Make D-Star, System Fusion, M17, and POCSAG optional.

This commit is contained in:
Jonathan Naylor 2020-11-08 21:28:26 +00:00
parent a345586ee9
commit dd5a465a39
28 changed files with 517 additions and 120 deletions

View File

@ -17,6 +17,9 @@
*/ */
#include "Config.h" #include "Config.h"
#if defined(MODE_DSTAR)
#include "Globals.h" #include "Globals.h"
#include "CalDStarRX.h" #include "CalDStarRX.h"
#include "Utils.h" #include "Utils.h"
@ -126,3 +129,5 @@ void CCalDStarRX::process(q15_t value)
} }
} }
#endif

View File

@ -16,10 +16,13 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
#include "Config.h"
#if defined(MODE_DSTAR)
#if !defined(CALDSTARRX_H) #if !defined(CALDSTARRX_H)
#define CALDSTARRX_H #define CALDSTARRX_H
#include "Config.h"
#include "DStarDefines.h" #include "DStarDefines.h"
class CCalDStarRX { class CCalDStarRX {
@ -40,3 +43,5 @@ private:
#endif #endif
#endif

View File

@ -17,6 +17,9 @@
*/ */
#include "Config.h" #include "Config.h"
#if defined(MODE_DSTAR)
#include "Globals.h" #include "Globals.h"
#include "CalDStarTX.h" #include "CalDStarTX.h"
@ -181,3 +184,5 @@ uint8_t CCalDStarTX::write(const uint8_t* data, uint16_t length)
return 0U; return 0U;
} }
#endif

View File

@ -16,10 +16,13 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
#include "Config.h"
#if defined(MODE_DSTAR)
#if !defined(CALDSTARTX_H) #if !defined(CALDSTARTX_H)
#define CALDSTARTX_H #define CALDSTARTX_H
#include "Config.h"
#include "DStarDefines.h" #include "DStarDefines.h"
class CCalDStarTX { class CCalDStarTX {
@ -37,3 +40,5 @@ private:
#endif #endif
#endif

View File

@ -18,10 +18,12 @@
*/ */
#include "Config.h" #include "Config.h"
#if defined(MODE_POCSAG)
#include "Globals.h" #include "Globals.h"
#include "CalPOCSAG.h" #include "CalPOCSAG.h"
CCalPOCSAG::CCalPOCSAG() : CCalPOCSAG::CCalPOCSAG() :
m_state(POCSAGCAL_IDLE) m_state(POCSAGCAL_IDLE)
{ {
@ -48,3 +50,6 @@ uint8_t CCalPOCSAG::write(const uint8_t* data, uint16_t length)
return 0U; return 0U;
} }
#endif

View File

@ -17,11 +17,13 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
#include "Config.h"
#if defined(MODE_POCSAG)
#if !defined(CALPOCSAG_H) #if !defined(CALPOCSAG_H)
#define CALPOCSAG_H #define CALPOCSAG_H
#include "Config.h"
enum POCSAGCAL { enum POCSAGCAL {
POCSAGCAL_IDLE, POCSAGCAL_IDLE,
POCSAGCAL_TX POCSAGCAL_TX
@ -40,3 +42,6 @@ private:
}; };
#endif #endif
#endif

View File

@ -19,6 +19,39 @@
#if !defined(CONFIG_H) #if !defined(CONFIG_H)
#define CONFIG_H #define CONFIG_H
// Allow for the selection of which modes to compile into the firmware. This is particularly useful for processors
// which have limited code space and processing power like the STM32F103, which is found on older/cheaper boards.
// Enable D-Star support, the D-Star correlator improves the sensitivity of D-Star enormously but uses quite a lot
// of processing power.
// #define MODE_DSTAR
#define USE_DSTAR_CORRELATOR
// Enable DMR support
#define MODE_DMR
// Enable System Fusion support
// #define MODE_YSF
// Enable P25 phase 1 support, the boxcar filter sometimes improves the performance of P25 receive on some systems.
#define MODE_P25
#define USE_P25_BOXCAR
// Enable NXDN support
#define MODE_NXDN
// Enable M17 support
// #define MODE_M17
// Enable POCSAG support
// #define MODE_POCSAG
// Enable FM support
#define MODE_FM
// Enable AX.25 support
#define MODE_AX25
// Allow for the use of high quality external clock oscillators // Allow for the use of high quality external clock oscillators
// The number is the frequency of the oscillator in Hertz. // The number is the frequency of the oscillator in Hertz.
// //
@ -44,7 +77,7 @@
// #define USE_COS_AS_LOCKOUT // #define USE_COS_AS_LOCKOUT
// Use pins to output the current mode via LEDs // Use pins to output the current mode via LEDs
#define MODE_LEDS // #define MODE_LEDS
// For the original Arduino Due pin layout // For the original Arduino Due pin layout
// #define ARDUINO_DUE_PAPA // #define ARDUINO_DUE_PAPA

View File

@ -18,6 +18,9 @@
*/ */
#include "Config.h" #include "Config.h"
#if defined(MODE_DSTAR)
#include "Globals.h" #include "Globals.h"
#include "DStarRX.h" #include "DStarRX.h"
#include "Utils.h" #include "Utils.h"
@ -715,3 +718,6 @@ bool CDStarRX::checksum(const uint8_t* header) const
return crc8[0U] == header[DSTAR_HEADER_LENGTH_BYTES - 2U] && crc8[1U] == header[DSTAR_HEADER_LENGTH_BYTES - 1U]; return crc8[0U] == header[DSTAR_HEADER_LENGTH_BYTES - 2U] && crc8[1U] == header[DSTAR_HEADER_LENGTH_BYTES - 1U];
} }
#endif

View File

@ -16,10 +16,13 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
#include "Config.h"
#if defined(MODE_DSTAR)
#if !defined(DSTARRX_H) #if !defined(DSTARRX_H)
#define DSTARRX_H #define DSTARRX_H
#include "Config.h"
#include "DStarDefines.h" #include "DStarDefines.h"
enum DSRX_STATE { enum DSRX_STATE {
@ -68,3 +71,5 @@ private:
#endif #endif
#endif

View File

@ -18,6 +18,9 @@
*/ */
#include "Config.h" #include "Config.h"
#if defined(MODE_DSTAR)
#include "Globals.h" #include "Globals.h"
#include "DStarTX.h" #include "DStarTX.h"
@ -446,3 +449,5 @@ uint8_t CDStarTX::getSpace() const
return m_buffer.getSpace() / (DSTAR_DATA_LENGTH_BYTES + 1U); return m_buffer.getSpace() / (DSTAR_DATA_LENGTH_BYTES + 1U);
} }
#endif

View File

