Add the AX.25 modem parameters and start reworking the AX,25 RX

processing.
This commit is contained in:
Jonathan Naylor
2020-06-21 14:15:37 +01:00
parent fe77cbd68c
commit 692d6519db
11 changed files with 101 additions and 124 deletions

View File

@@ -51,12 +51,10 @@ bool CAX25Control::writeModem(unsigned char *data, unsigned int len)
CUtils::dump(1U, "AX.25 raw packet", data, len); CUtils::dump(1U, "AX.25 raw packet", data, len);
if (m_network != NULL) { if (m_network == NULL)
if (isUI(data, len)) return true;
m_network->writeAX25(data, len);
}
return true; return m_network->write(data, len);
} }
bool CAX25Control::openFile() bool CAX25Control::openFile()
@@ -233,15 +231,3 @@ bool CAX25Control::decodeAddress(const unsigned char* data, std::string& text, b
return (data[6U] & 0x01U) == 0x00U; 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;
}

View File

@@ -38,7 +38,6 @@ private:
bool m_enabled; bool m_enabled;
FILE* m_fp; FILE* m_fp;
bool isUI(const unsigned char* data, unsigned int length) const;
void decode(const unsigned char* data, unsigned int length); void decode(const unsigned char* data, unsigned int length);
bool decodeAddress(const unsigned char* data, std::string& text, bool isDigi = false) const; bool decodeAddress(const unsigned char* data, std::string& text, bool isDigi = false) const;
bool openFile(); bool openFile();

View File

