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