diff --git a/NXDNControl.cpp b/NXDNControl.cpp index 4eeea24..4023dc6 100644 --- a/NXDNControl.cpp +++ b/NXDNControl.cpp @@ -230,7 +230,7 @@ bool CNXDNControl::processVoice(unsigned char usc, unsigned char option, unsigne scrambler(data + 2U); - // writeNetwork(data, m_rfFrames, ); + writeNetwork(data, false); #if defined(DUMP_NXDN) writeFile(data + 2U); @@ -401,7 +401,7 @@ bool CNXDNControl::processVoice(unsigned char usc, unsigned char option, unsigne scrambler(start + 2U); - // writeNetwork(start, m_rfFrames, ); + writeNetwork(start, false); #if defined(DUMP_NXDN) writeFile(start + 2U); @@ -515,7 +515,7 @@ bool CNXDNControl::processVoice(unsigned char usc, unsigned char option, unsigne scrambler(data + 2U); - // writeNetwork(data, m_rfFrames, ); + writeNetwork(data, false); #if defined(DUMP_NXDN) writeFile(data + 2U); @@ -575,6 +575,9 @@ bool CNXDNControl::processData(unsigned char option, unsigned char *data) LogMessage("NXDN, received RF data header from %s to %s%u, %u blocks", source.c_str(), grp ? "TG " : "", dstId, frames); + m_rfLayer3 = layer3; + m_rfFrames = 0U; + m_rfState = RS_RF_DATA; #if defined(DUMP_NXDN) @@ -607,21 +610,20 @@ bool CNXDNControl::processData(unsigned char option, unsigned char *data) scrambler(data + 2U); - writeQueueNet(data); + writeNetwork(data, true); if (m_duplex) writeQueueRF(data); + m_rfFrames++; + #if defined(DUMP_NXDN) writeFile(data + 2U); #endif - if (validUDCH) { - unsigned char type = layer3.getMessageType(); - if (type == NXDN_MESSAGE_TYPE_TX_REL) { - LogMessage("NXDN, ended RF data transmission"); - writeEndRF(); - } + if (data[0U] == TAG_EOT) { + LogMessage("NXDN, ended RF data transmission"); + writeEndRF(); } return true; @@ -753,7 +755,7 @@ void CNXDNControl::writeQueueNet(const unsigned char *data) m_queue.addData(data, len); } -void CNXDNControl::writeNetwork(const unsigned char *data, unsigned int count, bool end) +void CNXDNControl::writeNetwork(const unsigned char *data, bool dat) { assert(data != NULL); @@ -767,7 +769,9 @@ void CNXDNControl::writeNetwork(const unsigned char *data, unsigned int count, b unsigned short dstId = m_rfLayer3.getDestinationGroupId(); bool grp = m_rfLayer3.getIsGroup(); - m_network->write(data + 2U, srcId, grp, dstId, count % 256U, end); + bool end = data[0U] == TAG_EOT; + + m_network->write(data + 2U, srcId, grp, dstId, dat, m_rfFrames, end); } void CNXDNControl::scrambler(unsigned char* data) const diff --git a/NXDNControl.h b/NXDNControl.h index 5f000e7..d0934b6 100644 --- a/NXDNControl.h +++ b/NXDNControl.h @@ -86,7 +86,7 @@ private: void writeQueueRF(const unsigned char* data); void writeQueueNet(const unsigned char* data); - void writeNetwork(const unsigned char* data, unsigned int count, bool end); + void writeNetwork(const unsigned char* data, bool dat); void writeNetwork(); void scrambler(unsigned char* data) const; diff --git a/NXDNNetwork.cpp b/NXDNNetwork.cpp index 6453829..53cfb05 100644 --- a/NXDNNetwork.cpp +++ b/NXDNNetwork.cpp @@ -32,11 +32,14 @@ CNXDNNetwork::CNXDNNetwork(const std::string& myAddress, unsigned int myPort, co m_socket(myAddress, myPort), m_address(), m_port(gatewayPort), +m_callsign(callsign), m_debug(debug), m_enabled(false), m_buffer(1000U, "NXDN Network"), m_pollTimer(1000U, 5U) { + m_callsign.resize(10U, ' '); + m_address = CUDPSocket::lookup(gatewayAddress); } @@ -56,7 +59,7 @@ bool CNXDNNetwork::open() return m_socket.open(); } -bool CNXDNNetwork::write(const unsigned char* data, unsigned short src, bool grp, unsigned short dst, unsigned char cnt, bool end) +bool CNXDNNetwork::write(const unsigned char* data, unsigned short src, bool grp, unsigned short dst, bool dat, unsigned char cnt, bool end) { assert(data != NULL); @@ -72,7 +75,8 @@ bool CNXDNNetwork::write(const unsigned char* data, unsigned short src, bool grp buffer[6U] = (src >> 8) & 0xFFU; buffer[7U] = grp ? 0x01U : 0x00U; - buffer[7U] |= end ? 0x80U : 0x00U; + buffer[7U] |= dat ? 0x02U : 0x00U; + buffer[7U] |= end ? 0x04U : 0x00U; buffer[8U] = (dst >> 8) & 0xFFU; buffer[9U] = (dst >> 8) & 0xFFU; @@ -97,10 +101,13 @@ bool CNXDNNetwork::writePoll() buffer[3U] = 'N'; buffer[4U] = 'P'; - if (m_debug) - CUtils::dump(1U, "NXDN Network Poll Sent", buffer, 5U); + for (unsigned int i = 0U; i < 10U; i++) + buffer[5U + i] = m_callsign.at(i); - return m_socket.write(buffer, 5U, m_address, m_port); + if (m_debug) + CUtils::dump(1U, "NXDN Network Poll Sent", buffer, 15U); + + return m_socket.write(buffer, 15U, m_address, m_port); } void CNXDNNetwork::clock(unsigned int ms) @@ -142,7 +149,7 @@ void CNXDNNetwork::clock(unsigned int ms) m_buffer.addData(buffer, 59U); } -unsigned int CNXDNNetwork::read(unsigned char* data, unsigned short& src, bool& grp, unsigned short& dst, unsigned char& cnt, bool& end) +unsigned int CNXDNNetwork::read(unsigned char* data, unsigned short& src, bool& grp, unsigned short& dst, bool& dat, unsigned char& cnt, bool& end) { assert(data != NULL); @@ -154,7 +161,8 @@ unsigned int CNXDNNetwork::read(unsigned char* data, unsigned short& src, bool& src = (buffer[5U] << 8) + buffer[6U]; grp = (buffer[7U] & 0x01U) == 0x01U; - end = (buffer[7U] & 0x80U) == 0x80U; + dat = (buffer[7U] & 0x02U) == 0x02U; + end = (buffer[7U] & 0x04U) == 0x04U; dst = (buffer[8U] << 8) + buffer[9U]; cnt = buffer[10U]; diff --git a/NXDNNetwork.h b/NXDNNetwork.h index c69602a..3ef9fda 100644 --- a/NXDNNetwork.h +++ b/NXDNNetwork.h @@ -36,9 +36,9 @@ public: void enable(bool enabled); - bool write(const unsigned char* data, unsigned short src, bool grp, unsigned short dst, unsigned char cnt, bool end); + bool write(const unsigned char* data, unsigned short src, bool grp, unsigned short dst, bool dat, unsigned char cnt, bool end); - unsigned int read(unsigned char* data, unsigned short& src, bool& grp, unsigned short& dst, unsigned char& cnt, bool& end); + unsigned int read(unsigned char* data, unsigned short& src, bool& grp, unsigned short& dst, bool& dat, unsigned char& cnt, bool& end); void reset(); @@ -50,6 +50,7 @@ private: CUDPSocket m_socket; in_addr m_address; unsigned int m_port; + std::string m_callsign; bool m_debug; bool m_enabled; CRingBuffer m_buffer;