@@ -27,34 +27,38 @@
const unsigned int BUFFER_LENGTH = 200U; const unsigned int BUFFER_LENGTH = 200U;
CAX25Network::CAX25Network(const std::string& localAddress, unsigned int localPort, const std::string& gatewayAddress, unsigned int gatewayPort, bool debug) : CAX25Network::CAX25Network(const std::string& port, unsigned int speed, bool debug) :
m_socket(localAddress, localPort), m_serial(port, SERIAL_SPEED(speed), false), // XXX
m_address(), m_txData(NULL),
m_port(gatewayPort), m_txLength(0U),
m_txOffset(0U),
m_rxData(NULL),
m_rxLength(0U),
m_rxComplete(false),
m_debug(debug), m_debug(debug),
m_enabled(false) m_enabled(false)
{ {
assert(gatewayPort > 0U); assert(!port.empty());
assert(!gatewayAddress.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() CAX25Network::~CAX25Network()
{ {
delete[] m_txData;
delete[] m_rxData;
} }
bool CAX25Network::open() bool CAX25Network::open()
{ {
LogMessage("Opening AX25 network connection"); LogMessage("Opening AX25 network connection");
if (m_address.s_addr == INADDR_NONE) return m_serial.open();
return false;
return m_socket.open();
} }
bool CAX25Network::writeAX25(const unsigned char* data, unsigned int length) bool CAX25Network::write(const unsigned char* data, unsigned int length)
{ {
assert(data != NULL); assert(data != NULL);
@@ -80,7 +84,7 @@ void CAX25Network::reset()
void CAX25Network::close() void CAX25Network::close()
{ {
m_socket.close(); m_serial.close();
LogMessage("Closing AX25 network connection"); LogMessage("Closing AX25 network connection");
} }

View File

@@ -19,32 +19,38 @@
#ifndef AX25Network_H #ifndef AX25Network_H
#define AX25Network_H #define AX25Network_H
#include "UDPSocket.h" #include "SerialController.h"
#include <cstdint> #include <cstdint>
#include <string> #include <string>
class CAX25Network { class CAX25Network {
public: 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(); ~CAX25Network();
bool open(); bool open();
void enable(bool enabled); 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 reset();
void close(); void close();
private: private:
CUDPSocket m_socket; CSerialController m_serial;
in_addr m_address; unsigned char* m_txData;
unsigned int m_port; unsigned int m_txLength;
bool m_debug; unsigned int m_txOffset;
bool m_enabled; unsigned char* m_rxData;
unsigned int m_rxLength;
bool m_rxComplete;
bool m_debug;
bool m_enabled;
}; };
#endif #endif

View File

@@ -211,7 +211,6 @@ m_fmExtAudioBoost(1U),
m_ax25Enabled(false), m_ax25Enabled(false),
m_ax25RXTwist(6), m_ax25RXTwist(6),
m_ax25TXTwist(6), m_ax25TXTwist(6),
m_ax25Digipeat(true),
m_ax25Trace(false), m_ax25Trace(false),
m_dstarNetworkEnabled(false), m_dstarNetworkEnabled(false),
m_dstarGatewayAddress(), m_dstarGatewayAddress(),
@@ -259,10 +258,8 @@ m_pocsagLocalPort(0U),
m_pocsagNetworkModeHang(3U), m_pocsagNetworkModeHang(3U),
m_pocsagNetworkDebug(false), m_pocsagNetworkDebug(false),
m_ax25NetworkEnabled(false), m_ax25NetworkEnabled(false),
m_ax25GatewayAddress(), m_ax25NetworkPort(),
m_ax25GatewayPort(0U), m_ax25NetworkSpeed(9600U),
m_ax25LocalAddress(),
m_ax25LocalPort(0U),
m_ax25NetworkDebug(false), m_ax25NetworkDebug(false),
m_tftSerialPort("/dev/ttyAMA0"), m_tftSerialPort("/dev/ttyAMA0"),
m_tftSerialBrightness(50U), m_tftSerialBrightness(50U),
@@ -802,8 +799,6 @@ bool CConf::read()
m_ax25RXTwist = ::atoi(value); m_ax25RXTwist = ::atoi(value);
else if (::strcmp(key, "TXTwist") == 0) else if (::strcmp(key, "TXTwist") == 0)
m_ax25TXTwist = ::atoi(value); m_ax25TXTwist = ::atoi(value);
else if (::strcmp(key, "Digipeat") == 0)
m_ax25Digipeat = ::atoi(value) == 1;
else if (::strcmp(key, "Trace") == 0) else if (::strcmp(key, "Trace") == 0)
m_ax25Trace = ::atoi(value) == 1; m_ax25Trace = ::atoi(value) == 1;
} else if (section == SECTION_DSTAR_NETWORK) { } else if (section == SECTION_DSTAR_NETWORK) {
@@ -903,18 +898,14 @@ bool CConf::read()
else if (::strcmp(key, "Debug") == 0) else if (::strcmp(key, "Debug") == 0)
m_pocsagNetworkDebug = ::atoi(value) == 1; m_pocsagNetworkDebug = ::atoi(value) == 1;
} else if (section == SECTION_AX25_NETWORK) { } else if (section == SECTION_AX25_NETWORK) {
if (::strcmp(key, "Enable") == 0) if (::strcmp(key, "Enable") == 0)
m_ax25NetworkEnabled = ::atoi(value) == 1; m_ax25NetworkEnabled = ::atoi(value) == 1;
else if (::strcmp(key, "LocalAddress") == 0) else if (::strcmp(key, "Port") == 0)
m_ax25LocalAddress = value; m_ax25NetworkPort = value;
else if (::strcmp(key, "LocalPort") == 0) else if (::strcmp(key, "Speed") == 0)
m_ax25LocalPort = (unsigned int)::atoi(value); m_ax25NetworkSpeed = (unsigned int)::atoi(value);
else if (::strcmp(key, "GatewayAddress") == 0) else if (::strcmp(key, "Debug") == 0)
m_ax25GatewayAddress = value; m_ax25NetworkDebug = ::atoi(value) == 1;
else if (::strcmp(key, "GatewayPort") == 0)
m_ax25GatewayPort = (unsigned int)::atoi(value);
else if (::strcmp(key, "Debug") == 0)
m_ax25NetworkDebug = ::atoi(value) == 1;
} else if (section == SECTION_TFTSERIAL) { } else if (section == SECTION_TFTSERIAL) {
if (::strcmp(key, "Port") == 0) if (::strcmp(key, "Port") == 0)
m_tftSerialPort = value; m_tftSerialPort = value;
@@ -1743,11 +1734,6 @@ int CConf::getAX25TXTwist() const
return m_ax25TXTwist; return m_ax25TXTwist;
} }
bool CConf::getAX25Digipeat() const
{
return m_ax25Digipeat;
}
bool CConf::getAX25Trace() const bool CConf::getAX25Trace() const
{ {
return m_ax25Trace; return m_ax25Trace;
@@ -1983,24 +1969,14 @@ bool CConf::getAX25NetworkEnabled() const
return m_ax25NetworkEnabled; 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; return m_ax25NetworkSpeed;
}
std::string CConf::getAX25LocalAddress() const
{
return m_ax25LocalAddress;
}
unsigned int CConf::getAX25LocalPort() const
{
return m_ax25LocalPort;
} }
bool CConf::getAX25NetworkDebug() const bool CConf::getAX25NetworkDebug() const

14
Conf.h
View File

@@ -176,7 +176,6 @@ public:
bool getAX25Enabled() const; bool getAX25Enabled() const;
int getAX25RXTwist() const; int getAX25RXTwist() const;
int getAX25TXTwist() const; int getAX25TXTwist() const;
bool getAX25Digipeat() const;
bool getAX25Trace() const; bool getAX25Trace() const;
// The FM Section // The FM Section
@@ -271,10 +270,8 @@ public:
// The AX.25 Network section // The AX.25 Network section
bool getAX25NetworkEnabled() const; bool getAX25NetworkEnabled() const;
std::string getAX25GatewayAddress() const; std::string getAX25NetworkPort() const;
unsigned int getAX25GatewayPort() const; unsigned int getAX25NetworkSpeed() const;
std::string getAX25LocalAddress() const;
unsigned int getAX25LocalPort() const;
bool getAX25NetworkDebug() const; bool getAX25NetworkDebug() const;
// The TFTSERIAL section // The TFTSERIAL section
@@ -463,7 +460,6 @@ private:
bool m_ax25Enabled; bool m_ax25Enabled;
int m_ax25RXTwist; int m_ax25RXTwist;
int m_ax25TXTwist; int m_ax25TXTwist;
bool m_ax25Digipeat;
bool m_ax25Trace; bool m_ax25Trace;
bool m_fmEnabled; bool m_fmEnabled;
@@ -550,10 +546,8 @@ private:
bool m_pocsagNetworkDebug; bool m_pocsagNetworkDebug;
bool m_ax25NetworkEnabled; bool m_ax25NetworkEnabled;
std::string m_ax25GatewayAddress; std::string m_ax25NetworkPort;
unsigned int m_ax25GatewayPort; unsigned int m_ax25NetworkSpeed;
std::string m_ax25LocalAddress;
unsigned int m_ax25LocalPort;
bool m_ax25NetworkDebug; bool m_ax25NetworkDebug;
std::string m_tftSerialPort; std::string m_tftSerialPort;

View File

@@ -180,7 +180,6 @@ ExtAudioBoost=1
Enable=1 Enable=1
TXTwist=6 TXTwist=6
RXTwist=6 RXTwist=6
Digipeat=1
Trace=1 Trace=1
[D-Star Network] [D-Star Network]
@@ -242,10 +241,8 @@ Debug=0
[AX.25 Network] [AX.25 Network]
Enable=1 Enable=1
LocalAddress=127.0.0.1 Port=/dev/ttyp7
LocalPort=47325 Speed=9600
GatewayAddress=127.0.0.1
GatewayPort=47326
Debug=0 Debug=0
[TFT Serial] [TFT Serial]

View File

@@ -626,18 +626,16 @@ int CMMDVMHost::run()
} }
if (m_ax25Enabled) { if (m_ax25Enabled) {
int rxTwist = m_conf.getAX25RXTwist(); int rxTwist = m_conf.getAX25RXTwist();
int txTwist = m_conf.getAX25TXTwist(); int txTwist = m_conf.getAX25TXTwist();
bool digipeat = m_conf.getAX25Digipeat(); bool trace = m_conf.getAX25Trace();
bool trace = m_conf.getAX25Trace();
LogInfo("AX.25 RF Parameters"); LogInfo("AX.25 RF Parameters");
LogInfo(" RXTwist: %d", rxTwist); LogInfo(" RXTwist: %d", rxTwist);
LogInfo(" TXTwist: %d", txTwist); LogInfo(" TXTwist: %d", txTwist);
LogInfo(" Digipeat: %s", digipeat ? "yes" : "no");
LogInfo(" Trace: %s", trace ? "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(); bool remoteControlEnabled = m_conf.getRemoteControlEnabled();
@@ -1584,19 +1582,15 @@ bool CMMDVMHost::createPOCSAGNetwork()
bool CMMDVMHost::createAX25Network() bool CMMDVMHost::createAX25Network()
{ {
std::string gatewayAddress = m_conf.getAX25GatewayAddress(); std::string port = m_conf.getAX25NetworkPort();
unsigned int gatewayPort = m_conf.getAX25GatewayPort(); unsigned int speed = m_conf.getAX25NetworkSpeed();
std::string localAddress = m_conf.getAX25LocalAddress(); bool debug = m_conf.getAX25NetworkDebug();
unsigned int localPort = m_conf.getAX25LocalPort();
bool debug = m_conf.getAX25NetworkDebug();
LogInfo("AX.25 Network Parameters"); LogInfo("AX.25 Network Parameters");
LogInfo(" Gateway Address: %s", gatewayAddress.c_str()); LogInfo(" Port: %s", port.c_str());
LogInfo(" Gateway Port: %u", gatewayPort); LogInfo(" Speed: %u", speed);
LogInfo(" Local Address: %s", localAddress.c_str());
LogInfo(" Local Port: %u", localPort);
m_ax25Network = new CAX25Network(localAddress, localPort, gatewayAddress, gatewayPort, debug); m_ax25Network = new CAX25Network(port, speed, debug);
bool ret = m_ax25Network->open(); bool ret = m_ax25Network->open();
if (!ret) { if (!ret) {

View File

@@ -114,15 +114,17 @@ m_txInvert(txInvert),
m_pttInvert(pttInvert), m_pttInvert(pttInvert),
m_txDelay(txDelay), m_txDelay(txDelay),
m_dmrDelay(dmrDelay), m_dmrDelay(dmrDelay),
m_rxLevel(0U), m_rxLevel(0.0F),
m_cwIdTXLevel(0U), m_cwIdTXLevel(0.0F),
m_dstarTXLevel(0U), m_dstarTXLevel(0.0F),
m_dmrTXLevel(0U), m_dmrTXLevel(0.0F),
m_ysfTXLevel(0U), m_ysfTXLevel(0.0F),
m_p25TXLevel(0U), m_p25TXLevel(0.0F),
m_nxdnTXLevel(0U), m_nxdnTXLevel(0.0F),
m_pocsagTXLevel(0U), m_pocsagTXLevel(0.0F),
m_fmTXLevel(0U), m_fmTXLevel(0.0F),
m_ax25TXLevel(0.0F),
m_rfLevel(0.0F),
m_trace(trace), m_trace(trace),
m_debug(debug), m_debug(debug),
m_rxFrequency(0U), m_rxFrequency(0U),
@@ -177,6 +179,8 @@ m_lockout(false),
m_error(false), m_error(false),
m_mode(MODE_IDLE), m_mode(MODE_IDLE),
m_hwType(HWT_UNKNOWN), m_hwType(HWT_UNKNOWN),
m_ax25RXTwist(0),
m_ax25TXTwist(0),
m_fmCallsign(), m_fmCallsign(),
m_fmCallsignSpeed(20U), m_fmCallsignSpeed(20U),
m_fmCallsignFrequency(1000U), m_fmCallsignFrequency(1000U),
@@ -248,7 +252,7 @@ void CModem::setModeParams(bool dstarEnabled, bool dmrEnabled, bool ysfEnabled,
m_ax25Enabled = ax25Enabled; 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_rxLevel = rxLevel;
m_cwIdTXLevel = cwIdTXLevel; m_cwIdTXLevel = cwIdTXLevel;
@@ -259,6 +263,7 @@ void CModem::setLevels(float rxLevel, float cwIdTXLevel, float dstarTXLevel, flo
m_nxdnTXLevel = nxdnTXLevel; m_nxdnTXLevel = nxdnTXLevel;
m_pocsagTXLevel = pocsagTXLevel; m_pocsagTXLevel = pocsagTXLevel;
m_fmTXLevel = fmTXLevel; m_fmTXLevel = fmTXLevel;
m_ax25TXLevel = ax25TXLevel;
} }
void CModem::setDMRParams(unsigned int colorCode) void CModem::setDMRParams(unsigned int colorCode)
@@ -284,6 +289,12 @@ void CModem::setNXDNParams(unsigned int txHang)
m_nxdnTXHang = txHang; m_nxdnTXHang = txHang;
} }
void CModem::setAX25Params(int rxTwist, int txTwist)
{
m_ax25RXTwist = rxTwist;
m_ax25TXTwist = txTwist;
}
void CModem::setTransparentDataParams(unsigned int sendFrameType) void CModem::setTransparentDataParams(unsigned int sendFrameType)
{ {
m_sendTransparentDataFrameType = sendFrameType; m_sendTransparentDataFrameType = sendFrameType;
@@ -1551,7 +1562,7 @@ bool CModem::setConfig()
buffer[0U] = MMDVM_FRAME_START; buffer[0U] = MMDVM_FRAME_START;
buffer[1U] = 24U; buffer[1U] = 27U;
buffer[2U] = MMDVM_SET_CONFIG; buffer[2U] = MMDVM_SET_CONFIG;
@@ -1621,10 +1632,16 @@ bool CModem::setConfig()
buffer[23U] = (unsigned char)m_nxdnTXHang; 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); buffer[25U] = (unsigned char)(m_ax25RXTwist + 128);
if (ret != 24)
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; return false;
unsigned int count = 0U; unsigned int count = 0U;

View File

@@ -48,11 +48,12 @@ public:
virtual void setSerialParams(const std::string& protocol, unsigned int address); 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 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 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 setDMRParams(unsigned int colorCode);
virtual void setYSFParams(bool loDev, unsigned int txHang); virtual void setYSFParams(bool loDev, unsigned int txHang);
virtual void setP25Params(unsigned int txHang); virtual void setP25Params(unsigned int txHang);
virtual void setNXDNParams(unsigned int txHang); virtual void setNXDNParams(unsigned int txHang);
virtual void setAX25Params(int rxTwist, int txTwist);
virtual void setTransparentDataParams(unsigned int sendFrameType); 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); 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_nxdnTXLevel;
float m_pocsagTXLevel; float m_pocsagTXLevel;
float m_fmTXLevel; float m_fmTXLevel;
float m_ax25TXLevel;
float m_rfLevel; float m_rfLevel;
bool m_trace; bool m_trace;
bool m_debug; bool m_debug;
@@ -201,6 +203,8 @@ private:
bool m_error; bool m_error;
unsigned char m_mode; unsigned char m_mode;
HW_TYPE m_hwType; HW_TYPE m_hwType;
int m_ax25RXTwist;
int m_ax25TXTwist;
std::string m_fmCallsign; std::string m_fmCallsign;
unsigned int m_fmCallsignSpeed; unsigned int m_fmCallsignSpeed;

View File

@@ -19,6 +19,6 @@
#if !defined(VERSION_H) #if !defined(VERSION_H)
#define VERSION_H #define VERSION_H
const char* VERSION = "20200620"; const char* VERSION = "20200621";
#endif #endif