Initial proof of concept of turbo button
This commit is contained in:
		
							parent
							
								
									b6745c9e2e
								
							
						
					
					
						commit
						94f2f510fc
					
				| @ -48,50 +48,50 @@ subroutine foxgen() | ||||
| 
 | ||||
|   do n=1,nslots | ||||
|      i3b=i3bit(n) | ||||
|      if(i3b.eq.0) then | ||||
|         msg=cmsg(n)(1:22)                     !Standard FT8 message | ||||
|      else | ||||
|         i1=index(cmsg(n),' ')                 !Special Fox message | ||||
|         i2=index(cmsg(n),';') | ||||
|         i3=index(cmsg(n),'<') | ||||
|         i4=index(cmsg(n),'>') | ||||
|         msg=cmsg(n)(1:i1)//cmsg(n)(i2+1:i3-2)//'                   ' | ||||
|         read(cmsg(n)(i4+2:i4+4),*) irpt | ||||
|      endif | ||||
|      call genft8(msg,mygrid,bcontest,0,msgsent,msgbits,itone) | ||||
|      !if(i3b.eq.0) then | ||||
|         msg=cmsg(n)(1:12)                     !Standard FT8 message | ||||
|      !else | ||||
|      !   i1=index(cmsg(n),' ')                 !Special Fox message | ||||
|      !   i2=index(cmsg(n),';') | ||||
|      !   i3=index(cmsg(n),'<') | ||||
|      !   i4=index(cmsg(n),'>') | ||||
|      !   msg=cmsg(n)(1:i1)//cmsg(n)(i2+1:i3-2)//'                   ' | ||||
|      !   read(cmsg(n)(i4+2:i4+4),*) irpt | ||||
|      !endif | ||||
|      call genft8(msg,mygrid,bcontest,i3b,msgsent,msgbits,itone) | ||||
| !     print*,'Foxgen:',n,cmsg(n),msgsent | ||||
| 
 | ||||
|      if(i3b.eq.1) then | ||||
|         icrc10=crc10(c_loc(mycall),12) | ||||
|         nrpt=irpt+30 | ||||
|         write(cbits,1001) msgbits(1:56),icrc10,nrpt,i3b,0 | ||||
| 1001    format(56b1.1,b10.10,b6.6,b3.3,b12.12) | ||||
|         read(cbits,1002) msgbits | ||||
| 1002    format(87i1) | ||||
| 
 | ||||
|         cb88=cbits//'0' | ||||
|         read(cb88,1003) i1Msg8BitBytes(1:11) | ||||
| 1003    format(11b8) | ||||
|         icrc12=crc12(c_loc(i1Msg8BitBytes),11) | ||||
| !        icrc12=xor(icrc12, 41) ! TODO: jsherer - could change the crc here | ||||
| 
 | ||||
|         write(cbits,1001) msgbits(1:56),icrc10,nrpt,i3b,icrc12 | ||||
|         read(cbits,1002) msgbits | ||||
| 
 | ||||
