bool CGMSKRepeaterTXRXThread::receiveRadioHeader() { bool error; CHeaderData* header = m_modem->readHeader(error); if (header == NULL) return error; wxLogMessage(wxT("Header decoded - My: %s/%s Your: %s Rpt1: %s Rpt2: %s Flags: %02X %02X %02X"), header->getMyCall1().c_str(), header->getMyCall2().c_str(), header->getYourCall().c_str(), header->getRptCall1().c_str(), header->getRptCall2().c_str(), header->getFlag1(), header->getFlag2(), header->getFlag3()); bool res = processRadioHeader(header); if (res) { // A valid header and is a DV packet m_radioSeqNo = 20U; m_ambeFrames = 0U; m_ambeSilence = 0U; m_ambeBits = 1U; m_ambeErrors = 0U; m_ambeLength = 0U; m_lastAMBEBits = 0U; m_lastAMBEErrors = 0U; } else { // This is a DD packet or some other problem // wxLogMessage(wxT("Invalid header")); } return false; }
void CDStarRepeaterRXThread::receiveHeader(CHeaderData* header) { wxASSERT(header != NULL); wxLogMessage(wxT("Radio header decoded - My: %s/%s Your: %s Rpt1: %s Rpt2: %s Flags: %02X %02X %02X"), header->getMyCall1().c_str(), header->getMyCall2().c_str(), header->getYourCall().c_str(), header->getRptCall1().c_str(), header->getRptCall2().c_str(), header->getFlag1(), header->getFlag2(), header->getFlag3()); bool res = processRadioHeader(header); if (res) { // A valid header and is a DV packet m_radioSeqNo = 20U; setRadioState(DSRXS_PROCESS_DATA); } else { // This is a DD packet or some other problem // wxLogMessage(wxT("Invalid header")); } }
void CDVRPTRRepeaterRXThread::receiveHeader(unsigned char* data, unsigned int length) { CHeaderData* header = new CHeaderData(data, length, false); wxLogMessage(wxT("Radio header decoded - My: %s/%s Your: %s Rpt1: %s Rpt2: %s Flags: %02X %02X %02X"), header->getMyCall1().c_str(), header->getMyCall2().c_str(), header->getYourCall().c_str(), header->getRptCall1().c_str(), header->getRptCall2().c_str(), header->getFlag1(), header->getFlag2(), header->getFlag3()); bool res = processRadioHeader(header); if (res) { // A valid header and is a DV packet m_radioSeqNo = 20U; setRadioState(DSRXS_PROCESS_DATA); } else { // This is a DD packet or some other problem // wxLogMessage(wxT("Invalid header")); } }
void CDStarRepeaterRXThread::receiveSlowData(unsigned char* data, unsigned int) { unsigned int errs; errs = countBits(data[VOICE_FRAME_LENGTH_BYTES + 0U] ^ DATA_SYNC_BYTES[0U]); errs += countBits(data[VOICE_FRAME_LENGTH_BYTES + 1U] ^ DATA_SYNC_BYTES[1U]); errs += countBits(data[VOICE_FRAME_LENGTH_BYTES + 2U] ^ DATA_SYNC_BYTES[2U]); // The data sync has been seen, a fuzzy match is used, two bit errors or less if (errs <= MAX_DATA_SYNC_BIT_ERRS) { // wxLogMessage(wxT("Found data sync at frame %u, errs: %u"), m_radioSeqNo, errs); m_radioSeqNo = 0U; m_slowDataDecoder.sync(); } else if (m_radioSeqNo == 20U) { // wxLogMessage(wxT("Assuming data sync")); m_radioSeqNo = 0U; m_slowDataDecoder.sync(); } else { m_radioSeqNo++; m_slowDataDecoder.addData(data + VOICE_FRAME_LENGTH_BYTES); CHeaderData* header = m_slowDataDecoder.getHeaderData(); if (header == NULL) return; wxLogMessage(wxT("Radio header from slow data - My: %s/%s Your: %s Rpt1: %s Rpt2: %s Flags: %02X %02X %02X BER: 0%%"), header->getMyCall1().c_str(), header->getMyCall2().c_str(), header->getYourCall().c_str(), header->getRptCall1().c_str(), header->getRptCall2().c_str(), header->getFlag1(), header->getFlag2(), header->getFlag3()); if (header != NULL) { bool res = processRadioHeader(header); if (res) { // A valid header and is a DV packet, go to normal data relaying setRadioState(DSRXS_PROCESS_DATA); } else { // This is a DD packet or some other problem // wxLogMessage(wxT("Invalid header")); } } } }
void CSoundCardRepeaterTXRXThread::radioStateMachine(bool bit) { switch (m_rxState) { case DSRXS_LISTENING: { unsigned int errs1 = m_frameMatcher.add(bit); unsigned int errs2 = m_dataMatcher.add(bit); // The frame sync has been seen, an exact match only if (errs1 == 0U) { // wxLogMessage(wxT("Found frame sync")); setRadioState(DSRXS_PROCESS_HEADER); } // The data sync has been seen, an exact match only if (errs2 == 0U) { // wxLogMessage(wxT("Found data sync")); setRadioState(DSRXS_PROCESS_SLOW_DATA); } } break; case DSRXS_PROCESS_HEADER: m_bitBuffer.add(bit); if (m_bitBuffer.getLength() == FEC_SECTION_LENGTH_BITS) { CHeaderData* header = processFECHeader(); if (header != NULL) { bool res = processRadioHeader(header); if (res) { // A valid header and is a DV packet m_radioSeqNo = 20U; m_radioSyncsLost = 0U; setRadioState(DSRXS_PROCESS_DATA); } else { // This is a DD packet or some other problem // wxLogMessage(wxT("Invalid header")); setRadioState(DSRXS_LISTENING); } } else { // The checksum failed setRadioState(DSRXS_LISTENING); } } break; case DSRXS_PROCESS_DATA: { m_bitBuffer.add(bit); unsigned int errs1 = m_endMatcher.add(bit); unsigned int errs2 = m_dataMatcher.add(bit); // The end pattern has been seen, a fuzzy match is used, four bit errors or less if (errs1 <= MAX_END_PATTERN_BIT_ERRS) { // wxLogMessage(wxT("Found end pattern, errs: %u"), errs1); processRadioFrame(FRAME_END); setRadioState(DSRXS_LISTENING); endOfRadioData(); break; } if (m_bitBuffer.getLength() == DV_FRAME_LENGTH_BITS) { // The squelch is closed so replace the data with silence if (m_squelchCount >= MAX_SQUELCH_COUNT) { m_bitBuffer.clear(); // Add AMBE silence and slow data for (unsigned int i = 0U; i < DV_FRAME_LENGTH_BITS; i++) m_bitBuffer.add(NULL_FRAME_DATA_BITS[i]); } // The data sync has been seen, a fuzzy match is used, two bit errors or less if (errs2 <= MAX_DATA_SYNC_BIT_ERRS) { // wxLogMessage(wxT("Found data sync at frame %u, errs: %u"), m_radioSeqNo, errs2); m_radioSeqNo = 0U; m_radioSyncsLost = 0U; processRadioFrame(FRAME_SYNC); } else if (m_radioSeqNo == 20U) { // wxLogMessage(wxT("Regenerating data sync")); m_radioSeqNo = 0U; m_radioSyncsLost++; if (m_radioSyncsLost == MAX_LOST_SYNCS) { // wxLogMessage(wxT("Lost sync")); processRadioFrame(FRAME_END); setRadioState(DSRXS_LISTENING); endOfRadioData(); } else { processRadioFrame(FRAME_SYNC); } } else { m_radioSeqNo++; processRadioFrame(FRAME_NORMAL); } m_squelchCount = 0U; m_bitBuffer.clear(); } } break; case DSRXS_PROCESS_SLOW_DATA: { m_bitBuffer.add(bit); unsigned int errs1 = m_endMatcher.add(bit); unsigned int errs2 = m_dataMatcher.add(bit); // The end pattern has been seen, a fuzzy match is used, four bit errors or less if (errs1 <= MAX_END_PATTERN_BIT_ERRS) { // wxLogMessage(wxT("Found end pattern, errs: %u"), errs1); setRadioState(DSRXS_LISTENING); break; } if (m_bitBuffer.getLength() == DV_FRAME_LENGTH_BITS) { // The squelch is closed so abort the slow data search if (m_squelchCount >= MAX_SQUELCH_COUNT) { setRadioState(DSRXS_LISTENING); break; } // The data sync has been seen, a fuzzy match is used, two bit errors or less if (errs2 <= MAX_DATA_SYNC_BIT_ERRS) { // wxLogMessage(wxT("Found data sync at frame %u, errs: %u"), m_radioSeqNo, errs2); m_radioSeqNo = 0U; m_radioSyncsLost = 0U; processSlowData(true); } else if (m_radioSeqNo == 20U) { // wxLogMessage(wxT("Assuming data sync")); m_radioSeqNo = 0U; m_radioSyncsLost++; if (m_radioSyncsLost == MAX_LOST_SYNCS) { // wxLogMessage(wxT("Lost sync")); setRadioState(DSRXS_LISTENING); } else { processSlowData(true); } } else { m_radioSeqNo++; CHeaderData* header = processSlowData(false); if (header != NULL) { bool res = processRadioHeader(header); if (res) { // A valid header and is a DV packet, go to normal data relaying setRadioState(DSRXS_PROCESS_DATA); } else { // This is a DD packet or some other problem // wxLogMessage(wxT("Invalid header")); } } } m_squelchCount = 0U; m_bitBuffer.clear(); } } break; } }