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);
}
Beispiel #2
0
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;
	}
}