From 8ace65b86d3944a9ebe90b768c8514b8c2de88fa Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Tue, 16 Feb 2021 22:34:25 +0000 Subject: [PATCH] More sane modem port protocol handling. --- Conf.cpp | 70 ++++++++++---- Conf.h | 22 +++-- I2CController.h | 5 +- MMDVM.ini | 16 ++- MMDVMHost.cpp | 53 +++++++--- MMDVMHost.vcxproj | 4 + MMDVMHost.vcxproj.filters | 12 +++ MMDVMModem.cpp | 199 ++++++++++++++++++-------------------- MMDVMModem.h | 9 +- MMDVMModemPort.cpp | 23 +++++ MMDVMModemPort.h | 37 +++++++ Makefile | 10 +- Makefile.Pi | 10 +- Makefile.Pi.Adafruit | 4 +- Makefile.Pi.HD44780 | 4 +- Makefile.Pi.OLED | 11 ++- Makefile.Pi.PCF8574 | 4 +- Modem.h | 5 +- NullModem.h | 4 +- UARTController.h | 3 +- UDPController.cpp | 79 +++++++++++++++ UDPController.h | 49 ++++++++++ 22 files changed, 453 insertions(+), 180 deletions(-) create mode 100644 MMDVMModemPort.cpp create mode 100644 MMDVMModemPort.h create mode 100644 UDPController.cpp create mode 100644 UDPController.h diff --git a/Conf.cpp b/Conf.cpp index 4dbafbfac..1c4985bce 100644 --- a/Conf.cpp +++ b/Conf.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015-2020 by Jonathan Naylor G4KLX + * Copyright (C) 2015-2021 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -93,10 +93,14 @@ m_dmrIdLookupFile(), m_dmrIdLookupTime(0U), m_nxdnIdLookupFile(), m_nxdnIdLookupTime(0U), -m_modemPort(), m_modemProtocol("uart"), -m_modemSpeed(115200U), -m_modemAddress(0x22), +m_modemUARTPort(), +m_modemUARTSpeed(115200U), +m_modemI2CPort(), +m_modemI2CAddress(0x22U), +m_modemModemAddress(), +m_modemModemPort(0U), +m_modemLocalPort(0U), m_modemRXInvert(false), m_modemTXInvert(false), m_modemPTTInvert(false), @@ -514,14 +518,22 @@ bool CConf::read() else if (::strcmp(key, "Time") == 0) m_nxdnIdLookupTime = (unsigned int)::atoi(value); } else if (section == SECTION_MODEM) { - if (::strcmp(key, "Port") == 0) - m_modemPort = value; - else if (::strcmp(key, "Protocol") == 0) + if (::strcmp(key, "Protocol") == 0) m_modemProtocol = value; - else if (::strcmp(key, "Speed") == 0) - m_modemSpeed = (unsigned int)::atoi(value); - else if (::strcmp(key, "Address") == 0) - m_modemAddress = (unsigned int)::strtoul(value, NULL, 16); + else if (::strcmp(key, "UARTPort") == 0) + m_modemUARTPort = value; + else if (::strcmp(key, "UARTSpeed") == 0) + m_modemUARTSpeed = (unsigned int)::atoi(value); + else if (::strcmp(key, "I2CPort") == 0) + m_modemI2CPort = value; + else if (::strcmp(key, "I2CAddress") == 0) + m_modemI2CAddress = (unsigned int)::strtoul(value, NULL, 16); + else if (::strcmp(key, "ModemAddress") == 0) + m_modemModemAddress = value; + else if (::strcmp(key, "ModemPort") == 0) + m_modemModemPort = (unsigned int)::atoi(value); + else if (::strcmp(key, "LocalPort") == 0) + m_modemLocalPort = (unsigned int)::atoi(value); else if (::strcmp(key, "RXInvert") == 0) m_modemRXInvert = ::atoi(value) == 1; else if (::strcmp(key, "TXInvert") == 0) @@ -1232,24 +1244,44 @@ unsigned int CConf::getNXDNIdLookupTime() const return m_nxdnIdLookupTime; } -std::string CConf::getModemPort() const +std::string CConf::getModemProtocol() const { - return m_modemPort; + return m_modemProtocol; } -std::string CConf::getModemProtocol() const +std::string CConf::getModemUARTPort() const { - return m_modemProtocol; + return m_modemUARTPort; +} + +unsigned int CConf::getModemUARTSpeed() const +{ + return m_modemUARTSpeed; +} + +std::string CConf::getModemI2CPort() const +{ + return m_modemI2CPort; +} + +unsigned int CConf::getModemI2CAddress() const +{ + return m_modemI2CAddress; +} + +std::string CConf::getModemModemAddress() const +{ + return m_modemModemAddress; } -unsigned int CConf::getModemSpeed() const +unsigned int CConf::getModemModemPort() const { - return m_modemSpeed; + return m_modemModemPort; } -unsigned int CConf::getModemAddress() const +unsigned int CConf::getModemLocalPort() const { - return m_modemAddress; + return m_modemLocalPort; } bool CConf::getModemRXInvert() const diff --git a/Conf.h b/Conf.h index 92fa8ce00..430bbeb48 100644 --- a/Conf.h +++ b/Conf.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015-2020 by Jonathan Naylor G4KLX + * Copyright (C) 2015-2021 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -70,10 +70,14 @@ class CConf unsigned int getNXDNIdLookupTime() const; // The Modem section - std::string getModemPort() const; std::string getModemProtocol() const; - unsigned int getModemSpeed() const; - unsigned int getModemAddress() const; + std::string getModemUARTPort() const; + unsigned int getModemUARTSpeed() const; + std::string getModemI2CPort() const; + unsigned int getModemI2CAddress() const; + std::string getModemModemAddress() const; + unsigned int getModemModemPort() const; + unsigned int getModemLocalPort() const; bool getModemRXInvert() const; bool getModemTXInvert() const; bool getModemPTTInvert() const; @@ -391,10 +395,14 @@ class CConf std::string m_nxdnIdLookupFile; unsigned int m_nxdnIdLookupTime; - std::string m_modemPort; std::string m_modemProtocol; - unsigned int m_modemSpeed; - unsigned int m_modemAddress; + std::string m_modemUARTPort; + unsigned int m_modemUARTSpeed; + std::string m_modemI2CPort; + unsigned int m_modemI2CAddress; + std::string m_modemModemAddress; + unsigned int m_modemModemPort; + unsigned int m_modemLocalPort; bool m_modemRXInvert; bool m_modemTXInvert; bool m_modemPTTInvert; diff --git a/I2CController.h b/I2CController.h index 281c587cc..19298cac2 100644 --- a/I2CController.h +++ b/I2CController.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2002-2004,2007-2009,2011-2013,2015-2017,2020 by Jonathan Naylor G4KLX + * Copyright (C) 2002-2004,2007-2009,2011-2013,2015-2017,2020,2021 by Jonathan Naylor G4KLX * Copyright (C) 1999-2001 by Thomas Sailor HB9JNX * * This program is free software; you can redistribute it and/or modify @@ -22,11 +22,12 @@ #if defined(__linux__) +#include "MMDVMModemPort.h" #include "SerialPort.h" #include -class CI2CController : public ISerialPort { +class CI2CController : public ISerialPort, public IMMDVMModemPort { public: CI2CController(const std::string& device, unsigned int address = 0x22U); virtual ~CI2CController(); diff --git a/MMDVM.ini b/MMDVM.ini index 7810965ff..638118fa0 100644 --- a/MMDVM.ini +++ b/MMDVM.ini @@ -43,12 +43,18 @@ File=NXDN.csv Time=24 [Modem] -# Port=/dev/ttyACM0 -Port=/dev/ttyAMA0 -# Port=\\.\COM4 +# Valid values are "uart", "udp", and (on Linux) "i2c" Protocol=uart -Speed=460800 -# Address=0x22 +# The port and speed used for a UART connection +# UARTPort=\\.\COM4 +# UARTPort=/dev/ttyACM0 +UARTPort=/dev/ttyAMA0 +UARTSpeed=460800 +# The port and address for an I2C connection +I2CPort=/dev/i2c +I2CAddress=0x22 +# IP parameters for UDP connection + TXInvert=1 RXInvert=0 PTTInvert=0 diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index 7929f2dfe..a03fa7053 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -23,6 +23,7 @@ #include "NXDNIcomNetwork.h" #include "RSSIInterpolator.h" #include "UARTController.h" +#include "UDPController.h" #include "MMDVMModem.h" #include "NullModem.h" #include "Version.h" @@ -1315,10 +1316,14 @@ int CMMDVMHost::run() bool CMMDVMHost::createModem() { - std::string port = m_conf.getModemPort(); - std::string protocol = m_conf.getModemProtocol(); - unsigned int speed = m_conf.getModemSpeed(); - unsigned int address = m_conf.getModemAddress(); + std::string protocol = m_conf.getModemProtocol(); + std::string uartPort = m_conf.getModemUARTPort(); + unsigned int uartSpeed = m_conf.getModemUARTSpeed(); + std::string i2cPort = m_conf.getModemI2CPort(); + unsigned int i2cAddress = m_conf.getModemI2CAddress(); + std::string modemAddress = m_conf.getModemModemAddress(); + unsigned int modemPort = m_conf.getModemModemPort(); + unsigned int localPort = m_conf.getModemLocalPort(); bool rxInvert = m_conf.getModemRXInvert(); bool txInvert = m_conf.getModemTXInvert(); bool pttInvert = m_conf.getModemPTTInvert(); @@ -1358,14 +1363,23 @@ bool CMMDVMHost::createModem() bool useCOSAsLockout = m_conf.getModemUseCOSAsLockout(); LogInfo("Modem Parameters"); - LogInfo(" Port: %s", port.c_str()); -#if defined(__linux__) LogInfo(" Protocol: %s", protocol.c_str()); - if (protocol == "i2c") - LogInfo(" I2C Address: %02X", address); - else + + if (protocol == "uart") { + LogInfo(" UART Port: %s", uartPort.c_str()); + LogInfo(" UART Speed: %u", uartSpeed); + } else if (protocol == "udp") { + LogInfo(" Modem Address: %s", modemAddress.c_str()); + LogInfo(" Modem Port: %u", modemPort); + LogInfo(" Local Port: %u", localPort); + } +#if defined(__linux__) + else if (protocol == "i2c") { + LogInfo(" I2C Port: %s", i2cPort.c_str()); + LogInfo(" I2C Address: %02X", i2cAddress); + } #endif - LogInfo(" Speed: %u", speed); + LogInfo(" RX Invert: %s", rxInvert ? "yes" : "no"); LogInfo(" TX Invert: %s", txInvert ? "yes" : "no"); LogInfo(" PTT Invert: %s", pttInvert ? "yes" : "no"); @@ -1390,11 +1404,24 @@ bool CMMDVMHost::createModem() LogInfo(" TX Frequency: %uHz (%uHz)", txFrequency, txFrequency + txOffset); LogInfo(" Use COS as Lockout: %s", useCOSAsLockout ? "yes" : "no"); - if (port == "NullModem") + if (protocol == "null") m_modem = new CNullModem; else - m_modem = new CMMDVMModem(port, m_duplex, rxInvert, txInvert, pttInvert, txDelay, dmrDelay, useCOSAsLockout, trace, debug); - m_modem->setSerialParams(protocol, address, speed); + m_modem = new CMMDVMModem(m_duplex, rxInvert, txInvert, pttInvert, txDelay, dmrDelay, useCOSAsLockout, trace, debug); + + IMMDVMModemPort* modem = NULL; + if (protocol == "uart") + modem = new CUARTController(uartPort, uartSpeed, true); + else if (protocol == "udp") + modem = new CUDPController(modemAddress, modemPort, localPort); +#if defined(__linux__) + else if (protocol == "i2c") + modem = new CI2CController(i2cPort, i2cAddress); +#endif + else + return false; + + m_modem->setModem(modem); m_modem->setModeParams(m_dstarEnabled, m_dmrEnabled, m_ysfEnabled, m_p25Enabled, m_nxdnEnabled, m_m17Enabled, m_pocsagEnabled, m_fmEnabled, m_ax25Enabled); m_modem->setLevels(rxLevel, cwIdTXLevel, dstarTXLevel, dmrTXLevel, ysfTXLevel, p25TXLevel, nxdnTXLevel, m17TXLevel, pocsagTXLevel, fmTXLevel, ax25TXLevel); m_modem->setRFParams(rxFrequency, rxOffset, txFrequency, txOffset, txDCOffset, rxDCOffset, rfLevel, pocsagFrequency); diff --git a/MMDVMHost.vcxproj b/MMDVMHost.vcxproj index 10ce89c15..1067b2b78 100644 --- a/MMDVMHost.vcxproj +++ b/MMDVMHost.vcxproj @@ -203,6 +203,7 @@ + @@ -252,6 +253,7 @@ + @@ -311,6 +313,7 @@ + @@ -356,6 +359,7 @@ + diff --git a/MMDVMHost.vcxproj.filters b/MMDVMHost.vcxproj.filters index 52c2b9fa6..0a1e4bf1d 100644 --- a/MMDVMHost.vcxproj.filters +++ b/MMDVMHost.vcxproj.filters @@ -344,6 +344,12 @@ Header Files + + Header Files + + + Header Files + @@ -646,5 +652,11 @@ Source Files + + Source Files + + + Source Files + \ No newline at end of file diff --git a/MMDVMModem.cpp b/MMDVMModem.cpp index e2fd3b928..bb14094e1 100644 --- a/MMDVMModem.cpp +++ b/MMDVMModem.cpp @@ -114,8 +114,7 @@ const unsigned int MAX_RESPONSES = 30U; const unsigned int BUFFER_LENGTH = 2000U; -CMMDVMModem::CMMDVMModem(const std::string& port, bool duplex, bool rxInvert, bool txInvert, bool pttInvert, unsigned int txDelay, unsigned int dmrDelay, bool useCOSAsLockout, bool trace, bool debug) : -m_port(port), +CMMDVMModem::CMMDVMModem(bool duplex, bool rxInvert, bool txInvert, bool pttInvert, unsigned int txDelay, unsigned int dmrDelay, bool useCOSAsLockout, bool trace, bool debug) : m_protocolVersion(0U), m_dmrColorCode(0U), m_ysfLoDev(false), @@ -158,7 +157,7 @@ m_fmEnabled(false), m_ax25Enabled(false), m_rxDCOffset(0), m_txDCOffset(0), -m_serial(NULL), +m_port(NULL), m_buffer(NULL), m_length(0U), m_offset(0U), @@ -247,25 +246,19 @@ m_fmMaxDevLevel(90.0F), m_fmExtEnable(false) { m_buffer = new unsigned char[BUFFER_LENGTH]; - - assert(!port.empty()); } CMMDVMModem::~CMMDVMModem() { - delete m_serial; + delete m_port; delete[] m_buffer; } -void CMMDVMModem::setSerialParams(const std::string& protocol, unsigned int address, unsigned int speed) +void CMMDVMModem::setModem(IMMDVMModemPort* port) { - // Create the serial controller instance according the protocol specified in conf. -#if defined(__linux__) - if (protocol == "i2c") - m_serial = new CI2CController(m_port, address); - else -#endif - m_serial = new CUARTController(m_port, speed, true); + assert(port != NULL); + + m_port = port; } void CMMDVMModem::setRFParams(unsigned int rxFrequency, int rxOffset, unsigned int txFrequency, int txOffset, int txDCOffset, int rxDCOffset, float rfLevel, unsigned int pocsagFrequency) @@ -351,15 +344,15 @@ bool CMMDVMModem::open() { ::LogMessage("Opening the MMDVM"); - bool ret = m_serial->open(); + bool ret = m_port->open(); if (!ret) return false; ret = readVersion(); if (!ret) { - m_serial->close(); - delete m_serial; - m_serial = NULL; + m_port->close(); + delete m_port; + m_port = NULL; return false; } else { /* Stopping the inactivity timer here when a firmware version has been @@ -369,51 +362,51 @@ bool CMMDVMModem::open() ret = setFrequency(); if (!ret) { - m_serial->close(); - delete m_serial; - m_serial = NULL; + m_port->close(); + delete m_port; + m_port = NULL; return false; } ret = writeConfig(); if (!ret) { - m_serial->close(); - delete m_serial; - m_serial = NULL; + m_port->close(); + delete m_port; + m_port = NULL; return false; } if (m_fmEnabled && m_duplex) { ret = setFMCallsignParams(); if (!ret) { - m_serial->close(); - delete m_serial; - m_serial = NULL; + m_port->close(); + delete m_port; + m_port = NULL; return false; } ret = setFMAckParams(); if (!ret) { - m_serial->close(); - delete m_serial; - m_serial = NULL; + m_port->close(); + delete m_port; + m_port = NULL; return false; } ret = setFMMiscParams(); if (!ret) { - m_serial->close(); - delete m_serial; - m_serial = NULL; + m_port->close(); + delete m_port; + m_port = NULL; return false; } if (m_fmExtEnable) { ret = setFMExtParams(); if (!ret) { - m_serial->close(); - delete m_serial; - m_serial = NULL; + m_port->close(); + delete m_port; + m_port = NULL; return false; } } @@ -429,7 +422,7 @@ bool CMMDVMModem::open() void CMMDVMModem::clock(unsigned int ms) { - assert(m_serial != NULL); + assert(m_port != NULL); // Poll the modem status every 250ms m_statusTimer.clock(ms); @@ -928,7 +921,7 @@ void CMMDVMModem::clock(unsigned int ms) break; } - int ret = m_serial->write(m_buffer, len); + int ret = m_port->write(m_buffer, len); if (ret != int(len)) LogWarning("Error when writing D-Star data to the MMDVM"); @@ -944,7 +937,7 @@ void CMMDVMModem::clock(unsigned int ms) if (m_trace) CUtils::dump(1U, "TX DMR Data 1", m_buffer, len); - int ret = m_serial->write(m_buffer, len); + int ret = m_port->write(m_buffer, len); if (ret != int(len)) LogWarning("Error when writing DMR data to the MMDVM"); @@ -961,7 +954,7 @@ void CMMDVMModem::clock(unsigned int ms) if (m_trace) CUtils::dump(1U, "TX DMR Data 2", m_buffer, len); - int ret = m_serial->write(m_buffer, len); + int ret = m_port->write(m_buffer, len); if (ret != int(len)) LogWarning("Error when writing DMR data to the MMDVM"); @@ -978,7 +971,7 @@ void CMMDVMModem::clock(unsigned int ms) if (m_trace) CUtils::dump(1U, "TX YSF Data", m_buffer, len); - int ret = m_serial->write(m_buffer, len); + int ret = m_port->write(m_buffer, len); if (ret != int(len)) LogWarning("Error when writing YSF data to the MMDVM"); @@ -999,7 +992,7 @@ void CMMDVMModem::clock(unsigned int ms) CUtils::dump(1U, "TX P25 LDU", m_buffer, len); } - int ret = m_serial->write(m_buffer, len); + int ret = m_port->write(m_buffer, len); if (ret != int(len)) LogWarning("Error when writing P25 data to the MMDVM"); @@ -1016,7 +1009,7 @@ void CMMDVMModem::clock(unsigned int ms) if (m_trace) CUtils::dump(1U, "TX NXDN Data", m_buffer, len); - int ret = m_serial->write(m_buffer, len); + int ret = m_port->write(m_buffer, len); if (ret != int(len)) LogWarning("Error when writing NXDN data to the MMDVM"); @@ -1037,7 +1030,7 @@ void CMMDVMModem::clock(unsigned int ms) CUtils::dump(1U, "TX M17 Data", m_buffer, len); } - int ret = m_serial->write(m_buffer, len); + int ret = m_port->write(m_buffer, len); if (ret != int(len)) LogWarning("Error when writing M17 data to the MMDVM"); @@ -1054,7 +1047,7 @@ void CMMDVMModem::clock(unsigned int ms) if (m_trace) CUtils::dump(1U, "TX POCSAG Data", m_buffer, len); - int ret = m_serial->write(m_buffer, len); + int ret = m_port->write(m_buffer, len); if (ret != int(len)) LogWarning("Error when writing POCSAG data to the MMDVM"); @@ -1071,7 +1064,7 @@ void CMMDVMModem::clock(unsigned int ms) if (m_trace) CUtils::dump(1U, "TX FM Data", m_buffer, len); - int ret = m_serial->write(m_buffer, len); + int ret = m_port->write(m_buffer, len); if (ret != int(len)) LogWarning("Error when writing FM data to the MMDVM"); @@ -1088,7 +1081,7 @@ void CMMDVMModem::clock(unsigned int ms) if (m_trace) CUtils::dump(1U, "TX AX.25 Data", m_buffer, len); - int ret = m_serial->write(m_buffer, len); + int ret = m_port->write(m_buffer, len); if (ret != int(len)) LogWarning("Error when writing AX.25 data to the MMDVM"); @@ -1105,7 +1098,7 @@ void CMMDVMModem::clock(unsigned int ms) if (m_trace) CUtils::dump(1U, "TX Transparent Data", m_buffer, len); - int ret = m_serial->write(m_buffer, len); + int ret = m_port->write(m_buffer, len); if (ret != int(len)) LogWarning("Error when writing Transparent data to the MMDVM"); } @@ -1118,7 +1111,7 @@ void CMMDVMModem::clock(unsigned int ms) if (m_trace) CUtils::dump(1U, "TX Serial Data", m_buffer, len); - int ret = m_serial->write(m_buffer, len); + int ret = m_port->write(m_buffer, len); if (ret != int(len)) LogWarning("Error when writing Serial data to the MMDVM"); } @@ -1126,11 +1119,11 @@ void CMMDVMModem::clock(unsigned int ms) void CMMDVMModem::close() { - assert(m_serial != NULL); + assert(m_port != NULL); ::LogMessage("Closing the MMDVM"); - m_serial->close(); + m_port->close(); } unsigned int CMMDVMModem::readDStarData(unsigned char* data) @@ -1645,7 +1638,7 @@ bool CMMDVMModem::writeTransparentData(const unsigned char* data, unsigned int l bool CMMDVMModem::writeDStarInfo(const char* my1, const char* my2, const char* your, const char* type, const char* reflector) { - assert(m_serial != NULL); + assert(m_port != NULL); assert(my1 != NULL); assert(my2 != NULL); assert(your != NULL); @@ -1669,12 +1662,12 @@ bool CMMDVMModem::writeDStarInfo(const char* my1, const char* my2, const char* y ::memcpy(buffer + 25U, reflector, DSTAR_LONG_CALLSIGN_LENGTH); - return m_serial->write(buffer, 33U) != 33; + return m_port->write(buffer, 33U) != 33; } bool CMMDVMModem::writeDMRInfo(unsigned int slotNo, const std::string& src, bool group, const std::string& dest, const char* type) { - assert(m_serial != NULL); + assert(m_port != NULL); assert(type != NULL); unsigned char buffer[50U]; @@ -1695,12 +1688,12 @@ bool CMMDVMModem::writeDMRInfo(unsigned int slotNo, const std::string& src, bool ::memcpy(buffer + 46U, type, 1U); - return m_serial->write(buffer, 47U) != 47; + return m_port->write(buffer, 47U) != 47; } bool CMMDVMModem::writeYSFInfo(const char* source, const char* dest, unsigned char dgid, const char* type, const char* origin) { - assert(m_serial != NULL); + assert(m_port != NULL); assert(source != NULL); assert(dest != NULL); assert(type != NULL); @@ -1723,12 +1716,12 @@ bool CMMDVMModem::writeYSFInfo(const char* source, const char* dest, unsigned ch buffer[35U] = dgid; - return m_serial->write(buffer, 36U) != 36; + return m_port->write(buffer, 36U) != 36; } bool CMMDVMModem::writeP25Info(const char* source, bool group, unsigned int dest, const char* type) { - assert(m_serial != NULL); + assert(m_port != NULL); assert(source != NULL); assert(type != NULL); @@ -1748,12 +1741,12 @@ bool CMMDVMModem::writeP25Info(const char* source, bool group, unsigned int dest ::memcpy(buffer + 30U, type, 1U); - return m_serial->write(buffer, 31U) != 31; + return m_port->write(buffer, 31U) != 31; } bool CMMDVMModem::writeNXDNInfo(const char* source, bool group, unsigned int dest, const char* type) { - assert(m_serial != NULL); + assert(m_port != NULL); assert(source != NULL); assert(type != NULL); @@ -1773,12 +1766,12 @@ bool CMMDVMModem::writeNXDNInfo(const char* source, bool group, unsigned int des ::memcpy(buffer + 30U, type, 1U); - return m_serial->write(buffer, 31U) != 31; + return m_port->write(buffer, 31U) != 31; } bool CMMDVMModem::writeM17Info(const char* source, const char* dest, const char* type) { - assert(m_serial != NULL); + assert(m_port != NULL); assert(source != NULL); assert(dest != NULL); assert(type != NULL); @@ -1797,12 +1790,12 @@ bool CMMDVMModem::writeM17Info(const char* source, const char* dest, const char* ::memcpy(buffer + 22U, type, 1U); - return m_serial->write(buffer, 23U) != 23; + return m_port->write(buffer, 23U) != 23; } bool CMMDVMModem::writePOCSAGInfo(unsigned int ric, const std::string& message) { - assert(m_serial != NULL); + assert(m_port != NULL); size_t length = message.size(); @@ -1818,14 +1811,14 @@ bool CMMDVMModem::writePOCSAGInfo(unsigned int ric, const std::string& message) ::memcpy(buffer + 11U, message.c_str(), length); - int ret = m_serial->write(buffer, length + 11U); + int ret = m_port->write(buffer, length + 11U); return ret != int(length + 11U); } bool CMMDVMModem::writeIPInfo(const std::string& address) { - assert(m_serial != NULL); + assert(m_port != NULL); size_t length = address.size(); @@ -1839,14 +1832,14 @@ bool CMMDVMModem::writeIPInfo(const std::string& address) ::memcpy(buffer + 4U, address.c_str(), length); - int ret = m_serial->write(buffer, length + 4U); + int ret = m_port->write(buffer, length + 4U); return ret != int(length + 4U); } bool CMMDVMModem::writeSerial(const unsigned char* data, unsigned int length) { - assert(m_serial != NULL); + assert(m_port != NULL); assert(data != NULL); assert(length > 0U); @@ -1887,7 +1880,7 @@ bool CMMDVMModem::hasError() const bool CMMDVMModem::readVersion() { - assert(m_serial != NULL); + assert(m_port != NULL); CThread::sleep(2000U); // 2s @@ -1900,12 +1893,12 @@ bool CMMDVMModem::readVersion() // CUtils::dump(1U, "Written", buffer, 3U); - int ret = m_serial->write(buffer, 3U); + int ret = m_port->write(buffer, 3U); if (ret != 3) return false; #if defined(__APPLE__) - m_serial->setNonblock(true); + m_port->setNonblock(true); #endif for (unsigned int count = 0U; count < MAX_RESPONSES; count++) { @@ -2000,7 +1993,7 @@ bool CMMDVMModem::readVersion() bool CMMDVMModem::readStatus() { - assert(m_serial != NULL); + assert(m_port != NULL); unsigned char buffer[3U]; @@ -2010,7 +2003,7 @@ bool CMMDVMModem::readStatus() // CUtils::dump(1U, "Written", buffer, 3U); - return m_serial->write(buffer, 3U) == 3; + return m_port->write(buffer, 3U) == 3; } bool CMMDVMModem::writeConfig() @@ -2027,7 +2020,7 @@ bool CMMDVMModem::writeConfig() bool CMMDVMModem::setConfig1() { - assert(m_serial != NULL); + assert(m_port != NULL); unsigned char buffer[30U]; @@ -2109,7 +2102,7 @@ bool CMMDVMModem::setConfig1() // CUtils::dump(1U, "Written", buffer, 26U); - int ret = m_serial->write(buffer, 26U); + int ret = m_port->write(buffer, 26U); if (ret != 26) return false; @@ -2142,7 +2135,7 @@ bool CMMDVMModem::setConfig1() bool CMMDVMModem::setConfig2() { - assert(m_serial != NULL); + assert(m_port != NULL); unsigned char buffer[50U]; @@ -2235,7 +2228,7 @@ bool CMMDVMModem::setConfig2() // CUtils::dump(1U, "Written", buffer, 40U); - int ret = m_serial->write(buffer, 40U); + int ret = m_port->write(buffer, 40U); if (ret != 40) return false; @@ -2268,7 +2261,7 @@ bool CMMDVMModem::setConfig2() bool CMMDVMModem::setFrequency() { - assert(m_serial != NULL); + assert(m_port != NULL); unsigned char buffer[20U]; unsigned char len; @@ -2310,7 +2303,7 @@ bool CMMDVMModem::setFrequency() // CUtils::dump(1U, "Written", buffer, len); - int ret = m_serial->write(buffer, len); + int ret = m_port->write(buffer, len); if (ret != len) return false; @@ -2341,11 +2334,11 @@ bool CMMDVMModem::setFrequency() RESP_TYPE_MMDVM CMMDVMModem::getResponse() { - assert(m_serial != NULL); + assert(m_port != NULL); if (m_state == SS_START) { // Get the start of the frame or nothing at all - int ret = m_serial->read(m_buffer + 0U, 1U); + int ret = m_port->read(m_buffer + 0U, 1U); if (ret < 0) { LogError("Error when reading from the modem"); return RTM_ERROR; @@ -2363,7 +2356,7 @@ RESP_TYPE_MMDVM CMMDVMModem::getResponse() if (m_state == SS_LENGTH1) { // Get the length of the frame, 1/2 - int ret = m_serial->read(m_buffer + 1U, 1U); + int ret = m_port->read(m_buffer + 1U, 1U); if (ret < 0) { LogError("Error when reading from the modem"); m_state = SS_START; @@ -2384,7 +2377,7 @@ RESP_TYPE_MMDVM CMMDVMModem::getResponse() if (m_state == SS_LENGTH2) { // Get the length of the frane, 2/2 - int ret = m_serial->read(m_buffer + 2U, 1U); + int ret = m_port->read(m_buffer + 2U, 1U); if (ret < 0) { LogError("Error when reading from the modem"); m_state = SS_START; @@ -2401,7 +2394,7 @@ RESP_TYPE_MMDVM CMMDVMModem::getResponse() if (m_state == SS_TYPE) { // Get the frame type - int ret = m_serial->read(&m_type, 1U); + int ret = m_port->read(&m_type, 1U); if (ret < 0) { LogError("Error when reading from the modem"); m_state = SS_START; @@ -2418,7 +2411,7 @@ RESP_TYPE_MMDVM CMMDVMModem::getResponse() if (m_state == SS_DATA) { while (m_offset < m_length) { - int ret = m_serial->read(m_buffer + m_offset, m_length - m_offset); + int ret = m_port->read(m_buffer + m_offset, m_length - m_offset); if (ret < 0) { LogError("Error when reading from the modem"); m_state = SS_START; @@ -2453,7 +2446,7 @@ unsigned char CMMDVMModem::getMode() const bool CMMDVMModem::setMode(unsigned char mode) { - assert(m_serial != NULL); + assert(m_port != NULL); unsigned char buffer[4U]; @@ -2464,12 +2457,12 @@ bool CMMDVMModem::setMode(unsigned char mode) // CUtils::dump(1U, "Written", buffer, 4U); - return m_serial->write(buffer, 4U) == 4; + return m_port->write(buffer, 4U) == 4; } bool CMMDVMModem::sendCWId(const std::string& callsign) { - assert(m_serial != NULL); + assert(m_port != NULL); unsigned int length = callsign.length(); if (length > 200U) @@ -2486,12 +2479,12 @@ bool CMMDVMModem::sendCWId(const std::string& callsign) // CUtils::dump(1U, "Written", buffer, length + 3U); - return m_serial->write(buffer, length + 3U) == int(length + 3U); + return m_port->write(buffer, length + 3U) == int(length + 3U); } bool CMMDVMModem::writeDMRStart(bool tx) { - assert(m_serial != NULL); + assert(m_port != NULL); if (tx && m_tx) return true; @@ -2507,12 +2500,12 @@ bool CMMDVMModem::writeDMRStart(bool tx) // CUtils::dump(1U, "Written", buffer, 4U); - return m_serial->write(buffer, 4U) == 4; + return m_port->write(buffer, 4U) == 4; } bool CMMDVMModem::writeDMRAbort(unsigned int slotNo) { - assert(m_serial != NULL); + assert(m_port != NULL); if (slotNo == 1U) m_txDMRData1.clear(); @@ -2528,12 +2521,12 @@ bool CMMDVMModem::writeDMRAbort(unsigned int slotNo) // CUtils::dump(1U, "Written", buffer, 4U); - return m_serial->write(buffer, 4U) == 4; + return m_port->write(buffer, 4U) == 4; } bool CMMDVMModem::writeDMRShortLC(const unsigned char* lc) { - assert(m_serial != NULL); + assert(m_port != NULL); assert(lc != NULL); unsigned char buffer[12U]; @@ -2553,7 +2546,7 @@ bool CMMDVMModem::writeDMRShortLC(const unsigned char* lc) // CUtils::dump(1U, "Written", buffer, 12U); - return m_serial->write(buffer, 12U) == 12; + return m_port->write(buffer, 12U) == 12; } void CMMDVMModem::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) @@ -2614,7 +2607,7 @@ void CMMDVMModem::setFMExtParams(const std::string& ack, unsigned int audioBoost bool CMMDVMModem::setFMCallsignParams() { - assert(m_serial != NULL); + assert(m_port != NULL); unsigned char buffer[80U]; unsigned char len = 10U + m_fmCallsign.size(); @@ -2644,7 +2637,7 @@ bool CMMDVMModem::setFMCallsignParams() // CUtils::dump(1U, "Written", buffer, len); - int ret = m_serial->write(buffer, len); + int ret = m_port->write(buffer, len); if (ret != len) return false; @@ -2675,7 +2668,7 @@ bool CMMDVMModem::setFMCallsignParams() bool CMMDVMModem::setFMAckParams() { - assert(m_serial != NULL); + assert(m_port != NULL); unsigned char buffer[80U]; unsigned char len = 8U + m_fmRfAck.size(); @@ -2696,7 +2689,7 @@ bool CMMDVMModem::setFMAckParams() // CUtils::dump(1U, "Written", buffer, len); - int ret = m_serial->write(buffer, len); + int ret = m_port->write(buffer, len); if (ret != len) return false; @@ -2727,7 +2720,7 @@ bool CMMDVMModem::setFMAckParams() bool CMMDVMModem::setFMMiscParams() { - assert(m_serial != NULL); + assert(m_port != NULL); unsigned char buffer[20U]; @@ -2763,7 +2756,7 @@ bool CMMDVMModem::setFMMiscParams() // CUtils::dump(1U, "Written", buffer, 17U); - int ret = m_serial->write(buffer, 17U); + int ret = m_port->write(buffer, 17U); if (ret != 17) return false; @@ -2794,7 +2787,7 @@ bool CMMDVMModem::setFMMiscParams() bool CMMDVMModem::setFMExtParams() { - assert(m_serial != NULL); + assert(m_port != NULL); unsigned char buffer[80U]; unsigned char len = 7U + m_fmExtAck.size(); @@ -2814,7 +2807,7 @@ bool CMMDVMModem::setFMExtParams() // CUtils::dump(1U, "Written", buffer, len); - int ret = m_serial->write(buffer, len); + int ret = m_port->write(buffer, len); if (ret != len) return false; diff --git a/MMDVMModem.h b/MMDVMModem.h index 6e73ce8c3..5670d289a 100644 --- a/MMDVMModem.h +++ b/MMDVMModem.h @@ -21,7 +21,7 @@ #include "Modem.h" -#include "SerialPort.h" +#include "MMDVMModemPort.h" #include "RingBuffer.h" #include "Defines.h" #include "Timer.h" @@ -44,10 +44,10 @@ enum SERIAL_STATE { class CMMDVMModem : public IModem { public: - CMMDVMModem(const std::string& port, bool duplex, bool rxInvert, bool txInvert, bool pttInvert, unsigned int txDelay, unsigned int dmrDelay, bool useCOSAsLockout, bool trace, bool debug); + CMMDVMModem(bool duplex, bool rxInvert, bool txInvert, bool pttInvert, unsigned int txDelay, unsigned int dmrDelay, bool useCOSAsLockout, bool trace, bool debug); virtual ~CMMDVMModem(); - virtual void setSerialParams(const std::string& protocol, unsigned int address, unsigned int speed); + virtual void setModem(IMMDVMModemPort* port); 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 m17Enabled, bool pocsagEnabled, bool fmEnabled, bool ax25Enabled); virtual void setLevels(float rxLevel, float cwIdTXLevel, float dstarTXLevel, float dmrTXLevel, float ysfTXLevel, float p25TXLevel, float nxdnTXLevel, float m17TXLevel, float pocsagLevel, float fmTXLevel, float ax25TXLevel); @@ -136,7 +136,6 @@ class CMMDVMModem : public IModem { virtual void close(); private: - std::string m_port; unsigned int m_protocolVersion; unsigned int m_dmrColorCode; bool m_ysfLoDev; @@ -179,7 +178,7 @@ class CMMDVMModem : public IModem { bool m_ax25Enabled; int m_rxDCOffset; int m_txDCOffset; - ISerialPort* m_serial; + IMMDVMModemPort* m_port; unsigned char* m_buffer; unsigned int m_length; unsigned int m_offset; diff --git a/MMDVMModemPort.cpp b/MMDVMModemPort.cpp new file mode 100644 index 000000000..5b60b744c --- /dev/null +++ b/MMDVMModemPort.cpp @@ -0,0 +1,23 @@ +/* +* Copyright (C) 2016,2021 by Jonathan Naylor G4KLX +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "MMDVMModemPort.h" + +IMMDVMModemPort::~IMMDVMModemPort() +{ +} diff --git a/MMDVMModemPort.h b/MMDVMModemPort.h new file mode 100644 index 000000000..565708c72 --- /dev/null +++ b/MMDVMModemPort.h @@ -0,0 +1,37 @@ +/* +* Copyright (C) 2016,2021 by Jonathan Naylor G4KLX +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef MMDVMModemPort_H +#define MMDVMModemPort_H + +class IMMDVMModemPort { +public: + virtual ~IMMDVMModemPort() = 0; + + virtual bool open() = 0; + + virtual int read(unsigned char* buffer, unsigned int length) = 0; + + virtual int write(const unsigned char* buffer, unsigned int length) = 0; + + virtual void close() = 0; + +private: +}; + +#endif diff --git a/Makefile b/Makefile index 108776ad1..d26be33c7 100644 --- a/Makefile +++ b/Makefile @@ -11,11 +11,11 @@ OBJECTS = \ DMRDirectNetwork.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRGatewayNetwork.o DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o \ DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o FMControl.o FMNetwork.o Golay2087.o Golay24128.o \ Hamming.o I2CController.o IIRDirectForm1Filter.o LCDproc.o Log.o M17Control.o M17Convolution.o M17CRC.o M17LICH.o M17Network.o M17Utils.o MMDVMHost.o \ - MMDVMModem.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NullModem.o NXDNAudio.o NXDNControl.o NXDNConvolution.o NXDNCRC.o \ - NXDNFACCH1.o NXDNIcomNetwork.o NXDNKenwoodNetwork.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o \ - P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o PseudoTTYController.o POCSAGControl.o POCSAGNetwork.o QR1676.o \ - RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialPort.o StopWatch.o Sync.o SHA256.o TFTSurenoo.o Thread.o Timer.o UARTController.o \ - UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o + MMDVMModem.o MMDVMModemPort.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NullModem.o NXDNAudio.o NXDNControl.o \ + NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNIcomNetwork.o NXDNKenwoodNetwork.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o \ + NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o PseudoTTYController.o POCSAGControl.o \ + POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialPort.o StopWatch.o Sync.o SHA256.o TFTSurenoo.o Thread.o Timer.o \ + UARTController.o UDPController.o UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o all: MMDVMHost RemoteCommand diff --git a/Makefile.Pi b/Makefile.Pi index 110672b1f..0662f57f4 100644 --- a/Makefile.Pi +++ b/Makefile.Pi @@ -11,11 +11,11 @@ OBJECTS = \ DMRDirectNetwork.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRGatewayNetwork.o DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o \ DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o FMControl.o FMNetwork.o Golay2087.o Golay24128.o \ Hamming.o I2CController.o IIRDirectForm1Filter.o LCDproc.o Log.o M17Control.o M17Convolution.o M17CRC.o M17LICH.o M17Network.o M17Utils.o MMDVMHost.o \ - MMDVMModem.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NullModem.o NXDNAudio.o NXDNControl.o NXDNConvolution.o NXDNCRC.o \ - NXDNFACCH1.o NXDNIcomNetwork.o NXDNKenwoodNetwork.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o \ - P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o PseudoTTYController.o POCSAGControl.o POCSAGNetwork.o QR1676.o \ - RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialPort.o StopWatch.o Sync.o SHA256.o TFTSurenoo.o Thread.o Timer.o UARTController.o \ - UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o + MMDVMModem.o MMDVMModemPort.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NullModem.o NXDNAudio.o NXDNControl.o \ + NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNIcomNetwork.o NXDNKenwoodNetwork.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o \ + NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o PseudoTTYController.o POCSAGControl.o \ + POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialPort.o StopWatch.o Sync.o SHA256.o TFTSurenoo.o Thread.o Timer.o \ + UARTController.o UDPController.o UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o all: MMDVMHost RemoteCommand diff --git a/Makefile.Pi.Adafruit b/Makefile.Pi.Adafruit index 2fe709853..eeb192aab 100644 --- a/Makefile.Pi.Adafruit +++ b/Makefile.Pi.Adafruit @@ -12,11 +12,11 @@ OBJECTS = \ DMRDirectNetwork.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRGatewayNetwork.o DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o \ DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o FMControl.o FMNetwork.o Golay2087.o Golay24128.o \ Hamming.o HD44780.o I2CController.o IIRDirectForm1Filter.o LCDproc.o Log.o M17Control.o M17Convolution.o M17CRC.o M17LICH.o M17Network.o M17Utils.o \ - MMDVMHost.o MMDVMModem.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NullModem.o NXDNAudio.o NXDNControl.o \ + MMDVMHost.o MMDVMModem.o MMDVMModemPort.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NullModem.o NXDNAudio.o NXDNControl.o \ NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNIcomNetwork.o NXDNKenwoodNetwork.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o \ NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o PseudoTTYController.o POCSAGControl.o \ POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialPort.o StopWatch.o Sync.o SHA256.o TFTSurenoo.o Thread.o Timer.o \ - UARTController.o UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o + UARTController.o UDPController.o UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o all: MMDVMHost RemoteCommand diff --git a/Makefile.Pi.HD44780 b/Makefile.Pi.HD44780 index 1db3fcfe0..92a7b58c6 100644 --- a/Makefile.Pi.HD44780 +++ b/Makefile.Pi.HD44780 @@ -11,11 +11,11 @@ OBJECTS = \ DMRDirectNetwork.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRGatewayNetwork.o DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o \ DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o FMControl.o FMNetwork.o Golay2087.o Golay24128.o \ Hamming.o HD44780.o I2CController.o IIRDirectForm1Filter.o LCDproc.o Log.o M17Control.o M17Convolution.o M17CRC.o M17LICH.o M17Network.o M17Utils.o \ - MMDVMHost.o MMDVMModem.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NullModem.o NXDNAudio.o NXDNControl.o \ + MMDVMHost.o MMDVMModem.o MMDVMModemPort.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NullModem.o NXDNAudio.o NXDNControl.o \ NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNIcomNetwork.o NXDNKenwoodNetwork.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o \ NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o PseudoTTYController.o POCSAGControl.o \ POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialPort.o StopWatch.o Sync.o SHA256.o TFTSurenoo.o Thread.o Timer.o \ - UARTController.o UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o + UARTController.o UDPController.o UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o all: MMDVMHost RemoteCommand diff --git a/Makefile.Pi.OLED b/Makefile.Pi.OLED index 5c692cec4..42c584d8a 100644 --- a/Makefile.Pi.OLED +++ b/Makefile.Pi.OLED @@ -15,11 +15,12 @@ OBJECTS = \ DMRDirectNetwork.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRGatewayNetwork.o DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o \ DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o FMControl.o FMNetwork.o Golay2087.o Golay24128.o \ Hamming.o I2CController.o IIRDirectForm1Filter.o LCDproc.o Log.o M17Control.o M17Convolution.o M17CRC.o M17LICH.o M17Network.o M17Utils.o MMDVMHost.o \ - MMDVMModem.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NullModem.o NXDNAudio.o NXDNControl.o NXDNConvolution.o NXDNCRC.o \ - NXDNFACCH1.o NXDNIcomNetwork.o NXDNKenwoodNetwork.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o NXDNUDCH.o OLED.o P25Audio.o \ - P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o PseudoTTYController.o POCSAGControl.o POCSAGNetwork.o QR1676.o \ - RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialPort.o StopWatch.o Sync.o SHA256.o TFTSurenoo.o Thread.o Timer.o UARTController.o \ - UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o + MMDVMModem.o MMDVMModemPort.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NullModem.o NXDNAudio.o NXDNControl.o \ + NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNIcomNetwork.o NXDNKenwoodNetwork.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o \ + NXDNUDCH.o OLED.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o PseudoTTYController.o \ + POCSAGControl.o POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialPort.o StopWatch.o Sync.o SHA256.o TFTSurenoo.o \ + Thread.o Timer.o UARTController.o UDPController.o UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o \ + YSFPayload.o all: MMDVMHost RemoteCommand diff --git a/Makefile.Pi.PCF8574 b/Makefile.Pi.PCF8574 index 8da7d05a2..0c5464012 100644 --- a/Makefile.Pi.PCF8574 +++ b/Makefile.Pi.PCF8574 @@ -12,11 +12,11 @@ OBJECTS = \ DMRDirectNetwork.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRGatewayNetwork.o DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o \ DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o FMControl.o FMNetwork.o Golay2087.o Golay24128.o \ Hamming.o HD44780.o I2CController.o IIRDirectForm1Filter.o LCDproc.o Log.o M17Control.o M17Convolution.o M17CRC.o M17LICH.o M17Network.o M17Utils.o \ - MMDVMHost.o MMDVMModem.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NullModem.o NXDNAudio.o NXDNControl.o \ + MMDVMHost.o MMDVMModem.o MMDVMModemPort.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NullModem.o NXDNAudio.o NXDNControl.o \ NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNIcomNetwork.o NXDNKenwoodNetwork.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o \ NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o PseudoTTYController.o POCSAGControl.o \ POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialPort.o StopWatch.o Sync.o SHA256.o TFTSurenoo.o Thread.o Timer.o \ - UARTController.o UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o + UARTController.o UDPController.o UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o all: MMDVMHost RemoteCommand diff --git a/Modem.h b/Modem.h index faf091728..896e5de75 100644 --- a/Modem.h +++ b/Modem.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011-2018,2020 by Jonathan Naylor G4KLX + * Copyright (C) 2011-2018,2020,2021 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,6 +20,7 @@ #define MODEM_H #include "Defines.h" +#include "MMDVMModemPort.h" #include @@ -27,7 +28,7 @@ class IModem { public: virtual ~IModem() = 0; - virtual void setSerialParams(const std::string& protocol, unsigned int address, unsigned int speed) = 0; + virtual void setModem(IMMDVMModemPort* port) = 0; virtual void setRFParams(unsigned int rxFrequency, int rxOffset, unsigned int txFrequency, int txOffset, int txDCOffset, int rxDCOffset, float rfLevel, unsigned int pocsagFrequency) = 0; virtual void setModeParams(bool dstarEnabled, bool dmrEnabled, bool ysfEnabled, bool p25Enabled, bool nxdnEnabled, bool m17ENabled, bool pocsagEnabled, bool fmEnabled, bool ax25Enabled) = 0; virtual void setLevels(float rxLevel, float cwIdTXLevel, float dstarTXLevel, float dmrTXLevel, float ysfTXLevel, float p25TXLevel, float nxdnTXLevel, float m17TXLevel, float pocsagLevel, float fmTXLevel, float ax25TXLevel) = 0; diff --git a/NullModem.h b/NullModem.h index 83e60d6bb..442b13e11 100644 --- a/NullModem.h +++ b/NullModem.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011-2018,2020 by Jonathan Naylor G4KLX + * Copyright (C) 2011-2018,2020,2021 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -29,7 +29,7 @@ class CNullModem : public IModem { CNullModem(); virtual ~CNullModem(); - virtual void setSerialParams(const std::string& protocol, unsigned int address, unsigned int speed) {}; + virtual void setModem(IMMDVMModemPort* port) {}; 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 m17Enabled, bool pocsagEnabled, bool fmEnabled, bool ax25Enabled) {}; virtual void setLevels(float rxLevel, float cwIdTXLevel, float dstarTXLevel, float dmrTXLevel, float ysfTXLevel, float p25TXLevel, float nxdnTXLevel, float m17TXLevel, float pocsagLevel, float fmTXLevel, float ax25TXLevel) {}; diff --git a/UARTController.h b/UARTController.h index e1e245f62..bd7d13327 100644 --- a/UARTController.h +++ b/UARTController.h @@ -20,6 +20,7 @@ #ifndef UARTController_H #define UARTController_H +#include "MMDVMModemPort.h" #include "SerialPort.h" #include @@ -28,7 +29,7 @@ #include #endif -class CUARTController : public ISerialPort { +class CUARTController : public ISerialPort, public IMMDVMModemPort { public: CUARTController(const std::string& device, unsigned int speed, bool assertRTS = false); virtual ~CUARTController(); diff --git a/UDPController.cpp b/UDPController.cpp new file mode 100644 index 000000000..7e38d7c7c --- /dev/null +++ b/UDPController.cpp @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2021 by Jonathan Naylor G4KLX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "UDPController.h" +#include "Log.h" + +#include +#include + +const unsigned int BUFFER_LENGTH = 600U; + +CUDPController::CUDPController(const std::string& modemAddress, unsigned int modemPort, unsigned int localPort) : +m_socket(localPort), +m_addr(), +m_addrLen(0U), +m_buffer(NULL), +m_length(0U), +m_offset(0U) +{ + assert(!modemAddress.empty()); + assert(modemPort > 0U); + assert(localPort > 0U); + + if (CUDPSocket::lookup(modemAddress, modemPort, m_addr, m_addrLen) != 0) + m_addrLen = 0U; + + m_buffer = new unsigned char[BUFFER_LENGTH]; +} + +CUDPController::~CUDPController() +{ + delete[] m_buffer; +} + +bool CUDPController::open() +{ + if (m_addrLen == 0U) { + LogError("Unable to resolve the address of the modem"); + return false; + } + + return m_socket.open(m_addr); +} + +int CUDPController::read(unsigned char* buffer, unsigned int length) +{ + assert(buffer != NULL); + assert(length > 0U); + + return 0; +} + +int CUDPController::write(const unsigned char* buffer, unsigned int length) +{ + assert(buffer != NULL); + assert(length > 0U); + + return m_socket.write(buffer, length, m_addr, m_addrLen) ? int(length) : -1; +} + +void CUDPController::close() +{ + m_socket.close(); +} diff --git a/UDPController.h b/UDPController.h new file mode 100644 index 000000000..6e24eca35 --- /dev/null +++ b/UDPController.h @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2021 by Jonathan Naylor G4KLX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef UDPController_H +#define UDPController_H + +#include "MMDVMModemPort.h" +#include "UDPSocket.h" + +#include + +class CUDPController : public IMMDVMModemPort { +public: + CUDPController(const std::string& modemAddress, unsigned int modemPort, unsigned int localPort); + virtual ~CUDPController(); + + virtual bool open(); + + virtual int read(unsigned char* buffer, unsigned int length); + + virtual int write(const unsigned char* buffer, unsigned int length); + + virtual void close(); + +protected: + CUDPSocket m_socket; + sockaddr_storage m_addr; + unsigned int m_addrLen; + unsigned char* m_buffer; + unsigned int m_length; + unsigned int m_offset; +}; + +#endif