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