From c026471aec8b5618b806a1f3c1a1c907200b2c7a Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Sun, 21 Jun 2020 18:53:38 +0100 Subject: [PATCH] Start the AX.25 transmit path development. --- AX25Control.cpp | 20 +++++++++++++++++++- AX25Control.h | 2 ++ AX25Network.cpp | 2 +- MMDVMHost.cpp | 16 +++++++++++++++- Modem.h | 2 ++ 5 files changed, 39 insertions(+), 3 deletions(-) diff --git a/AX25Control.cpp b/AX25Control.cpp index 563fa42..00cfc0d 100644 --- a/AX25Control.cpp +++ b/AX25Control.cpp @@ -49,7 +49,7 @@ bool CAX25Control::writeModem(unsigned char *data, unsigned int len) if (m_trace) decode(data, len); - CUtils::dump(1U, "AX.25 raw packet", data, len); + CUtils::dump(1U, "AX.25 received packet", data, len); if (m_network == NULL) return true; @@ -57,6 +57,24 @@ bool CAX25Control::writeModem(unsigned char *data, unsigned int len) return m_network->write(data, len); } +unsigned int CAX25Control::readModem(unsigned char* data) +{ + assert(data != NULL); + + if (m_network == NULL) + return 0U; + + if (!m_enabled) + return 0U; + + unsigned int length = m_network->read(data, 500U); + + if (length > 0U) + CUtils::dump(1U, "AX.25 transmitted packet", data, length); + + return length; +} + bool CAX25Control::openFile() { if (m_fp != NULL) diff --git a/AX25Control.h b/AX25Control.h index b0217df..b4fed2a 100644 --- a/AX25Control.h +++ b/AX25Control.h @@ -30,6 +30,8 @@ public: bool writeModem(unsigned char* data, unsigned int len); + unsigned int readModem(unsigned char* data); + void enable(bool enabled); private: diff --git a/AX25Network.cpp b/AX25Network.cpp index 7da9a4c..806844f 100644 --- a/AX25Network.cpp +++ b/AX25Network.cpp @@ -181,7 +181,7 @@ void CAX25Network::enable(bool enabled) { m_enabled = enabled; - if (enabled && !m_enabled) { + if (enabled != m_enabled) { m_rxLastChar = 0U; m_rxLength = 0U; } diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index 12e71b5..6c10567 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -688,7 +688,7 @@ int CMMDVMHost::run() m_ump->setCD(cd); } - unsigned char data[220U]; + unsigned char data[500U]; unsigned int len; bool ret; @@ -989,6 +989,20 @@ int CMMDVMHost::run() } } + if (m_ax25 != NULL) { + ret = m_modem->hasAX25Space(); + if (ret) { + len = m_ax25->readModem(data); + if (len > 0U) { + if (m_mode == MODE_IDLE || m_mode == MODE_FM) { + m_modem->writeAX25Data(data, len); + } else if (m_mode != MODE_LOCKOUT) { + LogWarning("AX.25 data received when in mode %u", m_mode); + } + } + } + } + if (transparentSocket != NULL) { in_addr address; unsigned int port = 0U; diff --git a/Modem.h b/Modem.h index 1f8b291..29ecbe4 100644 --- a/Modem.h +++ b/Modem.h @@ -80,6 +80,7 @@ public: virtual bool hasP25Space() const; virtual bool hasNXDNSpace() const; virtual bool hasPOCSAGSpace() const; + virtual bool hasAX25Space() const; virtual bool hasTX() const; virtual bool hasCD() const; @@ -95,6 +96,7 @@ public: virtual bool writeP25Data(const unsigned char* data, unsigned int length); virtual bool writeNXDNData(const unsigned char* data, unsigned int length); virtual bool writePOCSAGData(const unsigned char* data, unsigned int length); + virtual bool writeAX25Data(const unsigned char* data, unsigned int length); virtual bool writeTransparentData(const unsigned char* data, unsigned int length);