void CRepeaterProtocolHandler::readText(wxString& text, LINK_STATUS& status, wxString& reflector) { if (m_type != NETWORK_TEXT) { text = wxT(" "); reflector = wxT(" "); status = LS_NONE; return; } text = wxString((char*)(m_buffer + 5U), wxConvLocal, 20U); status = LINK_STATUS(m_buffer[25U]); reflector = wxString((char*)(m_buffer + 26U), wxConvLocal, 8U); }
void CDStarNetwork::clock(unsigned int ms) { m_pollTimer.clock(ms); if (m_pollTimer.hasExpired()) { char text[60U]; #if defined(_WIN32) || defined(_WIN64) if (m_duplex) ::sprintf(text, "win_mmdvm-%s", m_version); else ::sprintf(text, "win_mmdvm-dvmega-%s", m_version); #else if (m_duplex) ::sprintf(text, "linux_mmdvm-%s", m_version); else ::sprintf(text, "linux_mmdvm-dvmega-%s", m_version); #endif writePoll(text); m_pollTimer.start(); } unsigned char buffer[BUFFER_LENGTH]; in_addr address; unsigned int port; int length = m_socket.read(buffer, BUFFER_LENGTH, address, port); if (length <= 0) return; // Check if the data is for us if (m_address.s_addr != address.s_addr || m_port != port) { LogMessage("D-Star packet received from an invalid source, %08X != %08X and/or %u != %u", m_address.s_addr, address.s_addr, m_port, port); return; } // Invalid packet type? if (::memcmp(buffer, "DSRP", 4U) != 0) return; switch (buffer[4]) { case 0x00U: // NETWORK_TEXT; if (m_debug) CUtils::dump(1U, "D-Star Network Status Received", buffer, length); m_linkStatus = LINK_STATUS(buffer[25U]); ::memcpy(m_linkReflector, buffer + 26U, DSTAR_LONG_CALLSIGN_LENGTH); LogMessage("D-Star link status set to \"%20.20s\"", buffer + 5U); return; case 0x01U: // NETWORK_TEMPTEXT; case 0x04U: // NETWORK_STATUS1..5 case 0x24U: // NETWORK_DD_DATA return; case 0x20U: // NETWORK_HEADER if (m_inId == 0U && m_enabled) { if (m_debug) CUtils::dump(1U, "D-Star Network Header Received", buffer, length); m_inId = buffer[5] * 256U + buffer[6]; unsigned char c = length - 7U; m_buffer.addData(&c, 1U); c = TAG_HEADER; m_buffer.addData(&c, 1U); m_buffer.addData(buffer + 8U, length - 8U); } break; case 0x21U: // NETWORK_DATA if (m_enabled) { if (m_debug) CUtils::dump(1U, "D-Star Network Data Received", buffer, length); uint16_t id = buffer[5] * 256U + buffer[6]; // Check that the stream id matches the valid header, reject otherwise if (id == m_inId && m_enabled) { unsigned char ctrl[3U]; ctrl[0U] = length - 7U; // Is this the last packet in the stream? if ((buffer[7] & 0x40) == 0x40) { m_inId = 0U; ctrl[1U] = TAG_EOT; } else { ctrl[1U] = TAG_DATA; } ctrl[2U] = buffer[7] & 0x3FU; m_buffer.addData(ctrl, 3U); m_buffer.addData(buffer + 9U, length - 9U); } } break; default: CUtils::dump("Unknown D-Star packet from the Gateway", buffer, length); break; } }