Make POCSAG and AX.25 conditional in the modem handling code.

This commit is contained in:
Jonathan Naylor
2023-06-29 13:39:10 +01:00
parent b524c14d1d
commit 7fa24d7f57
2 changed files with 153 additions and 8 deletions

121
Modem.cpp
View File

@@ -80,9 +80,13 @@ const unsigned char MMDVM_M17_PACKET = 0x47U;
const unsigned char MMDVM_M17_LOST = 0x48U; const unsigned char MMDVM_M17_LOST = 0x48U;
const unsigned char MMDVM_M17_EOT = 0x49U; const unsigned char MMDVM_M17_EOT = 0x49U;
#if defined(USE_POCSAG)
const unsigned char MMDVM_POCSAG_DATA = 0x50U; const unsigned char MMDVM_POCSAG_DATA = 0x50U;
#endif
#if defined(USE_AX25)
const unsigned char MMDVM_AX25_DATA = 0x55U; const unsigned char MMDVM_AX25_DATA = 0x55U;
#endif
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;
@@ -118,9 +122,12 @@ const unsigned char CAP1_P25 = 0x08U;
const unsigned char CAP1_NXDN = 0x10U; const unsigned char CAP1_NXDN = 0x10U;
const unsigned char CAP1_M17 = 0x20U; const unsigned char CAP1_M17 = 0x20U;
const unsigned char CAP1_FM = 0x40U; const unsigned char CAP1_FM = 0x40U;
#if defined(USE_POCSAG)
const unsigned char CAP2_POCSAG = 0x01U; const unsigned char CAP2_POCSAG = 0x01U;
#endif
#if defined(USE_AX25)
const unsigned char CAP2_AX25 = 0x02U; const unsigned char CAP2_AX25 = 0x02U;
#endif
CModem::CModem(bool duplex, bool rxInvert, bool txInvert, bool pttInvert, unsigned int txDelay, unsigned int dmrDelay, bool useCOSAsLockout, bool trace, bool debug) : CModem::CModem(bool duplex, bool rxInvert, bool txInvert, bool pttInvert, unsigned int txDelay, unsigned int dmrDelay, bool useCOSAsLockout, bool trace, bool debug) :
m_protocolVersion(0U), m_protocolVersion(0U),
@@ -144,25 +151,35 @@ m_ysfTXLevel(0.0F),
m_p25TXLevel(0.0F), m_p25TXLevel(0.0F),
m_nxdnTXLevel(0.0F), m_nxdnTXLevel(0.0F),
m_m17TXLevel(0.0F), m_m17TXLevel(0.0F),
#if defined(USE_POCSAG)
m_pocsagTXLevel(0.0F), m_pocsagTXLevel(0.0F),
#endif
m_fmTXLevel(0.0F), m_fmTXLevel(0.0F),
#if defined(USE_AX25)
m_ax25TXLevel(0.0F), m_ax25TXLevel(0.0F),
#endif
m_rfLevel(0.0F), m_rfLevel(0.0F),
m_useCOSAsLockout(useCOSAsLockout), m_useCOSAsLockout(useCOSAsLockout),
m_trace(trace), m_trace(trace),
m_debug(debug), m_debug(debug),
m_rxFrequency(0U), m_rxFrequency(0U),
m_txFrequency(0U), m_txFrequency(0U),
#if defined(USE_POCSAG)
m_pocsagFrequency(0U), m_pocsagFrequency(0U),
#endif
m_dstarEnabled(false), m_dstarEnabled(false),
m_dmrEnabled(false), m_dmrEnabled(false),
m_ysfEnabled(false), m_ysfEnabled(false),
m_p25Enabled(false), m_p25Enabled(false),
m_nxdnEnabled(false), m_nxdnEnabled(false),
m_m17Enabled(false), m_m17Enabled(false),
#if defined(USE_POCSAG)
m_pocsagEnabled(false), m_pocsagEnabled(false),
#endif
m_fmEnabled(false), m_fmEnabled(false),
#if defined(USE_AX25)
m_ax25Enabled(false), m_ax25Enabled(false),
#endif
m_rxDCOffset(0), m_rxDCOffset(0),
m_txDCOffset(0), m_txDCOffset(0),
m_port(NULL), m_port(NULL),
@@ -185,11 +202,15 @@ m_rxNXDNData(1000U, "Modem RX NXDN"),
m_txNXDNData(1000U, "Modem TX NXDN"), m_txNXDNData(1000U, "Modem TX NXDN"),
m_rxM17Data(1000U, "Modem RX M17"), m_rxM17Data(1000U, "Modem RX M17"),
m_txM17Data(1000U, "Modem TX M17"), m_txM17Data(1000U, "Modem TX M17"),
#if defined(USE_POCSAG)
m_txPOCSAGData(1000U, "Modem TX POCSAG"), m_txPOCSAGData(1000U, "Modem TX POCSAG"),
#endif
m_rxFMData(5000U, "Modem RX FM"), m_rxFMData(5000U, "Modem RX FM"),
m_txFMData(5000U, "Modem TX FM"), m_txFMData(5000U, "Modem TX FM"),
#if defined(USE_AX25)
m_rxAX25Data(1000U, "Modem RX AX.25"), m_rxAX25Data(1000U, "Modem RX AX.25"),
m_txAX25Data(1000U, "Modem TX AX.25"), m_txAX25Data(1000U, "Modem TX AX.25"),
#endif
m_rxSerialData(1000U, "Modem RX Serial"), m_rxSerialData(1000U, "Modem RX Serial"),
m_txSerialData(1000U, "Modem TX Serial"), m_txSerialData(1000U, "Modem TX Serial"),
m_rxTransparentData(1000U, "Modem RX Transparent"), m_rxTransparentData(1000U, "Modem RX Transparent"),
@@ -205,19 +226,25 @@ m_ysfSpace(0U),
m_p25Space(0U), m_p25Space(0U),
m_nxdnSpace(0U), m_nxdnSpace(0U),
m_m17Space(0U), m_m17Space(0U),
#if defined(USE_POCSAG)
m_pocsagSpace(0U), m_pocsagSpace(0U),
#endif
m_fmSpace(0U), m_fmSpace(0U),
#if defined(USE_AX25)
m_ax25Space(0U), m_ax25Space(0U),
#endif
m_tx(false), m_tx(false),
m_cd(false), m_cd(false),
m_lockout(false), 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),
#if defined(USE_AX25)
m_ax25RXTwist(0), m_ax25RXTwist(0),
m_ax25TXDelay(300U), m_ax25TXDelay(300U),
m_ax25SlotTime(30U), m_ax25SlotTime(30U),
m_ax25PPersist(128U), m_ax25PPersist(128U),
#endif
m_fmCallsign(), m_fmCallsign(),
m_fmCallsignSpeed(20U), m_fmCallsignSpeed(20U),
m_fmCallsignFrequency(1000U), m_fmCallsignFrequency(1000U),
@@ -279,7 +306,9 @@ void CModem::setRFParams(unsigned int rxFrequency, int rxOffset, unsigned int tx
m_txDCOffset = txDCOffset; m_txDCOffset = txDCOffset;
m_rxDCOffset = rxDCOffset; m_rxDCOffset = rxDCOffset;
m_rfLevel = rfLevel; m_rfLevel = rfLevel;
#if defined(USE_POCSAG)
m_pocsagFrequency = pocsagFrequency + txOffset; m_pocsagFrequency = pocsagFrequency + txOffset;
#endif
} }
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 m17Enabled, bool pocsagEnabled, bool fmEnabled, bool ax25Enabled)
@@ -290,9 +319,13 @@ void CModem::setModeParams(bool dstarEnabled, bool dmrEnabled, bool ysfEnabled,
m_p25Enabled = p25Enabled; m_p25Enabled = p25Enabled;
m_nxdnEnabled = nxdnEnabled; m_nxdnEnabled = nxdnEnabled;
m_m17Enabled = m17Enabled; m_m17Enabled = m17Enabled;
#if defined(USE_POCSAG)
m_pocsagEnabled = pocsagEnabled; m_pocsagEnabled = pocsagEnabled;
#endif
m_fmEnabled = fmEnabled; m_fmEnabled = fmEnabled;
#if defined(USE_AX25)
m_ax25Enabled = ax25Enabled; m_ax25Enabled = ax25Enabled;
#endif
} }
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 m17TXLevel, float pocsagTXLevel, float fmTXLevel, float ax25TXLevel)
@@ -305,9 +338,13 @@ void CModem::setLevels(float rxLevel, float cwIdTXLevel, float dstarTXLevel, flo
m_p25TXLevel = p25TXLevel; m_p25TXLevel = p25TXLevel;
m_nxdnTXLevel = nxdnTXLevel; m_nxdnTXLevel = nxdnTXLevel;
m_m17TXLevel = m17TXLevel; m_m17TXLevel = m17TXLevel;
#if defined(USE_POCSAG)
m_pocsagTXLevel = pocsagTXLevel; m_pocsagTXLevel = pocsagTXLevel;
#endif
m_fmTXLevel = fmTXLevel; m_fmTXLevel = fmTXLevel;
#if defined(USE_AX25)
m_ax25TXLevel = ax25TXLevel; m_ax25TXLevel = ax25TXLevel;
#endif
} }
void CModem::setDMRParams(unsigned int colorCode) void CModem::setDMRParams(unsigned int colorCode)
@@ -338,6 +375,7 @@ void CModem::setM17Params(unsigned int txHang)
m_m17TXHang = txHang; m_m17TXHang = txHang;
} }
#if defined(USE_AX25)
void CModem::setAX25Params(int rxTwist, unsigned int txDelay, unsigned int slotTime, unsigned int pPersist) void CModem::setAX25Params(int rxTwist, unsigned int txDelay, unsigned int slotTime, unsigned int pPersist)
{ {
m_ax25RXTwist = rxTwist; m_ax25RXTwist = rxTwist;
@@ -345,6 +383,7 @@ void CModem::setAX25Params(int rxTwist, unsigned int txDelay, unsigned int slotT
m_ax25SlotTime = slotTime; m_ax25SlotTime = slotTime;
m_ax25PPersist = pPersist; m_ax25PPersist = pPersist;
} }
#endif
void CModem::setTransparentDataParams(unsigned int sendFrameType) void CModem::setTransparentDataParams(unsigned int sendFrameType)
{ {
@@ -758,6 +797,7 @@ void CModem::clock(unsigned int ms)
} }
break; break;
#if defined(USE_AX25)
case MMDVM_AX25_DATA: { case MMDVM_AX25_DATA: {
if (m_trace) if (m_trace)
CUtils::dump(1U, "RX AX.25 Data", m_buffer, m_length); CUtils::dump(1U, "RX AX.25 Data", m_buffer, m_length);
@@ -768,6 +808,7 @@ void CModem::clock(unsigned int ms)
m_rxAX25Data.addData(m_buffer + m_offset, m_length - m_offset); m_rxAX25Data.addData(m_buffer + m_offset, m_length - m_offset);
} }
break; break;
#endif
case MMDVM_GET_STATUS: case MMDVM_GET_STATUS:
// if (m_trace) // if (m_trace)
@@ -796,9 +837,13 @@ void CModem::clock(unsigned int ms)
m_p25Space = 0U; m_p25Space = 0U;
m_nxdnSpace = 0U; m_nxdnSpace = 0U;
m_m17Space = 0U; m_m17Space = 0U;
#if defined(USE_POCSAG)
m_pocsagSpace = 0U; m_pocsagSpace = 0U;
#endif
m_fmSpace = 0U; m_fmSpace = 0U;
#if defined(USE_AX25)
m_ax25Space = 0U; m_ax25Space = 0U;
#endif
m_dstarSpace = m_buffer[m_offset + 3U]; m_dstarSpace = m_buffer[m_offset + 3U];
m_dmrSpace1 = m_buffer[m_offset + 4U]; m_dmrSpace1 = m_buffer[m_offset + 4U];
@@ -810,8 +855,10 @@ void CModem::clock(unsigned int ms)
m_p25Space = m_buffer[m_offset + 7U]; m_p25Space = m_buffer[m_offset + 7U];
if (m_length > (m_offset + 8U)) if (m_length > (m_offset + 8U))
m_nxdnSpace = m_buffer[m_offset + 8U]; m_nxdnSpace = m_buffer[m_offset + 8U];
#if defined(USE_POCSAG)
if (m_length > (m_offset + 9U)) if (m_length > (m_offset + 9U))
m_pocsagSpace = m_buffer[m_offset + 9U]; m_pocsagSpace = m_buffer[m_offset + 9U];
#endif
if (m_length > (m_offset + 10U)) if (m_length > (m_offset + 10U))
m_m17Space = m_buffer[m_offset + 10U]; m_m17Space = m_buffer[m_offset + 10U];
} }
@@ -844,8 +891,12 @@ void CModem::clock(unsigned int ms)
m_nxdnSpace = m_buffer[m_offset + 8U]; m_nxdnSpace = m_buffer[m_offset + 8U];
m_m17Space = m_buffer[m_offset + 9U]; m_m17Space = m_buffer[m_offset + 9U];
m_fmSpace = m_buffer[m_offset + 10U]; m_fmSpace = m_buffer[m_offset + 10U];
#if defined(USE_POCSAG)
m_pocsagSpace = m_buffer[m_offset + 11U]; m_pocsagSpace = m_buffer[m_offset + 11U];
#endif
#if defined(USE_AX25)
m_ax25Space = m_buffer[m_offset + 12U]; m_ax25Space = m_buffer[m_offset + 12U];
#endif
} }
break; break;
@@ -857,9 +908,13 @@ void CModem::clock(unsigned int ms)
m_p25Space = 0U; m_p25Space = 0U;
m_nxdnSpace = 0U; m_nxdnSpace = 0U;
m_m17Space = 0U; m_m17Space = 0U;
#if defined(USE_POCSAG)
m_pocsagSpace = 0U; m_pocsagSpace = 0U;
#endif
m_fmSpace = 0U; m_fmSpace = 0U;
#if defined(USE_AX25)
m_ax25Space = 0U; m_ax25Space = 0U;
#endif
break; break;
} }
@@ -1075,6 +1130,7 @@ void CModem::clock(unsigned int ms)
m_m17Space--; m_m17Space--;
} }
#if defined(USE_POCSAG)
if (m_pocsagSpace > 1U && !m_txPOCSAGData.isEmpty()) { if (m_pocsagSpace > 1U && !m_txPOCSAGData.isEmpty()) {
unsigned char len = 0U; unsigned char len = 0U;
m_txPOCSAGData.getData(&len, 1U); m_txPOCSAGData.getData(&len, 1U);
@@ -1091,6 +1147,7 @@ void CModem::clock(unsigned int ms)
m_pocsagSpace--; m_pocsagSpace--;
} }
#endif
if (m_fmSpace > 1U && !m_txFMData.isEmpty()) { if (m_fmSpace > 1U && !m_txFMData.isEmpty()) {
unsigned int len = 0U; unsigned int len = 0U;
@@ -1113,6 +1170,7 @@ void CModem::clock(unsigned int ms)
m_fmSpace--; m_fmSpace--;
} }
#if defined(USE_AX25)
if (m_ax25Space > 0U && !m_txAX25Data.isEmpty()) { if (m_ax25Space > 0U && !m_txAX25Data.isEmpty()) {
unsigned int len = 0U; unsigned int len = 0U;
m_txAX25Data.getData((unsigned char*)&len, sizeof(unsigned int)); m_txAX25Data.getData((unsigned char*)&len, sizeof(unsigned int));
@@ -1129,6 +1187,7 @@ void CModem::clock(unsigned int ms)
m_ax25Space = 0U; m_ax25Space = 0U;
} }
#endif
if (!m_txTransparentData.isEmpty()) { if (!m_txTransparentData.isEmpty()) {
unsigned char len = 0U; unsigned char len = 0U;
@@ -1278,6 +1337,7 @@ unsigned int CModem::readFMData(unsigned char* data)
return len; return len;
} }
#if defined(USE_AX25)
unsigned int CModem::readAX25Data(unsigned char* data) unsigned int CModem::readAX25Data(unsigned char* data)
{ {
assert(data != NULL); assert(data != NULL);
@@ -1291,6 +1351,7 @@ unsigned int CModem::readAX25Data(unsigned char* data)
return len; return len;
} }
#endif
unsigned int CModem::readTransparentData(unsigned char* data) unsigned int CModem::readTransparentData(unsigned char* data)
{ {
@@ -1552,6 +1613,7 @@ bool CModem::writeM17Data(const unsigned char* data, unsigned int length)
return true; return true;
} }
#if defined(USE_POCSAG)
bool CModem::hasPOCSAGSpace() const bool CModem::hasPOCSAGSpace() const
{ {
unsigned int space = m_txPOCSAGData.freeSpace() / (POCSAG_FRAME_LENGTH_BYTES + 4U); unsigned int space = m_txPOCSAGData.freeSpace() / (POCSAG_FRAME_LENGTH_BYTES + 4U);
@@ -1578,6 +1640,7 @@ bool CModem::writePOCSAGData(const unsigned char* data, unsigned int length)
return true; return true;
} }
#endif
unsigned int CModem::getFMSpace() const unsigned int CModem::getFMSpace() const
{ {
@@ -1613,6 +1676,7 @@ bool CModem::writeFMData(const unsigned char* data, unsigned int length)
return true; return true;
} }
#if defined(USE_AX25)
bool CModem::hasAX25Space() const bool CModem::hasAX25Space() const
{ {
unsigned int space = m_txAX25Data.freeSpace() / (AX25_MAX_FRAME_LENGTH_BYTES + 5U); unsigned int space = m_txAX25Data.freeSpace() / (AX25_MAX_FRAME_LENGTH_BYTES + 5U);
@@ -1648,6 +1712,7 @@ bool CModem::writeAX25Data(const unsigned char* data, unsigned int length)
return true; return true;
} }
#endif
bool CModem::writeTransparentData(const unsigned char* data, unsigned int length) bool CModem::writeTransparentData(const unsigned char* data, unsigned int length)
{ {
@@ -1840,6 +1905,7 @@ bool CModem::writeM17Info(const char* source, const char* dest, const char* type
return m_port->write(buffer, 23U) != 23; return m_port->write(buffer, 23U) != 23;
} }
#if defined(USE_POCSAG)
bool CModem::writePOCSAGInfo(unsigned int ric, const std::string& message) bool CModem::writePOCSAGInfo(unsigned int ric, const std::string& message)
{ {
assert(m_port != NULL); assert(m_port != NULL);
@@ -1862,6 +1928,7 @@ bool CModem::writePOCSAGInfo(unsigned int ric, const std::string& message)
return ret != int(length + 11U); return ret != int(length + 11U);
} }
#endif
bool CModem::writeIPInfo(const std::string& address) bool CModem::writeIPInfo(const std::string& address)
{ {
@@ -1960,15 +2027,19 @@ bool CModem::hasFM() const
return (m_capabilities1 & CAP1_FM) == CAP1_FM; return (m_capabilities1 & CAP1_FM) == CAP1_FM;
} }
#if defined(USE_POCSAG)
bool CModem::hasPOCSAG() const bool CModem::hasPOCSAG() const
{ {
return (m_capabilities2 & CAP2_POCSAG) == CAP2_POCSAG; return (m_capabilities2 & CAP2_POCSAG) == CAP2_POCSAG;
} }
#endif
#if defined(USE_AX25)
bool CModem::hasAX25() const bool CModem::hasAX25() const
{ {
return (m_capabilities2 & CAP2_AX25) == CAP2_AX25; return (m_capabilities2 & CAP2_AX25) == CAP2_AX25;
} }
#endif
unsigned int CModem::getVersion() const unsigned int CModem::getVersion() const
{ {
@@ -2033,7 +2104,11 @@ bool CModem::readVersion()
case 1U: case 1U:
LogInfo("MMDVM protocol version: 1, description: %.*s", m_length - 4U, m_buffer + 4U); 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 | CAP1_M17;
#if defined(USE_POCSAG)
m_capabilities2 = CAP2_POCSAG; m_capabilities2 = CAP2_POCSAG;
#else
m_capabilities2 = 0x00U;
#endif
return true; return true;
case 2U: case 2U:
@@ -2070,10 +2145,14 @@ bool CModem::readVersion()
::strcat(modeText, " M17"); ::strcat(modeText, " M17");
if (hasFM()) if (hasFM())
::strcat(modeText, " FM"); ::strcat(modeText, " FM");
#if defined(USE_POCSAG)
if (hasPOCSAG()) if (hasPOCSAG())
::strcat(modeText, " POCSAG"); ::strcat(modeText, " POCSAG");
#endif
#if defined(USE_AX25)
if (hasAX25()) if (hasAX25())
::strcat(modeText, " AX.25"); ::strcat(modeText, " AX.25");
#endif
LogInfo(modeText); LogInfo(modeText);
return true; return true;
@@ -2160,8 +2239,10 @@ bool CModem::setConfig1()
buffer[4U] |= 0x08U; buffer[4U] |= 0x08U;
if (m_nxdnEnabled) if (m_nxdnEnabled)
buffer[4U] |= 0x10U; buffer[4U] |= 0x10U;
#if defined(USE_POCSAG)
if (m_pocsagEnabled) if (m_pocsagEnabled)
buffer[4U] |= 0x20U; buffer[4U] |= 0x20U;
#endif
if (m_m17Enabled) if (m_m17Enabled)
buffer[4U] |= 0x40U; buffer[4U] |= 0x40U;
@@ -2190,9 +2271,11 @@ bool CModem::setConfig1()
buffer[18U] = (unsigned char)(m_nxdnTXLevel * 2.55F + 0.5F); buffer[18U] = (unsigned char)(m_nxdnTXLevel * 2.55F + 0.5F);
buffer[19U] = (unsigned char)m_ysfTXHang; buffer[19U] = (unsigned char)m_ysfTXHang;
#if defined(USE_POCSAG)
buffer[20U] = (unsigned char)(m_pocsagTXLevel * 2.55F + 0.5F); buffer[20U] = (unsigned char)(m_pocsagTXLevel * 2.55F + 0.5F);
#else
buffer[20U] = 0U;
#endif
buffer[21U] = (unsigned char)(m_fmTXLevel * 2.55F + 0.5F); buffer[21U] = (unsigned char)(m_fmTXLevel * 2.55F + 0.5F);
buffer[22U] = (unsigned char)m_p25TXHang; buffer[22U] = (unsigned char)m_p25TXHang;
@@ -2281,11 +2364,14 @@ bool CModem::setConfig2()
buffer[4U] |= 0x40U; buffer[4U] |= 0x40U;
buffer[5U] = 0x00U; buffer[5U] = 0x00U;
#if defined(USE_POCSAG)
if (m_pocsagEnabled) if (m_pocsagEnabled)
buffer[5U] |= 0x01U; buffer[5U] |= 0x01U;
#endif
#if defined(USE_AX25)
if (m_ax25Enabled) if (m_ax25Enabled)
buffer[5U] |= 0x02U; buffer[5U] |= 0x02U;
#endif
buffer[6U] = m_txDelay / 10U; // In 10ms units buffer[6U] = m_txDelay / 10U; // In 10ms units
buffer[7U] = MODE_IDLE; buffer[7U] = MODE_IDLE;
@@ -2302,9 +2388,17 @@ bool CModem::setConfig2()
buffer[15U] = (unsigned char)(m_p25TXLevel * 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[16U] = (unsigned char)(m_nxdnTXLevel * 2.55F + 0.5F);
buffer[17U] = (unsigned char)(m_m17TXLevel * 2.55F + 0.5F); buffer[17U] = (unsigned char)(m_m17TXLevel * 2.55F + 0.5F);
#if defined(USE_POCSAG)
buffer[18U] = (unsigned char)(m_pocsagTXLevel * 2.55F + 0.5F); buffer[18U] = (unsigned char)(m_pocsagTXLevel * 2.55F + 0.5F);
#else
buffer[18U] = 0U;
#endif
buffer[19U] = (unsigned char)(m_fmTXLevel * 2.55F + 0.5F); buffer[19U] = (unsigned char)(m_fmTXLevel * 2.55F + 0.5F);
#if defined(USE_AX25)
buffer[20U] = (unsigned char)(m_ax25TXLevel * 2.55F + 0.5F); buffer[20U] = (unsigned char)(m_ax25TXLevel * 2.55F + 0.5F);
#else
buffer[20U] = 0U;
#endif
buffer[21U] = 0x00U; buffer[21U] = 0x00U;
buffer[22U] = 0x00U; buffer[22U] = 0x00U;
@@ -2318,11 +2412,17 @@ bool CModem::setConfig2()
buffer[29U] = m_dmrColorCode; buffer[29U] = m_dmrColorCode;
buffer[30U] = m_dmrDelay; buffer[30U] = m_dmrDelay;
#if defined(USE_AX25)
buffer[31U] = (unsigned char)(m_ax25RXTwist + 128); buffer[31U] = (unsigned char)(m_ax25RXTwist + 128);
buffer[32U] = m_ax25TXDelay / 10U; // In 10ms units buffer[32U] = m_ax25TXDelay / 10U; // In 10ms units
buffer[33U] = m_ax25SlotTime / 10U; // In 10ms units buffer[33U] = m_ax25SlotTime / 10U; // In 10ms units
buffer[34U] = m_ax25PPersist; buffer[34U] = m_ax25PPersist;
#else
buffer[31U] = 0U;
buffer[32U] = 0U;
buffer[33U] = 0U;
buffer[34U] = 0U;
#endif
buffer[35U] = 0x00U; buffer[35U] = 0x00U;
buffer[36U] = 0x00U; buffer[36U] = 0x00U;
buffer[37U] = 0x00U; buffer[37U] = 0x00U;
@@ -2368,20 +2468,29 @@ bool CModem::setFrequency()
unsigned char buffer[20U]; unsigned char buffer[20U];
unsigned char len; unsigned char len;
unsigned int pocsagFrequency = 433000000U;
#if defined(USE_POCSAG)
unsigned int pocsagFrequency = 433000000U;
if (m_pocsagEnabled) if (m_pocsagEnabled)
pocsagFrequency = m_pocsagFrequency; pocsagFrequency = m_pocsagFrequency;
#endif
if (m_hwType == HWT_DVMEGA) if (m_hwType == HWT_DVMEGA)
len = 12U; len = 12U;
else { else {
buffer[12U] = (unsigned char)(m_rfLevel * 2.55F + 0.5F); buffer[12U] = (unsigned char)(m_rfLevel * 2.55F + 0.5F);
#if defined(USE_POCSAG)
buffer[13U] = (pocsagFrequency >> 0) & 0xFFU; buffer[13U] = (pocsagFrequency >> 0) & 0xFFU;
buffer[14U] = (pocsagFrequency >> 8) & 0xFFU; buffer[14U] = (pocsagFrequency >> 8) & 0xFFU;
buffer[15U] = (pocsagFrequency >> 16) & 0xFFU; buffer[15U] = (pocsagFrequency >> 16) & 0xFFU;
buffer[16U] = (pocsagFrequency >> 24) & 0xFFU; buffer[16U] = (pocsagFrequency >> 24) & 0xFFU;
#else
buffer[13U] = 0U;
buffer[14U] = 0U;
buffer[15U] = 0U;
buffer[16U] = 0U;
#endif
len = 17U; len = 17U;
} }

40
Modem.h
View File

@@ -54,7 +54,9 @@ public:
void setP25Params(unsigned int txHang); void setP25Params(unsigned int txHang);
void setNXDNParams(unsigned int txHang); void setNXDNParams(unsigned int txHang);
void setM17Params(unsigned int txHang); void setM17Params(unsigned int txHang);
#if defined(USE_AX25)
void setAX25Params(int rxTwist, unsigned int txDelay, unsigned int slotTime, unsigned int pPersist); void setAX25Params(int rxTwist, unsigned int txDelay, unsigned int slotTime, unsigned int pPersist);
#endif
void setTransparentDataParams(unsigned int sendFrameType); void setTransparentDataParams(unsigned int sendFrameType);
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); 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);
@@ -70,10 +72,13 @@ public:
bool hasP25() const; bool hasP25() const;
bool hasNXDN() const; bool hasNXDN() const;
bool hasM17() const; bool hasM17() const;
#if defined(USE_POCSAG)
bool hasPOCSAG() const; bool hasPOCSAG() const;
#endif
bool hasFM() const; bool hasFM() const;
#if defined(USE_AX25)
bool hasAX25() const; bool hasAX25() const;
#endif
unsigned int getVersion() const; unsigned int getVersion() const;
unsigned int readDStarData(unsigned char* data); unsigned int readDStarData(unsigned char* data);
@@ -84,7 +89,9 @@ public:
unsigned int readNXDNData(unsigned char* data); unsigned int readNXDNData(unsigned char* data);
unsigned int readM17Data(unsigned char* data); unsigned int readM17Data(unsigned char* data);
unsigned int readFMData(unsigned char* data); unsigned int readFMData(unsigned char* data);
#if defined(USE_AX25)
unsigned int readAX25Data(unsigned char* data); unsigned int readAX25Data(unsigned char* data);
#endif
bool hasDStarSpace() const; bool hasDStarSpace() const;
bool hasDMRSpace1() const; bool hasDMRSpace1() const;
@@ -93,9 +100,13 @@ public:
bool hasP25Space() const; bool hasP25Space() const;
bool hasNXDNSpace() const; bool hasNXDNSpace() const;
bool hasM17Space() const; bool hasM17Space() const;
#if defined(USE_POCSAG)
bool hasPOCSAGSpace() const; bool hasPOCSAGSpace() const;
#endif
unsigned int getFMSpace() const; unsigned int getFMSpace() const;
#if defined(USE_AX25)
bool hasAX25Space() const; bool hasAX25Space() const;
#endif
bool hasTX() const; bool hasTX() const;
bool hasCD() const; bool hasCD() const;
@@ -111,9 +122,13 @@ public:
bool writeP25Data(const unsigned char* data, unsigned int length); bool writeP25Data(const unsigned char* data, unsigned int length);
bool writeNXDNData(const unsigned char* data, unsigned int length); bool writeNXDNData(const unsigned char* data, unsigned int length);
bool writeM17Data(const unsigned char* data, unsigned int length); bool writeM17Data(const unsigned char* data, unsigned int length);
#if defined(USE_POCSAG)
bool writePOCSAGData(const unsigned char* data, unsigned int length); bool writePOCSAGData(const unsigned char* data, unsigned int length);
#endif
bool writeFMData(const unsigned char* data, unsigned int length); bool writeFMData(const unsigned char* data, unsigned int length);
#if defined(USE_AX25)
bool writeAX25Data(const unsigned char* data, unsigned int length); bool writeAX25Data(const unsigned char* data, unsigned int length);
#endif
bool writeDStarInfo(const char* my1, const char* my2, const char* your, const char* type, const char* reflector); bool writeDStarInfo(const char* my1, const char* my2, const char* your, const char* type, const char* reflector);
bool writeDMRInfo(unsigned int slotNo, const std::string& src, bool group, const std::string& dst, const char* type); bool writeDMRInfo(unsigned int slotNo, const std::string& src, bool group, const std::string& dst, const char* type);
@@ -121,7 +136,9 @@ public:
bool writeP25Info(const char* source, bool group, unsigned int dest, const char* type); bool writeP25Info(const char* source, bool group, unsigned int dest, const char* type);
bool writeNXDNInfo(const char* source, bool group, unsigned int dest, const char* type); bool writeNXDNInfo(const char* source, bool group, unsigned int dest, const char* type);
bool writeM17Info(const char* source, const char* dest, const char* type); bool writeM17Info(const char* source, const char* dest, const char* type);
#if defined(USE_POCSAG)
bool writePOCSAGInfo(unsigned int ric, const std::string& message); bool writePOCSAGInfo(unsigned int ric, const std::string& message);
#endif
bool writeIPInfo(const std::string& address); bool writeIPInfo(const std::string& address);
bool writeDMRStart(bool tx); bool writeDMRStart(bool tx);
@@ -167,25 +184,35 @@ private:
float m_p25TXLevel; float m_p25TXLevel;
float m_nxdnTXLevel; float m_nxdnTXLevel;
float m_m17TXLevel; float m_m17TXLevel;
#if defined(USE_POCSAG)
float m_pocsagTXLevel; float m_pocsagTXLevel;
#endif
float m_fmTXLevel; float m_fmTXLevel;
#if defined(USE_AX25)
float m_ax25TXLevel; float m_ax25TXLevel;
#endif
float m_rfLevel; float m_rfLevel;
bool m_useCOSAsLockout; bool m_useCOSAsLockout;
bool m_trace; bool m_trace;
bool m_debug; bool m_debug;
unsigned int m_rxFrequency; unsigned int m_rxFrequency;
unsigned int m_txFrequency; unsigned int m_txFrequency;
#if defined(USE_POCSAG)
unsigned int m_pocsagFrequency; unsigned int m_pocsagFrequency;
#endif
bool m_dstarEnabled; bool m_dstarEnabled;
bool m_dmrEnabled; bool m_dmrEnabled;
bool m_ysfEnabled; bool m_ysfEnabled;
bool m_p25Enabled; bool m_p25Enabled;
bool m_nxdnEnabled; bool m_nxdnEnabled;
bool m_m17Enabled; bool m_m17Enabled;
#if defined(USE_POCSAG)
bool m_pocsagEnabled; bool m_pocsagEnabled;
#endif
bool m_fmEnabled; bool m_fmEnabled;
#if defined(USE_AX25)
bool m_ax25Enabled; bool m_ax25Enabled;
#endif
int m_rxDCOffset; int m_rxDCOffset;
int m_txDCOffset; int m_txDCOffset;
IModemPort* m_port; IModemPort* m_port;
@@ -208,11 +235,15 @@ private:
CRingBuffer<unsigned char> m_txNXDNData; CRingBuffer<unsigned char> m_txNXDNData;
CRingBuffer<unsigned char> m_rxM17Data; CRingBuffer<unsigned char> m_rxM17Data;
CRingBuffer<unsigned char> m_txM17Data; CRingBuffer<unsigned char> m_txM17Data;
#if defined(USE_POCSAG)
CRingBuffer<unsigned char> m_txPOCSAGData; CRingBuffer<unsigned char> m_txPOCSAGData;
#endif
CRingBuffer<unsigned char> m_rxFMData; CRingBuffer<unsigned char> m_rxFMData;
CRingBuffer<unsigned char> m_txFMData; CRingBuffer<unsigned char> m_txFMData;
#if defined(USE_AX25)
CRingBuffer<unsigned char> m_rxAX25Data; CRingBuffer<unsigned char> m_rxAX25Data;
CRingBuffer<unsigned char> m_txAX25Data; CRingBuffer<unsigned char> m_txAX25Data;
#endif
CRingBuffer<unsigned char> m_rxSerialData; CRingBuffer<unsigned char> m_rxSerialData;
CRingBuffer<unsigned char> m_txSerialData; CRingBuffer<unsigned char> m_txSerialData;
CRingBuffer<unsigned char> m_rxTransparentData; CRingBuffer<unsigned char> m_rxTransparentData;
@@ -228,20 +259,25 @@ private:
unsigned int m_p25Space; unsigned int m_p25Space;
unsigned int m_nxdnSpace; unsigned int m_nxdnSpace;
unsigned int m_m17Space; unsigned int m_m17Space;
#if defined(USE_POCSAG)
unsigned int m_pocsagSpace; unsigned int m_pocsagSpace;
#endif
unsigned int m_fmSpace; unsigned int m_fmSpace;
#if defined(USE_AX25)
unsigned int m_ax25Space; unsigned int m_ax25Space;
#endif
bool m_tx; bool m_tx;
bool m_cd; bool m_cd;
bool m_lockout; bool m_lockout;
bool m_error; bool m_error;
unsigned char m_mode; unsigned char m_mode;
HW_TYPE m_hwType; HW_TYPE m_hwType;
#if defined(USE_AX25)
int m_ax25RXTwist; int m_ax25RXTwist;
unsigned int m_ax25TXDelay; unsigned int m_ax25TXDelay;
unsigned int m_ax25SlotTime; unsigned int m_ax25SlotTime;
unsigned int m_ax25PPersist; unsigned int m_ax25PPersist;
#endif
std::string m_fmCallsign; std::string m_fmCallsign;
unsigned int m_fmCallsignSpeed; unsigned int m_fmCallsignSpeed;
unsigned int m_fmCallsignFrequency; unsigned int m_fmCallsignFrequency;