diff --git a/rigcommander.cpp b/rigcommander.cpp index 1c3ecd6..ed75bf9 100644 --- a/rigcommander.cpp +++ b/rigcommander.cpp @@ -22,6 +22,8 @@ rigCommander::rigCommander() { + rigState.mutex = new QMutex(); + QMutexLocker locker(rigState.mutex); rigState.filter = 0; rigState.mode = 0; rigState.ptt = 0; @@ -33,6 +35,7 @@ rigCommander::rigCommander() rigCommander::~rigCommander() { closeComm(); + delete rigState.mutex; } @@ -569,12 +572,16 @@ void rigCommander::setFrequency(unsigned char vfo, freqt freq) cmdPayload.append(freqPayload); if (vfo == 0) { + rigState.mutex->lock(); rigState.vfoAFreq = freq; + rigState.mutex->unlock(); cmdPayload.prepend('\x00'); } else { + rigState.mutex->lock(); rigState.vfoBFreq = freq; + rigState.mutex->unlock(); cmdPayload.prepend(vfo); cmdPayload.prepend('\x25'); } @@ -702,6 +709,8 @@ void rigCommander::setMode(mode_info m) payload.append(m.filter); prepDataAndSend(payload); + + QMutexLocker locker(rigState.mutex); rigState.mode = m.reg; rigState.filter = m.filter; } @@ -733,6 +742,7 @@ void rigCommander::setMode(unsigned char mode, unsigned char modeFilter) } prepDataAndSend(payload); + QMutexLocker locker(rigState.mutex); rigState.mode = mode; rigState.filter = modeFilter; @@ -753,6 +763,7 @@ void rigCommander::setDataMode(bool dataOn, unsigned char filter) payload.append("\x00\x00", 2); // data mode off, bandwidth not defined per ICD. } prepDataAndSend(payload); + QMutexLocker locker(rigState.mutex); rigState.datamode = dataOn; } @@ -1020,6 +1031,7 @@ void rigCommander::setPTT(bool pttOn) QByteArray payload("\x1C\x00", 2); payload.append((char)pttOn); prepDataAndSend(payload); + QMutexLocker locker(rigState.mutex); rigState.ptt = pttOn; } } @@ -1241,16 +1253,22 @@ void rigCommander::parseCommand() break; case '\x0F': emit haveDuplexMode((duplexMode)(unsigned char)payloadIn[1]); + rigState.mutex->lock(); rigState.duplex = (duplexMode)(unsigned char)payloadIn[1]; + rigState.mutex->unlock(); break; case '\x11': emit haveAttenuator((unsigned char)payloadIn.at(1)); + rigState.mutex->lock(); rigState.attenuator = (unsigned char)payloadIn.at(1); + rigState.mutex->unlock(); break; case '\x12': emit haveAntenna((unsigned char)payloadIn.at(1), (bool)payloadIn.at(2)); + rigState.mutex->lock(); rigState.antenna = (unsigned char)payloadIn.at(1); rigState.rxAntenna = (bool)payloadIn.at(2); + rigState.mutex->unlock(); break; case '\x14': // read levels @@ -1346,7 +1364,6 @@ void rigCommander::parseLevels() // "INDEX: 00 01 02 03 04 " // "DATA: 14 02 00 78 fd " - if(payloadIn[0] == '\x14') { switch(payloadIn[1]) @@ -1355,18 +1372,24 @@ void rigCommander::parseLevels() // AF level - ignore if LAN connection. if (udp == Q_NULLPTR) { emit haveAfGain(level); + rigState.mutex->lock(); rigState.afGain = level; + rigState.mutex->unlock(); } break; case '\x02': // RX RF Gain emit haveRfGain(level); + rigState.mutex->lock(); rigState.rfGain = level; + rigState.mutex->unlock(); break; case '\x03': // Squelch level emit haveSql(level); + rigState.mutex->lock(); rigState.squelch = level; + rigState.mutex->unlock(); break; case '\x07': // Twin BPF Inner, or, IF-Shift level @@ -1385,12 +1408,16 @@ void rigCommander::parseLevels() case '\x0A': // TX RF level emit haveTxPower(level); + rigState.mutex->lock(); rigState.txPower = level; + rigState.mutex->unlock(); break; case '\x0B': // Mic Gain emit haveMicGain(level); + rigState.mutex->lock(); rigState.micGain = level; + rigState.mutex->unlock(); break; case '\x0C': // CW Keying Speed - ignore for now @@ -1401,7 +1428,9 @@ void rigCommander::parseLevels() case '\x0E': // compressor level emit haveCompLevel(level); + rigState.mutex->lock(); rigState.compLevel = level; + rigState.mutex->unlock(); break; case '\x12': // NB level - ignore for now @@ -1409,17 +1438,23 @@ void rigCommander::parseLevels() case '\x15': // monitor level emit haveMonitorLevel(level); + rigState.mutex->lock(); rigState.monitorLevel = level; + rigState.mutex->unlock(); break; case '\x16': // VOX gain emit haveVoxGain(level); + rigState.mutex->lock(); rigState.voxGain = level; + rigState.mutex->unlock(); break; case '\x17': // anti-VOX gain emit haveAntiVoxGain(level); + rigState.mutex->lock(); rigState.antiVoxGain = level; + rigState.mutex->unlock(); break; default: @@ -1437,42 +1472,58 @@ void rigCommander::parseLevels() case '\x02': // S-Meter emit haveMeter(meterS, level); + rigState.mutex->lock(); rigState.sMeter = level; + rigState.mutex->unlock(); break; case '\x04': // Center (IC-R8600) emit haveMeter(meterCenter, level); + rigState.mutex->lock(); rigState.sMeter = level; + rigState.mutex->unlock(); break; case '\x11': // RF-Power meter emit haveMeter(meterPower, level); + rigState.mutex->lock(); rigState.powerMeter = level; + rigState.mutex->unlock(); break; case '\x12': // SWR emit haveMeter(meterSWR, level); + rigState.mutex->lock(); rigState.swrMeter = level; + rigState.mutex->unlock(); break; case '\x13': // ALC emit haveMeter(meterALC, level); + rigState.mutex->lock(); rigState.alcMeter = level; + rigState.mutex->unlock(); break; case '\x14': // COMP dB reduction emit haveMeter(meterComp, level); + rigState.mutex->lock(); rigState.compMeter = level; + rigState.mutex->unlock(); break; case '\x15': // VD (12V) emit haveMeter(meterVoltage, level); + rigState.mutex->lock(); rigState.voltageMeter = level; + rigState.mutex->unlock(); break; case '\x16': // ID emit haveMeter(meterCurrent, level); + rigState.mutex->lock(); rigState.currentMeter = level; + rigState.mutex->unlock(); break; default: @@ -2379,6 +2430,7 @@ void rigCommander::parsePTT() // PTT on emit havePTTStatus(true); } + QMutexLocker locker(rigState.mutex); rigState.ptt = (bool)payloadIn[2]; } @@ -2398,6 +2450,7 @@ void rigCommander::parseRegisters1A() // "INDEX: 00 01 02 03 04 " // "DATA: 1a 06 01 03 fd " (data mode enabled, filter width 3 selected) + QMutexLocker locker(rigState.mutex); switch(payloadIn[01]) { @@ -2440,24 +2493,32 @@ void rigCommander::parseRegister1B() // "Repeater tone" tone = decodeTone(payloadIn); emit haveTone(tone); + rigState.mutex->lock(); rigState.ctcss = tone; + rigState.mutex->unlock(); break; case '\x01': // "TSQL tone" tone = decodeTone(payloadIn); emit haveTSQL(tone); + rigState.mutex->lock(); rigState.tsql = tone; + rigState.mutex->unlock(); break; case '\x02': // DTCS (DCS) tone = decodeTone(payloadIn, tinv, rinv); emit haveDTCS(tone, tinv, rinv); + rigState.mutex->lock(); rigState.dtcs = tone; + rigState.mutex->unlock(); break; case '\x07': // "CSQL code (DV mode)" tone = decodeTone(payloadIn); + rigState.mutex->lock(); rigState.csql = tone; + rigState.mutex->unlock(); break; default: break; @@ -2469,6 +2530,7 @@ void rigCommander::parseRegister16() //"INDEX: 00 01 02 03 " //"DATA: 16 5d 00 fd " // ^-- mode info here + switch(payloadIn.at(1)) { case '\x5d': @@ -2477,7 +2539,9 @@ void rigCommander::parseRegister16() case '\x02': // Preamp emit havePreamp((unsigned char)payloadIn.at(2)); + rigState.mutex->lock(); rigState.preamp = (unsigned char)payloadIn.at(2); + rigState.mutex->unlock(); break; default: break; @@ -3790,7 +3854,10 @@ void rigCommander::parseFrequency() freq.MHzDouble = frequencyMhz; + rigState.mutex->lock(); rigState.vfoAFreq = freq; + rigState.mutex->unlock(); + emit haveFrequency(freq); } @@ -3868,8 +3935,10 @@ void rigCommander::parseMode() } else { filter = 0; } + rigState.mutex->lock(); rigState.mode = (unsigned char)payloadIn[01]; rigState.filter = filter; + rigState.mutex->unlock(); emit haveMode((unsigned char)payloadIn[01], filter); } diff --git a/rigcommander.h b/rigcommander.h index 2b18c36..90550e0 100644 --- a/rigcommander.h +++ b/rigcommander.h @@ -2,6 +2,8 @@ #define RIGCOMMANDER_H #include +#include +#include #include #include "commhandler.h" @@ -60,6 +62,7 @@ struct timekind { }; struct rigStateStruct { + QMutex *mutex; freqt vfoAFreq; freqt vfoBFreq; unsigned char currentVfo; diff --git a/rigctld.cpp b/rigctld.cpp index c7a8595..c456cbd 100644 --- a/rigctld.cpp +++ b/rigctld.cpp @@ -175,6 +175,8 @@ void rigCtlClient::socketReadyRead() QStringList command = commandBuffer.mid(num).split(" "); + QMutexLocker locker(rigState->mutex); + if (command[0] == 0xf0 || command[0] == "chk_vfo") { QString resp;