|         call encode174(msgbits,codeword)      !Encode the test message | ||||
|          | ||||
| ! Message structure: S7 D29 S7 D29 S7 | ||||
|         itone(1:7)=icos7 | ||||
|         itone(36+1:36+7)=icos7 | ||||
|         itone(NN-6:NN)=icos7 | ||||
|         k=7 | ||||
|         do j=1,ND | ||||
|            i=3*j -2 | ||||
|            k=k+1 | ||||
|            if(j.eq.30) k=k+7 | ||||
|            itone(k)=codeword(i)*4 + codeword(i+1)*2 + codeword(i+2) | ||||
|         enddo | ||||
|      endif | ||||
| !!      if(i3b.eq.1) then | ||||
| !!         icrc10=crc10(c_loc(mycall),12) | ||||
| !!         nrpt=irpt+30 | ||||
| !!         write(cbits,1001) msgbits(1:56),icrc10,nrpt,i3b,0 | ||||
| !! 1001    format(56b1.1,b10.10,b6.6,b3.3,b12.12) | ||||
| !!         read(cbits,1002) msgbits | ||||
| !! 1002    format(87i1) | ||||
| !!  | ||||
| !!         cb88=cbits//'0' | ||||
| !!         read(cb88,1003) i1Msg8BitBytes(1:11) | ||||
| !! 1003    format(11b8) | ||||
| !!         icrc12=crc12(c_loc(i1Msg8BitBytes),11) | ||||
| !! !        icrc12=xor(icrc12, 41) ! TODO: jsherer - could change the crc here | ||||
| !!  | ||||
| !!         write(cbits,1001) msgbits(1:56),icrc10,nrpt,i3b,icrc12 | ||||
| !!         read(cbits,1002) msgbits | ||||
| !!  | ||||
| !!         call encode174(msgbits,codeword)      !Encode the test message | ||||
| !!          | ||||
| !! ! Message structure: S7 D29 S7 D29 S7 | ||||
| !!         itone(1:7)=icos7 | ||||
| !!         itone(36+1:36+7)=icos7 | ||||
| !!         itone(NN-6:NN)=icos7 | ||||
| !!         k=7 | ||||
| !!         do j=1,ND | ||||
| !!            i=3*j -2 | ||||
| !!            k=k+1 | ||||
| !!            if(j.eq.30) k=k+7 | ||||
| !!            itone(k)=codeword(i)*4 + codeword(i+1)*2 + codeword(i+2) | ||||
| !!         enddo | ||||
| !!      endif | ||||
|       | ||||
| ! Make copies of itone() and msgbits() for ft8sim | ||||
|      itone2=itone | ||||
|  | ||||
| @ -151,6 +151,9 @@ extern "C" { | ||||
|   void plotsave_(float swide[], int* m_w , int* m_h1, int* irow); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| #define TEST_FOX_WAVE_GEN 1 | ||||
| 
 | ||||
| const int NEAR_THRESHOLD_RX = 10; | ||||
| 
 | ||||
| int volatile itone[NUM_ISCAT_SYMBOLS];  //Audio tones for all Tx symbols
 | ||||
| @ -1575,6 +1578,12 @@ void MainWindow::initializeDummyData(){ | ||||
|     displayTextForFreq("HELLO BRAVE  NEW   WORLD    \u2301 ", 42, DriftingDateTime::currentDateTimeUtc().addSecs(-300), false, true, true); | ||||
| 
 | ||||
|     displayActivity(true); | ||||
| 
 | ||||
|     ui->heartbeatButton->click(); | ||||
|     QTimer::singleShot(10000, this, [this](){ | ||||
|          m_idleMinutes = 61; | ||||
|          scheduleHeartbeat(true); | ||||
|     }); | ||||
| } | ||||
| 
 | ||||
| void MainWindow::initialize_fonts () | ||||
| @ -2374,6 +2383,7 @@ void MainWindow::on_menuControl_aboutToShow(){ | ||||
|     ui->actionEnable_Spotting->setChecked(ui->spotButton->isChecked()); | ||||
|     ui->actionEnable_Active->setChecked(ui->activeButton->isChecked()); | ||||
|     ui->actionEnable_Auto_Reply->setChecked(ui->autoReplyButton->isChecked()); | ||||
|     ui->actionEnable_Heartbeat->setChecked(ui->heartbeatButton->isChecked()); | ||||
|     ui->actionEnable_Selcall->setChecked(ui->selcalButton->isChecked()); | ||||
| 
 | ||||
|     QMenu * heartbeatMenu = new QMenu(this->menuBar()); | ||||
| @ -4491,6 +4501,41 @@ void MainWindow::guiUpdate() | ||||
|               const_cast<int *> (itone), 22, 6, 22); | ||||
|       msgibits = m_i3bit; | ||||
|       msgsent[22]=0; | ||||
| 
 | ||||
|       if(TEST_FOX_WAVE_GEN) { | ||||
| 
 | ||||
|         foxcom_.nslots=1; | ||||
| 
 | ||||
|         foxcom_.nfreq=ui->TxFreqSpinBox->value(); | ||||
|         if(m_config.split_mode()) foxcom_.nfreq = foxcom_.nfreq - m_XIT;  //Fox Tx freq
 | ||||
|         strncpy(&foxcom_.cmsg[0][0], QString::fromStdString(message).toLatin1(), 12); | ||||
|         foxcom_.i3bit[0] = m_i3bit; | ||||
| 
 | ||||
|         if(!m_txFrameQueue.isEmpty()){ | ||||
|             auto pair = m_txFrameQueue.dequeue(); | ||||
|             strncpy(&foxcom_.cmsg[1][0], pair.first.toLatin1(), 12); | ||||
|             foxcom_.i3bit[1] = pair.second; | ||||
|             foxcom_.nslots++; | ||||
|         } | ||||
| 
 | ||||
|         /*
 | ||||
|         foreach(auto pair, ){ | ||||
|             int i = foxcom_.nslots; | ||||
| 
 | ||||
|             strncpy(&foxcom_.cmsg[i][0], pair.first.toLatin1(), 12); | ||||
|             foxcom_.i3bit[i] = pair.second; | ||||
| 
 | ||||
|             foxcom_.nslots++; | ||||
|         } | ||||
|         count += 4; | ||||
|         */ | ||||
| 
 | ||||
|         foxgen_(); | ||||
|       } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     m_currentMessage = QString::fromLatin1(msgsent); | ||||
| @ -5547,6 +5592,7 @@ void MainWindow::enqueueMessage(int priority, QString message, int freq, Callbac | ||||
| 
 | ||||
| void MainWindow::enqueueHeartbeat(QString message){ | ||||
|     m_txHeartbeatQueue.enqueue(message); | ||||
|     scheduleHeartbeat(true); | ||||
| } | ||||
| 
 | ||||
| void MainWindow::resetMessage(){ | ||||
| @ -5839,6 +5885,7 @@ int MainWindow::findFreeFreqOffset(int fmin, int fmax, int bw){ | ||||
| // schedulePing
 | ||||
| void MainWindow::scheduleHeartbeat(bool first){ | ||||
|     auto timestamp = DriftingDateTime::currentDateTimeUtc(); | ||||
|     auto orig = timestamp; | ||||
| 
 | ||||
|     // if we have the heartbeat interval disabled, return early, unless this is a "heartbeat now"
 | ||||
|     if(!m_config.heartbeat() && !first){ | ||||
| @ -5874,6 +5921,7 @@ void MainWindow::scheduleHeartbeat(bool first){ | ||||
| 
 | ||||
| // pausePing
 | ||||
| void MainWindow::pauseHeartbeat(){ | ||||
|     ui->heartbeatButton->setChecked(false); | ||||
|     m_nextHeartPaused = true; | ||||
| 
 | ||||
|     if(heartbeatTimer.isActive()){ | ||||
| @ -5883,6 +5931,7 @@ void MainWindow::pauseHeartbeat(){ | ||||
| 
 | ||||
| // unpausePing
 | ||||
| void MainWindow::unpauseHeartbeat(){ | ||||
|     ui->heartbeatButton->setChecked(true); | ||||
|     scheduleHeartbeat(false); | ||||
| } | ||||
| 
 | ||||
| @ -6088,6 +6137,7 @@ void MainWindow::acceptQSO (QDateTime const& QSO_date_off, QString const& call, | ||||
|   m_logBook.init(); | ||||
| 
 | ||||
|   if (m_config.clear_callsign ()){ | ||||
|       clearDX (); | ||||
|       clearCallsignSelected(); | ||||
|   } | ||||
| 
 | ||||
| @ -8040,6 +8090,9 @@ void MainWindow::transmit (double snr) | ||||
|     if(m_config.x2ToneSpacing()) toneSpacing=2*12000.0/1920.0; | ||||
|     if(m_config.x4ToneSpacing()) toneSpacing=4*12000.0/1920.0; | ||||
|     if(m_config.bFox() and !m_tune) toneSpacing=-1; | ||||
| 
 | ||||
|     if(TEST_FOX_WAVE_GEN && !m_tune) toneSpacing=-1; | ||||
| 
 | ||||
|     Q_EMIT sendMessage (NUM_FT8_SYMBOLS, | ||||
|            1920.0, ui->TxFreqSpinBox->value () - m_XIT, | ||||
|            toneSpacing, m_soundOutput, m_config.audio_output_channel (), | ||||
| @ -8615,7 +8668,11 @@ void MainWindow::refreshTextDisplay(){ | ||||
|         // ugh...i hate these globals
 | ||||
|         m_txTextDirtyLastSelectedCall = callsignSelected(true); | ||||
|         m_txTextDirtyLastText = text; | ||||
| #if TEST_FOX_WAVE_GEN | ||||
|         m_txFrameCountEstimate = (int)ceil(float(frames)/2.0); | ||||
| #else | ||||
|         m_txFrameCountEstimate = frames; | ||||
| #endif | ||||
|         m_txTextDirty = false; | ||||
| 
 | ||||
|         updateTextStatsDisplay(transmitText, frames); | ||||
| @ -8643,11 +8700,15 @@ void MainWindow::updateTxButtonDisplay(){ | ||||
|     // update transmit button
 | ||||
|     if(m_tune || m_transmitting || m_txFrameCount > 0){ | ||||
|         int count = m_txFrameCount; | ||||
|         int sent = count - m_txFrameQueue.count(); | ||||
| //#if TEST_FOX_WAVE_GEN
 | ||||
| //    count = qMax(1, (int)ceil(float(count)/4.0));
 | ||||
| //#endif
 | ||||
|         int sent = count - (int)ceil(float(m_txFrameQueue.count())/4.0); | ||||
| 
 | ||||
|         ui->startTxButton->setText(m_tune ? "Tuning" : QString("Sending (%1/%2)").arg(sent).arg(count)); | ||||
|         ui->startTxButton->setEnabled(false); | ||||
|     } else { | ||||
|         ui->startTxButton->setText(m_txFrameCountEstimate <= 0 ? QString("Send") : QString("Send (%1)").arg(m_txFrameCountEstimate)); | ||||
|         ui->startTxButton->setText(m_txFrameCountEstimate <= 0 ? QString("Send") : QString("Turbo Send (%1)").arg(m_txFrameCountEstimate)); | ||||
|         ui->startTxButton->setEnabled(m_txFrameCountEstimate > 0 && ensureSelcalCallsignSelected(false)); | ||||
|     } | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Jordan Sherer
						Jordan Sherer