@ -16,11 +16,13 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
#include "Config.h"
#if defined(MODE_DSTAR)
#if !defined(DSTARTX_H) #if !defined(DSTARTX_H)
#define DSTARTX_H #define DSTARTX_H
#include "Config.h"
#include "RingBuffer.h" #include "RingBuffer.h"
class CDStarTX { class CDStarTX {
@ -52,3 +54,5 @@ private:
#endif #endif
#endif

View File

@ -142,9 +142,15 @@ extern bool m_dcd;
extern CSerialPort serial; extern CSerialPort serial;
extern CIO io; extern CIO io;
#if defined(MODE_DSTAR)
extern CDStarRX dstarRX; extern CDStarRX dstarRX;
extern CDStarTX dstarTX; extern CDStarTX dstarTX;
extern CCalDStarRX calDStarRX;
extern CCalDStarTX calDStarTX;
#endif
#if defined(MODE_DMR)
extern CDMRIdleRX dmrIdleRX; extern CDMRIdleRX dmrIdleRX;
extern CDMRRX dmrRX; extern CDMRRX dmrRX;
extern CDMRTX dmrTX; extern CDMRTX dmrTX;
@ -152,33 +158,49 @@ extern CDMRTX dmrTX;
extern CDMRDMORX dmrDMORX; extern CDMRDMORX dmrDMORX;
extern CDMRDMOTX dmrDMOTX; extern CDMRDMOTX dmrDMOTX;
extern CCalDMR calDMR;
#endif
#if defined(MODE_YSF)
extern CYSFRX ysfRX; extern CYSFRX ysfRX;
extern CYSFTX ysfTX; extern CYSFTX ysfTX;
#endif
#if defined(MODE_P25)
extern CP25RX p25RX; extern CP25RX p25RX;
extern CP25TX p25TX; extern CP25TX p25TX;
extern CCalP25 calP25;
#endif
#if defined(MODE_NXDN)
extern CNXDNRX nxdnRX; extern CNXDNRX nxdnRX;
extern CNXDNTX nxdnTX; extern CNXDNTX nxdnTX;
extern CPOCSAGTX pocsagTX; extern CCalNXDN calNXDN;
#endif
#if defined(MODE_POCSAG)
extern CPOCSAGTX pocsagTX;
extern CCalPOCSAG calPOCSAG;
#endif
#if defined(MODE_M17)
extern CM17RX m17RX; extern CM17RX m17RX;
extern CM17TX m17TX; extern CM17TX m17TX;
#endif
extern CFM fm; #if defined(MODE_FM)
extern CFM fm;
extern CCalFM calFM;
#endif
#if defined(MODE_AX25)
extern CAX25RX ax25RX; extern CAX25RX ax25RX;
extern CAX25TX ax25TX; extern CAX25TX ax25TX;
#endif
extern CCalDStarRX calDStarRX; extern CCalRSSI calRSSI;
extern CCalDStarTX calDStarTX;
extern CCalDMR calDMR;
extern CCalFM calFM;
extern CCalP25 calP25;
extern CCalNXDN calNXDN;
extern CCalPOCSAG calPOCSAG;
extern CCalRSSI calRSSI;
extern CCWIdTX cwIdTX; extern CCWIdTX cwIdTX;

84
IO.cpp
View File

@ -26,17 +26,21 @@
static q31_t DC_FILTER[] = {3367972, 0, 3367972, 0, 2140747704, 0}; // {b0, 0, b1, b2, -a1, -a2} static q31_t DC_FILTER[] = {3367972, 0, 3367972, 0, 2140747704, 0}; // {b0, 0, b1, b2, -a1, -a2}
const uint32_t DC_FILTER_STAGES = 1U; // One Biquad stage const uint32_t DC_FILTER_STAGES = 1U; // One Biquad stage
#if defined(MODE_DMR) || defined(MODE_YSF)
// Generated using rcosdesign(0.2, 8, 5, 'sqrt') in MATLAB // Generated using rcosdesign(0.2, 8, 5, 'sqrt') in MATLAB
static q15_t RRC_0_2_FILTER[] = {401, 104, -340, -731, -847, -553, 112, 909, 1472, 1450, 683, -675, -2144, -3040, -2706, -770, 2667, 6995, static q15_t RRC_0_2_FILTER[] = {401, 104, -340, -731, -847, -553, 112, 909, 1472, 1450, 683, -675, -2144, -3040, -2706, -770, 2667, 6995,
11237, 14331, 15464, 14331, 11237, 6995, 2667, -770, -2706, -3040, -2144, -675, 683, 1450, 1472, 909, 112, 11237, 14331, 15464, 14331, 11237, 6995, 2667, -770, -2706, -3040, -2144, -675, 683, 1450, 1472, 909, 112,
-553, -847, -731, -340, 104, 401, 0}; -553, -847, -731, -340, 104, 401, 0};
const uint16_t RRC_0_2_FILTER_LEN = 42U; const uint16_t RRC_0_2_FILTER_LEN = 42U;
#endif
#if defined(MODE_M17)
// Generated using rcosdesign(0.5, 8, 5, 'sqrt') in MATLAB // Generated using rcosdesign(0.5, 8, 5, 'sqrt') in MATLAB
static q15_t RRC_0_5_FILTER[] = {-147, -88, 72, 220, 223, 46, -197, -285, -79, 334, 623, 390, -498, -1691, -2363, -1556, 1284, 5872, 11033, static q15_t RRC_0_5_FILTER[] = {-147, -88, 72, 220, 223, 46, -197, -285, -79, 334, 623, 390, -498, -1691, -2363, -1556, 1284, 5872, 11033,
15109, 16656, 15109, 11033, 5872, 1284, -1556, -2363, -1691, -498, 390, 623, 334, -79, -285, -197, 46, 223, 15109, 16656, 15109, 11033, 5872, 1284, -1556, -2363, -1691, -498, 390, 623, 334, -79, -285, -197, 46, 223,
220, 72, -88, -147, 0}; 220, 72, -88, -147, 0};
const uint16_t RRC_0_5_FILTER_LEN = 42U; const uint16_t RRC_0_5_FILTER_LEN = 42U;
#endif
// Generated using rcosdesign(0.2, 8, 10, 'sqrt') in MATLAB // Generated using rcosdesign(0.2, 8, 10, 'sqrt') in MATLAB
static q15_t NXDN_0_2_FILTER[] = {284, 198, 73, -78, -240, -393, -517, -590, -599, -533, -391, -181, 79, 364, 643, 880, 1041, 1097, 1026, 819, static q15_t NXDN_0_2_FILTER[] = {284, 198, 73, -78, -240, -393, -517, -590, -599, -533, -391, -181, 79, 364, 643, 880, 1041, 1097, 1026, 819,
@ -50,9 +54,11 @@ static q15_t NXDN_ISINC_FILTER[] = {790, -1085, -1073, -553, 747, 2341, 3156, 21
12354, 4441, -3102, -7536, -7834, -4915, -893, 2152, 3156, 2341, 747, -553, -1073, -1085, 790}; 12354, 4441, -3102, -7536, -7834, -4915, -893, 2152, 3156, 2341, 747, -553, -1073, -1085, 790};
const uint16_t NXDN_ISINC_FILTER_LEN = 32U; const uint16_t NXDN_ISINC_FILTER_LEN = 32U;
#if defined(MODE_DSTAR)
// Generated using gaussfir(0.5, 4, 5) in MATLAB // Generated using gaussfir(0.5, 4, 5) in MATLAB
static q15_t GAUSSIAN_0_5_FILTER[] = {8, 104, 760, 3158, 7421, 9866, 7421, 3158, 760, 104, 8, 0}; static q15_t GAUSSIAN_0_5_FILTER[] = {8, 104, 760, 3158, 7421, 9866, 7421, 3158, 760, 104, 8, 0};
const uint16_t GAUSSIAN_0_5_FILTER_LEN = 12U; const uint16_t GAUSSIAN_0_5_FILTER_LEN = 12U;
#endif
// One symbol boxcar filter // One symbol boxcar filter
static q15_t BOXCAR_FILTER[] = {12000, 12000, 12000, 12000, 12000, 0}; static q15_t BOXCAR_FILTER[] = {12000, 12000, 12000, 12000, 12000, 0};
@ -67,15 +73,21 @@ m_txBuffer(TX_RINGBUFFER_SIZE),
m_rssiBuffer(RX_RINGBUFFER_SIZE), m_rssiBuffer(RX_RINGBUFFER_SIZE),
m_dcFilter(), m_dcFilter(),
m_dcState(), m_dcState(),
m_rrc02Filter(), #if defined(MODE_DSTAR)
m_rrc05Filter(),
m_gaussianFilter(), m_gaussianFilter(),
m_gaussianState(),
#endif
m_boxcarFilter(), m_boxcarFilter(),
m_nxdnFilter(), m_nxdnFilter(),
m_nxdnISincFilter(), m_nxdnISincFilter(),
#if defined(MODE_DMR) || defined(MODE_YSF)
m_rrc02Filter(),
m_rrc02State(), m_rrc02State(),
#endif
#if defined(MODE_M17)
m_rrc05Filter(),
m_rrc05State(), m_rrc05State(),
m_gaussianState(), #endif
m_boxcarState(), m_boxcarState(),
m_nxdnState(), m_nxdnState(),
m_nxdnISincState(), m_nxdnISincState(),
@ -102,9 +114,13 @@ m_dacOverflow(0U),
m_watchdog(0U), m_watchdog(0U),
m_lockout(false) m_lockout(false)
{ {
::memset(m_rrc02State, 0x00U, 70U * sizeof(q15_t)); #if defined(MODE_DSTAR)
::memset(m_rrc05State, 0x00U, 70U * sizeof(q15_t)); ::memset(m_gaussianState, 0x00U, 40U * sizeof(q15_t));
::memset(m_gaussianState, 0x00U, 40U * sizeof(q15_t)); m_gaussianFilter.numTaps = GAUSSIAN_0_5_FILTER_LEN;
m_gaussianFilter.pState = m_gaussianState;
m_gaussianFilter.pCoeffs = GAUSSIAN_0_5_FILTER;
#endif
::memset(m_boxcarState, 0x00U, 30U * sizeof(q15_t)); ::memset(m_boxcarState, 0x00U, 30U * sizeof(q15_t));
::memset(m_nxdnState, 0x00U, 110U * sizeof(q15_t)); ::memset(m_nxdnState, 0x00U, 110U * sizeof(q15_t));
::memset(m_nxdnISincState, 0x00U, 60U * sizeof(q15_t)); ::memset(m_nxdnISincState, 0x00U, 60U * sizeof(q15_t));
@ -115,17 +131,19 @@ m_lockout(false)
m_dcFilter.pCoeffs = DC_FILTER; m_dcFilter.pCoeffs = DC_FILTER;
m_dcFilter.postShift = 0; m_dcFilter.postShift = 0;
#if defined(MODE_DMR) || defined(MODE_YSF)
::memset(m_rrc02State, 0x00U, 70U * sizeof(q15_t));
m_rrc02Filter.numTaps = RRC_0_2_FILTER_LEN; m_rrc02Filter.numTaps = RRC_0_2_FILTER_LEN;
m_rrc02Filter.pState = m_rrc02State; m_rrc02Filter.pState = m_rrc02State;
m_rrc02Filter.pCoeffs = RRC_0_2_FILTER; m_rrc02Filter.pCoeffs = RRC_0_2_FILTER;
#endif
#if defined(MODE_M17)
::memset(m_rrc05State, 0x00U, 70U * sizeof(q15_t));
m_rrc05Filter.numTaps = RRC_0_5_FILTER_LEN; m_rrc05Filter.numTaps = RRC_0_5_FILTER_LEN;
m_rrc05Filter.pState = m_rrc05State; m_rrc05Filter.pState = m_rrc05State;
m_rrc05Filter.pCoeffs = RRC_0_5_FILTER; m_rrc05Filter.pCoeffs = RRC_0_5_FILTER;
#endif
m_gaussianFilter.numTaps = GAUSSIAN_0_5_FILTER_LEN;
m_gaussianFilter.pState = m_gaussianState;
m_gaussianFilter.pCoeffs = GAUSSIAN_0_5_FILTER;
m_boxcarFilter.numTaps = BOXCAR_FILTER_LEN; m_boxcarFilter.numTaps = BOXCAR_FILTER_LEN;
m_boxcarFilter.pState = m_boxcarState; m_boxcarFilter.pState = m_boxcarState;
@ -353,6 +371,7 @@ void CIO::process()
#endif #endif
if (m_modemState == STATE_IDLE) { if (m_modemState == STATE_IDLE) {
#if defined(MODE_DSTAR)
if (m_dstarEnable) { if (m_dstarEnable) {
q15_t GMSKVals[RX_BLOCK_SIZE]; q15_t GMSKVals[RX_BLOCK_SIZE];
#if defined(USE_DCBLOCKER) #if defined(USE_DCBLOCKER)
@ -362,6 +381,7 @@ void CIO::process()
#endif #endif
dstarRX.samples(GMSKVals, rssi, RX_BLOCK_SIZE); dstarRX.samples(GMSKVals, rssi, RX_BLOCK_SIZE);
} }
#endif
if (m_p25Enable) { if (m_p25Enable) {
q15_t P25Vals[RX_BLOCK_SIZE]; q15_t P25Vals[RX_BLOCK_SIZE];
@ -396,6 +416,7 @@ void CIO::process()
dmrDMORX.samples(DMRVals, rssi, RX_BLOCK_SIZE); dmrDMORX.samples(DMRVals, rssi, RX_BLOCK_SIZE);
} }
#if defined(MODE_YSF)
if (m_ysfEnable) { if (m_ysfEnable) {
q15_t YSFVals[RX_BLOCK_SIZE]; q15_t YSFVals[RX_BLOCK_SIZE];
#if defined(USE_DCBLOCKER) #if defined(USE_DCBLOCKER)
@ -405,7 +426,9 @@ void CIO::process()
#endif #endif
ysfRX.samples(YSFVals, rssi, RX_BLOCK_SIZE); ysfRX.samples(YSFVals, rssi, RX_BLOCK_SIZE);
} }
#endif
#if defined(MODE_M17)
if (m_m17Enable) { if (m_m17Enable) {
q15_t RRCVals[RX_BLOCK_SIZE]; q15_t RRCVals[RX_BLOCK_SIZE];
#if defined(USE_DCBLOCKER) #if defined(USE_DCBLOCKER)
@ -415,6 +438,7 @@ void CIO::process()
#endif #endif
m17RX.samples(RRCVals, rssi, RX_BLOCK_SIZE); m17RX.samples(RRCVals, rssi, RX_BLOCK_SIZE);
} }
#endif
if (m_fmEnable) { if (m_fmEnable) {
bool cos = getCOSInt(); bool cos = getCOSInt();
@ -432,7 +456,10 @@ void CIO::process()
ax25RX.samples(samples, RX_BLOCK_SIZE); ax25RX.samples(samples, RX_BLOCK_SIZE);
#endif #endif
} }
} else if (m_modemState == STATE_DSTAR) { }
#if defined(MODE_DSTAR)
else if (m_modemState == STATE_DSTAR) {
if (m_dstarEnable) { if (m_dstarEnable) {
q15_t GMSKVals[RX_BLOCK_SIZE]; q15_t GMSKVals[RX_BLOCK_SIZE];
#if defined(USE_DCBLOCKER) #if defined(USE_DCBLOCKER)
@ -442,7 +469,10 @@ void CIO::process()
#endif #endif
dstarRX.samples(GMSKVals, rssi, RX_BLOCK_SIZE); dstarRX.samples(GMSKVals, rssi, RX_BLOCK_SIZE);
} }
} else if (m_modemState == STATE_DMR) { }
#endif
else if (m_modemState == STATE_DMR) {
if (m_dmrEnable) { if (m_dmrEnable) {
q15_t DMRVals[RX_BLOCK_SIZE]; q15_t DMRVals[RX_BLOCK_SIZE];
::arm_fir_fast_q15(&m_rrc02Filter, samples, DMRVals, RX_BLOCK_SIZE); ::arm_fir_fast_q15(&m_rrc02Filter, samples, DMRVals, RX_BLOCK_SIZE);
@ -457,7 +487,10 @@ void CIO::process()
dmrDMORX.samples(DMRVals, rssi, RX_BLOCK_SIZE); dmrDMORX.samples(DMRVals, rssi, RX_BLOCK_SIZE);
} }
} }
} else if (m_modemState == STATE_YSF) { }
#if defined(MODE_YSF)
else if (m_modemState == STATE_YSF) {
if (m_ysfEnable) { if (m_ysfEnable) {
q15_t YSFVals[RX_BLOCK_SIZE]; q15_t YSFVals[RX_BLOCK_SIZE];
#if defined(USE_DCBLOCKER) #if defined(USE_DCBLOCKER)
@ -467,7 +500,10 @@ void CIO::process()
#endif #endif
ysfRX.samples(YSFVals, rssi, RX_BLOCK_SIZE); ysfRX.samples(YSFVals, rssi, RX_BLOCK_SIZE);
} }
} else if (m_modemState == STATE_P25) { }
#endif
else if (m_modemState == STATE_P25) {
if (m_p25Enable) { if (m_p25Enable) {
q15_t P25Vals[RX_BLOCK_SIZE]; q15_t P25Vals[RX_BLOCK_SIZE];
#if defined(USE_DCBLOCKER) #if defined(USE_DCBLOCKER)
@ -490,7 +526,10 @@ void CIO::process()
nxdnRX.samples(NXDNVals, rssi, RX_BLOCK_SIZE); nxdnRX.samples(NXDNVals, rssi, RX_BLOCK_SIZE);
} }
} else if (m_modemState == STATE_M17) { }
#if defined(MODE_M17)
else if (m_modemState == STATE_M17) {
if (m_m17Enable) { if (m_m17Enable) {
q15_t M17Vals[RX_BLOCK_SIZE]; q15_t M17Vals[RX_BLOCK_SIZE];
#if defined(USE_DCBLOCKER) #if defined(USE_DCBLOCKER)
@ -500,7 +539,10 @@ void CIO::process()
#endif #endif
m17RX.samples(M17Vals, rssi, RX_BLOCK_SIZE); m17RX.samples(M17Vals, rssi, RX_BLOCK_SIZE);
} }
} else if (m_modemState == STATE_FM) { }
#endif
else if (m_modemState == STATE_FM) {
bool cos = getCOSInt(); bool cos = getCOSInt();
#if defined(USE_DCBLOCKER) #if defined(USE_DCBLOCKER)
fm.samples(cos, dcSamples, RX_BLOCK_SIZE); fm.samples(cos, dcSamples, RX_BLOCK_SIZE);
@ -511,12 +553,18 @@ void CIO::process()
if (m_ax25Enable) if (m_ax25Enable)
ax25RX.samples(samples, RX_BLOCK_SIZE); ax25RX.samples(samples, RX_BLOCK_SIZE);
#endif #endif
} else if (m_modemState == STATE_DSTARCAL) { }
#if defined(MODE_DSTAR)
else if (m_modemState == STATE_DSTARCAL) {
q15_t GMSKVals[RX_BLOCK_SIZE]; q15_t GMSKVals[RX_BLOCK_SIZE];
::arm_fir_fast_q15(&m_gaussianFilter, samples, GMSKVals, RX_BLOCK_SIZE); ::arm_fir_fast_q15(&m_gaussianFilter, samples, GMSKVals, RX_BLOCK_SIZE);
calDStarRX.samples(GMSKVals, RX_BLOCK_SIZE); calDStarRX.samples(GMSKVals, RX_BLOCK_SIZE);
} else if (m_modemState == STATE_RSSICAL) { }
#endif
else if (m_modemState == STATE_RSSICAL) {
calRSSI.samples(rssi, RX_BLOCK_SIZE); calRSSI.samples(rssi, RX_BLOCK_SIZE);
} }
} }

16
IO.h
View File

@ -70,15 +70,25 @@ private:
arm_biquad_casd_df1_inst_q31 m_dcFilter; arm_biquad_casd_df1_inst_q31 m_dcFilter;
q31_t m_dcState[4]; q31_t m_dcState[4];
arm_fir_instance_q15 m_rrc02Filter; #if defined(MODE_DSTAR)
arm_fir_instance_q15 m_rrc05Filter;
arm_fir_instance_q15 m_gaussianFilter; arm_fir_instance_q15 m_gaussianFilter;
q15_t m_gaussianState[40U]; // NoTaps + BlockSize - 1, 12 + 20 - 1 plus some spare
#endif
arm_fir_instance_q15 m_boxcarFilter; arm_fir_instance_q15 m_boxcarFilter;
arm_fir_instance_q15 m_nxdnFilter; arm_fir_instance_q15 m_nxdnFilter;
arm_fir_instance_q15 m_nxdnISincFilter; arm_fir_instance_q15 m_nxdnISincFilter;
#if defined(MODE_DMR) || defined(MODE_YSF)
arm_fir_instance_q15 m_rrc02Filter;
q15_t m_rrc02State[70U]; // NoTaps + BlockSize - 1, 42 + 20 - 1 plus some spare q15_t m_rrc02State[70U]; // NoTaps + BlockSize - 1, 42 + 20 - 1 plus some spare
#endif
#if defined(MODE_M17)
arm_fir_instance_q15 m_rrc05Filter;
q15_t m_rrc05State[70U]; // NoTaps + BlockSize - 1, 42 + 20 - 1 plus some spare q15_t m_rrc05State[70U]; // NoTaps + BlockSize - 1, 42 + 20 - 1 plus some spare
q15_t m_gaussianState[40U]; // NoTaps + BlockSize - 1, 12 + 20 - 1 plus some spare #endif
q15_t m_boxcarState[30U]; // NoTaps + BlockSize - 1, 6 + 20 - 1 plus some spare q15_t m_boxcarState[30U]; // NoTaps + BlockSize - 1, 6 + 20 - 1 plus some spare
q15_t m_nxdnState[110U]; // NoTaps + BlockSize - 1, 82 + 20 - 1 plus some spare q15_t m_nxdnState[110U]; // NoTaps + BlockSize - 1, 82 + 20 - 1 plus some spare
q15_t m_nxdnISincState[60U]; // NoTaps + BlockSize - 1, 32 + 20 - 1 plus some spare q15_t m_nxdnISincState[60U]; // NoTaps + BlockSize - 1, 32 + 20 - 1 plus some spare

View File

@ -17,6 +17,9 @@
*/ */
#include "Config.h" #include "Config.h"
#if defined(MODE_M17)
#include "Globals.h" #include "Globals.h"
#include "M17RX.h" #include "M17RX.h"
#include "Utils.h" #include "Utils.h"
@ -402,3 +405,6 @@ void CM17RX::writeRSSIData(uint8_t* data)
m_rssiAccum = 0U; m_rssiAccum = 0U;
m_rssiCount = 0U; m_rssiCount = 0U;
} }
#endif

