bool CDVRPTRControllerV2::setConfig() { unsigned char buffer[105U]; ::memset(buffer, 0x00U, 105U); buffer[0U] = 'H'; buffer[1U] = 'E'; buffer[2U] = 'A'; buffer[3U] = 'D'; buffer[4U] = 'X'; buffer[5U] = '9'; buffer[6U] = '0'; buffer[7U] = '0'; buffer[8U] = '1'; ::memset(buffer + 9U, ' ', LONG_CALLSIGN_LENGTH); for (unsigned int i = 0U; i < LONG_CALLSIGN_LENGTH && i < m_callsign.Len(); i++) buffer[9U + i] = m_callsign.GetChar(i); buffer[65U] = m_duplex ? 0x03U : 0x00U; buffer[66U] = m_txInvert ? 0x01U : 0x00U; buffer[73U] = (m_modLevel * 256U) / 100U; buffer[87U] = 0x01U; // CUtils::dump(wxT("Written"), buffer, 105U); int ret = writeModem(buffer, 105U); if (ret != 105) return false; unsigned int count = 0U; unsigned int length; RESP_TYPE_V2 resp; do { ::wxMilliSleep(10UL); resp = getResponse(m_buffer, length); if (resp != RT2_CONFIG) { count++; if (count >= MAX_RESPONSES) { wxLogError(wxT("The DV-RPTR modem is not responding to the configure command")); return false; } } } while (resp != RT2_CONFIG); // CUtils::dump(wxT("Response"), m_buffer, length); wxString firmware((char*)(m_buffer + 9U), wxConvLocal); wxLogInfo(wxT("DV-RPTR Modem Firmware version: %s"), firmware.c_str()); return true; }
bool CDVRPTRV3Controller::readSpace() { unsigned char buffer[10U]; buffer[0U] = 'H'; buffer[1U] = 'E'; buffer[2U] = 'A'; buffer[3U] = 'D'; buffer[4U] = 'Y'; buffer[5U] = '9'; buffer[6U] = '0'; buffer[7U] = '1'; buffer[8U] = '1'; buffer[9U] = 0x00U; // CUtils::dump(wxT("Written"), buffer, 10U); return writeModem(buffer, 10U); }
bool CDVRPTRV3Controller::readSerial() { unsigned char buffer[105U]; ::memset(buffer, 0x00U, 105U); buffer[0U] = 'H'; buffer[1U] = 'E'; buffer[2U] = 'A'; buffer[3U] = 'D'; buffer[4U] = 'X'; buffer[5U] = '9'; buffer[6U] = '0'; buffer[7U] = '0'; buffer[8U] = '0'; // CUtils::dump(wxT("Written"), buffer, 105U); bool ret = writeModem(buffer, 105U); if (!ret) return false; unsigned int count = 0U; unsigned int length; RESP_TYPE_V3 resp; do { ::wxMilliSleep(10UL); resp = getResponse(m_buffer, length); if (resp != RT3_QUERY) { count++; if (count >= MAX_RESPONSES) { wxLogError(wxT("The DV-RPTR modem is not responding to the query command")); return false; } } } while (resp != RT3_QUERY); wxLogInfo(wxT("DV-RPTR Modem Hardware serial: 0x%02X%02X%02x%02X"), m_buffer[9U], m_buffer[10U], m_buffer[11U], m_buffer[12U]); return true; }
void* CDVRPTRV3Controller::Entry() { wxLogMessage(wxT("Starting DV-RPTR3 Modem Controller thread")); // Clock every 5ms-ish CTimer pollTimer(200U, 0U, 250U); pollTimer.start(); unsigned int space = 0U; while (!m_stopped) { // Poll the modem status every 250ms if (pollTimer.hasExpired()) { bool ret = readSpace(); if (!ret) { ret = findModem(); if (!ret) { wxLogMessage(wxT("Stopping DV-RPTR3 Modem Controller thread")); return NULL; } } pollTimer.start(); } unsigned int length; RESP_TYPE_V3 type = getResponse(m_buffer, length); switch (type) { case RT3_TIMEOUT: break; case RT3_ERROR: { bool ret = findModem(); if (!ret) { wxLogMessage(wxT("Stopping DV-RPTR3 Modem Controller thread")); return NULL; } } break; case RT3_HEADER: { // CUtils::dump(wxT("RT3_HEADER"), m_buffer, length); wxMutexLocker locker(m_mutex); unsigned char data[2U]; data[0U] = DSMTT_HEADER; data[1U] = RADIO_HEADER_LENGTH_BYTES; m_rxData.addData(data, 2U); m_rxData.addData(m_buffer + 9U, RADIO_HEADER_LENGTH_BYTES - 2U); // Dummy checksum data[0U] = 0xFFU; data[1U] = 0xFFU; m_rxData.addData(data, 2U); data[0U] = DSMTT_DATA; data[1U] = DV_FRAME_LENGTH_BYTES; m_rxData.addData(data, 2U); m_rxData.addData(m_buffer + 51U, DV_FRAME_LENGTH_BYTES); m_rx = true; } break; case RT3_DATA: { // CUtils::dump(wxT("RT3_DATA"), m_buffer, length); wxMutexLocker locker(m_mutex); unsigned char data[2U]; data[0U] = DSMTT_DATA; data[1U] = DV_FRAME_LENGTH_BYTES; m_rxData.addData(data, 2U); m_rxData.addData(m_buffer + 5U, DV_FRAME_LENGTH_BYTES); m_rx = true; // End of transmission? bool end = (m_buffer[19U] & 0x40U) == 0x40U; if (end) { data[0U] = DSMTT_EOT; data[1U] = 0U; m_rxData.addData(data, 2U); m_rx = false; } } break; case RT3_SPACE: space = m_buffer[9U]; // CUtils::dump(wxT("RT3_SPACE"), m_buffer, length); break; // These should not be received in this loop, but don't complain if we do case RT3_QUERY: case RT3_CONFIG: break; default: wxLogMessage(wxT("Unknown DV-RPTR3 message, type")); CUtils::dump(wxT("Buffer dump"), m_buffer, length); break; } if (space > 0U) { if (m_txData.hasData()) { unsigned char len = 0U; unsigned char data[200U]; { wxMutexLocker locker(m_mutex); m_txData.getData(&len, 1U); m_txData.getData(data, len); } // CUtils::dump(wxT("Write"), data, len); bool ret = writeModem(data, len); if (!ret) { bool ret = findModem(); if (!ret) { wxLogMessage(wxT("Stopping DV-RPTR3 Modem Controller thread")); return NULL; } } else { space--; } } } Sleep(5UL); pollTimer.clock(); } wxLogMessage(wxT("Stopping DV-RPTR3 Modem Controller thread")); closeModem(); return NULL; }