Decoder queue processing bugs

This commit is contained in:
Jordan Sherer 2019-11-11 22:39:02 -05:00
parent 865cfa31f9
commit eada85c04d
3 changed files with 39 additions and 9 deletions

View File

@ -9,6 +9,7 @@
#define JS8_USE_REFSPEC 0 // compute the signal refspec
#define JS8_USE_IHSYM 0 // compute ihsym manually instead of from symspec
#define JS8_RING_BUFFER 1 // use a ring buffer instead of clearing the decode frames
#define JS8_SINGLE_DECODE 0 // single submode decode per instantiation of the decoder
#define JS8_NUM_SYMBOLS 79
#define JS8_ENABLE_JS8A 1

View File

@ -1555,7 +1555,8 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
});
// Don't block heartbeat's first run...
m_lastTxTime = DriftingDateTime::currentDateTimeUtc().addSecs(-300);
m_lastTxStartTime = DriftingDateTime::currentDateTimeUtc().addSecs(-300);
m_lastTxStopTime = DriftingDateTime::currentDateTimeUtc().addSecs(-300);
int width = 75;
/*
@ -3987,7 +3988,7 @@ bool MainWindow::isDecodeReady(int submode, qint32 k, qint32 k0, qint32 *pCurren
if(pCycle) *pCycle = currentCycle;
if(pStart) *pStart = *pCurrentDecodeStart;
if(pSz) *pSz = qMax(framesNeeded, k-(*pCurrentDecodeStart));
if(pSz) *pSz = cycleFrames; // qMax(framesNeeded, k-(*pCurrentDecodeStart));
*pCurrentDecodeStart = *pNextDecodeStart;
*pNextDecodeStart = *pCurrentDecodeStart + cycleFrames;
@ -4007,6 +4008,12 @@ void MainWindow::decode(){
return;
}
int threshold = 1000; // one second
if(isInTransmitDecodeThreshold(threshold)){
qDebug() << "--> decoder paused for" << threshold << "ms after transmit stop";
return;
}
bool ready = decodeEnqueueReady(k, k0);
if(ready || !m_decoderQueue.isEmpty()){
qDebug() << "--> decoder is ready to be run with" << m_decoderQueue.count() << "decode periods";
@ -4091,7 +4098,7 @@ bool MainWindow::decodeEnqueueReady(qint32 k, qint32 k0){
if(couldDecodeB){
DecodeParams d;
d.submode = Varicode::JS8CallNormal;
d.submode = Varicode::JS8CallFast;
d.cycle = cycleB;
d.start = startB;
d.sz = szB;
@ -4101,7 +4108,7 @@ bool MainWindow::decodeEnqueueReady(qint32 k, qint32 k0){
if(couldDecodeC){
DecodeParams d;
d.submode = Varicode::JS8CallNormal;
d.submode = Varicode::JS8CallTurbo;
d.cycle = cycleC;
d.start = startC;
d.sz = szC;
@ -4112,7 +4119,7 @@ bool MainWindow::decodeEnqueueReady(qint32 k, qint32 k0){
#if JS8_ENABLE_JS8E
if(couldDecodeE){
DecodeParams d;
d.submode = Varicode::JS8CallNormal;
d.submode = Varicode::JS8CallUltraSlow;
d.cycle = cycleE;
d.start = startE;
d.sz = szE;
@ -4148,6 +4155,8 @@ bool MainWindow::decodeProcessQueue(qint32 *pSubmode){
qDebug() << "--> decoder skipping at least 1 decode cycle" << "count" << count << "max" << maxDecodes;
}
dec_data.params.nsubmodes = 0;
while(!m_decoderQueue.isEmpty()){
auto params = m_decoderQueue.front();
m_decoderQueue.removeFirst();
@ -4161,7 +4170,6 @@ bool MainWindow::decodeProcessQueue(qint32 *pSubmode){
submode = params.submode;
}
dec_data.params.nsubmodes = 0;
switch(params.submode){
case Varicode::JS8CallNormal:
dec_data.params.kposA = params.start;
@ -4178,12 +4186,17 @@ bool MainWindow::decodeProcessQueue(qint32 *pSubmode){
dec_data.params.kszC = params.sz;
dec_data.params.nsubmodes |= (params.submode << 1);
break;
#if JS8_ENABLE_JS8E
case Varicode::JS8CallUltraSlow:
dec_data.params.kposE = params.start;
dec_data.params.kszE = params.sz;
dec_data.params.nsubmodes |= (params.submode << 1);
break;
#endif
}
#if JS8_SINGLE_DECODE
break;
#endif
}
if(submode == -1){
@ -4320,6 +4333,11 @@ bool MainWindow::decodeProcessQueue(qint32 *pSubmode){
void MainWindow::decodeStart(){
qDebug() << "--> decoder starting";
qDebug() << " --> nsubmodes:" << dec_data.params.nsubmodes;
qDebug() << " --> A:" << dec_data.params.kposA << dec_data.params.kszA;
qDebug() << " --> B:" << dec_data.params.kposB << dec_data.params.kszB;
qDebug() << " --> C:" << dec_data.params.kposC << dec_data.params.kszC;
qDebug() << " --> E:" << dec_data.params.kposE << dec_data.params.kszE;
//newdat=1 ==> this is new data, must do the big FFT
//nagain=1 ==> decode only at fQSO +/- Tol
@ -5443,7 +5461,7 @@ void MainWindow::guiUpdate()
}
// TODO: jsherer - perhaps an on_transmitting signal?
m_lastTxTime = DriftingDateTime::currentDateTimeUtc();
m_lastTxStartTime = DriftingDateTime::currentDateTimeUtc();
m_transmitting = true;
transmitDisplay (true);
@ -5685,6 +5703,7 @@ void MainWindow::stopTx()
m_btxok = false;
m_transmitting = false;
g_iptt=0;
m_lastTxStopTime = DriftingDateTime::currentDateTimeUtc();
if (!m_tx_watchdog) {
tx_status_label.setStyleSheet("");
tx_status_label.setText("");
@ -6345,6 +6364,14 @@ bool MainWindow::isMessageQueuedForTransmit(){
return m_transmitting || m_txFrameCount > 0;
}
bool MainWindow::isInTransmitDecodeThreshold(int ms){
if(m_lastTxStopTime.isNull()){
return false;
}
return m_lastTxStopTime.msecsTo(DriftingDateTime::currentDateTimeUtc()) < ms;
}
void MainWindow::prependMessageText(QString text){
// don't add message text if we already have a transmission queued...
if(isMessageQueuedForTransmit()){
@ -11519,7 +11546,7 @@ void MainWindow::processTxQueue(){
}
// and if we are a low priority message, we need to have not transmitted in the past 30 seconds...
if(head.priority <= PriorityLow && m_lastTxTime.secsTo(DriftingDateTime::currentDateTimeUtc()) <= 30){
if(head.priority <= PriorityLow && m_lastTxStartTime.secsTo(DriftingDateTime::currentDateTimeUtc()) <= 30){
return;
}

View File

@ -143,6 +143,7 @@ public slots:
void writeNoticeTextToUI(QDateTime date, QString text);
int writeMessageTextToUI(QDateTime date, QString text, int freq, bool isTx, int block=-1);
bool isMessageQueuedForTransmit();
bool isInTransmitDecodeThreshold(int seconds);
void prependMessageText(QString text);
void addMessageText(QString text, bool clear=false, bool selectFirstPlaceholder=false);
void enqueueMessage(int priority, QString message, int freq, Callback c);
@ -782,7 +783,8 @@ private:
QString m_txTextDirtyLastSelectedCall;
QString m_lastTxMessage;
QString m_totalTxMessage;
QDateTime m_lastTxTime;
QDateTime m_lastTxStartTime;
QDateTime m_lastTxStopTime;
int m_timeDeltaMsMMA;
int m_timeDeltaMsMMA_N;