diff --git a/AX25Control.cpp b/AX25Control.cpp index a6b89ea..563fa42 100644 --- a/AX25Control.cpp +++ b/AX25Control.cpp @@ -51,12 +51,10 @@ bool CAX25Control::writeModem(unsigned char *data, unsigned int len) CUtils::dump(1U, "AX.25 raw packet", data, len); - if (m_network != NULL) { - if (isUI(data, len)) - m_network->writeAX25(data, len); - } + if (m_network == NULL) + return true; - return true; + return m_network->write(data, len); } bool CAX25Control::openFile() @@ -233,15 +231,3 @@ bool CAX25Control::decodeAddress(const unsigned char* data, std::string& text, b return (data[6U] & 0x01U) == 0x00U; } - -bool CAX25Control::isUI(const unsigned char* data, unsigned int length) const -{ - assert(data != NULL); - assert(length >= 15U); - - unsigned int n = 13U; - while ((data[n] & 0x01U) == 0x00U && n < length) - n += 7U; - - return (data[n + 1U] & 0xEFU) == 0x03U; -} diff --git a/AX25Control.h b/AX25Control.h index 59b5688..b0217df 100644 --- a/AX25Control.h +++ b/AX25Control.h @@ -38,7 +38,6 @@ private: bool m_enabled; FILE* m_fp; - bool isUI(const unsigned char* data, unsigned int length) const; void decode(const unsigned char* data, unsigned int length); bool decodeAddress(const unsigned char* data, std::string& text, bool isDigi = false) const; bool openFile(); diff --git a/AX25Network.cpp b/AX25Network.cpp index 3f5ac49..5330ec8 100644 --- a/AX25Network.cpp +++ b/AX25Network.cpp @@ -27,34 +27,38 @@ const unsigned int BUFFER_LENGTH = 200U; -CAX25Network::CAX25Network(const std::string& localAddress, unsigned int localPort, const std::string& gatewayAddress, unsigned int gatewayPort, bool debug) : -m_socket(localAddress, localPort), -m_address(), -m_port(gatewayPort), +CAX25Network::CAX25Network(const std::string& port, unsigned int speed, bool debug) : +m_serial(port, SERIAL_SPEED(speed), false), // XXX +m_txData(NULL), +m_txLength(0U), +m_txOffset(0U), +m_rxData(NULL), +m_rxLength(0U), +m_rxComplete(false), m_debug(debug), m_enabled(false) { - assert(gatewayPort > 0U); - assert(!gatewayAddress.empty()); + assert(!port.empty()); + assert(speed > 0U); - m_address = CUDPSocket::lookup(gatewayAddress); + m_txData = new unsigned char[BUFFER_LENGTH]; + m_rxData = new unsigned char[BUFFER_LENGTH]; } CAX25Network::~CAX25Network() { + delete[] m_txData; + delete[] m_rxData; } bool CAX25Network::open() { LogMessage("Opening AX25 network connection"); - if (m_address.s_addr == INADDR_NONE) - return false; - - return m_socket.open(); + return m_serial.open(); } -bool CAX25Network::writeAX25(const unsigned char* data, unsigned int length) +bool CAX25Network::write(const unsigned char* data, unsigned int length) { assert(data != NULL); @@ -80,7 +84,7 @@ void CAX25Network::reset() void CAX25Network::close() { - m_socket.close(); + m_serial.close(); LogMessage("Closing AX25 network connection"); } diff --git a/AX25Network.h b/AX25Network.h index 866ae7e..9c9cecb 100644 --- a/AX25Network.h +++ b/AX25Network.h @@ -19,32 +19,38 @@ #ifndef AX25Network_H #define AX25Network_H -#include "UDPSocket.h" +#include "SerialController.h" #include #include class CAX25Network { public: - CAX25Network(const std::string& localAddress, unsigned int localPort, const std::string& gatewayAddress, unsigned int gatewayPort, bool debug); + CAX25Network(const std::string& port, unsigned int speed, bool debug); ~CAX25Network(); bool open(); void enable(bool enabled); - bool writeAX25(const unsigned char* data, unsigned int length); + bool write(const unsigned char* data, unsigned int length); + + unsigned int read(unsigned char* data, unsigned int length); void reset(); void close(); private: - CUDPSocket m_socket; - in_addr m_address; - unsigned int m_port; - bool m_debug; - bool m_enabled; + CSerialController m_serial; + unsigned char* m_txData; + unsigned int m_txLength; + unsigned int m_txOffset; + unsigned char* m_rxData; + unsigned int m_rxLength; + bool m_rxComplete; + bool m_debug; + bool m_enabled; }; #endif diff --git a/Conf.cpp b/Conf.cpp index 85972c1..0ef321f 100644 --- a/Conf.cpp +++ b/Conf.cpp @@ -211,7 +211,6 @@ m_fmExtAudioBoost(1U), m_ax25Enabled(false), m_ax25RXTwist(6), m_ax25TXTwist(6), -m_ax25Digipeat(true), m_ax25Trace(false), m_dstarNetworkEnabled(false), m_dstarGatewayAddress(), @@ -259,10 +258,8 @@ m_pocsagLocalPort(0U), m_pocsagNetworkModeHang(3U), m_pocsagNetworkDebug(false), m_ax25NetworkEnabled(false), -m_ax25GatewayAddress(), -m_ax25GatewayPort(0U), -m_ax25LocalAddress(), -m_ax25LocalPort(0U), +m_ax25NetworkPort(), +m_ax25NetworkSpeed(9600U), m_ax25NetworkDebug(false), m_tftSerialPort("/dev/ttyAMA0"), m_tftSerialBrightness(50U), @@ -802,8 +799,6 @@ bool CConf::read() m_ax25RXTwist = ::atoi(value); else if (::strcmp(key, "TXTwist") == 0) m_ax25TXTwist = ::atoi(value); - else if (::strcmp(key, "Digipeat") == 0) - m_ax25Digipeat = ::atoi(value) == 1; else if (::strcmp(key, "Trace") == 0) m_ax25Trace = ::atoi(value) == 1; } else if (section == SECTION_DSTAR_NETWORK) { @@ -903,18 +898,14 @@ bool CConf::read() else if (::strcmp(key, "Debug") == 0) m_pocsagNetworkDebug = ::atoi(value) == 1; } else if (section == SECTION_AX25_NETWORK) { - if (::strcmp(key, "Enable") == 0) - m_ax25NetworkEnabled = ::atoi(value) == 1; - else if (::strcmp(key, "LocalAddress") == 0) - m_ax25LocalAddress = value; - else if (::strcmp(key, "LocalPort") == 0) - m_ax25LocalPort = (unsigned int)::atoi(value); - else if (::strcmp(key, "GatewayAddress") == 0) - m_ax25GatewayAddress = value; - else if (::strcmp(key, "GatewayPort") == 0) - m_ax25GatewayPort = (unsigned int)::atoi(value); - else if (::strcmp(key, "Debug") == 0) - m_ax25NetworkDebug = ::atoi(value) == 1; + if (::strcmp(key, "Enable") == 0) + m_ax25NetworkEnabled = ::atoi(value) == 1; + else if (::strcmp(key, "Port") == 0) + m_ax25NetworkPort = value; + else if (::strcmp(key, "Speed") == 0) + m_ax25NetworkSpeed = (unsigned int)::atoi(value); + else if (::strcmp(key, "Debug") == 0) + m_ax25NetworkDebug = ::atoi(value) == 1; } else if (section == SECTION_TFTSERIAL) { if (::strcmp(key, "Port") == 0) m_tftSerialPort = value; @@ -1743,11 +1734,6 @@ int CConf::getAX25TXTwist() const return m_ax25TXTwist; } -bool CConf::getAX25Digipeat() const -{ - return m_ax25Digipeat; -} - bool CConf::getAX25Trace() const { return m_ax25Trace; @@ -1983,24 +1969,14 @@ bool CConf::getAX25NetworkEnabled() const return m_ax25NetworkEnabled; } -std::string CConf::getAX25GatewayAddress() const +std::string CConf::getAX25NetworkPort() const { - return m_ax25GatewayAddress; + return m_ax25NetworkPort; } -unsigned int CConf::getAX25GatewayPort() const +unsigned int CConf::getAX25NetworkSpeed() const { - return m_ax25GatewayPort; -} - -std::string CConf::getAX25LocalAddress() const -{ - return m_ax25LocalAddress; -} - -unsigned int CConf::getAX25LocalPort() const -{ - return m_ax25LocalPort; + return m_ax25NetworkSpeed; } bool CConf::getAX25NetworkDebug() const diff --git a/Conf.h b/Conf.h index 8379061..335c1e3 100644 --- a/Conf.h +++ b/Conf.h @@ -176,7 +176,6 @@ public: bool getAX25Enabled() const; int getAX25RXTwist() const; int getAX25TXTwist() const; - bool getAX25Digipeat() const; bool getAX25Trace() const; // The FM Section @@ -271,10 +270,8 @@ public: // The AX.25 Network section bool getAX25NetworkEnabled() const; - std::string getAX25GatewayAddress() const; - unsigned int getAX25GatewayPort() const; - std::string getAX25LocalAddress() const; - unsigned int getAX25LocalPort() const; + std::string getAX25NetworkPort() const; + unsigned int getAX25NetworkSpeed() const; bool getAX25NetworkDebug() const; // The TFTSERIAL section @@ -463,7 +460,6 @@ private: bool m_ax25Enabled; int m_ax25RXTwist; int m_ax25TXTwist; - bool m_ax25Digipeat; bool m_ax25Trace; bool m_fmEnabled; @@ -550,10 +546,8 @@ private: bool m_pocsagNetworkDebug; bool m_ax25NetworkEnabled; - std::string m_ax25GatewayAddress; - unsigned int m_ax25GatewayPort; - std::string m_ax25LocalAddress; - unsigned int m_ax25LocalPort; + std::string m_ax25NetworkPort; + unsigned int m_ax25NetworkSpeed; bool m_ax25NetworkDebug; std::string m_tftSerialPort; diff --git a/MMDVM.ini b/MMDVM.ini index dcbb0b8..6b12fff 100644 --- a/MMDVM.ini +++ b/MMDVM.ini @@ -180,7 +180,6 @@ ExtAudioBoost=1 Enable=1 TXTwist=6 RXTwist=6 -Digipeat=1 Trace=1 [D-Star Network] @@ -242,10 +241,8 @@ Debug=0 [AX.25 Network] Enable=1 -LocalAddress=127.0.0.1 -LocalPort=47325 -GatewayAddress=127.0.0.1 -GatewayPort=47326 +Port=/dev/ttyp7 +Speed=9600 Debug=0 [TFT Serial] diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index db24632..12e71b5 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -626,18 +626,16 @@ int CMMDVMHost::run() } if (m_ax25Enabled) { - int rxTwist = m_conf.getAX25RXTwist(); - int txTwist = m_conf.getAX25TXTwist(); - bool digipeat = m_conf.getAX25Digipeat(); - bool trace = m_conf.getAX25Trace(); + int rxTwist = m_conf.getAX25RXTwist(); + int txTwist = m_conf.getAX25TXTwist(); + bool trace = m_conf.getAX25Trace(); LogInfo("AX.25 RF Parameters"); LogInfo(" RXTwist: %d", rxTwist); LogInfo(" TXTwist: %d", txTwist); - LogInfo(" Digipeat: %s", digipeat ? "yes" : "no"); LogInfo(" Trace: %s", trace ? "yes" : "no"); - m_ax25 = new CAX25Control(m_ax25Network, digipeat, trace); + m_ax25 = new CAX25Control(m_ax25Network, trace); } bool remoteControlEnabled = m_conf.getRemoteControlEnabled(); @@ -1584,19 +1582,15 @@ bool CMMDVMHost::createPOCSAGNetwork() bool CMMDVMHost::createAX25Network() { - std::string gatewayAddress = m_conf.getAX25GatewayAddress(); - unsigned int gatewayPort = m_conf.getAX25GatewayPort(); - std::string localAddress = m_conf.getAX25LocalAddress(); - unsigned int localPort = m_conf.getAX25LocalPort(); - bool debug = m_conf.getAX25NetworkDebug(); + std::string port = m_conf.getAX25NetworkPort(); + unsigned int speed = m_conf.getAX25NetworkSpeed(); + bool debug = m_conf.getAX25NetworkDebug(); LogInfo("AX.25 Network Parameters"); - LogInfo(" Gateway Address: %s", gatewayAddress.c_str()); - LogInfo(" Gateway Port: %u", gatewayPort); - LogInfo(" Local Address: %s", localAddress.c_str()); - LogInfo(" Local Port: %u", localPort); + LogInfo(" Port: %s", port.c_str()); + LogInfo(" Speed: %u", speed); - m_ax25Network = new CAX25Network(localAddress, localPort, gatewayAddress, gatewayPort, debug); + m_ax25Network = new CAX25Network(port, speed, debug); bool ret = m_ax25Network->open(); if (!ret) { diff --git a/Modem.cpp b/Modem.cpp index bcdde83..f1c6449 100644 --- a/Modem.cpp +++ b/Modem.cpp @@ -114,15 +114,17 @@ m_txInvert(txInvert), m_pttInvert(pttInvert), m_txDelay(txDelay), m_dmrDelay(dmrDelay), -m_rxLevel(0U), -m_cwIdTXLevel(0U), -m_dstarTXLevel(0U), -m_dmrTXLevel(0U), -m_ysfTXLevel(0U), -m_p25TXLevel(0U), -m_nxdnTXLevel(0U), -m_pocsagTXLevel(0U), -m_fmTXLevel(0U), +m_rxLevel(0.0F), +m_cwIdTXLevel(0.0F), +m_dstarTXLevel(0.0F), +m_dmrTXLevel(0.0F), +m_ysfTXLevel(0.0F), +m_p25TXLevel(0.0F), +m_nxdnTXLevel(0.0F), +m_pocsagTXLevel(0.0F), +m_fmTXLevel(0.0F), +m_ax25TXLevel(0.0F), +m_rfLevel(0.0F), m_trace(trace), m_debug(debug), m_rxFrequency(0U), @@ -177,6 +179,8 @@ m_lockout(false), m_error(false), m_mode(MODE_IDLE), m_hwType(HWT_UNKNOWN), +m_ax25RXTwist(0), +m_ax25TXTwist(0), m_fmCallsign(), m_fmCallsignSpeed(20U), m_fmCallsignFrequency(1000U), @@ -248,7 +252,7 @@ void CModem::setModeParams(bool dstarEnabled, bool dmrEnabled, bool ysfEnabled, m_ax25Enabled = ax25Enabled; } -void CModem::setLevels(float rxLevel, float cwIdTXLevel, float dstarTXLevel, float dmrTXLevel, float ysfTXLevel, float p25TXLevel, float nxdnTXLevel, float pocsagTXLevel, float fmTXLevel) +void CModem::setLevels(float rxLevel, float cwIdTXLevel, float dstarTXLevel, float dmrTXLevel, float ysfTXLevel, float p25TXLevel, float nxdnTXLevel, float pocsagTXLevel, float fmTXLevel, float ax25TXLevel) { m_rxLevel = rxLevel; m_cwIdTXLevel = cwIdTXLevel; @@ -259,6 +263,7 @@ void CModem::setLevels(float rxLevel, float cwIdTXLevel, float dstarTXLevel, flo m_nxdnTXLevel = nxdnTXLevel; m_pocsagTXLevel = pocsagTXLevel; m_fmTXLevel = fmTXLevel; + m_ax25TXLevel = ax25TXLevel; } void CModem::setDMRParams(unsigned int colorCode) @@ -284,6 +289,12 @@ void CModem::setNXDNParams(unsigned int txHang) m_nxdnTXHang = txHang; } +void CModem::setAX25Params(int rxTwist, int txTwist) +{ + m_ax25RXTwist = rxTwist; + m_ax25TXTwist = txTwist; +} + void CModem::setTransparentDataParams(unsigned int sendFrameType) { m_sendTransparentDataFrameType = sendFrameType; @@ -1551,7 +1562,7 @@ bool CModem::setConfig() buffer[0U] = MMDVM_FRAME_START; - buffer[1U] = 24U; + buffer[1U] = 27U; buffer[2U] = MMDVM_SET_CONFIG; @@ -1621,10 +1632,16 @@ bool CModem::setConfig() buffer[23U] = (unsigned char)m_nxdnTXHang; - // CUtils::dump(1U, "Written", buffer, 24U); + buffer[24U] = (unsigned char)(m_ax25TXLevel * 2.55F + 0.5F); - int ret = m_serial->write(buffer, 24U); - if (ret != 24) + buffer[25U] = (unsigned char)(m_ax25RXTwist + 128); + + buffer[26U] = (unsigned char)(m_ax25TXTwist + 128); + + // CUtils::dump(1U, "Written", buffer, 27U); + + int ret = m_serial->write(buffer, 27U); + if (ret != 27) return false; unsigned int count = 0U; diff --git a/Modem.h b/Modem.h index ea01945..1f8b291 100644 --- a/Modem.h +++ b/Modem.h @@ -48,11 +48,12 @@ public: virtual void setSerialParams(const std::string& protocol, unsigned int address); virtual void setRFParams(unsigned int rxFrequency, int rxOffset, unsigned int txFrequency, int txOffset, int txDCOffset, int rxDCOffset, float rfLevel, unsigned int pocsagFrequency); virtual void setModeParams(bool dstarEnabled, bool dmrEnabled, bool ysfEnabled, bool p25Enabled, bool nxdnEnabled, bool pocsagEnabled, bool fmEnabled, bool ax25Enabled); - virtual void setLevels(float rxLevel, float cwIdTXLevel, float dstarTXLevel, float dmrTXLevel, float ysfTXLevel, float p25TXLevel, float nxdnTXLevel, float pocsagLevel, float fmTXLevel); + virtual void setLevels(float rxLevel, float cwIdTXLevel, float dstarTXLevel, float dmrTXLevel, float ysfTXLevel, float p25TXLevel, float nxdnTXLevel, float pocsagLevel, float fmTXLevel, float ax25TXLevel); virtual void setDMRParams(unsigned int colorCode); virtual void setYSFParams(bool loDev, unsigned int txHang); virtual void setP25Params(unsigned int txHang); virtual void setNXDNParams(unsigned int txHang); + virtual void setAX25Params(int rxTwist, int txTwist); virtual void setTransparentDataParams(unsigned int sendFrameType); virtual void setFMCallsignParams(const std::string& callsign, unsigned int callsignSpeed, unsigned int callsignFrequency, unsigned int callsignTime, unsigned int callsignHoldoff, float callsignHighLevel, float callsignLowLevel, bool callsignAtStart, bool callsignAtEnd, bool callsignAtLatch); @@ -146,6 +147,7 @@ private: float m_nxdnTXLevel; float m_pocsagTXLevel; float m_fmTXLevel; + float m_ax25TXLevel; float m_rfLevel; bool m_trace; bool m_debug; @@ -201,6 +203,8 @@ private: bool m_error; unsigned char m_mode; HW_TYPE m_hwType; + int m_ax25RXTwist; + int m_ax25TXTwist; std::string m_fmCallsign; unsigned int m_fmCallsignSpeed; diff --git a/Version.h b/Version.h index 7cfe66a..5f48e8f 100644 --- a/Version.h +++ b/Version.h @@ -19,6 +19,6 @@ #if !defined(VERSION_H) #define VERSION_H -const char* VERSION = "20200620"; +const char* VERSION = "20200621"; #endif