From 9a72e95ec073ed82f5765c931f64fff25b97b4e3 Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Sat, 17 Oct 2020 16:47:19 +0100 Subject: [PATCH] Clean compile(-ish), still more to do. --- M17Control.cpp | 338 +++++-------------------------------------------- M17Control.h | 2 +- M17LICH.h | 1 + M17Network.cpp | 11 +- MMDVMHost.cpp | 4 +- Sync.cpp | 2 +- 6 files changed, 41 insertions(+), 317 deletions(-) diff --git a/M17Control.cpp b/M17Control.cpp index 24cc8c3..1169a5c 100644 --- a/M17Control.cpp +++ b/M17Control.cpp @@ -72,10 +72,10 @@ m_networkWatchdog(1000U, 0U, 1500U), m_elapsed(), m_rfFrames(0U), m_netFrames(0U), +m_rfLastFN(0U), m_rfErrs(0U), m_rfBits(1U), m_rfLICH(), -m_rfMask(0x00U), m_netLICH(), m_rssiMapper(rssiMapper), m_rssi(0U), @@ -122,7 +122,6 @@ bool CM17Control::writeModem(unsigned char* data, unsigned int len) if (type == TAG_LOST) { m_rfState = RS_RF_LISTENING; - m_rfMask = 0x00U; return false; } @@ -154,7 +153,7 @@ bool CM17Control::writeModem(unsigned char* data, unsigned int len) interleaver(temp, data + 2U); if (m_rfState == RS_RF_LISTENING) { - m_rfMask = 0x00U; + m_rfLICH.reset(); CM17Convolution conv; conv.start(); @@ -180,6 +179,7 @@ bool CM17Control::writeModem(unsigned char* data, unsigned int len) m_maxRSSI = m_rssi; m_aveRSSI = m_rssi; m_rssiCount = 1U; + m_rfLastFN = 0U; #if defined(DUMP_M17) openFile(); @@ -259,7 +259,7 @@ bool CM17Control::writeModem(unsigned char* data, unsigned int len) bool valid = CM17CRC::checkCRC(frame, M17_FN_LENGTH_BITS + M17_PAYLOAD_LENGTH_BITS + M17_CRC_LENGTH_BITS); if (valid) { - unsigned int fn = (frame[0U] << 8) + (frame[1U] << 0); + m_rfLastFN = (frame[0U] << 8) + (frame[1U] << 0); unsigned int frag1, frag2, frag3, frag4; @@ -270,7 +270,7 @@ bool CM17Control::writeModem(unsigned char* data, unsigned int len) unsigned int lich3 = CGolay24128::decode24128(frag3); unsigned int lich4 = CGolay24128::decode24128(frag4); - m_rfLICH.setFragment(data + 2U + M17_SYNC_LENGTH_BYTES, fn & 0x7FFFU); + m_rfLICH.setFragment(data + 2U + M17_SYNC_LENGTH_BYTES, m_rfLastFN & 0x7FFFU); valid = m_rfLICH.isValid(); if (valid) { @@ -343,321 +343,45 @@ bool CM17Control::writeModem(unsigned char* data, unsigned int len) #if defined(DUMP_M17) writeFile(data + 2U); #endif - if (m_duplex) - writeQueueRF(data); - if (data[0U] == TAG_EOT) { - std::string source = m_rfLICH.getSource(); - std::string dest = m_rfLICH.getDest(); + CM17Convolution conv; + conv.start(); - m_rfFrames++; - if (m_rssi != 0U) - LogMessage("M17, received RF end of transmission from %s to %s, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", source.c_str(), dest.c_str(), float(m_rfFrames) / 25.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCount); - else - LogMessage("M17, received RF end of transmission from %s to %s, %.1f seconds, BER: %.1f%%", source.c_str(), dest.c_str(), float(m_rfFrames) / 25.0F, float(m_rfErrs * 100U) / float(m_rfBits)); - writeEndRF(); - } - else { - m_rfFrames = 0U; - m_rfErrs = 0U; - m_rfBits = 1U; - m_rfTimeoutTimer.start(); - m_rfState = RS_RF_AUDIO; - m_minRSSI = m_rssi; - m_maxRSSI = m_rssi; - m_aveRSSI = m_rssi; - m_rssiCount = 1U; -#if defined(DUMP_M17) - openFile(); -#endif - unsigned short srcId = m_rfLayer3.getSourceUnitId(); - unsigned short dstId = m_rfLayer3.getDestinationGroupId(); - bool grp = m_rfLayer3.getIsGroup(); + unsigned int n = 2U + M17_SYNC_LENGTH_BYTES + M17_LICH_FRAGMENT_LENGTH_BYTES; + for (unsigned int i = 0U; i < (M17_LICH_LENGTH_BYTES / 2U); i++) { + uint8_t s0 = data[n++]; + uint8_t s1 = data[n++]; - std::string source = m_lookup->find(srcId); - LogMessage("M17, received RF header from %s to %s%u", source.c_str(), grp ? "TG " : "", dstId); - m_display->writeM17(source.c_str(), grp, dstId, "R"); + conv.decode(s0, s1); } - return true; - } - else { - if (m_rfState == RS_RF_LISTENING) { - CM17FACCH1 facch; - bool valid = false; - switch (option) { - case M17_LICH_STEAL_FACCH: - valid = facch.decode(data + 2U, M17_FSW_LENGTH_BITS + M17_LICH_LENGTH_BITS + M17_SACCH_LENGTH_BITS); - if (!valid) - valid = facch.decode(data + 2U, M17_FSW_LENGTH_BITS + M17_LICH_LENGTH_BITS + M17_SACCH_LENGTH_BITS + M17_FACCH1_LENGTH_BITS); - break; - case M17_LICH_STEAL_FACCH1_1: - valid = facch.decode(data + 2U, M17_FSW_LENGTH_BITS + M17_LICH_LENGTH_BITS + M17_SACCH_LENGTH_BITS); - break; - case M17_LICH_STEAL_FACCH1_2: - valid = facch.decode(data + 2U, M17_FSW_LENGTH_BITS + M17_LICH_LENGTH_BITS + M17_SACCH_LENGTH_BITS + M17_FACCH1_LENGTH_BITS); - break; - default: - break; - } + unsigned char frame[M17_FN_LENGTH_BYTES + M17_PAYLOAD_LENGTH_BYTES + M17_CRC_LENGTH_BYTES]; + conv.chainback(frame, M17_FN_LENGTH_BITS + M17_PAYLOAD_LENGTH_BITS + M17_CRC_LENGTH_BITS); - bool hasInfo = false; - if (valid) { - unsigned char buffer[10U]; - facch.getData(buffer); + bool valid = CM17CRC::checkCRC(frame, M17_FN_LENGTH_BITS + M17_PAYLOAD_LENGTH_BITS + M17_CRC_LENGTH_BITS); + if (valid) { + m_rfLastFN = (frame[0U] << 8) + (frame[1U] << 0); - CM17Layer3 layer3; - layer3.decode(buffer, M17_FACCH1_LENGTH_BITS); - - hasInfo = layer3.getMessageType() == M17_MESSAGE_TYPE_VCALL; - if (!hasInfo) - return false; - - m_rfLayer3 = layer3; - } - - if (!hasInfo) { - unsigned char message[3U]; - sacch.getData(message); - - unsigned char structure = sacch.getStructure(); - switch (structure) { - case M17_SR_1_4: - m_rfLayer3.decode(message, 18U, 0U); - if (m_rfLayer3.getMessageType() == M17_MESSAGE_TYPE_VCALL) - m_rfMask = 0x01U; - else - m_rfMask = 0x00U; - break; - case M17_SR_2_4: - m_rfMask |= 0x02U; - m_rfLayer3.decode(message, 18U, 18U); - break; - case M17_SR_3_4: - m_rfMask |= 0x04U; - m_rfLayer3.decode(message, 18U, 36U); - break; - case M17_SR_4_4: - m_rfMask |= 0x08U; - m_rfLayer3.decode(message, 18U, 54U); - break; - default: - break; - } - - if (m_rfMask != 0x0FU) - return false; - - unsigned char type = m_rfLayer3.getMessageType(); - if (type != M17_MESSAGE_TYPE_VCALL) - return false; - } - - unsigned short srcId = m_rfLayer3.getSourceUnitId(); - unsigned short dstId = m_rfLayer3.getDestinationGroupId(); - bool grp = m_rfLayer3.getIsGroup(); - - if (m_selfOnly) { - if (srcId != m_id) { - m_rfState = RS_RF_REJECTED; - return false; - } - } - - m_rfFrames = 0U; - m_rfErrs = 0U; - m_rfBits = 1U; - m_rfTimeoutTimer.start(); - m_rfState = RS_RF_AUDIO; - - m_minRSSI = m_rssi; - m_maxRSSI = m_rssi; - m_aveRSSI = m_rssi; - m_rssiCount = 1U; -#if defined(DUMP_M17) - openFile(); -#endif - std::string source = m_lookup->find(srcId); - LogMessage("M17, received RF late entry from %s to %s%u", source.c_str(), grp ? "TG " : "", dstId); - m_display->writeM17(source.c_str(), grp, dstId, "R"); - - m_rfState = RS_RF_AUDIO; - - // Create a dummy start message - unsigned char start[M17_FRAME_LENGTH_BYTES + 2U]; - - start[0U] = TAG_DATA; - start[1U] = 0x00U; - - // Generate the sync - CSync::addM17Sync(start + 2U); - - // Generate the LICH - CM17LICH lich; - lich.setRFCT(M17_LICH_RFCT_RDCH); - lich.setFCT(M17_LICH_USC_SACCH_NS); - lich.setOption(M17_LICH_STEAL_FACCH); - lich.setDirection(m_remoteGateway || !m_duplex ? M17_LICH_DIRECTION_INBOUND : M17_LICH_DIRECTION_OUTBOUND); - lich.encode(start + 2U); - - lich.setDirection(M17_LICH_DIRECTION_INBOUND); - netData[0U] = lich.getRaw(); - - CM17SACCH sacch; - sacch.setRAN(m_ran); - sacch.setStructure(M17_SR_SINGLE); - sacch.setData(SACCH_IDLE); - sacch.encode(start + 2U); - - sacch.getRaw(netData + 1U); - - unsigned char message[22U]; - m_rfLayer3.getData(message); - - facch.setData(message); - facch.encode(start + 2U, M17_FSW_LENGTH_BITS + M17_LICH_LENGTH_BITS + M17_SACCH_LENGTH_BITS); - facch.encode(start + 2U, M17_FSW_LENGTH_BITS + M17_LICH_LENGTH_BITS + M17_SACCH_LENGTH_BITS + M17_FACCH1_LENGTH_BITS); - - facch.getRaw(netData + 5U + 0U); - facch.getRaw(netData + 5U + 14U); - - interleaver(start + 2U); - decorrelator(start + 2U); - - writeNetwork(netData); - -#if defined(DUMP_M17) - writeFile(start + 2U); -#endif - if (m_duplex) - writeQueueRF(start); + } else { + m_rfLastFN++; } - } - - if (m_rfState == RS_RF_AUDIO) { - // Regenerate the sync - CSync::addM17Sync(data + 2U); - - // Regenerate the LICH - CM17LICH lich; - lich.setRFCT(M17_LICH_RFCT_RDCH); - lich.setFCT(M17_LICH_USC_SACCH_SS); - lich.setOption(option); - lich.setDirection(m_remoteGateway || !m_duplex ? M17_LICH_DIRECTION_INBOUND : M17_LICH_DIRECTION_OUTBOUND); - lich.encode(data + 2U); - - lich.setDirection(M17_LICH_DIRECTION_INBOUND); - netData[0U] = lich.getRaw(); - - // Regenerate SACCH if it's valid - CM17SACCH sacch; - bool validSACCH = sacch.decode(data + 2U); - if (validSACCH) { - sacch.setRAN(m_ran); - sacch.encode(data + 2U); - } - - sacch.getRaw(netData + 1U); - - // Regenerate the audio and interpret the FACCH1 data - if (option == M17_LICH_STEAL_NONE) { - CAMBEFEC ambe; - unsigned int errors = 0U; - errors += ambe.regenerateYSFDN(data + 2U + M17_FSW_LICH_SACCH_LENGTH_BYTES + 0U); - errors += ambe.regenerateYSFDN(data + 2U + M17_FSW_LICH_SACCH_LENGTH_BYTES + 9U); - errors += ambe.regenerateYSFDN(data + 2U + M17_FSW_LICH_SACCH_LENGTH_BYTES + 18U); - errors += ambe.regenerateYSFDN(data + 2U + M17_FSW_LICH_SACCH_LENGTH_BYTES + 27U); - m_rfErrs += errors; - m_rfBits += 188U; - m_display->writeM17BER(float(errors) / 1.88F); - LogDebug("M17, AMBE FEC %u/188 (%.1f%%)", errors, float(errors) / 1.88F); - - CM17Audio audio; - audio.decode(data + 2U + M17_FSW_LICH_SACCH_LENGTH_BYTES + 0U, netData + 5U + 0U); - audio.decode(data + 2U + M17_FSW_LICH_SACCH_LENGTH_BYTES + 18U, netData + 5U + 14U); - } - else if (option == M17_LICH_STEAL_FACCH1_1) { - CM17FACCH1 facch1; - bool valid = facch1.decode(data + 2U, M17_FSW_LENGTH_BITS + M17_LICH_LENGTH_BITS + M17_SACCH_LENGTH_BITS); - if (valid) - facch1.encode(data + 2U, M17_FSW_LENGTH_BITS + M17_LICH_LENGTH_BITS + M17_SACCH_LENGTH_BITS); - facch1.getRaw(netData + 5U + 0U); - - CAMBEFEC ambe; - unsigned int errors = 0U; - errors += ambe.regenerateYSFDN(data + 2U + M17_FSW_LICH_SACCH_LENGTH_BYTES + 18U); - errors += ambe.regenerateYSFDN(data + 2U + M17_FSW_LICH_SACCH_LENGTH_BYTES + 27U); - m_rfErrs += errors; - m_rfBits += 94U; - m_display->writeM17BER(float(errors) / 0.94F); - LogDebug("M17, AMBE FEC %u/94 (%.1f%%)", errors, float(errors) / 0.94F); - - CM17Audio audio; - audio.decode(data + 2U + M17_FSW_LICH_SACCH_LENGTH_BYTES + 18U, netData + 5U + 14U); - } - else if (option == M17_LICH_STEAL_FACCH1_2) { - CAMBEFEC ambe; - unsigned int errors = 0U; - errors += ambe.regenerateYSFDN(data + 2U + M17_FSW_LICH_SACCH_LENGTH_BYTES); - errors += ambe.regenerateYSFDN(data + 2U + M17_FSW_LICH_SACCH_LENGTH_BYTES + 9U); - m_rfErrs += errors; - m_rfBits += 94U; - m_display->writeM17BER(float(errors) / 0.94F); - LogDebug("M17, AMBE FEC %u/94 (%.1f%%)", errors, float(errors) / 0.94F); - - CM17Audio audio; - audio.decode(data + 2U + M17_FSW_LICH_SACCH_LENGTH_BYTES + 0U, netData + 5U + 0U); - - CM17FACCH1 facch1; - bool valid = facch1.decode(data + 2U, M17_FSW_LENGTH_BITS + M17_LICH_LENGTH_BITS + M17_SACCH_LENGTH_BITS + M17_FACCH1_LENGTH_BITS); - if (valid) - facch1.encode(data + 2U, M17_FSW_LENGTH_BITS + M17_LICH_LENGTH_BITS + M17_SACCH_LENGTH_BITS + M17_FACCH1_LENGTH_BITS); - facch1.getRaw(netData + 5U + 14U); - } - else { - CM17FACCH1 facch11; - bool valid1 = facch11.decode(data + 2U, M17_FSW_LENGTH_BITS + M17_LICH_LENGTH_BITS + M17_SACCH_LENGTH_BITS); - if (valid1) - facch11.encode(data + 2U, M17_FSW_LENGTH_BITS + M17_LICH_LENGTH_BITS + M17_SACCH_LENGTH_BITS); - facch11.getRaw(netData + 5U + 0U); - - CM17FACCH1 facch12; - bool valid2 = facch12.decode(data + 2U, M17_FSW_LENGTH_BITS + M17_LICH_LENGTH_BITS + M17_SACCH_LENGTH_BITS + M17_FACCH1_LENGTH_BITS); - if (valid2) - facch12.encode(data + 2U, M17_FSW_LENGTH_BITS + M17_LICH_LENGTH_BITS + M17_SACCH_LENGTH_BITS + M17_FACCH1_LENGTH_BITS); - facch12.getRaw(netData + 5U + 14U); - } - - data[0U] = TAG_DATA; - data[1U] = 0x00U; - - unsigned char temp[M17_FRAME_LENGTH_BYTES]; - interleaver(data + 2U, temp); - decorrelator(temp, data + 2U); - - writeNetwork(netData); - -#if defined(DUMP_M17) - writeFile(data + 2U); -#endif if (m_duplex) writeQueueRF(data); m_rfFrames++; - m_display->writeM17RSSI(m_rssi); - } + // EOT? + if ((m_rfLastFN & 0x8000U) == 0x8000U) { + std::string source = m_rfLICH.getSource(); + std::string dest = m_rfLICH.getDest(); - m_rfFrames++; - - // EOT? - if ((fn & 0x8000U) == 0x8000U) { - if (m_rssi != 0U) - LogMessage("M17, received RF end of transmission from %s to %s, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", source.c_str(), dest.c_str(), float(m_rfFrames) / 25.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCount); - else - LogMessage("M17, received RF end of transmission from %s to %s, %.1f seconds, BER: %.1f%%", source.c_str(), dest.c_str(), float(m_rfFrames) / 25.0F, float(m_rfErrs * 100U) / float(m_rfBits)); - writeEndRF(); + if (m_rssi != 0U) + LogMessage("M17, received RF end of transmission from %s to %s, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", source.c_str(), dest.c_str(), float(m_rfFrames) / 25.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCount); + else + LogMessage("M17, received RF end of transmission from %s to %s, %.1f seconds, BER: %.1f%%", source.c_str(), dest.c_str(), float(m_rfFrames) / 25.0F, float(m_rfErrs * 100U) / float(m_rfBits)); + writeEndRF(); + } } return true; @@ -682,8 +406,6 @@ void CM17Control::writeEndRF() { m_rfState = RS_RF_LISTENING; - m_rfMask = 0x00U; - m_rfTimeoutTimer.stop(); if (m_netState == RS_NET_IDLE) { @@ -1003,8 +725,6 @@ void CM17Control::enable(bool enabled) // Reset the RF section m_rfState = RS_RF_LISTENING; - m_rfMask = 0x00U; - m_rfTimeoutTimer.stop(); // Reset the networking section diff --git a/M17Control.h b/M17Control.h index 371b729..ed39f3a 100644 --- a/M17Control.h +++ b/M17Control.h @@ -63,10 +63,10 @@ private: CStopWatch m_elapsed; unsigned int m_rfFrames; unsigned int m_netFrames; + unsigned int m_rfLastFN; unsigned int m_rfErrs; unsigned int m_rfBits; CM17LICH m_rfLICH; - unsigned char m_rfMask; CM17LICH m_netLICH; CRSSIInterpolator* m_rssiMapper; unsigned char m_rssi; diff --git a/M17LICH.h b/M17LICH.h index c16a58f..4c4346c 100644 --- a/M17LICH.h +++ b/M17LICH.h @@ -34,6 +34,7 @@ public: std::string getDest() const; unsigned char getDataType() const; + void reset(); bool isValid() const; void getLinkSetup(unsigned char* data) const; diff --git a/M17Network.cpp b/M17Network.cpp index 6e4d66e..28314cd 100644 --- a/M17Network.cpp +++ b/M17Network.cpp @@ -174,11 +174,6 @@ void CM17Network::clock(unsigned int ms) return; } - if (::memcmp(buffer + 0U, "PING", 4U) == 0) { - sendPong(); - return; - } - if (::memcmp(buffer + 0U, "DISC", 4U) == 0) { m_timer.stop(); m_state = M17N_NOTLINKED; @@ -186,6 +181,12 @@ void CM17Network::clock(unsigned int ms) return; } + if (::memcmp(buffer + 0U, "PING", 4U) == 0) { + if (m_state == M17N_LINKED) + sendPong(); + return; + } + if (!m_enabled) return; diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index 6d8880a..b30263f 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -1551,7 +1551,7 @@ bool CMMDVMHost::createM17Network() LogInfo(" Local Port: %u", localPort); LogInfo(" Mode Hang: %us", m_m17NetModeHang); - m_m17Network = new CM17Network(localPort, gatewayAddress, gatewayPort, debug); + m_m17Network = new CM17Network(localPort, debug); bool ret = m_m17Network->open(); if (!ret) { delete m_m17Network; @@ -1559,6 +1559,8 @@ bool CMMDVMHost::createM17Network() return false; } + m_m17Network->link(gatewayAddress, gatewayPort, "M17-USA", 'A'); + m_m17Network->enable(true); return true; diff --git a/Sync.cpp b/Sync.cpp index 7144683..34dec37 100644 --- a/Sync.cpp +++ b/Sync.cpp @@ -89,5 +89,5 @@ void CSync::addM17Sync(unsigned char* data) { assert(data != NULL); - ::memcpy(data, M17_SYNC_BYTES, M17_SYNC_BYTES_LENGTH); + ::memcpy(data, M17_SYNC_BYTES, M17_SYNC_LENGTH_BYTES); }