Make space for dPMR.

This commit is contained in:
Jonathan Naylor
2025-07-09 13:38:55 +01:00
parent 994bff73ba
commit 9720c7a40d
52 changed files with 38 additions and 3684 deletions

212
Modem.cpp
View File

@@ -23,7 +23,6 @@
#include "NXDNDefines.h"
#include "AX25Defines.h"
#include "POCSAGDefines.h"
#include "M17Defines.h"
#include "Thread.h"
#include "Modem.h"
#include "Utils.h"
@@ -74,12 +73,6 @@ const unsigned char MMDVM_P25_LOST = 0x32U;
const unsigned char MMDVM_NXDN_DATA = 0x40U;
const unsigned char MMDVM_NXDN_LOST = 0x41U;
const unsigned char MMDVM_M17_LINK_SETUP = 0x45U;
const unsigned char MMDVM_M17_STREAM = 0x46U;
const unsigned char MMDVM_M17_PACKET = 0x47U;
const unsigned char MMDVM_M17_LOST = 0x48U;
const unsigned char MMDVM_M17_EOT = 0x49U;
const unsigned char MMDVM_POCSAG_DATA = 0x50U;
const unsigned char MMDVM_AX25_DATA = 0x55U;
@@ -116,7 +109,6 @@ const unsigned char CAP1_DMR = 0x02U;
const unsigned char CAP1_YSF = 0x04U;
const unsigned char CAP1_P25 = 0x08U;
const unsigned char CAP1_NXDN = 0x10U;
const unsigned char CAP1_M17 = 0x20U;
const unsigned char CAP1_FM = 0x40U;
const unsigned char CAP2_POCSAG = 0x01U;
const unsigned char CAP2_AX25 = 0x02U;
@@ -129,7 +121,6 @@ m_ysfLoDev(false),
m_ysfTXHang(4U),
m_p25TXHang(5U),
m_nxdnTXHang(5U),
m_m17TXHang(5U),
m_duplex(duplex),
m_rxInvert(rxInvert),
m_txInvert(txInvert),
@@ -143,7 +134,6 @@ m_dmrTXLevel(0.0F),
m_ysfTXLevel(0.0F),
m_p25TXLevel(0.0F),
m_nxdnTXLevel(0.0F),
m_m17TXLevel(0.0F),
m_pocsagTXLevel(0.0F),
m_fmTXLevel(0.0F),
m_ax25TXLevel(0.0F),
@@ -159,7 +149,6 @@ m_dmrEnabled(false),
m_ysfEnabled(false),
m_p25Enabled(false),
m_nxdnEnabled(false),
m_m17Enabled(false),
m_pocsagEnabled(false),
m_fmEnabled(false),
m_ax25Enabled(false),
@@ -183,8 +172,6 @@ m_rxP25Data(1000U, "Modem RX P25"),
m_txP25Data(1000U, "Modem TX P25"),
m_rxNXDNData(1000U, "Modem RX NXDN"),
m_txNXDNData(1000U, "Modem TX NXDN"),
m_rxM17Data(1000U, "Modem RX M17"),
m_txM17Data(1000U, "Modem TX M17"),
m_txPOCSAGData(1000U, "Modem TX POCSAG"),
m_rxFMData(5000U, "Modem RX FM"),
m_txFMData(5000U, "Modem TX FM"),
@@ -204,7 +191,6 @@ m_dmrSpace2(0U),
m_ysfSpace(0U),
m_p25Space(0U),
m_nxdnSpace(0U),
m_m17Space(0U),
m_pocsagSpace(0U),
m_fmSpace(0U),
m_ax25Space(0U),
@@ -282,20 +268,19 @@ void CModem::setRFParams(unsigned int rxFrequency, int rxOffset, unsigned int tx
m_pocsagFrequency = pocsagFrequency + txOffset;
}
void CModem::setModeParams(bool dstarEnabled, bool dmrEnabled, bool ysfEnabled, bool p25Enabled, bool nxdnEnabled, bool m17Enabled, bool pocsagEnabled, bool fmEnabled, bool ax25Enabled)
void CModem::setModeParams(bool dstarEnabled, bool dmrEnabled, bool ysfEnabled, bool p25Enabled, bool nxdnEnabled, bool pocsagEnabled, bool fmEnabled, bool ax25Enabled)
{
m_dstarEnabled = dstarEnabled;
m_dmrEnabled = dmrEnabled;
m_ysfEnabled = ysfEnabled;
m_p25Enabled = p25Enabled;
m_nxdnEnabled = nxdnEnabled;
m_m17Enabled = m17Enabled;
m_pocsagEnabled = pocsagEnabled;
m_fmEnabled = fmEnabled;
m_ax25Enabled = ax25Enabled;
}
void CModem::setLevels(float rxLevel, float cwIdTXLevel, float dstarTXLevel, float dmrTXLevel, float ysfTXLevel, float p25TXLevel, float nxdnTXLevel, float m17TXLevel, float pocsagTXLevel, float fmTXLevel, float ax25TXLevel)
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;
@@ -304,7 +289,6 @@ void CModem::setLevels(float rxLevel, float cwIdTXLevel, float dstarTXLevel, flo
m_ysfTXLevel = ysfTXLevel;
m_p25TXLevel = p25TXLevel;
m_nxdnTXLevel = nxdnTXLevel;
m_m17TXLevel = m17TXLevel;
m_pocsagTXLevel = pocsagTXLevel;
m_fmTXLevel = fmTXLevel;
m_ax25TXLevel = ax25TXLevel;
@@ -333,11 +317,6 @@ void CModem::setNXDNParams(unsigned int txHang)
m_nxdnTXHang = txHang;
}
void CModem::setM17Params(unsigned int txHang)
{
m_m17TXHang = txHang;
}
void CModem::setAX25Params(int rxTwist, unsigned int txDelay, unsigned int slotTime, unsigned int pPersist)
{
m_ax25RXTwist = rxTwist;
@@ -664,58 +643,6 @@ void CModem::clock(unsigned int ms)
}
break;
case MMDVM_M17_LINK_SETUP: {
if (m_trace)
CUtils::dump(1U, "RX M17 Link Setup", m_buffer, m_length);
unsigned char data = m_length - 2U;
m_rxM17Data.addData(&data, 1U);
data = TAG_HEADER;
m_rxM17Data.addData(&data, 1U);
m_rxM17Data.addData(m_buffer + 3U, m_length - 3U);
}
break;
case MMDVM_M17_STREAM: {
if (m_trace)
CUtils::dump(1U, "RX M17 Stream Data", m_buffer, m_length);
unsigned char data = m_length - 2U;
m_rxM17Data.addData(&data, 1U);
data = TAG_DATA;
m_rxM17Data.addData(&data, 1U);
m_rxM17Data.addData(m_buffer + 3U, m_length - 3U);
}
break;
case MMDVM_M17_EOT: {
if (m_trace)
CUtils::dump(1U, "RX M17 EOT", m_buffer, m_length);
unsigned char data = 1U;
m_rxM17Data.addData(&data, 1U);
data = TAG_EOT;
m_rxM17Data.addData(&data, 1U);
}
break;
case MMDVM_M17_LOST: {
if (m_trace)
CUtils::dump(1U, "RX M17 Lost", m_buffer, m_length);
unsigned char data = 1U;
m_rxM17Data.addData(&data, 1U);
data = TAG_LOST;
m_rxM17Data.addData(&data, 1U);
}
break;
case MMDVM_FM_DATA: {
if (m_trace)
CUtils::dump(1U, "RX FM Data", m_buffer, m_length);
@@ -795,7 +722,6 @@ void CModem::clock(unsigned int ms)
m_p25Space = 0U;
m_nxdnSpace = 0U;
m_m17Space = 0U;
m_pocsagSpace = 0U;
m_fmSpace = 0U;
m_ax25Space = 0U;
@@ -812,8 +738,6 @@ void CModem::clock(unsigned int ms)
m_nxdnSpace = m_buffer[m_offset + 8U];
if (m_length > (m_offset + 9U))
m_pocsagSpace = m_buffer[m_offset + 9U];
if (m_length > (m_offset + 10U))
m_m17Space = m_buffer[m_offset + 10U];
}
break;
@@ -842,7 +766,6 @@ void CModem::clock(unsigned int ms)
m_ysfSpace = m_buffer[m_offset + 6U];
m_p25Space = m_buffer[m_offset + 7U];
m_nxdnSpace = m_buffer[m_offset + 8U];
m_m17Space = m_buffer[m_offset + 9U];
m_fmSpace = m_buffer[m_offset + 10U];
m_pocsagSpace = m_buffer[m_offset + 11U];
m_ax25Space = m_buffer[m_offset + 12U];
@@ -856,7 +779,6 @@ void CModem::clock(unsigned int ms)
m_ysfSpace = 0U;
m_p25Space = 0U;
m_nxdnSpace = 0U;
m_m17Space = 0U;
m_pocsagSpace = 0U;
m_fmSpace = 0U;
m_ax25Space = 0U;
@@ -864,7 +786,7 @@ void CModem::clock(unsigned int ms)
}
m_inactivityTimer.start();
// LogMessage("status=%02X, tx=%d, space=%u,%u,%u,%u,%u,%u,%u,%u,%u,%u lockout=%d, cd=%d", m_buffer[m_offset + 2U], int(m_tx), m_dstarSpace, m_dmrSpace1, m_dmrSpace2, m_ysfSpace, m_p25Space, m_nxdnSpace, m_m17Space, m_pocsagSpace, m_fmSpace, m_ax25Space, int(m_lockout), int(m_cd));
// LogMessage("status=%02X, tx=%d, space=%u,%u,%u,%u,%u,%u,%u,%u,%u lockout=%d, cd=%d", m_buffer[m_offset + 2U], int(m_tx), m_dstarSpace, m_dmrSpace1, m_dmrSpace2, m_ysfSpace, m_p25Space, m_nxdnSpace, m_pocsagSpace, m_fmSpace, m_ax25Space, int(m_lockout), int(m_cd));
break;
case MMDVM_TRANSPARENT: {
@@ -1042,34 +964,6 @@ void CModem::clock(unsigned int ms)
m_nxdnSpace--;
}
if (m_m17Space > 1U && !m_txM17Data.isEmpty()) {
unsigned char len = 0U;
m_txM17Data.getData(&len, 1U);
m_txM17Data.getData(m_buffer, len);
if (m_trace) {
switch (m_buffer[2U]) {
case MMDVM_M17_LINK_SETUP:
CUtils::dump(1U, "TX M17 Link Setup", m_buffer, len);
break;
case MMDVM_M17_STREAM:
CUtils::dump(1U, "TX M17 Stream Data", m_buffer, len);
break;
case MMDVM_M17_EOT:
CUtils::dump(1U, "TX M17 EOT", m_buffer, len);
break;
}
}
int ret = m_port->write(m_buffer, len);
if (ret != int(len))
LogWarning("Error when writing M17 data to the MMDVM");
m_playoutTimer.start();
m_m17Space--;
}
if (m_pocsagSpace > 1U && !m_txPOCSAGData.isEmpty()) {
unsigned char len = 0U;
m_txPOCSAGData.getData(&len, 1U);
@@ -1245,20 +1139,6 @@ unsigned int CModem::readNXDNData(unsigned char* data)
return len;
}
unsigned int CModem::readM17Data(unsigned char* data)
{
assert(data != nullptr);
if (m_rxM17Data.isEmpty())
return 0U;
unsigned char len = 0U;
m_rxM17Data.getData(&len, 1U);
m_rxM17Data.getData(data, len);
return len;
}
unsigned int CModem::readFMData(unsigned char* data)
{
assert(data != nullptr);
@@ -1506,47 +1386,6 @@ bool CModem::writeNXDNData(const unsigned char* data, unsigned int length)
return true;
}
bool CModem::hasM17Space() const
{
unsigned int space = m_txM17Data.freeSpace() / (M17_FRAME_LENGTH_BYTES + 4U);
return space > 1U;
}
bool CModem::writeM17Data(const unsigned char* data, unsigned int length)
{
assert(data != nullptr);
assert(length > 0U);
unsigned char buffer[130U];
buffer[0U] = MMDVM_FRAME_START;
buffer[1U] = length + 2U;
switch (data[0U]) {
case TAG_HEADER:
buffer[2U] = MMDVM_M17_LINK_SETUP;
::memcpy(buffer + 3U, data + 1U, length - 1U);
break;
case TAG_DATA:
buffer[2U] = MMDVM_M17_STREAM;
::memcpy(buffer + 3U, data + 1U, length - 1U);
break;
case TAG_EOT:
buffer[2U] = MMDVM_M17_EOT;
::memcpy(buffer + 3U, data + 1U, length - 1U);
break;
default:
return false;
}
unsigned char len = length + 2U;
m_txM17Data.addData(&len, 1U);
m_txM17Data.addData(buffer, len);
return true;
}
bool CModem::hasPOCSAGSpace() const
{
unsigned int space = m_txPOCSAGData.freeSpace() / (POCSAG_FRAME_LENGTH_BYTES + 4U);
@@ -1811,30 +1650,6 @@ bool CModem::writeNXDNInfo(const char* source, bool group, unsigned int dest, co
return m_port->write(buffer, 31U) != 31;
}
bool CModem::writeM17Info(const char* source, const char* dest, const char* type)
{
assert(m_port != nullptr);
assert(source != nullptr);
assert(dest != nullptr);
assert(type != nullptr);
unsigned char buffer[40U];
buffer[0U] = MMDVM_FRAME_START;
buffer[1U] = 31U;
buffer[2U] = MMDVM_QSO_INFO;
buffer[3U] = MODE_M17;
::sprintf((char*)(buffer + 4U), "%9.9s", source);
::sprintf((char*)(buffer + 13U), "%9.9s", dest);
::memcpy(buffer + 22U, type, 1U);
return m_port->write(buffer, 23U) != 23;
}
bool CModem::writePOCSAGInfo(unsigned int ric, const std::string& message)
{
assert(m_port != nullptr);
@@ -1945,11 +1760,6 @@ bool CModem::hasNXDN() const
return (m_capabilities1 & CAP1_NXDN) == CAP1_NXDN;
}
bool CModem::hasM17() const
{
return (m_capabilities1 & CAP1_M17) == CAP1_M17;
}
bool CModem::hasFM() const
{
return (m_capabilities1 & CAP1_FM) == CAP1_FM;
@@ -2027,7 +1837,7 @@ bool CModem::readVersion()
switch (m_protocolVersion) {
case 1U:
LogInfo("MMDVM protocol version: 1, description: %.*s", m_length - 4U, m_buffer + 4U);
m_capabilities1 = CAP1_DSTAR | CAP1_DMR | CAP1_YSF | CAP1_P25 | CAP1_NXDN | CAP1_M17;
m_capabilities1 = CAP1_DSTAR | CAP1_DMR | CAP1_YSF | CAP1_P25 | CAP1_NXDN;
m_capabilities2 = CAP2_POCSAG;
return true;
@@ -2061,8 +1871,6 @@ bool CModem::readVersion()
::strcat(modeText, " P25");
if (hasNXDN())
::strcat(modeText, " NXDN");
if (hasM17())
::strcat(modeText, " M17");
if (hasFM())
::strcat(modeText, " FM");
if (hasPOCSAG())
@@ -2157,8 +1965,6 @@ bool CModem::setConfig1()
buffer[4U] |= 0x10U;
if (m_pocsagEnabled)
buffer[4U] |= 0x20U;
if (m_m17Enabled)
buffer[4U] |= 0x40U;
buffer[5U] = m_txDelay / 10U; // In 10ms units
@@ -2194,9 +2000,9 @@ bool CModem::setConfig1()
buffer[23U] = (unsigned char)m_nxdnTXHang;
buffer[24U] = (unsigned char)(m_m17TXLevel * 2.55F + 0.5F);
buffer[24U] = 0x00U;
buffer[25U] = (unsigned char)m_m17TXHang;
buffer[25U] = 0x00U;
// CUtils::dump(1U, "Written", buffer, 26U);
@@ -2272,8 +2078,6 @@ bool CModem::setConfig2()
buffer[4U] |= 0x10U;
if (m_fmEnabled)
buffer[4U] |= 0x20U;
if (m_m17Enabled)
buffer[4U] |= 0x40U;
buffer[5U] = 0x00U;
if (m_pocsagEnabled)
@@ -2296,7 +2100,7 @@ bool CModem::setConfig2()
buffer[14U] = (unsigned char)(m_ysfTXLevel * 2.55F + 0.5F);
buffer[15U] = (unsigned char)(m_p25TXLevel * 2.55F + 0.5F);
buffer[16U] = (unsigned char)(m_nxdnTXLevel * 2.55F + 0.5F);
buffer[17U] = (unsigned char)(m_m17TXLevel * 2.55F + 0.5F);
buffer[17U] = 0x00U;
buffer[18U] = (unsigned char)(m_pocsagTXLevel * 2.55F + 0.5F);
buffer[19U] = (unsigned char)(m_fmTXLevel * 2.55F + 0.5F);
buffer[20U] = (unsigned char)(m_ax25TXLevel * 2.55F + 0.5F);
@@ -2306,7 +2110,7 @@ bool CModem::setConfig2()
buffer[23U] = (unsigned char)m_ysfTXHang;
buffer[24U] = (unsigned char)m_p25TXHang;
buffer[25U] = (unsigned char)m_nxdnTXHang;
buffer[26U] = (unsigned char)m_m17TXHang;
buffer[26U] = 0x00U;
buffer[27U] = 0x00U;
buffer[28U] = 0x00U;