diff --git a/DStarControl.cpp b/DStarControl.cpp index 2bab862..a4431ad 100644 --- a/DStarControl.cpp +++ b/DStarControl.cpp @@ -342,12 +342,14 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len) } // Check for the fast data signature - if (m_rfState == RS_RF_AUDIO) { + if (m_rfState == RS_RF_AUDIO && (m_rfN % 2U) == 1U) { unsigned char slowDataType = (data[DSTAR_VOICE_FRAME_LENGTH_BYTES + 1U] ^ DSTAR_SCRAMBLER_BYTE1) & DSTAR_SLOW_DATA_TYPE_MASK; if (slowDataType == DSTAR_SLOW_DATA_TYPE_FAST_DATA1 || slowDataType == DSTAR_SLOW_DATA_TYPE_FAST_DATA2) { LogMessage("D-Star, switching to fast data mode"); m_rfState = RS_RF_DATA; } + } else { + // Handle return to voice mode here? } if (m_rfState == RS_RF_DATA) { @@ -707,12 +709,14 @@ void CDStarControl::writeNetwork() } } else if (type == TAG_DATA) { // Check for the fast data signature - if (m_netState == RS_NET_AUDIO) { + if (m_netState == RS_NET_AUDIO && (m_netN % 2U) == 1U) { unsigned char slowDataType = data[DSTAR_VOICE_FRAME_LENGTH_BYTES + 2U] & DSTAR_SLOW_DATA_TYPE_MASK; if (slowDataType == DSTAR_SLOW_DATA_TYPE_FAST_DATA1 || slowDataType == DSTAR_SLOW_DATA_TYPE_FAST_DATA2) { LogMessage("D-Star, switching to fast data mode"); m_netState = RS_NET_DATA; } + } else { + // Handle return to voice mode here? } if (m_netState == RS_NET_DATA) { @@ -736,6 +740,8 @@ void CDStarControl::writeNetwork() writeFile(data + 1U, length - 1U); #endif writeQueueDataNet(data + 1U); + + m_netN = (m_netN + 1U) % 21U; } else if (m_netState == RS_NET_AUDIO) { unsigned char n = data[1U]; @@ -775,6 +781,8 @@ void CDStarControl::writeNetwork() writeFile(data + 1U, length - 1U); #endif writeQueueDataNet(data + 1U); + + m_netN = (m_netN + 1U) % 21U; } } else { CUtils::dump("D-Star, unknown data from network", data, DSTAR_FRAME_LENGTH_BYTES + 1U);