mirror of
https://github.com/g4klx/MMDVMHost
synced 2025-12-23 00:35:53 +08:00
Initial code for AX.25 support.
This commit is contained in:
97
AX25Control.cpp
Normal file
97
AX25Control.cpp
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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; version 2 of the License.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "AX25Control.h"
|
||||||
|
#include "Utils.h"
|
||||||
|
#include "Log.h"
|
||||||
|
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cassert>
|
||||||
|
#include <cstring>
|
||||||
|
#include <ctime>
|
||||||
|
|
||||||
|
// #define DUMP_AX25
|
||||||
|
|
||||||
|
const unsigned char BIT_MASK_TABLE[] = { 0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U };
|
||||||
|
|
||||||
|
#define WRITE_BIT1(p,i,b) p[(i)>>3] = (b) ? (p[(i)>>3] | BIT_MASK_TABLE[(i)&7]) : (p[(i)>>3] & ~BIT_MASK_TABLE[(i)&7])
|
||||||
|
#define READ_BIT1(p,i) (p[(i)>>3] & BIT_MASK_TABLE[(i)&7])
|
||||||
|
|
||||||
|
CAX25Control::CAX25Control(CAX25Network* network) :
|
||||||
|
m_network(network),
|
||||||
|
m_enabled(true),
|
||||||
|
m_fp(NULL)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
CAX25Control::~CAX25Control()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CAX25Control::writeModem(unsigned char *data, unsigned int len)
|
||||||
|
{
|
||||||
|
assert(data != NULL);
|
||||||
|
|
||||||
|
if (!m_enabled)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
unsigned char type = data[0U];
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CAX25Control::openFile()
|
||||||
|
{
|
||||||
|
if (m_fp != NULL)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
time_t t;
|
||||||
|
::time(&t);
|
||||||
|
|
||||||
|
struct tm* tm = ::localtime(&t);
|
||||||
|
|
||||||
|
char name[100U];
|
||||||
|
::sprintf(name, "AX25_%04d%02d%02d_%02d%02d%02d.ambe", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);
|
||||||
|
|
||||||
|
m_fp = ::fopen(name, "wb");
|
||||||
|
if (m_fp == NULL)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
::fwrite("AX25", 1U, 4U, m_fp);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CAX25Control::writeFile(const unsigned char* data, unsigned int length)
|
||||||
|
{
|
||||||
|
if (m_fp == NULL)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
::fwrite(&length, 1U, sizeof(unsigned int), m_fp);
|
||||||
|
::fwrite(data, 1U, length, m_fp);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CAX25Control::closeFile()
|
||||||
|
{
|
||||||
|
if (m_fp != NULL) {
|
||||||
|
::fclose(m_fp);
|
||||||
|
m_fp = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CAX25Control::enable(bool enabled)
|
||||||
|
{
|
||||||
|
m_enabled = enabled;
|
||||||
|
}
|
||||||
45
AX25Control.h
Normal file
45
AX25Control.h
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(AX25Control_H)
|
||||||
|
#define AX25Control_H
|
||||||
|
|
||||||
|
#include "AX25Network.h"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
class CAX25Control {
|
||||||
|
public:
|
||||||
|
CAX25Control(CAX25Network* network);
|
||||||
|
~CAX25Control();
|
||||||
|
|
||||||
|
bool writeModem(unsigned char* data, unsigned int len);
|
||||||
|
|
||||||
|
void enable(bool enabled);
|
||||||
|
|
||||||
|
private:
|
||||||
|
CAX25Network* m_network;
|
||||||
|
bool m_enabled;
|
||||||
|
FILE* m_fp;
|
||||||
|
|
||||||
|
bool openFile();
|
||||||
|
bool writeFile(const unsigned char* data, unsigned int length);
|
||||||
|
void closeFile();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
111
AX25Network.cpp
Normal file
111
AX25Network.cpp
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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 "AX25Network.h"
|
||||||
|
#include "Defines.h"
|
||||||
|
#include "Utils.h"
|
||||||
|
#include "Log.h"
|
||||||
|
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cassert>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
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),
|
||||||
|
m_debug(debug),
|
||||||
|
m_enabled(false)
|
||||||
|
{
|
||||||
|
assert(gatewayPort > 0U);
|
||||||
|
assert(!gatewayAddress.empty());
|
||||||
|
|
||||||
|
m_address = CUDPSocket::lookup(gatewayAddress);
|
||||||
|
}
|
||||||
|
|
||||||
|
CAX25Network::~CAX25Network()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CAX25Network::open()
|
||||||
|
{
|
||||||
|
LogMessage("Opening AX25 network connection");
|
||||||
|
|
||||||
|
if (m_address.s_addr == INADDR_NONE)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return m_socket.open();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CAX25Network::writeAX25(const unsigned char* data, unsigned int length)
|
||||||
|
{
|
||||||
|
assert(data != NULL);
|
||||||
|
|
||||||
|
unsigned char buffer[110U];
|
||||||
|
::memset(buffer, 0x00U, 110U);
|
||||||
|
|
||||||
|
buffer[0U] = 'A';
|
||||||
|
buffer[1U] = 'X';
|
||||||
|
buffer[2U] = '2';
|
||||||
|
buffer[3U] = '5';
|
||||||
|
|
||||||
|
::memcpy(buffer + 4U, data, length);
|
||||||
|
|
||||||
|
if (m_debug)
|
||||||
|
CUtils::dump(1U, "AX25 Network Data Sent", buffer, length + 4U);
|
||||||
|
|
||||||
|
return m_socket.write(buffer, length + 4U, m_address, m_port);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CAX25Network::writeMICE(const unsigned char* data, unsigned int length)
|
||||||
|
{
|
||||||
|
assert(data != NULL);
|
||||||
|
|
||||||
|
unsigned char buffer[110U];
|
||||||
|
::memset(buffer, 0x00U, 110U);
|
||||||
|
|
||||||
|
buffer[0U] = 'M';
|
||||||
|
buffer[1U] = 'I';
|
||||||
|
buffer[2U] = 'C';
|
||||||
|
buffer[3U] = 'E';
|
||||||
|
|
||||||
|
::memcpy(buffer + 4U, data, length);
|
||||||
|
|
||||||
|
if (m_debug)
|
||||||
|
CUtils::dump(1U, "AX25 Network Data Sent", buffer, length + 4U);
|
||||||
|
|
||||||
|
return m_socket.write(buffer, length + 4U, m_address, m_port);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CAX25Network::reset()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void CAX25Network::close()
|
||||||
|
{
|
||||||
|
m_socket.close();
|
||||||
|
|
||||||
|
LogMessage("Closing AX25 network connection");
|
||||||
|
}
|
||||||
|
|
||||||
|
void CAX25Network::enable(bool enabled)
|
||||||
|
{
|
||||||
|
m_enabled = enabled;
|
||||||
|
}
|
||||||
51
AX25Network.h
Normal file
51
AX25Network.h
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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 AX25Network_H
|
||||||
|
#define AX25Network_H
|
||||||
|
|
||||||
|
#include "UDPSocket.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();
|
||||||
|
|
||||||
|
bool open();
|
||||||
|
|
||||||
|
void enable(bool enabled);
|
||||||
|
|
||||||
|
bool writeAX25(const unsigned char* data, unsigned int length);
|
||||||
|
bool writeMICE(const 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;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
67
Conf.cpp
67
Conf.cpp
@@ -45,12 +45,14 @@ enum SECTION {
|
|||||||
SECTION_NXDN,
|
SECTION_NXDN,
|
||||||
SECTION_POCSAG,
|
SECTION_POCSAG,
|
||||||
SECTION_FM,
|
SECTION_FM,
|
||||||
|
SECTION_AX25,
|
||||||
SECTION_DSTAR_NETWORK,
|
SECTION_DSTAR_NETWORK,
|
||||||
SECTION_DMR_NETWORK,
|
SECTION_DMR_NETWORK,
|
||||||
SECTION_FUSION_NETWORK,
|
SECTION_FUSION_NETWORK,
|
||||||
SECTION_P25_NETWORK,
|
SECTION_P25_NETWORK,
|
||||||
SECTION_NXDN_NETWORK,
|
SECTION_NXDN_NETWORK,
|
||||||
SECTION_POCSAG_NETWORK,
|
SECTION_POCSAG_NETWORK,
|
||||||
|
SECTION_AX25_NETWORK,
|
||||||
SECTION_TFTSERIAL,
|
SECTION_TFTSERIAL,
|
||||||
SECTION_HD44780,
|
SECTION_HD44780,
|
||||||
SECTION_NEXTION,
|
SECTION_NEXTION,
|
||||||
@@ -205,6 +207,7 @@ m_fmCOSInvert(false),
|
|||||||
m_fmRFAudioBoost(1U),
|
m_fmRFAudioBoost(1U),
|
||||||
m_fmMaxDevLevel(90.0F),
|
m_fmMaxDevLevel(90.0F),
|
||||||
m_fmExtAudioBoost(1U),
|
m_fmExtAudioBoost(1U),
|
||||||
|
m_ax25Enabled(false),
|
||||||
m_dstarNetworkEnabled(false),
|
m_dstarNetworkEnabled(false),
|
||||||
m_dstarGatewayAddress(),
|
m_dstarGatewayAddress(),
|
||||||
m_dstarGatewayPort(0U),
|
m_dstarGatewayPort(0U),
|
||||||
@@ -249,6 +252,12 @@ m_pocsagLocalAddress(),
|
|||||||
m_pocsagLocalPort(0U),
|
m_pocsagLocalPort(0U),
|
||||||
m_pocsagNetworkModeHang(3U),
|
m_pocsagNetworkModeHang(3U),
|
||||||
m_pocsagNetworkDebug(false),
|
m_pocsagNetworkDebug(false),
|
||||||
|
m_ax25NetworkEnabled(false),
|
||||||
|
m_ax25GatewayAddress(),
|
||||||
|
m_ax25GatewayPort(0U),
|
||||||
|
m_ax25LocalAddress(),
|
||||||
|
m_ax25LocalPort(0U),
|
||||||
|
m_ax25NetworkDebug(false),
|
||||||
m_tftSerialPort("/dev/ttyAMA0"),
|
m_tftSerialPort("/dev/ttyAMA0"),
|
||||||
m_tftSerialBrightness(50U),
|
m_tftSerialBrightness(50U),
|
||||||
m_hd44780Rows(2U),
|
m_hd44780Rows(2U),
|
||||||
@@ -342,6 +351,8 @@ bool CConf::read()
|
|||||||
section = SECTION_POCSAG;
|
section = SECTION_POCSAG;
|
||||||
else if (::strncmp(buffer, "[FM]", 4U) == 0)
|
else if (::strncmp(buffer, "[FM]", 4U) == 0)
|
||||||
section = SECTION_FM;
|
section = SECTION_FM;
|
||||||
|
else if (::strncmp(buffer, "[AX.25]", 7U) == 0)
|
||||||
|
section = SECTION_AX25;
|
||||||
else if (::strncmp(buffer, "[D-Star Network]", 16U) == 0)
|
else if (::strncmp(buffer, "[D-Star Network]", 16U) == 0)
|
||||||
section = SECTION_DSTAR_NETWORK;
|
section = SECTION_DSTAR_NETWORK;
|
||||||
else if (::strncmp(buffer, "[DMR Network]", 13U) == 0)
|
else if (::strncmp(buffer, "[DMR Network]", 13U) == 0)
|
||||||
@@ -354,6 +365,8 @@ bool CConf::read()
|
|||||||
section = SECTION_NXDN_NETWORK;
|
section = SECTION_NXDN_NETWORK;
|
||||||
else if (::strncmp(buffer, "[POCSAG Network]", 16U) == 0)
|
else if (::strncmp(buffer, "[POCSAG Network]", 16U) == 0)
|
||||||
section = SECTION_POCSAG_NETWORK;
|
section = SECTION_POCSAG_NETWORK;
|
||||||
|
else if (::strncmp(buffer, "[AX.25 Network]", 15U) == 0)
|
||||||
|
section = SECTION_AX25_NETWORK;
|
||||||
else if (::strncmp(buffer, "[TFT Serial]", 12U) == 0)
|
else if (::strncmp(buffer, "[TFT Serial]", 12U) == 0)
|
||||||
section = SECTION_TFTSERIAL;
|
section = SECTION_TFTSERIAL;
|
||||||
else if (::strncmp(buffer, "[HD44780]", 9U) == 0)
|
else if (::strncmp(buffer, "[HD44780]", 9U) == 0)
|
||||||
@@ -700,8 +713,7 @@ bool CConf::read()
|
|||||||
m_pocsagEnabled = ::atoi(value) == 1;
|
m_pocsagEnabled = ::atoi(value) == 1;
|
||||||
else if (::strcmp(key, "Frequency") == 0)
|
else if (::strcmp(key, "Frequency") == 0)
|
||||||
m_pocsagFrequency = (unsigned int)::atoi(value);
|
m_pocsagFrequency = (unsigned int)::atoi(value);
|
||||||
}
|
} else if (section == SECTION_FM) {
|
||||||
else if (section == SECTION_FM) {
|
|
||||||
if (::strcmp(key, "Enable") == 0)
|
if (::strcmp(key, "Enable") == 0)
|
||||||
m_fmEnabled = ::atoi(value) == 1;
|
m_fmEnabled = ::atoi(value) == 1;
|
||||||
else if (::strcmp(key, "Callsign") == 0) {
|
else if (::strcmp(key, "Callsign") == 0) {
|
||||||
@@ -775,6 +787,9 @@ bool CConf::read()
|
|||||||
m_fmMaxDevLevel = float(::atof(value));
|
m_fmMaxDevLevel = float(::atof(value));
|
||||||
else if (::strcmp(key, "ExtAudioBoost") == 0)
|
else if (::strcmp(key, "ExtAudioBoost") == 0)
|
||||||
m_fmExtAudioBoost = (unsigned int)::atoi(value);
|
m_fmExtAudioBoost = (unsigned int)::atoi(value);
|
||||||
|
} else if (section == SECTION_AX25) {
|
||||||
|
if (::strcmp(key, "Enable") == 0)
|
||||||
|
m_ax25Enabled = ::atoi(value) == 1;
|
||||||
} else if (section == SECTION_DSTAR_NETWORK) {
|
} else if (section == SECTION_DSTAR_NETWORK) {
|
||||||
if (::strcmp(key, "Enable") == 0)
|
if (::strcmp(key, "Enable") == 0)
|
||||||
m_dstarNetworkEnabled = ::atoi(value) == 1;
|
m_dstarNetworkEnabled = ::atoi(value) == 1;
|
||||||
@@ -869,6 +884,19 @@ bool CConf::read()
|
|||||||
m_pocsagNetworkModeHang = (unsigned int)::atoi(value);
|
m_pocsagNetworkModeHang = (unsigned int)::atoi(value);
|
||||||
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) {
|
||||||
|
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;
|
||||||
} 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;
|
||||||
@@ -1677,6 +1705,11 @@ unsigned int CConf::getFMExtAudioBoost() const
|
|||||||
return m_fmExtAudioBoost;
|
return m_fmExtAudioBoost;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CConf::getAX25Enabled() const
|
||||||
|
{
|
||||||
|
return m_ax25Enabled;
|
||||||
|
}
|
||||||
|
|
||||||
bool CConf::getDStarNetworkEnabled() const
|
bool CConf::getDStarNetworkEnabled() const
|
||||||
{
|
{
|
||||||
return m_dstarNetworkEnabled;
|
return m_dstarNetworkEnabled;
|
||||||
@@ -1897,6 +1930,36 @@ bool CConf::getPOCSAGNetworkDebug() const
|
|||||||
return m_pocsagNetworkDebug;
|
return m_pocsagNetworkDebug;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CConf::getAX25NetworkEnabled() const
|
||||||
|
{
|
||||||
|
return m_ax25NetworkEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string CConf::getAX25GatewayAddress() const
|
||||||
|
{
|
||||||
|
return m_ax25GatewayAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int CConf::getAX25GatewayPort() const
|
||||||
|
{
|
||||||
|
return m_ax25GatewayPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string CConf::getAX25LocalAddress() const
|
||||||
|
{
|
||||||
|
return m_ax25LocalAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int CConf::getAX25LocalPort() const
|
||||||
|
{
|
||||||
|
return m_ax25LocalPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CConf::getAX25NetworkDebug() const
|
||||||
|
{
|
||||||
|
return m_ax25NetworkDebug;
|
||||||
|
}
|
||||||
|
|
||||||
std::string CConf::getTFTSerialPort() const
|
std::string CConf::getTFTSerialPort() const
|
||||||
{
|
{
|
||||||
return m_tftSerialPort;
|
return m_tftSerialPort;
|
||||||
|
|||||||
20
Conf.h
20
Conf.h
@@ -171,6 +171,9 @@ public:
|
|||||||
bool getPOCSAGEnabled() const;
|
bool getPOCSAGEnabled() const;
|
||||||
unsigned int getPOCSAGFrequency() const;
|
unsigned int getPOCSAGFrequency() const;
|
||||||
|
|
||||||
|
// The AX.25 section
|
||||||
|
bool getAX25Enabled() const;
|
||||||
|
|
||||||
// The FM Section
|
// The FM Section
|
||||||
bool getFMEnabled() const;
|
bool getFMEnabled() const;
|
||||||
std::string getFMCallsign() const;
|
std::string getFMCallsign() const;
|
||||||
@@ -260,6 +263,14 @@ public:
|
|||||||
unsigned int getPOCSAGNetworkModeHang() const;
|
unsigned int getPOCSAGNetworkModeHang() const;
|
||||||
bool getPOCSAGNetworkDebug() const;
|
bool getPOCSAGNetworkDebug() const;
|
||||||
|
|
||||||
|
// The AX.25 Network section
|
||||||
|
bool getAX25NetworkEnabled() const;
|
||||||
|
std::string getAX25GatewayAddress() const;
|
||||||
|
unsigned int getAX25GatewayPort() const;
|
||||||
|
std::string getAX25LocalAddress() const;
|
||||||
|
unsigned int getAX25LocalPort() const;
|
||||||
|
bool getAX25NetworkDebug() const;
|
||||||
|
|
||||||
// The TFTSERIAL section
|
// The TFTSERIAL section
|
||||||
std::string getTFTSerialPort() const;
|
std::string getTFTSerialPort() const;
|
||||||
unsigned int getTFTSerialBrightness() const;
|
unsigned int getTFTSerialBrightness() const;
|
||||||
@@ -442,6 +453,8 @@ private:
|
|||||||
bool m_pocsagEnabled;
|
bool m_pocsagEnabled;
|
||||||
unsigned int m_pocsagFrequency;
|
unsigned int m_pocsagFrequency;
|
||||||
|
|
||||||
|
bool m_ax25Enabled;
|
||||||
|
|
||||||
bool m_fmEnabled;
|
bool m_fmEnabled;
|
||||||
std::string m_fmCallsign;
|
std::string m_fmCallsign;
|
||||||
unsigned int m_fmCallsignSpeed;
|
unsigned int m_fmCallsignSpeed;
|
||||||
@@ -524,6 +537,13 @@ private:
|
|||||||
unsigned int m_pocsagNetworkModeHang;
|
unsigned int m_pocsagNetworkModeHang;
|
||||||
bool m_pocsagNetworkDebug;
|
bool m_pocsagNetworkDebug;
|
||||||
|
|
||||||
|
bool m_ax25NetworkEnabled;
|
||||||
|
std::string m_ax25GatewayAddress;
|
||||||
|
unsigned int m_ax25GatewayPort;
|
||||||
|
std::string m_ax25LocalAddress;
|
||||||
|
unsigned int m_ax25LocalPort;
|
||||||
|
bool m_ax25NetworkDebug;
|
||||||
|
|
||||||
std::string m_tftSerialPort;
|
std::string m_tftSerialPort;
|
||||||
unsigned int m_tftSerialBrightness;
|
unsigned int m_tftSerialBrightness;
|
||||||
|
|
||||||
|
|||||||
11
MMDVM.ini
11
MMDVM.ini
@@ -175,6 +175,9 @@ RFAudioBoost=1
|
|||||||
MaxDevLevel=90
|
MaxDevLevel=90
|
||||||
ExtAudioBoost=1
|
ExtAudioBoost=1
|
||||||
|
|
||||||
|
[AX.25]
|
||||||
|
Enable=1
|
||||||
|
|
||||||
[D-Star Network]
|
[D-Star Network]
|
||||||
Enable=1
|
Enable=1
|
||||||
GatewayAddress=127.0.0.1
|
GatewayAddress=127.0.0.1
|
||||||
@@ -231,6 +234,14 @@ GatewayPort=4800
|
|||||||
# ModeHang=3
|
# ModeHang=3
|
||||||
Debug=0
|
Debug=0
|
||||||
|
|
||||||
|
[AX.25 Network]
|
||||||
|
Enable=1
|
||||||
|
LocalAddress=127.0.0.1
|
||||||
|
LocalPort=47325
|
||||||
|
GatewayAddress=127.0.0.1
|
||||||
|
GatewayPort=47326
|
||||||
|
Debug=0
|
||||||
|
|
||||||
[TFT Serial]
|
[TFT Serial]
|
||||||
# Port=modem
|
# Port=modem
|
||||||
Port=/dev/ttyAMA0
|
Port=/dev/ttyAMA0
|
||||||
|
|||||||
@@ -119,12 +119,14 @@ m_ysf(NULL),
|
|||||||
m_p25(NULL),
|
m_p25(NULL),
|
||||||
m_nxdn(NULL),
|
m_nxdn(NULL),
|
||||||
m_pocsag(NULL),
|
m_pocsag(NULL),
|
||||||
|
m_ax25(NULL),
|
||||||
m_dstarNetwork(NULL),
|
m_dstarNetwork(NULL),
|
||||||
m_dmrNetwork(NULL),
|
m_dmrNetwork(NULL),
|
||||||
m_ysfNetwork(NULL),
|
m_ysfNetwork(NULL),
|
||||||
m_p25Network(NULL),
|
m_p25Network(NULL),
|
||||||
m_nxdnNetwork(NULL),
|
m_nxdnNetwork(NULL),
|
||||||
m_pocsagNetwork(NULL),
|
m_pocsagNetwork(NULL),
|
||||||
|
m_ax25Network(NULL),
|
||||||
m_display(NULL),
|
m_display(NULL),
|
||||||
m_ump(NULL),
|
m_ump(NULL),
|
||||||
m_mode(MODE_IDLE),
|
m_mode(MODE_IDLE),
|
||||||
@@ -151,6 +153,7 @@ m_p25Enabled(false),
|
|||||||
m_nxdnEnabled(false),
|
m_nxdnEnabled(false),
|
||||||
m_pocsagEnabled(false),
|
m_pocsagEnabled(false),
|
||||||
m_fmEnabled(false),
|
m_fmEnabled(false),
|
||||||
|
m_ax25Enabled(false),
|
||||||
m_cwIdTime(0U),
|
m_cwIdTime(0U),
|
||||||
m_dmrLookup(NULL),
|
m_dmrLookup(NULL),
|
||||||
m_nxdnLookup(NULL),
|
m_nxdnLookup(NULL),
|
||||||
@@ -320,6 +323,12 @@ int CMMDVMHost::run()
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_ax25Enabled && m_conf.getAX25NetworkEnabled()) {
|
||||||
|
ret = createAX25Network();
|
||||||
|
if (!ret)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
in_addr transparentAddress;
|
in_addr transparentAddress;
|
||||||
unsigned int transparentPort = 0U;
|
unsigned int transparentPort = 0U;
|
||||||
CUDPSocket* transparentSocket = NULL;
|
CUDPSocket* transparentSocket = NULL;
|
||||||
@@ -614,6 +623,9 @@ int CMMDVMHost::run()
|
|||||||
pocsagTimer.start();
|
pocsagTimer.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_ax25Enabled)
|
||||||
|
m_ax25 = new CAX25Control(m_ax25Network);
|
||||||
|
|
||||||
bool remoteControlEnabled = m_conf.getRemoteControlEnabled();
|
bool remoteControlEnabled = m_conf.getRemoteControlEnabled();
|
||||||
if (remoteControlEnabled) {
|
if (remoteControlEnabled) {
|
||||||
unsigned int port = m_conf.getRemoteControlPort();
|
unsigned int port = m_conf.getRemoteControlPort();
|
||||||
@@ -806,6 +818,15 @@ int CMMDVMHost::run()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
len = m_modem->readAX25Data(data);
|
||||||
|
if (m_ax25 != NULL && len > 0U) {
|
||||||
|
if (m_mode == MODE_IDLE || m_mode == MODE_FM) {
|
||||||
|
m_ax25->writeModem(data, len);
|
||||||
|
} else if (m_mode != MODE_LOCKOUT) {
|
||||||
|
LogWarning("NXDN modem data received when in mode %u", m_mode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
len = m_modem->readTransparentData(data);
|
len = m_modem->readTransparentData(data);
|
||||||
if (transparentSocket != NULL && len > 0U)
|
if (transparentSocket != NULL && len > 0U)
|
||||||
transparentSocket->write(data, len, transparentAddress, transparentPort);
|
transparentSocket->write(data, len, transparentAddress, transparentPort);
|
||||||
@@ -1126,6 +1147,11 @@ int CMMDVMHost::run()
|
|||||||
delete m_pocsagNetwork;
|
delete m_pocsagNetwork;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_ax25Network != NULL) {
|
||||||
|
m_ax25Network->close();
|
||||||
|
delete m_ax25Network;
|
||||||
|
}
|
||||||
|
|
||||||
if (transparentSocket != NULL) {
|
if (transparentSocket != NULL) {
|
||||||
transparentSocket->close();
|
transparentSocket->close();
|
||||||
delete transparentSocket;
|
delete transparentSocket;
|
||||||
@@ -1142,6 +1168,7 @@ int CMMDVMHost::run()
|
|||||||
delete m_p25;
|
delete m_p25;
|
||||||
delete m_nxdn;
|
delete m_nxdn;
|
||||||
delete m_pocsag;
|
delete m_pocsag;
|
||||||
|
delete m_ax25;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1209,7 +1236,7 @@ bool CMMDVMHost::createModem()
|
|||||||
|
|
||||||
m_modem = CModem::createModem(port, m_duplex, rxInvert, txInvert, pttInvert, txDelay, dmrDelay, trace, debug);
|
m_modem = CModem::createModem(port, m_duplex, rxInvert, txInvert, pttInvert, txDelay, dmrDelay, trace, debug);
|
||||||
m_modem->setSerialParams(protocol,address);
|
m_modem->setSerialParams(protocol,address);
|
||||||
m_modem->setModeParams(m_dstarEnabled, m_dmrEnabled, m_ysfEnabled, m_p25Enabled, m_nxdnEnabled, m_pocsagEnabled, m_fmEnabled);
|
m_modem->setModeParams(m_dstarEnabled, m_dmrEnabled, m_ysfEnabled, m_p25Enabled, m_nxdnEnabled, m_pocsagEnabled, m_fmEnabled, m_ax25Enabled);
|
||||||
m_modem->setLevels(rxLevel, cwIdTXLevel, dstarTXLevel, dmrTXLevel, ysfTXLevel, p25TXLevel, nxdnTXLevel, pocsagTXLevel, fmTXLevel);
|
m_modem->setLevels(rxLevel, cwIdTXLevel, dstarTXLevel, dmrTXLevel, ysfTXLevel, p25TXLevel, nxdnTXLevel, pocsagTXLevel, fmTXLevel);
|
||||||
m_modem->setRFParams(rxFrequency, rxOffset, txFrequency, txOffset, txDCOffset, rxDCOffset, rfLevel, pocsagFrequency);
|
m_modem->setRFParams(rxFrequency, rxOffset, txFrequency, txOffset, txDCOffset, rxDCOffset, rfLevel, pocsagFrequency);
|
||||||
m_modem->setDMRParams(colorCode);
|
m_modem->setDMRParams(colorCode);
|
||||||
@@ -1531,6 +1558,34 @@ bool CMMDVMHost::createPOCSAGNetwork()
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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();
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
m_ax25Network = new CAX25Network(localAddress, localPort, gatewayAddress, gatewayPort, debug);
|
||||||
|
|
||||||
|
bool ret = m_ax25Network->open();
|
||||||
|
if (!ret) {
|
||||||
|
delete m_ax25Network;
|
||||||
|
m_ax25Network = NULL;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_ax25Network->enable(true);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void CMMDVMHost::readParams()
|
void CMMDVMHost::readParams()
|
||||||
{
|
{
|
||||||
m_dstarEnabled = m_conf.getDStarEnabled();
|
m_dstarEnabled = m_conf.getDStarEnabled();
|
||||||
@@ -1540,6 +1595,7 @@ void CMMDVMHost::readParams()
|
|||||||
m_nxdnEnabled = m_conf.getNXDNEnabled();
|
m_nxdnEnabled = m_conf.getNXDNEnabled();
|
||||||
m_pocsagEnabled = m_conf.getPOCSAGEnabled();
|
m_pocsagEnabled = m_conf.getPOCSAGEnabled();
|
||||||
m_fmEnabled = m_conf.getFMEnabled();
|
m_fmEnabled = m_conf.getFMEnabled();
|
||||||
|
m_ax25Enabled = m_conf.getAX25Enabled();
|
||||||
m_duplex = m_conf.getDuplex();
|
m_duplex = m_conf.getDuplex();
|
||||||
m_callsign = m_conf.getCallsign();
|
m_callsign = m_conf.getCallsign();
|
||||||
m_id = m_conf.getId();
|
m_id = m_conf.getId();
|
||||||
@@ -1557,8 +1613,10 @@ void CMMDVMHost::readParams()
|
|||||||
LogInfo(" NXDN: %s", m_nxdnEnabled ? "enabled" : "disabled");
|
LogInfo(" NXDN: %s", m_nxdnEnabled ? "enabled" : "disabled");
|
||||||
LogInfo(" POCSAG: %s", m_pocsagEnabled ? "enabled" : "disabled");
|
LogInfo(" POCSAG: %s", m_pocsagEnabled ? "enabled" : "disabled");
|
||||||
LogInfo(" FM: %s", m_fmEnabled ? "enabled" : "disabled");
|
LogInfo(" FM: %s", m_fmEnabled ? "enabled" : "disabled");
|
||||||
|
LogInfo(" AX.25: %s", m_ax25Enabled ? "enabled" : "disabled");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// XXX AX.25 enabled/disabled
|
||||||
void CMMDVMHost::setMode(unsigned char mode)
|
void CMMDVMHost::setMode(unsigned char mode)
|
||||||
{
|
{
|
||||||
assert(m_modem != NULL);
|
assert(m_modem != NULL);
|
||||||
@@ -2016,9 +2074,13 @@ void CMMDVMHost::remoteControl()
|
|||||||
processEnableCommand(m_nxdnEnabled, true);
|
processEnableCommand(m_nxdnEnabled, true);
|
||||||
break;
|
break;
|
||||||
case RCD_ENABLE_FM:
|
case RCD_ENABLE_FM:
|
||||||
if (m_fmEnabled==false)
|
if (!m_fmEnabled)
|
||||||
processEnableCommand(m_fmEnabled, true);
|
processEnableCommand(m_fmEnabled, true);
|
||||||
break;
|
break;
|
||||||
|
case RCD_ENABLE_AX25:
|
||||||
|
if (!m_ax25Enabled)
|
||||||
|
processEnableCommand(m_ax25Enabled, true);
|
||||||
|
break;
|
||||||
case RCD_DISABLE_DSTAR:
|
case RCD_DISABLE_DSTAR:
|
||||||
if (m_dstar != NULL && m_dstarEnabled==true)
|
if (m_dstar != NULL && m_dstarEnabled==true)
|
||||||
processEnableCommand(m_dstarEnabled, false);
|
processEnableCommand(m_dstarEnabled, false);
|
||||||
@@ -2043,6 +2105,10 @@ void CMMDVMHost::remoteControl()
|
|||||||
if (m_fmEnabled == true)
|
if (m_fmEnabled == true)
|
||||||
processEnableCommand(m_fmEnabled, false);
|
processEnableCommand(m_fmEnabled, false);
|
||||||
break;
|
break;
|
||||||
|
case RCD_DISABLE_AX25:
|
||||||
|
if (m_ax25Enabled == true)
|
||||||
|
processEnableCommand(m_ax25Enabled, false);
|
||||||
|
break;
|
||||||
case RCD_PAGE:
|
case RCD_PAGE:
|
||||||
if (m_pocsag != NULL) {
|
if (m_pocsag != NULL) {
|
||||||
unsigned int ric = m_remoteControl->getArgUInt(0U);
|
unsigned int ric = m_remoteControl->getArgUInt(0U);
|
||||||
@@ -2092,8 +2158,10 @@ void CMMDVMHost::processModeCommand(unsigned char mode, unsigned int timeout)
|
|||||||
void CMMDVMHost::processEnableCommand(bool& mode, bool enabled)
|
void CMMDVMHost::processEnableCommand(bool& mode, bool enabled)
|
||||||
{
|
{
|
||||||
LogDebug("Setting mode current=%s new=%s",mode ? "true" : "false",enabled ? "true" : "false");
|
LogDebug("Setting mode current=%s new=%s",mode ? "true" : "false",enabled ? "true" : "false");
|
||||||
mode=enabled;
|
|
||||||
m_modem->setModeParams(m_dstarEnabled, m_dmrEnabled, m_ysfEnabled, m_p25Enabled, m_nxdnEnabled, m_pocsagEnabled, m_fmEnabled);
|
mode = enabled;
|
||||||
|
|
||||||
|
m_modem->setModeParams(m_dstarEnabled, m_dmrEnabled, m_ysfEnabled, m_p25Enabled, m_nxdnEnabled, m_pocsagEnabled, m_fmEnabled, m_ax25Enabled);
|
||||||
if (!m_modem->writeConfig())
|
if (!m_modem->writeConfig())
|
||||||
LogError("Cannot write Config to MMDVM");
|
LogError("Cannot write Config to MMDVM");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,8 +23,10 @@
|
|||||||
#include "POCSAGNetwork.h"
|
#include "POCSAGNetwork.h"
|
||||||
#include "POCSAGControl.h"
|
#include "POCSAGControl.h"
|
||||||
#include "DStarNetwork.h"
|
#include "DStarNetwork.h"
|
||||||
|
#include "AX25Network.h"
|
||||||
#include "NXDNNetwork.h"
|
#include "NXDNNetwork.h"
|
||||||
#include "DStarControl.h"
|
#include "DStarControl.h"
|
||||||
|
#include "AX25Control.h"
|
||||||
#include "DMRControl.h"
|
#include "DMRControl.h"
|
||||||
#include "YSFControl.h"
|
#include "YSFControl.h"
|
||||||
#include "P25Control.h"
|
#include "P25Control.h"
|
||||||
@@ -62,12 +64,14 @@ private:
|
|||||||
CP25Control* m_p25;
|
CP25Control* m_p25;
|
||||||
CNXDNControl* m_nxdn;
|
CNXDNControl* m_nxdn;
|
||||||
CPOCSAGControl* m_pocsag;
|
CPOCSAGControl* m_pocsag;
|
||||||
|
CAX25Control* m_ax25;
|
||||||
CDStarNetwork* m_dstarNetwork;
|
CDStarNetwork* m_dstarNetwork;
|
||||||
CDMRNetwork* m_dmrNetwork;
|
CDMRNetwork* m_dmrNetwork;
|
||||||
CYSFNetwork* m_ysfNetwork;
|
CYSFNetwork* m_ysfNetwork;
|
||||||
CP25Network* m_p25Network;
|
CP25Network* m_p25Network;
|
||||||
CNXDNNetwork* m_nxdnNetwork;
|
CNXDNNetwork* m_nxdnNetwork;
|
||||||
CPOCSAGNetwork* m_pocsagNetwork;
|
CPOCSAGNetwork* m_pocsagNetwork;
|
||||||
|
CAX25Network* m_ax25Network;
|
||||||
CDisplay* m_display;
|
CDisplay* m_display;
|
||||||
CUMP* m_ump;
|
CUMP* m_ump;
|
||||||
unsigned char m_mode;
|
unsigned char m_mode;
|
||||||
@@ -94,6 +98,7 @@ private:
|
|||||||
bool m_nxdnEnabled;
|
bool m_nxdnEnabled;
|
||||||
bool m_pocsagEnabled;
|
bool m_pocsagEnabled;
|
||||||
bool m_fmEnabled;
|
bool m_fmEnabled;
|
||||||
|
bool m_ax25Enabled;
|
||||||
unsigned int m_cwIdTime;
|
unsigned int m_cwIdTime;
|
||||||
CDMRLookup* m_dmrLookup;
|
CDMRLookup* m_dmrLookup;
|
||||||
CNXDNLookup* m_nxdnLookup;
|
CNXDNLookup* m_nxdnLookup;
|
||||||
@@ -114,6 +119,7 @@ private:
|
|||||||
bool createP25Network();
|
bool createP25Network();
|
||||||
bool createNXDNNetwork();
|
bool createNXDNNetwork();
|
||||||
bool createPOCSAGNetwork();
|
bool createPOCSAGNetwork();
|
||||||
|
bool createAX25Network();
|
||||||
|
|
||||||
void remoteControl();
|
void remoteControl();
|
||||||
void processModeCommand(unsigned char mode, unsigned int timeout);
|
void processModeCommand(unsigned char mode, unsigned int timeout);
|
||||||
|
|||||||
@@ -153,6 +153,8 @@
|
|||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="AMBEFEC.h" />
|
<ClInclude Include="AMBEFEC.h" />
|
||||||
|
<ClInclude Include="AX25Control.h" />
|
||||||
|
<ClInclude Include="AX25Network.h" />
|
||||||
<ClInclude Include="BCH.h" />
|
<ClInclude Include="BCH.h" />
|
||||||
<ClInclude Include="BPTC19696.h" />
|
<ClInclude Include="BPTC19696.h" />
|
||||||
<ClInclude Include="CASTInfo.h" />
|
<ClInclude Include="CASTInfo.h" />
|
||||||
@@ -251,6 +253,8 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="AMBEFEC.cpp" />
|
<ClCompile Include="AMBEFEC.cpp" />
|
||||||
|
<ClCompile Include="AX25Control.cpp" />
|
||||||
|
<ClCompile Include="AX25Network.cpp" />
|
||||||
<ClCompile Include="BCH.cpp" />
|
<ClCompile Include="BCH.cpp" />
|
||||||
<ClCompile Include="BPTC19696.cpp" />
|
<ClCompile Include="BPTC19696.cpp" />
|
||||||
<ClCompile Include="CASTInfo.cpp" />
|
<ClCompile Include="CASTInfo.cpp" />
|
||||||
|
|||||||
@@ -299,6 +299,12 @@
|
|||||||
<ClInclude Include="UserDBentry.h">
|
<ClInclude Include="UserDBentry.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="AX25Control.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="AX25Network.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="BPTC19696.cpp">
|
<ClCompile Include="BPTC19696.cpp">
|
||||||
@@ -562,5 +568,11 @@
|
|||||||
<ClCompile Include="UserDBentry.cpp">
|
<ClCompile Include="UserDBentry.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="AX25Control.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="AX25Network.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
2
Makefile
2
Makefile
@@ -6,7 +6,7 @@ CFLAGS = -g -O3 -Wall -std=c++0x -pthread
|
|||||||
LIBS = -lpthread
|
LIBS = -lpthread
|
||||||
LDFLAGS = -g
|
LDFLAGS = -g
|
||||||
|
|
||||||
OBJECTS = \
|
OBJECTS = AX25Control.o AX25Network.o \
|
||||||
AMBEFEC.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o \
|
AMBEFEC.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.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 \
|
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 Golay2087.o Golay24128.o Hamming.o I2CController.o LCDproc.o Log.o MMDVMHost.o MobileGPS.o Modem.o ModemSerialPort.o Mutex.o \
|
DStarSlowData.o Golay2087.o Golay24128.o Hamming.o I2CController.o LCDproc.o Log.o MMDVMHost.o MobileGPS.o Modem.o ModemSerialPort.o Mutex.o \
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ CFLAGS = -g -O3 -Wall -std=c++0x -pthread -DRASPBERRY_PI -I/usr/local/include
|
|||||||
LIBS = -lwiringPi -lwiringPiDev -lpthread
|
LIBS = -lwiringPi -lwiringPiDev -lpthread
|
||||||
LDFLAGS = -g -L/usr/local/lib
|
LDFLAGS = -g -L/usr/local/lib
|
||||||
|
|
||||||
OBJECTS = \
|
OBJECTS = AX25Control.o AX25Network.o \
|
||||||
AMBEFEC.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o \
|
AMBEFEC.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.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 \
|
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 Golay2087.o Golay24128.o Hamming.o I2CController.o LCDproc.o Log.o MMDVMHost.o MobileGPS.o Modem.o ModemSerialPort.o Mutex.o \
|
DStarSlowData.o Golay2087.o Golay24128.o Hamming.o I2CController.o LCDproc.o Log.o MMDVMHost.o MobileGPS.o Modem.o ModemSerialPort.o Mutex.o \
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ CFLAGS = -g -O3 -Wall -std=c++0x -pthread -DHD44780 -DADAFRUIT_DISPLAY -I/usr/l
|
|||||||
LIBS = -lwiringPi -lwiringPiDev -lpthread
|
LIBS = -lwiringPi -lwiringPiDev -lpthread
|
||||||
LDFLAGS = -g -L/usr/local/lib
|
LDFLAGS = -g -L/usr/local/lib
|
||||||
|
|
||||||
OBJECTS = \
|
OBJECTS = AX25Control.o AX25Network.o \
|
||||||
AMBEFEC.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o \
|
AMBEFEC.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.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 \
|
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 Golay2087.o Golay24128.o Hamming.o HD44780.o I2CController.o LCDproc.o Log.o MMDVMHost.o MobileGPS.o Modem.o ModemSerialPort.o Mutex.o \
|
DStarSlowData.o Golay2087.o Golay24128.o Hamming.o HD44780.o I2CController.o LCDproc.o Log.o MMDVMHost.o MobileGPS.o Modem.o ModemSerialPort.o Mutex.o \
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ CFLAGS = -g -O3 -Wall -std=c++0x -pthread -DHD44780 -I/usr/local/include
|
|||||||
LIBS = -lwiringPi -lwiringPiDev -lpthread
|
LIBS = -lwiringPi -lwiringPiDev -lpthread
|
||||||
LDFLAGS = -g -L/usr/local/lib
|
LDFLAGS = -g -L/usr/local/lib
|
||||||
|
|
||||||
OBJECTS = \
|
OBJECTS = AX25Control.o AX25Network.o \
|
||||||
AMBEFEC.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o \
|
AMBEFEC.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.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 \
|
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 Golay2087.o Golay24128.o Hamming.o HD44780.o I2CController.o LCDproc.o Log.o MMDVMHost.o MobileGPS.o Modem.o ModemSerialPort.o Mutex.o \
|
DStarSlowData.o Golay2087.o Golay24128.o Hamming.o HD44780.o I2CController.o LCDproc.o Log.o MMDVMHost.o MobileGPS.o Modem.o ModemSerialPort.o Mutex.o \
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ CFLAGS = -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include
|
|||||||
LIBS = -lArduiPi_OLED -lwiringPi -lpthread
|
LIBS = -lArduiPi_OLED -lwiringPi -lpthread
|
||||||
LDFLAGS = -g -L/usr/local/lib
|
LDFLAGS = -g -L/usr/local/lib
|
||||||
|
|
||||||
OBJECTS = \
|
OBJECTS = AX25Control.o AX25Network.o \
|
||||||
AMBEFEC.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o \
|
AMBEFEC.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.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 \
|
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 Golay2087.o Golay24128.o Hamming.o I2CController.o OLED.o LCDproc.o Log.o MMDVMHost.o MobileGPS.o Modem.o ModemSerialPort.o Mutex.o \
|
DStarSlowData.o Golay2087.o Golay24128.o Hamming.o I2CController.o OLED.o LCDproc.o Log.o MMDVMHost.o MobileGPS.o Modem.o ModemSerialPort.o Mutex.o \
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ CFLAGS = -g -O3 -Wall -std=c++0x -pthread -DHD44780 -DPCF8574_DISPLAY -I/usr/lo
|
|||||||
LIBS = -lwiringPi -lwiringPiDev -lpthread
|
LIBS = -lwiringPi -lwiringPiDev -lpthread
|
||||||
LDFLAGS = -g -L/usr/local/lib
|
LDFLAGS = -g -L/usr/local/lib
|
||||||
|
|
||||||
OBJECTS = \
|
OBJECTS = AX25Control.o AX25Network.o \
|
||||||
AMBEFEC.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o \
|
AMBEFEC.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.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 \
|
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 Golay2087.o Golay24128.o Hamming.o HD44780.o I2CController.o LCDproc.o Log.o MMDVMHost.o MobileGPS.o Modem.o ModemSerialPort.o Mutex.o \
|
DStarSlowData.o Golay2087.o Golay24128.o Hamming.o HD44780.o I2CController.o LCDproc.o Log.o MMDVMHost.o MobileGPS.o Modem.o ModemSerialPort.o Mutex.o \
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ CFLAGS = -g -O3 -Wall -std=c++0x -pthread
|
|||||||
LIBS = -lpthread -lsocket
|
LIBS = -lpthread -lsocket
|
||||||
LDFLAGS = -g
|
LDFLAGS = -g
|
||||||
|
|
||||||
OBJECTS = \
|
OBJECTS = AX25Control.o AX25Network.o \
|
||||||
AMBEFEC.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o \
|
AMBEFEC.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.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 \
|
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 Golay2087.o Golay24128.o Hamming.o LCDproc.o Log.o MMDVMHost.o MobileGPS.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o \
|
DStarSlowData.o Golay2087.o Golay24128.o Hamming.o LCDproc.o Log.o MMDVMHost.o MobileGPS.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o \
|
||||||
|
|||||||
37
Modem.cpp
37
Modem.cpp
@@ -76,6 +76,8 @@ const unsigned char MMDVM_NXDN_LOST = 0x41U;
|
|||||||
|
|
||||||
const unsigned char MMDVM_POCSAG_DATA = 0x50U;
|
const unsigned char MMDVM_POCSAG_DATA = 0x50U;
|
||||||
|
|
||||||
|
const unsigned char MMDVM_AX25_DATA = 0x55U;
|
||||||
|
|
||||||
const unsigned char MMDVM_FM_PARAMS1 = 0x60U;
|
const unsigned char MMDVM_FM_PARAMS1 = 0x60U;
|
||||||
const unsigned char MMDVM_FM_PARAMS2 = 0x61U;
|
const unsigned char MMDVM_FM_PARAMS2 = 0x61U;
|
||||||
const unsigned char MMDVM_FM_PARAMS3 = 0x62U;
|
const unsigned char MMDVM_FM_PARAMS3 = 0x62U;
|
||||||
@@ -133,6 +135,7 @@ m_p25Enabled(false),
|
|||||||
m_nxdnEnabled(false),
|
m_nxdnEnabled(false),
|
||||||
m_pocsagEnabled(false),
|
m_pocsagEnabled(false),
|
||||||
m_fmEnabled(false),
|
m_fmEnabled(false),
|
||||||
|
m_ax25Enabled(false),
|
||||||
m_rxDCOffset(0),
|
m_rxDCOffset(0),
|
||||||
m_txDCOffset(0),
|
m_txDCOffset(0),
|
||||||
m_serial(NULL),
|
m_serial(NULL),
|
||||||
@@ -152,6 +155,7 @@ m_txP25Data(1000U, "Modem TX P25"),
|
|||||||
m_rxNXDNData(1000U, "Modem RX NXDN"),
|
m_rxNXDNData(1000U, "Modem RX NXDN"),
|
||||||
m_txNXDNData(1000U, "Modem TX NXDN"),
|
m_txNXDNData(1000U, "Modem TX NXDN"),
|
||||||
m_txPOCSAGData(1000U, "Modem TX POCSAG"),
|
m_txPOCSAGData(1000U, "Modem TX POCSAG"),
|
||||||
|
m_rxAX25Data(1000U, "Modem RX AX.25"),
|
||||||
m_rxTransparentData(1000U, "Modem RX Transparent"),
|
m_rxTransparentData(1000U, "Modem RX Transparent"),
|
||||||
m_txTransparentData(1000U, "Modem TX Transparent"),
|
m_txTransparentData(1000U, "Modem TX Transparent"),
|
||||||
m_sendTransparentDataFrameType(0U),
|
m_sendTransparentDataFrameType(0U),
|
||||||
@@ -230,7 +234,7 @@ void CModem::setRFParams(unsigned int rxFrequency, int rxOffset, unsigned int tx
|
|||||||
m_pocsagFrequency = pocsagFrequency + txOffset;
|
m_pocsagFrequency = pocsagFrequency + txOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CModem::setModeParams(bool dstarEnabled, bool dmrEnabled, bool ysfEnabled, bool p25Enabled, bool nxdnEnabled, bool pocsagEnabled, bool fmEnabled)
|
void CModem::setModeParams(bool dstarEnabled, bool dmrEnabled, bool ysfEnabled, bool p25Enabled, bool nxdnEnabled, bool pocsagEnabled, bool fmEnabled, bool ax25Enabled)
|
||||||
{
|
{
|
||||||
m_dstarEnabled = dstarEnabled;
|
m_dstarEnabled = dstarEnabled;
|
||||||
m_dmrEnabled = dmrEnabled;
|
m_dmrEnabled = dmrEnabled;
|
||||||
@@ -239,6 +243,7 @@ void CModem::setModeParams(bool dstarEnabled, bool dmrEnabled, bool ysfEnabled,
|
|||||||
m_nxdnEnabled = nxdnEnabled;
|
m_nxdnEnabled = nxdnEnabled;
|
||||||
m_pocsagEnabled = pocsagEnabled;
|
m_pocsagEnabled = pocsagEnabled;
|
||||||
m_fmEnabled = fmEnabled;
|
m_fmEnabled = fmEnabled;
|
||||||
|
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)
|
||||||
@@ -585,6 +590,20 @@ void CModem::clock(unsigned int ms)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case MMDVM_AX25_DATA: {
|
||||||
|
if (m_trace)
|
||||||
|
CUtils::dump(1U, "RX AX.25 Data", m_buffer, m_length);
|
||||||
|
|
||||||
|
unsigned char data = m_length - 2U;
|
||||||
|
m_rxAX25Data.addData(&data, 1U);
|
||||||
|
|
||||||
|
data = TAG_DATA;
|
||||||
|
m_rxAX25Data.addData(&data, 1U);
|
||||||
|
|
||||||
|
m_rxAX25Data.addData(m_buffer + 3U, m_length - 3U);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case MMDVM_GET_STATUS: {
|
case MMDVM_GET_STATUS: {
|
||||||
// if (m_trace)
|
// if (m_trace)
|
||||||
// CUtils::dump(1U, "GET_STATUS", m_buffer, m_length);
|
// CUtils::dump(1U, "GET_STATUS", m_buffer, m_length);
|
||||||
@@ -941,6 +960,20 @@ unsigned int CModem::readNXDNData(unsigned char* data)
|
|||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned int CModem::readAX25Data(unsigned char* data)
|
||||||
|
{
|
||||||
|
assert(data != NULL);
|
||||||
|
|
||||||
|
if (m_rxAX25Data.isEmpty())
|
||||||
|
return 0U;
|
||||||
|
|
||||||
|
unsigned char len = 0U;
|
||||||
|
m_rxAX25Data.getData(&len, 1U);
|
||||||
|
m_rxAX25Data.getData(data, len);
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned int CModem::readTransparentData(unsigned char* data)
|
unsigned int CModem::readTransparentData(unsigned char* data)
|
||||||
{
|
{
|
||||||
assert(data != NULL);
|
assert(data != NULL);
|
||||||
@@ -1552,6 +1585,8 @@ bool CModem::setConfig()
|
|||||||
buffer[4U] |= 0x20U;
|
buffer[4U] |= 0x20U;
|
||||||
if (m_fmEnabled && m_duplex)
|
if (m_fmEnabled && m_duplex)
|
||||||
buffer[4U] |= 0x40U;
|
buffer[4U] |= 0x40U;
|
||||||
|
if (m_ax25Enabled)
|
||||||
|
buffer[4U] |= 0x80U;
|
||||||
|
|
||||||
buffer[5U] = m_txDelay / 10U; // In 10ms units
|
buffer[5U] = m_txDelay / 10U; // In 10ms units
|
||||||
|
|
||||||
|
|||||||
5
Modem.h
5
Modem.h
@@ -39,7 +39,7 @@ 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);
|
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);
|
||||||
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);
|
||||||
@@ -59,6 +59,7 @@ public:
|
|||||||
virtual unsigned int readYSFData(unsigned char* data);
|
virtual unsigned int readYSFData(unsigned char* data);
|
||||||
virtual unsigned int readP25Data(unsigned char* data);
|
virtual unsigned int readP25Data(unsigned char* data);
|
||||||
virtual unsigned int readNXDNData(unsigned char* data);
|
virtual unsigned int readNXDNData(unsigned char* data);
|
||||||
|
virtual unsigned int readAX25Data(unsigned char* data);
|
||||||
virtual unsigned int readTransparentData(unsigned char* data);
|
virtual unsigned int readTransparentData(unsigned char* data);
|
||||||
|
|
||||||
virtual unsigned int readSerial(unsigned char* data, unsigned int length);
|
virtual unsigned int readSerial(unsigned char* data, unsigned int length);
|
||||||
@@ -150,6 +151,7 @@ private:
|
|||||||
bool m_nxdnEnabled;
|
bool m_nxdnEnabled;
|
||||||
bool m_pocsagEnabled;
|
bool m_pocsagEnabled;
|
||||||
bool m_fmEnabled;
|
bool m_fmEnabled;
|
||||||
|
bool m_ax25Enabled;
|
||||||
int m_rxDCOffset;
|
int m_rxDCOffset;
|
||||||
int m_txDCOffset;
|
int m_txDCOffset;
|
||||||
CSerialController* m_serial;
|
CSerialController* m_serial;
|
||||||
@@ -169,6 +171,7 @@ private:
|
|||||||
CRingBuffer<unsigned char> m_rxNXDNData;
|
CRingBuffer<unsigned char> m_rxNXDNData;
|
||||||
CRingBuffer<unsigned char> m_txNXDNData;
|
CRingBuffer<unsigned char> m_txNXDNData;
|
||||||
CRingBuffer<unsigned char> m_txPOCSAGData;
|
CRingBuffer<unsigned char> m_txPOCSAGData;
|
||||||
|
CRingBuffer<unsigned char> m_rxAX25Data;
|
||||||
CRingBuffer<unsigned char> m_rxTransparentData;
|
CRingBuffer<unsigned char> m_rxTransparentData;
|
||||||
CRingBuffer<unsigned char> m_txTransparentData;
|
CRingBuffer<unsigned char> m_txTransparentData;
|
||||||
unsigned int m_sendTransparentDataFrameType;
|
unsigned int m_sendTransparentDataFrameType;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2019 by Jonathan Naylor G4KLX
|
* Copyright (C) 2019,2020 by Jonathan Naylor G4KLX
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -102,6 +102,8 @@ REMOTE_COMMAND CRemoteControl::getCommand()
|
|||||||
m_command = RCD_ENABLE_NXDN;
|
m_command = RCD_ENABLE_NXDN;
|
||||||
else if (m_args.at(1U) == "fm")
|
else if (m_args.at(1U) == "fm")
|
||||||
m_command = RCD_ENABLE_FM;
|
m_command = RCD_ENABLE_FM;
|
||||||
|
else if (m_args.at(1U) == "ax25")
|
||||||
|
m_command = RCD_ENABLE_AX25;
|
||||||
} else if (m_args.at(0U) == "disable" && m_args.size() >= DISABLE_ARGS) {
|
} else if (m_args.at(0U) == "disable" && m_args.size() >= DISABLE_ARGS) {
|
||||||
if (m_args.at(1U) == "dstar")
|
if (m_args.at(1U) == "dstar")
|
||||||
m_command = RCD_DISABLE_DSTAR;
|
m_command = RCD_DISABLE_DSTAR;
|
||||||
@@ -115,6 +117,8 @@ REMOTE_COMMAND CRemoteControl::getCommand()
|
|||||||
m_command = RCD_DISABLE_NXDN;
|
m_command = RCD_DISABLE_NXDN;
|
||||||
else if (m_args.at(1U) == "fm")
|
else if (m_args.at(1U) == "fm")
|
||||||
m_command = RCD_DISABLE_FM;
|
m_command = RCD_DISABLE_FM;
|
||||||
|
else if (m_args.at(1U) == "ax25")
|
||||||
|
m_command = RCD_DISABLE_AX25;
|
||||||
} else if (m_args.at(0U) == "page" && m_args.size() >= PAGE_ARGS) {
|
} else if (m_args.at(0U) == "page" && m_args.size() >= PAGE_ARGS) {
|
||||||
// Page command is in the form of "page <ric> <message>"
|
// Page command is in the form of "page <ric> <message>"
|
||||||
m_command = RCD_PAGE;
|
m_command = RCD_PAGE;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2019 by Jonathan Naylor G4KLX
|
* Copyright (C) 2019,2020 by Jonathan Naylor G4KLX
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -40,12 +40,14 @@ enum REMOTE_COMMAND {
|
|||||||
RCD_ENABLE_P25,
|
RCD_ENABLE_P25,
|
||||||
RCD_ENABLE_NXDN,
|
RCD_ENABLE_NXDN,
|
||||||
RCD_ENABLE_FM,
|
RCD_ENABLE_FM,
|
||||||
|
RCD_ENABLE_AX25,
|
||||||
RCD_DISABLE_DSTAR,
|
RCD_DISABLE_DSTAR,
|
||||||
RCD_DISABLE_DMR,
|
RCD_DISABLE_DMR,
|
||||||
RCD_DISABLE_YSF,
|
RCD_DISABLE_YSF,
|
||||||
RCD_DISABLE_P25,
|
RCD_DISABLE_P25,
|
||||||
RCD_DISABLE_NXDN,
|
RCD_DISABLE_NXDN,
|
||||||
RCD_DISABLE_FM,
|
RCD_DISABLE_FM,
|
||||||
|
RCD_DISABLE_AX25,
|
||||||
RCD_PAGE,
|
RCD_PAGE,
|
||||||
RCD_CW
|
RCD_CW
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user