View File

@ -16,10 +16,13 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
#include "Config.h"
#if defined(MODE_M17)
#if !defined(M17RX_H) #if !defined(M17RX_H)
#define M17RX_H #define M17RX_H
#include "Config.h"
#include "M17Defines.h" #include "M17Defines.h"
enum M17RX_STATE { enum M17RX_STATE {
@ -67,3 +70,5 @@ private:
#endif #endif
#endif

View File

@ -18,6 +18,9 @@
*/ */
#include "Config.h" #include "Config.h"
#if defined(MODE_M17)
#include "Globals.h" #include "Globals.h"
#include "M17TX.h" #include "M17TX.h"
@ -182,3 +185,6 @@ void CM17TX::setParams(uint8_t txHang)
{ {
m_txHang = txHang * 1200U; m_txHang = txHang * 1200U;
} }
#endif

View File

@ -16,11 +16,13 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
#include "Config.h"
#if defined(MODE_M17)
#if !defined(M17TX_H) #if !defined(M17TX_H)
#define M17TX_H #define M17TX_H
#include "Config.h"
#include "RingBuffer.h" #include "RingBuffer.h"
class CM17TX { class CM17TX {
@ -54,3 +56,5 @@ private:
#endif #endif
#endif

125
MMDVM.cpp
View File

@ -41,42 +41,65 @@ bool m_duplex = true;
bool m_tx = false; bool m_tx = false;
bool m_dcd = false; bool m_dcd = false;
CDStarRX dstarRX; #if defined(MODE_DSTAR)
CDStarTX dstarTX; CDStarRX dstarRX;
CDStarTX dstarTX;
CDMRIdleRX dmrIdleRX;
CDMRRX dmrRX;
CDMRTX dmrTX;
CDMRDMORX dmrDMORX;
CDMRDMOTX dmrDMOTX;
CYSFRX ysfRX;
CYSFTX ysfTX;
CP25RX p25RX;
CP25TX p25TX;
CNXDNRX nxdnRX;
CNXDNTX nxdnTX;
CM17RX m17RX;
CM17TX m17TX;
CPOCSAGTX pocsagTX;
CFM fm;
CAX25RX ax25RX;
CAX25TX ax25TX;
CCalDStarRX calDStarRX; CCalDStarRX calDStarRX;
CCalDStarTX calDStarTX; CCalDStarTX calDStarTX;
CCalDMR calDMR; #endif
CCalP25 calP25;
CCalNXDN calNXDN; #if defined(MODE_DMR)
CCalFM calFM; CDMRIdleRX dmrIdleRX;
CCalPOCSAG calPOCSAG; CDMRRX dmrRX;
CCalRSSI calRSSI; CDMRTX dmrTX;
CDMRDMORX dmrDMORX;
CDMRDMOTX dmrDMOTX;
CCalDMR calDMR;
#endif
#if defined(MODE_YSF)
CYSFRX ysfRX;
CYSFTX ysfTX;
#endif
#if defined(MODE_P25)
CP25RX p25RX;
CP25TX p25TX;
CCalP25 calP25;
#endif
#if defined(MODE_NXDN)
CNXDNRX nxdnRX;
CNXDNTX nxdnTX;
CCalNXDN calNXDN;
#endif
#if defined(MODE_M17)
CM17RX m17RX;
CM17TX m17TX;
#endif
#if defined(MODE_POCSAG)
CPOCSAGTX pocsagTX;
CCalPOCSAG calPOCSAG;
#endif
#if defined(MODE_FM)
CFM fm;
CCalFM calFM;
#endif
#if defined(MODE_AX25)
CAX25RX ax25RX;
CAX25TX ax25TX;
#endif
CCalRSSI calRSSI;
CCWIdTX cwIdTX; CCWIdTX cwIdTX;
@ -95,54 +118,84 @@ void loop()
io.process(); io.process();
// The following is for transmitting // The following is for transmitting
#if defined(MODE_DSTAR)
if (m_dstarEnable && m_modemState == STATE_DSTAR) if (m_dstarEnable && m_modemState == STATE_DSTAR)
dstarTX.process(); dstarTX.process();
#endif
#if defined(MODE_DMR)
if (m_dmrEnable && m_modemState == STATE_DMR) { if (m_dmrEnable && m_modemState == STATE_DMR) {
if (m_duplex) if (m_duplex)
dmrTX.process(); dmrTX.process();
else else
dmrDMOTX.process(); dmrDMOTX.process();
} }
#endif
#if defined(MODE_YSF)
if (m_ysfEnable && m_modemState == STATE_YSF) if (m_ysfEnable && m_modemState == STATE_YSF)
ysfTX.process(); ysfTX.process();
#endif
#if defined(MODE_P25)
if (m_p25Enable && m_modemState == STATE_P25) if (m_p25Enable && m_modemState == STATE_P25)
p25TX.process(); p25TX.process();
#endif
#if defined(MODE_NXDN)
if (m_nxdnEnable && m_modemState == STATE_NXDN) if (m_nxdnEnable && m_modemState == STATE_NXDN)
nxdnTX.process(); nxdnTX.process();
#endif
#if defined(MODE_M17)
if (m_m17Enable && m_modemState == STATE_M17) if (m_m17Enable && m_modemState == STATE_M17)
m17TX.process(); m17TX.process();
#endif
#if defined(MODE_POCSAG)
if (m_pocsagEnable && (m_modemState == STATE_POCSAG || pocsagTX.busy())) if (m_pocsagEnable && (m_modemState == STATE_POCSAG || pocsagTX.busy()))
pocsagTX.process(); pocsagTX.process();
#endif
#if defined(MODE_AX25)
if (m_ax25Enable && (m_modemState == STATE_IDLE || m_modemState == STATE_FM)) if (m_ax25Enable && (m_modemState == STATE_IDLE || m_modemState == STATE_FM))
ax25TX.process(); ax25TX.process();
#endif
#if defined(MODE_FM)
if (m_fmEnable && m_modemState == STATE_FM) if (m_fmEnable && m_modemState == STATE_FM)
fm.process(); fm.process();
#endif
#if defined(MODE_DSTAR)
if (m_modemState == STATE_DSTARCAL) if (m_modemState == STATE_DSTARCAL)
calDStarTX.process(); calDStarTX.process();
#endif
#if defined(MODE_DMR)
if (m_modemState == STATE_DMRCAL || m_modemState == STATE_LFCAL || m_modemState == STATE_DMRCAL1K || m_modemState == STATE_DMRDMO1K) if (m_modemState == STATE_DMRCAL || m_modemState == STATE_LFCAL || m_modemState == STATE_DMRCAL1K || m_modemState == STATE_DMRDMO1K)
calDMR.process(); calDMR.process();
#endif
#if defined(MODE_FM)
if (m_modemState == STATE_FMCAL10K || m_modemState == STATE_FMCAL12K || m_modemState == STATE_FMCAL15K || m_modemState == STATE_FMCAL20K || m_modemState == STATE_FMCAL25K || m_modemState == STATE_FMCAL30K)
calFM.process();
#endif
#if defined(MODE_P25)
if (m_modemState == STATE_P25CAL1K) if (m_modemState == STATE_P25CAL1K)
calP25.process(); calP25.process();
#endif
#if defined(MODE_NXDN)
if (m_modemState == STATE_NXDNCAL1K) if (m_modemState == STATE_NXDNCAL1K)
calNXDN.process(); calNXDN.process();
#endif
#if defined(MODE_POCSAG)
if (m_modemState == STATE_POCSAGCAL) if (m_modemState == STATE_POCSAGCAL)
calPOCSAG.process(); calPOCSAG.process();
#endif
if (m_modemState == STATE_FMCAL10K || m_modemState == STATE_FMCAL12K || m_modemState == STATE_FMCAL15K || m_modemState == STATE_FMCAL20K || m_modemState == STATE_FMCAL25K ||m_modemState == STATE_FMCAL30K)
calFM.process();
if (m_modemState == STATE_IDLE) if (m_modemState == STATE_IDLE)
cwIdTX.process(); cwIdTX.process();

120
MMDVM.ino
View File

@ -38,42 +38,65 @@ bool m_duplex = true;
bool m_tx = false; bool m_tx = false;
bool m_dcd = false; bool m_dcd = false;
CDStarRX dstarRX; #if defined(MODE_DSTAR)
CDStarTX dstarTX; CDStarRX dstarRX;
CDStarTX dstarTX;
CDMRIdleRX dmrIdleRX;
CDMRRX dmrRX;
CDMRTX dmrTX;
CDMRDMORX dmrDMORX;
CDMRDMOTX dmrDMOTX;
CYSFRX ysfRX;
CYSFTX ysfTX;
CP25RX p25RX;
CP25TX p25TX;
CNXDNRX nxdnRX;
CNXDNTX nxdnTX;
CM17RX m17RX;
CM17TX m17TX;
CPOCSAGTX pocsagTX;
CFM fm;
CAX25RX ax25RX;
CAX25TX ax25TX;
CCalDStarRX calDStarRX; CCalDStarRX calDStarRX;
CCalDStarTX calDStarTX; CCalDStarTX calDStarTX;
CCalDMR calDMR; #endif
CCalFM calFM;
CCalP25 calP25; #if defined(MODE_DMR)
CCalNXDN calNXDN; CDMRIdleRX dmrIdleRX;
CCalPOCSAG calPOCSAG; CDMRRX dmrRX;
CCalRSSI calRSSI; CDMRTX dmrTX;
CDMRDMORX dmrDMORX;
CDMRDMOTX dmrDMOTX;
CCalDMR calDMR;
#endif
#if defined(MODE_YSF)
CYSFRX ysfRX;
CYSFTX ysfTX;
#endif
#if defined(MODE_P25)
CP25RX p25RX;
CP25TX p25TX;
CCalP25 calP25;
#endif
#if defined(MODE_NXDN)
CNXDNRX nxdnRX;
CNXDNTX nxdnTX;
CCalNXDN calNXDN;
#endif
#if defined(MODE_M17)
CM17RX m17RX;
CM17TX m17TX;
#endif
#if defined(MODE_POCSAG)
CPOCSAGTX pocsagTX;
CCalPOCSAG calPOCSAG;
#endif
#if defined(MODE_FM)
CFM fm;
CCalFM calFM;
#endif
#if defined(MODE_AX25)
CAX25RX ax25RX;
CAX25TX ax25TX;
#endif
CCalRSSI calRSSI;
CCWIdTX cwIdTX; CCWIdTX cwIdTX;
@ -92,55 +115,86 @@ void loop()
io.process(); io.process();
// The following is for transmitting // The following is for transmitting
#if defined(MODE_DSTAR)
if (m_dstarEnable && m_modemState == STATE_DSTAR) if (m_dstarEnable && m_modemState == STATE_DSTAR)
dstarTX.process(); dstarTX.process();
#endif
#if defined(MODE_DMR)
if (m_dmrEnable && m_modemState == STATE_DMR) { if (m_dmrEnable && m_modemState == STATE_DMR) {
if (m_duplex) if (m_duplex)
dmrTX.process(); dmrTX.process();
else else
dmrDMOTX.process(); dmrDMOTX.process();
} }
#endif
#if defined(MODE_YSF)
if (m_ysfEnable && m_modemState == STATE_YSF) if (m_ysfEnable && m_modemState == STATE_YSF)
ysfTX.process(); ysfTX.process();
#endif
#if defined(MODE_P25)
if (m_p25Enable && m_modemState == STATE_P25) if (m_p25Enable && m_modemState == STATE_P25)
p25TX.process(); p25TX.process();
#endif
#if defined(MODE_NXDN)
if (m_nxdnEnable && m_modemState == STATE_NXDN) if (m_nxdnEnable && m_modemState == STATE_NXDN)
nxdnTX.process(); nxdnTX.process();
#endif
#if defined(MODE_M17)
if (m_m17Enable && m_modemState == STATE_M17) if (m_m17Enable && m_modemState == STATE_M17)
m17TX.process(); m17TX.process();
#endif
#if defined(MODE_POCSAG)
if (m_pocsagEnable && (m_modemState == STATE_POCSAG || pocsagTX.busy())) if (m_pocsagEnable && (m_modemState == STATE_POCSAG || pocsagTX.busy()))
pocsagTX.process(); pocsagTX.process();
#endif
#if defined(MODE_AX25)
if (m_ax25Enable && (m_modemState == STATE_IDLE || m_modemState == STATE_FM)) if (m_ax25Enable && (m_modemState == STATE_IDLE || m_modemState == STATE_FM))
ax25TX.process(); ax25TX.process();
#endif
#if defined(MODE_FM)
if (m_fmEnable && m_modemState == STATE_FM) if (m_fmEnable && m_modemState == STATE_FM)
fm.process(); fm.process();
#endif
#if defined(MODE_DSTAR)
if (m_modemState == STATE_DSTARCAL) if (m_modemState == STATE_DSTARCAL)
calDStarTX.process(); calDStarTX.process();
#endif
#if defined(MODE_DMR)
if (m_modemState == STATE_DMRCAL || m_modemState == STATE_LFCAL || m_modemState == STATE_DMRCAL1K || m_modemState == STATE_DMRDMO1K) if (m_modemState == STATE_DMRCAL || m_modemState == STATE_LFCAL || m_modemState == STATE_DMRCAL1K || m_modemState == STATE_DMRDMO1K)
calDMR.process(); calDMR.process();
#endif
#if defined(MODE_FM)
if (m_modemState == STATE_FMCAL10K || m_modemState == STATE_FMCAL12K || m_modemState == STATE_FMCAL15K || m_modemState == STATE_FMCAL20K || m_modemState == STATE_FMCAL25K || m_modemState == STATE_FMCAL30K) if (m_modemState == STATE_FMCAL10K || m_modemState == STATE_FMCAL12K || m_modemState == STATE_FMCAL15K || m_modemState == STATE_FMCAL20K || m_modemState == STATE_FMCAL25K || m_modemState == STATE_FMCAL30K)
calFM.process(); calFM.process();
#endif
#if defined(MODE_P25)
if (m_modemState == STATE_P25CAL1K) if (m_modemState == STATE_P25CAL1K)
calP25.process(); calP25.process();
#endif
#if defined(MODE_NXDN)
if (m_modemState == STATE_NXDNCAL1K) if (m_modemState == STATE_NXDNCAL1K)
calNXDN.process(); calNXDN.process();
#endif
#if defined(MODE_POCSAG)
if (m_modemState == STATE_POCSAGCAL) if (m_modemState == STATE_POCSAGCAL)
calPOCSAG.process(); calPOCSAG.process();
#endif
if (m_modemState == STATE_IDLE) if (m_modemState == STATE_IDLE)
cwIdTX.process(); cwIdTX.process();
} }

View File

@ -17,6 +17,9 @@
*/ */
#include "Config.h" #include "Config.h"
#if defined(MODE_POCSAG)
#include "Globals.h" #include "Globals.h"
#include "POCSAGTX.h" #include "POCSAGTX.h"
@ -147,3 +150,6 @@ uint8_t CPOCSAGTX::getSpace() const
{ {
return m_buffer.getSpace() / POCSAG_FRAME_LENGTH_BYTES; return m_buffer.getSpace() / POCSAG_FRAME_LENGTH_BYTES;
} }
#endif

View File

@ -16,11 +16,13 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
#include "Config.h"
#if defined(MODE_POCSAG)
#if !defined(POCSAGTX_H) #if !defined(POCSAGTX_H)
#define POCSAGTX_H #define POCSAGTX_H
#include "Config.h"
#include "RingBuffer.h" #include "RingBuffer.h"
class CPOCSAGTX { class CPOCSAGTX {
@ -51,3 +53,5 @@ private:
#endif #endif
#endif

View File

@ -195,10 +195,14 @@ void CSerialPort::getStatus()
reply[4U] |= m_dcd ? 0x40U : 0x00U; reply[4U] |= m_dcd ? 0x40U : 0x00U;
#if defined(MODE_DSTAR)
if (m_dstarEnable) if (m_dstarEnable)
reply[5U] = dstarTX.getSpace(); reply[5U] = dstarTX.getSpace();
else else
reply[5U] = 0U; reply[5U] = 0U;
#else
reply[5U] = 0U;
#endif
if (m_dmrEnable) { if (m_dmrEnable) {
if (m_duplex) { if (m_duplex) {
@ -213,10 +217,14 @@ void CSerialPort::getStatus()
reply[7U] = 0U; reply[7U] = 0U;
} }
#if defined(MODE_YSF)
if (m_ysfEnable) if (m_ysfEnable)
reply[8U] = ysfTX.getSpace(); reply[8U] = ysfTX.getSpace();
else else
reply[8U] = 0U; reply[8U] = 0U;
#else
reply[8U] = 0U;
#endif
if (m_p25Enable) if (m_p25Enable)
reply[9U] = p25TX.getSpace(); reply[9U] = p25TX.getSpace();
@ -228,15 +236,23 @@ void CSerialPort::getStatus()
else else
reply[10U] = 0U; reply[10U] = 0U;
#if defined(MODE_M17)
if (m_m17Enable) if (m_m17Enable)
reply[11U] = m17TX.getSpace(); reply[11U] = m17TX.getSpace();
else else
reply[11U] = 0U; reply[11U] = 0U;
#else
reply[11U] = 0U;
#endif
#if defined(MODE_POCSAG)
if (m_pocsagEnable) if (m_pocsagEnable)
reply[12U] = pocsagTX.getSpace(); reply[12U] = pocsagTX.getSpace();
else else
reply[12U] = 0U; reply[12U] = 0U;
#else
reply[12U] = 0U;
#endif
if (m_fmEnable) if (m_fmEnable)
reply[13U] = fm.getSpace(); reply[13U] = fm.getSpace();
@ -368,13 +384,21 @@ uint8_t CSerialPort::setConfig(const uint8_t* data, uint16_t length)
m_ax25Enable = ax25Enable; m_ax25Enable = ax25Enable;
m_duplex = !simplex; m_duplex = !simplex;
#if defined(MODE_DSTAR)
dstarTX.setTXDelay(txDelay); dstarTX.setTXDelay(txDelay);
#endif
#if defined(MODE_YSF)
ysfTX.setTXDelay(txDelay); ysfTX.setTXDelay(txDelay);
#endif
p25TX.setTXDelay(txDelay); p25TX.setTXDelay(txDelay);
dmrDMOTX.setTXDelay(txDelay); dmrDMOTX.setTXDelay(txDelay);
nxdnTX.setTXDelay(txDelay); nxdnTX.setTXDelay(txDelay);
#if defined(MODE_M17)
m17TX.setTXDelay(txDelay); m17TX.setTXDelay(txDelay);
#endif
#if defined(MODE_POCSAG)
pocsagTX.setTXDelay(txDelay); pocsagTX.setTXDelay(txDelay);
#endif
ax25TX.setTXDelay(ax25TXDelay); ax25TX.setTXDelay(ax25TXDelay);
dmrTX.setColorCode(colorCode); dmrTX.setColorCode(colorCode);
@ -383,10 +407,14 @@ uint8_t CSerialPort::setConfig(const uint8_t* data, uint16_t length)
dmrDMORX.setColorCode(colorCode); dmrDMORX.setColorCode(colorCode);
dmrIdleRX.setColorCode(colorCode); dmrIdleRX.setColorCode(colorCode);
#if defined(MODE_YSF)
ysfTX.setParams(ysfLoDev, ysfTXHang); ysfTX.setParams(ysfLoDev, ysfTXHang);
#endif
p25TX.setParams(p25TXHang); p25TX.setParams(p25TXHang);
nxdnTX.setParams(nxdnTXHang); nxdnTX.setParams(nxdnTXHang);
#if defined(MODE_M17)
m17TX.setParams(m17TXHang); m17TX.setParams(m17TXHang);
#endif
ax25RX.setParams(ax25RXTwist, ax25SlotTime, ax25PPersist); ax25RX.setParams(ax25RXTwist, ax25SlotTime, ax25PPersist);
io.setParameters(rxInvert, txInvert, pttInvert, rxLevel, cwIdTXLevel, dstarTXLevel, dmrTXLevel, ysfTXLevel, p25TXLevel, nxdnTXLevel, m17TXLevel, pocsagTXLevel, fmTXLevel, ax25TXLevel, txDCOffset, rxDCOffset, useCOSAsLockout); io.setParameters(rxInvert, txInvert, pttInvert, rxLevel, cwIdTXLevel, dstarTXLevel, dmrTXLevel, ysfTXLevel, p25TXLevel, nxdnTXLevel, m17TXLevel, pocsagTXLevel, fmTXLevel, ax25TXLevel, txDCOffset, rxDCOffset, useCOSAsLockout);
@ -396,6 +424,7 @@ uint8_t CSerialPort::setConfig(const uint8_t* data, uint16_t length)
return 0U; return 0U;
} }
#if defined(MODE_AX25)
uint8_t CSerialPort::setFMParams1(const uint8_t* data, uint16_t length) uint8_t CSerialPort::setFMParams1(const uint8_t* data, uint16_t length)
{ {
if (length < 8U) if (length < 8U)
@ -489,6 +518,7 @@ uint8_t CSerialPort::setFMParams4(const uint8_t* data, uint16_t length)
return fm.setExt(ack, audioBoost, speed, frequency, level); return fm.setExt(ack, audioBoost, speed, frequency, level);
} }
#endif
uint8_t CSerialPort::setMode(const uint8_t* data, uint16_t length) uint8_t CSerialPort::setMode(const uint8_t* data, uint16_t length)
{ {
@ -598,8 +628,10 @@ void CSerialPort::setMode(MMDVM_STATE modemState)
break; break;
} }
#if defined(MODE_DSTAR)
if (modemState != STATE_DSTAR) if (modemState != STATE_DSTAR)
dstarRX.reset(); dstarRX.reset();
#endif
if (modemState != STATE_DMR) { if (modemState != STATE_DMR) {
dmrIdleRX.reset(); dmrIdleRX.reset();
@ -607,8 +639,10 @@ void CSerialPort::setMode(MMDVM_STATE modemState)
dmrRX.reset(); dmrRX.reset();
} }
#if defined(MODE_YSF)
if (modemState != STATE_YSF) if (modemState != STATE_YSF)
ysfRX.reset(); ysfRX.reset();
#endif
if (modemState != STATE_P25) if (modemState != STATE_P25)
p25RX.reset(); p25RX.reset();
@ -616,8 +650,10 @@ void CSerialPort::setMode(MMDVM_STATE modemState)
if (modemState != STATE_NXDN) if (modemState != STATE_NXDN)
nxdnRX.reset(); nxdnRX.reset();
#if defined(MODE_M17)
if (modemState != STATE_M17) if (modemState != STATE_M17)
m17RX.reset(); m17RX.reset();
#endif
if (modemState != STATE_FM) if (modemState != STATE_FM)
fm.reset(); fm.reset();
@ -739,6 +775,7 @@ void CSerialPort::processMessage(const uint8_t* buffer, uint16_t length)
sendACK(); sendACK();
break; break;
#if defined(MODE_FM)
case MMDVM_FM_PARAMS1: case MMDVM_FM_PARAMS1:
err = setFMParams1(buffer, length); err = setFMParams1(buffer, length);
if (err == 0U) { if (err == 0U) {
@ -778,10 +815,13 @@ void CSerialPort::processMessage(const uint8_t* buffer, uint16_t length)
sendNAK(err); sendNAK(err);
} }
break; break;
#endif
case MMDVM_CAL_DATA: case MMDVM_CAL_DATA:
#if defined(MODE_DSTAR)
if (m_modemState == STATE_DSTARCAL) if (m_modemState == STATE_DSTARCAL)
err = calDStarTX.write(buffer, length); err = calDStarTX.write(buffer, length);
#endif
if (m_modemState == STATE_DMRCAL || m_modemState == STATE_LFCAL || m_modemState == STATE_DMRCAL1K || m_modemState == STATE_DMRDMO1K) if (m_modemState == STATE_DMRCAL || m_modemState == STATE_LFCAL || m_modemState == STATE_DMRCAL1K || m_modemState == STATE_DMRDMO1K)
err = calDMR.write(buffer, length); err = calDMR.write(buffer, length);
if (m_modemState == STATE_FMCAL10K || m_modemState == STATE_FMCAL12K || m_modemState == STATE_FMCAL15K || m_modemState == STATE_FMCAL20K || m_modemState == STATE_FMCAL25K || m_modemState == STATE_FMCAL30K) if (m_modemState == STATE_FMCAL10K || m_modemState == STATE_FMCAL12K || m_modemState == STATE_FMCAL15K || m_modemState == STATE_FMCAL20K || m_modemState == STATE_FMCAL25K || m_modemState == STATE_FMCAL30K)
@ -790,8 +830,10 @@ void CSerialPort::processMessage(const uint8_t* buffer, uint16_t length)
err = calP25.write(buffer, length); err = calP25.write(buffer, length);
if (m_modemState == STATE_NXDNCAL1K) if (m_modemState == STATE_NXDNCAL1K)
err = calNXDN.write(buffer, length); err = calNXDN.write(buffer, length);
#if defined(MODE_POCSAG)
if (m_modemState == STATE_POCSAGCAL) if (m_modemState == STATE_POCSAGCAL)
err = calPOCSAG.write(buffer, length); err = calPOCSAG.write(buffer, length);
#endif
if (err == 0U) { if (err == 0U) {
sendACK(); sendACK();
} else { } else {
@ -810,6 +852,7 @@ void CSerialPort::processMessage(const uint8_t* buffer, uint16_t length)
} }
break; break;
#if defined(MODE_DSTAR)
case MMDVM_DSTAR_HEADER: case MMDVM_DSTAR_HEADER:
if (m_dstarEnable) { if (m_dstarEnable) {
if (m_modemState == STATE_IDLE || m_modemState == STATE_DSTAR) if (m_modemState == STATE_IDLE || m_modemState == STATE_DSTAR)
@ -851,6 +894,7 @@ void CSerialPort::processMessage(const uint8_t* buffer, uint16_t length)
sendNAK(err); sendNAK(err);
} }
break; break;
#endif
case MMDVM_DMR_DATA1: case MMDVM_DMR_DATA1:
if (m_dmrEnable) { if (m_dmrEnable) {
@ -925,6 +969,7 @@ void CSerialPort::processMessage(const uint8_t* buffer, uint16_t length)
} }
break; break;
#if defined(MODE_YSF)
case MMDVM_YSF_DATA: case MMDVM_YSF_DATA:
if (m_ysfEnable) { if (m_ysfEnable) {
if (m_modemState == STATE_IDLE || m_modemState == STATE_YSF) if (m_modemState == STATE_IDLE || m_modemState == STATE_YSF)
@ -938,6 +983,7 @@ void CSerialPort::processMessage(const uint8_t* buffer, uint16_t length)
sendNAK(err); sendNAK(err);
} }
break; break;
#endif
case MMDVM_P25_HDR: case MMDVM_P25_HDR:
if (m_p25Enable) { if (m_p25Enable) {
@ -981,6 +1027,7 @@ void CSerialPort::processMessage(const uint8_t* buffer, uint16_t length)
} }
break; break;
#if defined(MODE_M17)
case MMDVM_M17_DATA: case MMDVM_M17_DATA:
if (m_m17Enable) { if (m_m17Enable) {
if (m_modemState == STATE_IDLE || m_modemState == STATE_M17) if (m_modemState == STATE_IDLE || m_modemState == STATE_M17)
@ -994,7 +1041,9 @@ void CSerialPort::processMessage(const uint8_t* buffer, uint16_t length)
sendNAK(err); sendNAK(err);
} }
break; break;
#endif
#if defined(MODE_POCSAG)
case MMDVM_POCSAG_DATA: case MMDVM_POCSAG_DATA:
if (m_pocsagEnable) { if (m_pocsagEnable) {
if (m_modemState == STATE_IDLE || m_modemState == STATE_POCSAG) if (m_modemState == STATE_IDLE || m_modemState == STATE_POCSAG)
@ -1008,6 +1057,7 @@ void CSerialPort::processMessage(const uint8_t* buffer, uint16_t length)
sendNAK(err); sendNAK(err);
} }
break; break;
#endif
case MMDVM_FM_DATA: case MMDVM_FM_DATA:
if (m_fmEnable) { if (m_fmEnable) {
@ -1057,6 +1107,7 @@ void CSerialPort::processMessage(const uint8_t* buffer, uint16_t length)
m_len = 0U; m_len = 0U;
} }
#if defined(MODE_DSTAR)
void CSerialPort::writeDStarHeader(const uint8_t* header, uint8_t length) void CSerialPort::writeDStarHeader(const uint8_t* header, uint8_t length)
{ {
if (m_modemState != STATE_DSTAR && m_modemState != STATE_IDLE) if (m_modemState != STATE_DSTAR && m_modemState != STATE_IDLE)
@ -1135,6 +1186,7 @@ void CSerialPort::writeDStarEOT()
writeInt(1U, reply, 3); writeInt(1U, reply, 3);
} }
#endif
void CSerialPort::writeDMRData(bool slot, const uint8_t* data, uint8_t length) void CSerialPort::writeDMRData(bool slot, const uint8_t* data, uint8_t length)
{ {
@ -1176,6 +1228,7 @@ void CSerialPort::writeDMRLost(bool slot)
writeInt(1U, reply, 3); writeInt(1U, reply, 3);
} }
#if defined(MODE_YSF)
void CSerialPort::writeYSFData(const uint8_t* data, uint8_t length) void CSerialPort::writeYSFData(const uint8_t* data, uint8_t length)
{ {
if (m_modemState != STATE_YSF && m_modemState != STATE_IDLE) if (m_modemState != STATE_YSF && m_modemState != STATE_IDLE)
@ -1215,6 +1268,7 @@ void CSerialPort::writeYSFLost()
writeInt(1U, reply, 3); writeInt(1U, reply, 3);
} }
#endif
void CSerialPort::writeP25Hdr(const uint8_t* data, uint8_t length) void CSerialPort::writeP25Hdr(const uint8_t* data, uint8_t length)
{ {
@ -1319,6 +1373,7 @@ void CSerialPort::writeNXDNLost()
writeInt(1U, reply, 3); writeInt(1U, reply, 3);
} }
#if defined(MODE_M17)
void CSerialPort::writeM17Data(const uint8_t* data, uint8_t length) void CSerialPort::writeM17Data(const uint8_t* data, uint8_t length)
{ {
if (m_modemState != STATE_M17 && m_modemState != STATE_IDLE) if (m_modemState != STATE_M17 && m_modemState != STATE_IDLE)
@ -1358,6 +1413,7 @@ void CSerialPort::writeM17Lost()
writeInt(1U, reply, 3); writeInt(1U, reply, 3);
} }
#endif
void CSerialPort::writeFMData(const uint8_t* data, uint16_t length) void CSerialPort::writeFMData(const uint8_t* data, uint16_t length)
{ {

View File

@ -36,32 +36,48 @@ public:
void process(); void process();
#if defined(MODE_DSTAR)
void writeDStarHeader(const uint8_t* header, uint8_t length); void writeDStarHeader(const uint8_t* header, uint8_t length);
void writeDStarData(const uint8_t* data, uint8_t length); void writeDStarData(const uint8_t* data, uint8_t length);
void writeDStarLost(); void writeDStarLost();
void writeDStarEOT(); void writeDStarEOT();
#endif
#if defined(MODE_DMR)
void writeDMRData(bool slot, const uint8_t* data, uint8_t length); void writeDMRData(bool slot, const uint8_t* data, uint8_t length);
void writeDMRLost(bool slot); void writeDMRLost(bool slot);
#endif
#if defined(MODE_YSF)
void writeYSFData(const uint8_t* data, uint8_t length); void writeYSFData(const uint8_t* data, uint8_t length);
void writeYSFLost(); void writeYSFLost();
#endif
#if defined(MODE_P25)
void writeP25Hdr(const uint8_t* data, uint8_t length); void writeP25Hdr(const uint8_t* data, uint8_t length);
void writeP25Ldu(const uint8_t* data, uint8_t length); void writeP25Ldu(const uint8_t* data, uint8_t length);
void writeP25Lost(); void writeP25Lost();
#endif
#if defined(MODE_NXDN)
void writeNXDNData(const uint8_t* data, uint8_t length); void writeNXDNData(const uint8_t* data, uint8_t length);
void writeNXDNLost(); void writeNXDNLost();
#endif
#if defined(MODE_M17)
void writeM17Data(const uint8_t* data, uint8_t length); void writeM17Data(const uint8_t* data, uint8_t length);
void writeM17Lost(); void writeM17Lost();
#endif
#if defined(MODE_AX25)
void writeAX25Data(const uint8_t* data, uint16_t length); void writeAX25Data(const uint8_t* data, uint16_t length);
#endif
#if defined(MODE_FM)
void writeFMData(const uint8_t* data, uint16_t length); void writeFMData(const uint8_t* data, uint16_t length);
void writeFMStatus(uint8_t status); void writeFMStatus(uint8_t status);
void writeFMEOT(); void writeFMEOT();
#endif
void writeCalData(const uint8_t* data, uint8_t length); void writeCalData(const uint8_t* data, uint8_t length);
void writeRSSIData(const uint8_t* data, uint8_t length); void writeRSSIData(const uint8_t* data, uint8_t length);
@ -86,11 +102,14 @@ private:
uint8_t setConfig(const uint8_t* data, uint16_t length); uint8_t setConfig(const uint8_t* data, uint16_t length);
uint8_t setMode(const uint8_t* data, uint16_t length); uint8_t setMode(const uint8_t* data, uint16_t length);
void setMode(MMDVM_STATE modemState); void setMode(MMDVM_STATE modemState);
void processMessage(const uint8_t* data, uint16_t length);
#if defined(MODE_FM)
uint8_t setFMParams1(const uint8_t* data, uint16_t length); uint8_t setFMParams1(const uint8_t* data, uint16_t length);
uint8_t setFMParams2(const uint8_t* data, uint16_t length); uint8_t setFMParams2(const uint8_t* data, uint16_t length);
uint8_t setFMParams3(const uint8_t* data, uint16_t length); uint8_t setFMParams3(const uint8_t* data, uint16_t length);
uint8_t setFMParams4(const uint8_t* data, uint16_t length); uint8_t setFMParams4(const uint8_t* data, uint16_t length);
void processMessage(const uint8_t* data, uint16_t length); #endif
// Hardware versions // Hardware versions
void beginInt(uint8_t n, int speed); void beginInt(uint8_t n, int speed);

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2009-2017 by Jonathan Naylor G4KLX * Copyright (C) 2009-2017,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
@ -17,6 +17,9 @@
*/ */
#include "Config.h" #include "Config.h"
#if defined(MODE_YSF)
#include "Globals.h" #include "Globals.h"
#include "YSFRX.h" #include "YSFRX.h"
#include "Utils.h" #include "Utils.h"
@ -402,3 +405,6 @@ void CYSFRX::writeRSSIData(uint8_t* data)
m_rssiAccum = 0U; m_rssiAccum = 0U;
m_rssiCount = 0U; m_rssiCount = 0U;
} }
#endif

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2015,2016,2017 by Jonathan Naylor G4KLX * Copyright (C) 2015,2016,2017,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
@ -16,10 +16,13 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
#include "Config.h"
#if defined(MODE_YSF)
#if !defined(YSFRX_H) #if !defined(YSFRX_H)
#define YSFRX_H #define YSFRX_H
#include "Config.h"
#include "YSFDefines.h" #include "YSFDefines.h"
enum YSFRX_STATE { enum YSFRX_STATE {
@ -67,3 +70,5 @@ private:
#endif #endif
#endif

View File

@ -18,6 +18,9 @@
*/ */
#include "Config.h" #include "Config.h"
#if defined(MODE_YSF)
#include "Globals.h" #include "Globals.h"
#include "YSFTX.h" #include "YSFTX.h"
@ -189,3 +192,6 @@ void CYSFTX::setParams(bool on, uint8_t txHang)
m_loDev = on; m_loDev = on;
m_txHang = txHang * 1200U; m_txHang = txHang * 1200U;
} }
#endif

View File

@ -16,11 +16,13 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
#include "Config.h"
#if defined(MODE_YSF)
#if !defined(YSFTX_H) #if !defined(YSFTX_H)
#define YSFTX_H #define YSFTX_H
#include "Config.h"
#include "RingBuffer.h" #include "RingBuffer.h"
class CYSFTX { class CYSFTX {
@ -55,3 +57,5 @@ private:
#endif #endif
#endif