void CDStarRepeaterRXThread::receiveModem() { for (;;) { DSMT_TYPE type = m_modem->read(); if (type == DSMTT_NONE) return; switch (m_rxState) { case DSRXS_LISTENING: if (type == DSMTT_HEADER) { CHeaderData* header = m_modem->readHeader(); receiveHeader(header); } else if (type == DSMTT_DATA) { unsigned char data[20U]; unsigned int length = m_modem->readData(data, 20U); setRadioState(DSRXS_PROCESS_SLOW_DATA); receiveSlowData(data, length); } break; case DSRXS_PROCESS_SLOW_DATA: if (type == DSMTT_DATA) { unsigned char data[20U]; unsigned int length = m_modem->readData(data, 20U); receiveSlowData(data, length); } else if (type == DSMTT_EOT || type == DSMTT_LOST) { setRadioState(DSRXS_LISTENING); } break; case DSRXS_PROCESS_DATA: if (type == DSMTT_DATA) { unsigned char data[20U]; unsigned int length = m_modem->readData(data, 20U); receiveRadioData(data, length); } else if (type == DSMTT_EOT || type == DSMTT_LOST) { unsigned char data[20U]; ::memcpy(data, END_PATTERN_BYTES, DV_FRAME_LENGTH_BYTES); processRadioFrame(data, FRAME_END); setRadioState(DSRXS_LISTENING); endOfRadioData(); } break; } } }
void CDVAPNodeTRXThread::run() { // Wait here until we have the essentials to run while (!m_killed && (m_dvap == NULL || m_rptCallsign.IsEmpty() || m_rptCallsign.IsSameAs(wxT(" ")))) ::wxMilliSleep(500UL); // 1/2 sec if (m_killed) return; m_stopped = false; m_beaconTimer.start(); m_dvapPollTimer.start(); if (m_protocolHandler != NULL) m_pollTimer.start(); wxLogMessage(wxT("Starting the DVAP node thread")); wxStopWatch stopWatch; while (!m_killed) { stopWatch.Start(); switch (m_state) { case DSRS_LISTENING: receiveRadioHeader(); break; case DSRS_NETWORK: break; case DSRS_VALID: case DSRS_INVALID: case DSRS_TIMEOUT: receiveRadioData(); break; default: // All the DSRS_*_WAIT values break; } // Listen all the time on the network for status packets at least receiveNetwork(); repeaterStateMachine(); m_tx = m_dvap->getPTT(); m_squelch = m_dvap->getSquelch(); m_signal = m_dvap->getSignal(); // Send the network poll if needed and restart the timer if (m_pollTimer.hasExpired()) { #if defined(__WINDOWS__) m_protocolHandler->writePoll(wxT("win_dvap-") + VERSION); #else m_protocolHandler->writePoll(wxT("linux_dvap-") + VERSION); #endif m_pollTimer.reset(); } if (m_dvapPollTimer.hasExpired()) { m_dvap->writePoll(); m_dvapPollTimer.reset(); } // Send the beacon and restart the timer if (m_beaconTimer.isRunning() && m_beaconTimer.hasExpired()) { m_beacon->sendBeacon(); m_beaconTimer.reset(); } if (m_localQueue.dataReady()) transmitLocalData(); else if (m_networkQueue[m_readNum]->dataReady()) transmitNetworkData(); else if (m_localQueue.headerReady()) transmitLocalHeader(); else if (m_networkQueue[m_readNum]->headerReady()) transmitNetworkHeader(); unsigned long ms = stopWatch.Time(); if (ms < CYCLE_TIME) { ::wxMilliSleep(CYCLE_TIME - ms); clock(CYCLE_TIME); } else { clock(ms); } } wxLogMessage(wxT("Stopping the DVAP node thread")); m_dvap->close(); if (m_protocolHandler != NULL) { m_protocolHandler->close(); delete m_protocolHandler; } }
void* CGMSKRepeaterTXRXThread::Entry() { // Wait here until we have the essentials to run while (!m_killed && (m_modem == NULL || m_controller == NULL || m_protocolHandler == NULL || m_rptCallsign.IsEmpty() || m_rptCallsign.IsSameAs(wxT(" ")))) Sleep(500UL); // 1/2 sec if (m_killed) return NULL; m_broken = m_modem->isBroken(); m_cycleTime = m_broken ? BROKEN_CYCLE_TIME : NORMAL_CYCLE_TIME; m_controller->setActive(false); m_controller->setRadioTransmit(false); m_pollTimer.start(); wxLogMessage(wxT("Starting the GMSK transmitter and receiver thread")); unsigned int count = 0U; wxStopWatch stopWatch; while (!m_killed) { stopWatch.Start(); switch (m_state) { case DSRS_SHUTDOWN: case DSRS_LISTENING: // Only check for the RF header every 100ms or so if (m_headerReadTimer.hasExpired()) { bool error = receiveRadioHeader(); if (error) reopenModem(); m_headerReadTimer.reset(); } break; case DSRS_VALID: { bool error = receiveRadioData(); if (error) reopenModem(); } break; default: break; } if (m_killed) break; // Listen all the time on the network for status packets at least receiveNetwork(); repeaterStateMachine(); // Send the network poll if needed and restart the timer if (m_pollTimer.hasExpired()) { #if defined(__WINDOWS__) m_protocolHandler->writePoll(wxT("win_gmsk-") + VERSION); #else m_protocolHandler->writePoll(wxT("linux_gmsk-") + VERSION); #endif m_pollTimer.reset(); } // Clock the heartbeat output every one second count++; if (count == 60U) { m_controller->setHeartbeat(); count = 0U; } // Set the output state if (m_tx || (m_activeHangTimer.isRunning() && !m_activeHangTimer.hasExpired())) { m_controller->setActive(true); } else { m_controller->setActive(false); m_activeHangTimer.stop(); } // Check the shutdown state, state changes are done here to bypass the state machine which is // frozen when m_disable is asserted m_disable = m_controller->getDisable(); if (m_disable) { if (m_state != DSRS_SHUTDOWN) { m_watchdogTimer.stop(); m_activeHangTimer.stop(); for (unsigned int i = 0U; i < NETWORK_QUEUE_COUNT; i++) m_networkQueue[i]->reset(); m_tx = false; m_controller->setActive(false); m_controller->setRadioTransmit(false); m_state = DSRS_SHUTDOWN; } } else { if (m_state == DSRS_SHUTDOWN) { m_watchdogTimer.stop(); m_state = DSRS_LISTENING; m_protocolHandler->reset(); } } if (m_networkQueue[m_readNum]->dataReady()) { bool ret = transmitNetworkData(); if (!ret) reopenModem(); } else if (m_networkQueue[m_readNum]->headerReady()) { bool ret = transmitNetworkHeader(); if (!ret) reopenModem(); } m_controller->setRadioTransmit(m_tx); unsigned long ms = stopWatch.Time(); if (m_state != DSRS_VALID) { if (ms < m_cycleTime) Sleep(m_cycleTime - ms); ms = stopWatch.Time(); } // Catch up with the clock clock(ms); } wxLogMessage(wxT("Stopping the GMSK transmitter and receiver thread")); if (m_modem != NULL) { m_modem->close(); delete m_modem; } m_controller->setActive(false); m_controller->setRadioTransmit(false); m_controller->close(); delete m_controller; m_protocolHandler->close(); delete m_protocolHandler; return NULL; }
void CDVAPNodeRXThread::run() { // Wait here until we have the essentials to run while (!m_killed && (m_dvap == NULL || m_protocolHandler == NULL)) ::wxMilliSleep(500UL); // 1/2 sec if (m_killed) return; m_dvapPollTimer.start(); m_pollTimer.start(); wxLogMessage(wxT("Starting the DVAP receiver thread")); wxStopWatch stopWatch; while (!m_killed) { stopWatch.Start(); if (m_state == DSRS_LISTENING) receiveRadioHeader(); else receiveRadioData(); // Listen all the time on the network for status packets at least receiveNetwork(); m_squelch = m_dvap->getSquelch(); m_signal = m_dvap->getSignal(); // Send the network poll if needed and restart the timer if (m_pollTimer.hasExpired()) { #if defined(__WINDOWS__) m_protocolHandler->writePoll(wxT("win_dvap-") + VERSION); #else m_protocolHandler->writePoll(wxT("linux_dvap-") + VERSION); #endif m_pollTimer.reset(); } if (m_dvapPollTimer.hasExpired()) { m_dvap->writePoll(); m_dvapPollTimer.reset(); } unsigned long ms = stopWatch.Time(); if (ms < CYCLE_TIME) { ::wxMilliSleep(CYCLE_TIME - ms); clock(CYCLE_TIME); } else { clock(ms); } } wxLogMessage(wxT("Stopping the DVAP receiver thread")); m_dvap->close(); m_protocolHandler->close(); delete m_protocolHandler; }
void CDVRPTRRepeaterRXThread::receiveRadio() { for (;;) { unsigned char data[50U]; unsigned int length; DATA_QUEUE_TYPE type = m_dvrptr->readQueue(data, length); switch (type) { case DQT_NONE: return; case DQT_HEADER: // CUtils::dump(wxT("DQT_HEADER"), data, length); break; case DQT_DATA: // CUtils::dump(wxT("DQT_DATA"), data, length); break; case DQT_EOT: // wxLogMessage(wxT("DQT_EOT")); break; case DQT_LOST: // wxLogMessage(wxT("DQT_LOST")); break; default: wxLogMessage(wxT("type=%d"), int(type)); CUtils::dump(wxT("DQT_???"), data, length); break; } switch (m_rxState) { case DSRXS_LISTENING: if (type == DQT_HEADER) { receiveHeader(data, length); } else if (type == DQT_DATA) { setRadioState(DSRXS_PROCESS_SLOW_DATA); } break; case DSRXS_PROCESS_SLOW_DATA: if (type == DQT_DATA) { receiveSlowData(data, length); } else if (type == DQT_EOT) { setRadioState(DSRXS_LISTENING); } else if (type == DQT_LOST) { setRadioState(DSRXS_LISTENING); } break; case DSRXS_PROCESS_DATA: if (type == DQT_DATA) { receiveRadioData(data, length); } else if (type == DQT_EOT) { processRadioFrame(data, FRAME_END); setRadioState(DSRXS_LISTENING); endOfRadioData(); } else if (type == DQT_LOST) { ::memcpy(data, NULL_FRAME_DATA_BYTES, DV_FRAME_LENGTH_BYTES); processRadioFrame(data, FRAME_END); setRadioState(DSRXS_LISTENING); endOfRadioData(); } break; } } }
void* CGMSKRepeaterRXThread::Entry() { // Wait here until we have the essentials to run while (!m_killed && (m_modem == NULL || m_protocolHandler == NULL)) Sleep(500UL); // 1/2 sec if (m_killed) return NULL; m_broken = m_modem->isBroken(); m_cycleTime = m_broken ? BROKEN_CYCLE_TIME : NORMAL_CYCLE_TIME; m_headerReadTimer.start(); m_pollTimer.start(); wxLogMessage(wxT("Starting the GMSK receiver thread")); wxStopWatch stopWatch; while (!m_killed) { stopWatch.Start(); if (m_state == DSRS_LISTENING) { // Only check for the RF header every 100ms or so if (m_headerReadTimer.hasExpired()) { bool error = receiveRadioHeader(); if (error) reopenModem(); m_headerReadTimer.reset(); } } else { bool error = receiveRadioData(); if (error) reopenModem(); } if (m_killed) break; // Listen all the time on the network for status packets at least receiveNetwork(); // Send the network poll if needed and restart the timer if (m_pollTimer.hasExpired()) { #if defined(__WINDOWS__) m_protocolHandler->writePoll(wxT("win_gmsk-") + VERSION); #else m_protocolHandler->writePoll(wxT("linux_gmsk-") + VERSION); #endif m_pollTimer.reset(); } unsigned long ms = stopWatch.Time(); // Don't sleep when reading from the modem if (m_state != DSRS_VALID) { if (ms < m_cycleTime) Sleep(m_cycleTime - ms); ms = stopWatch.Time(); } // Catch up with the clock clock(ms); } wxLogMessage(wxT("Stopping the GMSK receiver thread")); if (m_modem != NULL) { m_modem->close(); delete m_modem; } m_protocolHandler->close(); delete m_protocolHandler; return NULL; }