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);
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;
}

View file

@ -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();

View file

@ -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");
}

View file

@ -19,32 +19,38 @@
#ifndef AX25Network_H
#define AX25Network_H
#include "UDPSocket.h"
#include "SerialController.h"
#include <cstdint>
#include <string>
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

View file

@ -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

14
Conf.h
View file

@ -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;

View file

@ -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]

View file

@ -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) {

View file

@ -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;

View file

@ -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;

View file

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