diff --git a/CalDStarRX.cpp b/CalDStarRX.cpp index 32b6345..895dbf6 100644 --- a/CalDStarRX.cpp +++ b/CalDStarRX.cpp @@ -17,6 +17,9 @@ */ #include "Config.h" + +#if defined(MODE_DSTAR) + #include "Globals.h" #include "CalDStarRX.h" #include "Utils.h" @@ -126,3 +129,5 @@ void CCalDStarRX::process(q15_t value) } } +#endif + diff --git a/CalDStarRX.h b/CalDStarRX.h index 9b2c067..ddaebee 100644 --- a/CalDStarRX.h +++ b/CalDStarRX.h @@ -16,10 +16,13 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include "Config.h" + +#if defined(MODE_DSTAR) + #if !defined(CALDSTARRX_H) #define CALDSTARRX_H -#include "Config.h" #include "DStarDefines.h" class CCalDStarRX { @@ -40,3 +43,5 @@ private: #endif +#endif + diff --git a/CalDStarTX.cpp b/CalDStarTX.cpp index 9680cdc..bb252e5 100644 --- a/CalDStarTX.cpp +++ b/CalDStarTX.cpp @@ -17,6 +17,9 @@ */ #include "Config.h" + +#if defined(MODE_DSTAR) + #include "Globals.h" #include "CalDStarTX.h" @@ -181,3 +184,5 @@ uint8_t CCalDStarTX::write(const uint8_t* data, uint16_t length) return 0U; } +#endif + diff --git a/CalDStarTX.h b/CalDStarTX.h index 86f6625..2e556fb 100644 --- a/CalDStarTX.h +++ b/CalDStarTX.h @@ -16,10 +16,13 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include "Config.h" + +#if defined(MODE_DSTAR) + #if !defined(CALDSTARTX_H) #define CALDSTARTX_H -#include "Config.h" #include "DStarDefines.h" class CCalDStarTX { @@ -37,3 +40,5 @@ private: #endif +#endif + diff --git a/CalPOCSAG.cpp b/CalPOCSAG.cpp index b66eb69..c9600dc 100644 --- a/CalPOCSAG.cpp +++ b/CalPOCSAG.cpp @@ -18,10 +18,12 @@ */ #include "Config.h" + +#if defined(MODE_POCSAG) + #include "Globals.h" #include "CalPOCSAG.h" - CCalPOCSAG::CCalPOCSAG() : m_state(POCSAGCAL_IDLE) { @@ -48,3 +50,6 @@ uint8_t CCalPOCSAG::write(const uint8_t* data, uint16_t length) return 0U; } + +#endif + diff --git a/CalPOCSAG.h b/CalPOCSAG.h index d49eb81..2e4c9d4 100644 --- a/CalPOCSAG.h +++ b/CalPOCSAG.h @@ -17,11 +17,13 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include "Config.h" + +#if defined(MODE_POCSAG) + #if !defined(CALPOCSAG_H) #define CALPOCSAG_H -#include "Config.h" - enum POCSAGCAL { POCSAGCAL_IDLE, POCSAGCAL_TX @@ -40,3 +42,6 @@ private: }; #endif + +#endif + diff --git a/Config.h b/Config.h index 32b07c5..8bf2f35 100644 --- a/Config.h +++ b/Config.h @@ -19,6 +19,39 @@ #if !defined(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 // The number is the frequency of the oscillator in Hertz. // @@ -44,7 +77,7 @@ // #define USE_COS_AS_LOCKOUT // Use pins to output the current mode via LEDs -#define MODE_LEDS +// #define MODE_LEDS // For the original Arduino Due pin layout // #define ARDUINO_DUE_PAPA diff --git a/DStarRX.cpp b/DStarRX.cpp index f14f3fd..a4a3e1d 100644 --- a/DStarRX.cpp +++ b/DStarRX.cpp @@ -18,6 +18,9 @@ */ #include "Config.h" + +#if defined(MODE_DSTAR) + #include "Globals.h" #include "DStarRX.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]; } + +#endif + diff --git a/DStarRX.h b/DStarRX.h index d636cde..3088b6d 100644 --- a/DStarRX.h +++ b/DStarRX.h @@ -16,10 +16,13 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include "Config.h" + +#if defined(MODE_DSTAR) + #if !defined(DSTARRX_H) #define DSTARRX_H -#include "Config.h" #include "DStarDefines.h" enum DSRX_STATE { @@ -68,3 +71,5 @@ private: #endif +#endif + diff --git a/DStarTX.cpp b/DStarTX.cpp index e88b27e..cbd4c52 100644 --- a/DStarTX.cpp +++ b/DStarTX.cpp @@ -18,6 +18,9 @@ */ #include "Config.h" + +#if defined(MODE_DSTAR) + #include "Globals.h" #include "DStarTX.h" @@ -446,3 +449,5 @@ uint8_t CDStarTX::getSpace() const return m_buffer.getSpace() / (DSTAR_DATA_LENGTH_BYTES + 1U); } +#endif + diff --git a/DStarTX.h b/DStarTX.h index 0a82846..c214846 100644 --- a/DStarTX.h +++ b/DStarTX.h @@ -16,11 +16,13 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include "Config.h" + +#if defined(MODE_DSTAR) + #if !defined(DSTARTX_H) #define DSTARTX_H -#include "Config.h" - #include "RingBuffer.h" class CDStarTX { @@ -52,3 +54,5 @@ private: #endif +#endif + diff --git a/Globals.h b/Globals.h index 3b003e6..797b817 100644 --- a/Globals.h +++ b/Globals.h @@ -142,9 +142,15 @@ extern bool m_dcd; extern CSerialPort serial; extern CIO io; +#if defined(MODE_DSTAR) extern CDStarRX dstarRX; extern CDStarTX dstarTX; +extern CCalDStarRX calDStarRX; +extern CCalDStarTX calDStarTX; +#endif + +#if defined(MODE_DMR) extern CDMRIdleRX dmrIdleRX; extern CDMRRX dmrRX; extern CDMRTX dmrTX; @@ -152,33 +158,49 @@ extern CDMRTX dmrTX; extern CDMRDMORX dmrDMORX; extern CDMRDMOTX dmrDMOTX; +extern CCalDMR calDMR; +#endif + +#if defined(MODE_YSF) extern CYSFRX ysfRX; extern CYSFTX ysfTX; +#endif +#if defined(MODE_P25) extern CP25RX p25RX; extern CP25TX p25TX; +extern CCalP25 calP25; +#endif + +#if defined(MODE_NXDN) extern CNXDNRX nxdnRX; 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 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 CAX25TX ax25TX; +#endif -extern CCalDStarRX calDStarRX; -extern CCalDStarTX calDStarTX; -extern CCalDMR calDMR; -extern CCalFM calFM; -extern CCalP25 calP25; -extern CCalNXDN calNXDN; -extern CCalPOCSAG calPOCSAG; -extern CCalRSSI calRSSI; +extern CCalRSSI calRSSI; extern CCWIdTX cwIdTX; diff --git a/IO.cpp b/IO.cpp index 1ca14ca..70dc72b 100644 --- a/IO.cpp +++ b/IO.cpp @@ -26,17 +26,21 @@ 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 +#if defined(MODE_DMR) || defined(MODE_YSF) // 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, 11237, 14331, 15464, 14331, 11237, 6995, 2667, -770, -2706, -3040, -2144, -675, 683, 1450, 1472, 909, 112, -553, -847, -731, -340, 104, 401, 0}; const uint16_t RRC_0_2_FILTER_LEN = 42U; +#endif +#if defined(MODE_M17) // 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, 15109, 16656, 15109, 11033, 5872, 1284, -1556, -2363, -1691, -498, 390, 623, 334, -79, -285, -197, 46, 223, 220, 72, -88, -147, 0}; const uint16_t RRC_0_5_FILTER_LEN = 42U; +#endif // 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, @@ -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}; const uint16_t NXDN_ISINC_FILTER_LEN = 32U; +#if defined(MODE_DSTAR) // 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}; const uint16_t GAUSSIAN_0_5_FILTER_LEN = 12U; +#endif // One symbol boxcar filter 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_dcFilter(), m_dcState(), -m_rrc02Filter(), -m_rrc05Filter(), +#if defined(MODE_DSTAR) m_gaussianFilter(), +m_gaussianState(), +#endif m_boxcarFilter(), m_nxdnFilter(), m_nxdnISincFilter(), +#if defined(MODE_DMR) || defined(MODE_YSF) +m_rrc02Filter(), m_rrc02State(), +#endif +#if defined(MODE_M17) +m_rrc05Filter(), m_rrc05State(), -m_gaussianState(), +#endif m_boxcarState(), m_nxdnState(), m_nxdnISincState(), @@ -102,9 +114,13 @@ m_dacOverflow(0U), m_watchdog(0U), m_lockout(false) { - ::memset(m_rrc02State, 0x00U, 70U * sizeof(q15_t)); - ::memset(m_rrc05State, 0x00U, 70U * sizeof(q15_t)); - ::memset(m_gaussianState, 0x00U, 40U * sizeof(q15_t)); +#if defined(MODE_DSTAR) + ::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_nxdnState, 0x00U, 110U * 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.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.pState = m_rrc02State; 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.pState = m_rrc05State; m_rrc05Filter.pCoeffs = RRC_0_5_FILTER; - - m_gaussianFilter.numTaps = GAUSSIAN_0_5_FILTER_LEN; - m_gaussianFilter.pState = m_gaussianState; - m_gaussianFilter.pCoeffs = GAUSSIAN_0_5_FILTER; +#endif m_boxcarFilter.numTaps = BOXCAR_FILTER_LEN; m_boxcarFilter.pState = m_boxcarState; @@ -353,6 +371,7 @@ void CIO::process() #endif if (m_modemState == STATE_IDLE) { +#if defined(MODE_DSTAR) if (m_dstarEnable) { q15_t GMSKVals[RX_BLOCK_SIZE]; #if defined(USE_DCBLOCKER) @@ -362,6 +381,7 @@ void CIO::process() #endif dstarRX.samples(GMSKVals, rssi, RX_BLOCK_SIZE); } +#endif if (m_p25Enable) { q15_t P25Vals[RX_BLOCK_SIZE]; @@ -396,6 +416,7 @@ void CIO::process() dmrDMORX.samples(DMRVals, rssi, RX_BLOCK_SIZE); } +#if defined(MODE_YSF) if (m_ysfEnable) { q15_t YSFVals[RX_BLOCK_SIZE]; #if defined(USE_DCBLOCKER) @@ -405,7 +426,9 @@ void CIO::process() #endif ysfRX.samples(YSFVals, rssi, RX_BLOCK_SIZE); } +#endif +#if defined(MODE_M17) if (m_m17Enable) { q15_t RRCVals[RX_BLOCK_SIZE]; #if defined(USE_DCBLOCKER) @@ -415,6 +438,7 @@ void CIO::process() #endif m17RX.samples(RRCVals, rssi, RX_BLOCK_SIZE); } +#endif if (m_fmEnable) { bool cos = getCOSInt(); @@ -432,7 +456,10 @@ void CIO::process() ax25RX.samples(samples, RX_BLOCK_SIZE); #endif } - } else if (m_modemState == STATE_DSTAR) { + } + +#if defined(MODE_DSTAR) + else if (m_modemState == STATE_DSTAR) { if (m_dstarEnable) { q15_t GMSKVals[RX_BLOCK_SIZE]; #if defined(USE_DCBLOCKER) @@ -442,7 +469,10 @@ void CIO::process() #endif dstarRX.samples(GMSKVals, rssi, RX_BLOCK_SIZE); } - } else if (m_modemState == STATE_DMR) { + } +#endif + + else if (m_modemState == STATE_DMR) { if (m_dmrEnable) { q15_t 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); } } - } else if (m_modemState == STATE_YSF) { + } + +#if defined(MODE_YSF) + else if (m_modemState == STATE_YSF) { if (m_ysfEnable) { q15_t YSFVals[RX_BLOCK_SIZE]; #if defined(USE_DCBLOCKER) @@ -467,7 +500,10 @@ void CIO::process() #endif ysfRX.samples(YSFVals, rssi, RX_BLOCK_SIZE); } - } else if (m_modemState == STATE_P25) { + } +#endif + + else if (m_modemState == STATE_P25) { if (m_p25Enable) { q15_t P25Vals[RX_BLOCK_SIZE]; #if defined(USE_DCBLOCKER) @@ -490,7 +526,10 @@ void CIO::process() 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) { q15_t M17Vals[RX_BLOCK_SIZE]; #if defined(USE_DCBLOCKER) @@ -500,7 +539,10 @@ void CIO::process() #endif m17RX.samples(M17Vals, rssi, RX_BLOCK_SIZE); } - } else if (m_modemState == STATE_FM) { + } +#endif + + else if (m_modemState == STATE_FM) { bool cos = getCOSInt(); #if defined(USE_DCBLOCKER) fm.samples(cos, dcSamples, RX_BLOCK_SIZE); @@ -511,12 +553,18 @@ void CIO::process() if (m_ax25Enable) ax25RX.samples(samples, RX_BLOCK_SIZE); #endif - } else if (m_modemState == STATE_DSTARCAL) { + } + +#if defined(MODE_DSTAR) + else if (m_modemState == STATE_DSTARCAL) { q15_t GMSKVals[RX_BLOCK_SIZE]; ::arm_fir_fast_q15(&m_gaussianFilter, 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); } } diff --git a/IO.h b/IO.h index 6a920e6..8361b93 100644 --- a/IO.h +++ b/IO.h @@ -70,15 +70,25 @@ private: arm_biquad_casd_df1_inst_q31 m_dcFilter; q31_t m_dcState[4]; - arm_fir_instance_q15 m_rrc02Filter; - arm_fir_instance_q15 m_rrc05Filter; +#if defined(MODE_DSTAR) 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_nxdnFilter; 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 +#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_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_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 diff --git a/M17RX.cpp b/M17RX.cpp index 3633fbe..246d271 100644 --- a/M17RX.cpp +++ b/M17RX.cpp @@ -17,6 +17,9 @@ */ #include "Config.h" + +#if defined(MODE_M17) + #include "Globals.h" #include "M17RX.h" #include "Utils.h" @@ -402,3 +405,6 @@ void CM17RX::writeRSSIData(uint8_t* data) m_rssiAccum = 0U; m_rssiCount = 0U; } + +#endif + diff --git a/M17RX.h b/M17RX.h index 6826fee..cc7cb1c 100644 --- a/M17RX.h +++ b/M17RX.h @@ -16,10 +16,13 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include "Config.h" + +#if defined(MODE_M17) + #if !defined(M17RX_H) #define M17RX_H -#include "Config.h" #include "M17Defines.h" enum M17RX_STATE { @@ -67,3 +70,5 @@ private: #endif +#endif + diff --git a/M17TX.cpp b/M17TX.cpp index 870d4ad..98e6993 100644 --- a/M17TX.cpp +++ b/M17TX.cpp @@ -18,6 +18,9 @@ */ #include "Config.h" + +#if defined(MODE_M17) + #include "Globals.h" #include "M17TX.h" @@ -182,3 +185,6 @@ void CM17TX::setParams(uint8_t txHang) { m_txHang = txHang * 1200U; } + +#endif + diff --git a/M17TX.h b/M17TX.h index 159b601..850fcf1 100644 --- a/M17TX.h +++ b/M17TX.h @@ -16,11 +16,13 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include "Config.h" + +#if defined(MODE_M17) + #if !defined(M17TX_H) #define M17TX_H -#include "Config.h" - #include "RingBuffer.h" class CM17TX { @@ -54,3 +56,5 @@ private: #endif +#endif + diff --git a/MMDVM.cpp b/MMDVM.cpp index 2674030..f1cec7e 100644 --- a/MMDVM.cpp +++ b/MMDVM.cpp @@ -41,42 +41,65 @@ bool m_duplex = true; bool m_tx = false; bool m_dcd = false; -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; +#if defined(MODE_DSTAR) +CDStarRX dstarRX; +CDStarTX dstarTX; CCalDStarRX calDStarRX; CCalDStarTX calDStarTX; -CCalDMR calDMR; -CCalP25 calP25; -CCalNXDN calNXDN; -CCalFM calFM; -CCalPOCSAG calPOCSAG; -CCalRSSI calRSSI; +#endif + +#if defined(MODE_DMR) +CDMRIdleRX dmrIdleRX; +CDMRRX dmrRX; +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; @@ -95,54 +118,84 @@ void loop() io.process(); // The following is for transmitting +#if defined(MODE_DSTAR) if (m_dstarEnable && m_modemState == STATE_DSTAR) dstarTX.process(); +#endif +#if defined(MODE_DMR) if (m_dmrEnable && m_modemState == STATE_DMR) { if (m_duplex) dmrTX.process(); else dmrDMOTX.process(); } +#endif +#if defined(MODE_YSF) if (m_ysfEnable && m_modemState == STATE_YSF) ysfTX.process(); +#endif +#if defined(MODE_P25) if (m_p25Enable && m_modemState == STATE_P25) p25TX.process(); +#endif +#if defined(MODE_NXDN) if (m_nxdnEnable && m_modemState == STATE_NXDN) nxdnTX.process(); +#endif +#if defined(MODE_M17) if (m_m17Enable && m_modemState == STATE_M17) m17TX.process(); +#endif +#if defined(MODE_POCSAG) if (m_pocsagEnable && (m_modemState == STATE_POCSAG || pocsagTX.busy())) pocsagTX.process(); +#endif +#if defined(MODE_AX25) if (m_ax25Enable && (m_modemState == STATE_IDLE || m_modemState == STATE_FM)) ax25TX.process(); +#endif +#if defined(MODE_FM) if (m_fmEnable && m_modemState == STATE_FM) fm.process(); +#endif +#if defined(MODE_DSTAR) if (m_modemState == STATE_DSTARCAL) calDStarTX.process(); +#endif +#if defined(MODE_DMR) if (m_modemState == STATE_DMRCAL || m_modemState == STATE_LFCAL || m_modemState == STATE_DMRCAL1K || m_modemState == STATE_DMRDMO1K) 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) calP25.process(); +#endif +#if defined(MODE_NXDN) if (m_modemState == STATE_NXDNCAL1K) calNXDN.process(); +#endif +#if defined(MODE_POCSAG) if (m_modemState == STATE_POCSAGCAL) calPOCSAG.process(); - - 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 (m_modemState == STATE_IDLE) cwIdTX.process(); diff --git a/MMDVM.ino b/MMDVM.ino index e242737..ac125d5 100644 --- a/MMDVM.ino +++ b/MMDVM.ino @@ -38,42 +38,65 @@ bool m_duplex = true; bool m_tx = false; bool m_dcd = false; -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; +#if defined(MODE_DSTAR) +CDStarRX dstarRX; +CDStarTX dstarTX; CCalDStarRX calDStarRX; CCalDStarTX calDStarTX; -CCalDMR calDMR; -CCalFM calFM; -CCalP25 calP25; -CCalNXDN calNXDN; -CCalPOCSAG calPOCSAG; -CCalRSSI calRSSI; +#endif + +#if defined(MODE_DMR) +CDMRIdleRX dmrIdleRX; +CDMRRX dmrRX; +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; @@ -92,55 +115,86 @@ void loop() io.process(); // The following is for transmitting +#if defined(MODE_DSTAR) if (m_dstarEnable && m_modemState == STATE_DSTAR) dstarTX.process(); +#endif +#if defined(MODE_DMR) if (m_dmrEnable && m_modemState == STATE_DMR) { if (m_duplex) dmrTX.process(); else dmrDMOTX.process(); } +#endif +#if defined(MODE_YSF) if (m_ysfEnable && m_modemState == STATE_YSF) ysfTX.process(); +#endif +#if defined(MODE_P25) if (m_p25Enable && m_modemState == STATE_P25) p25TX.process(); +#endif +#if defined(MODE_NXDN) if (m_nxdnEnable && m_modemState == STATE_NXDN) nxdnTX.process(); +#endif +#if defined(MODE_M17) if (m_m17Enable && m_modemState == STATE_M17) m17TX.process(); +#endif +#if defined(MODE_POCSAG) if (m_pocsagEnable && (m_modemState == STATE_POCSAG || pocsagTX.busy())) pocsagTX.process(); +#endif +#if defined(MODE_AX25) if (m_ax25Enable && (m_modemState == STATE_IDLE || m_modemState == STATE_FM)) ax25TX.process(); +#endif +#if defined(MODE_FM) if (m_fmEnable && m_modemState == STATE_FM) fm.process(); +#endif +#if defined(MODE_DSTAR) if (m_modemState == STATE_DSTARCAL) calDStarTX.process(); +#endif +#if defined(MODE_DMR) if (m_modemState == STATE_DMRCAL || m_modemState == STATE_LFCAL || m_modemState == STATE_DMRCAL1K || m_modemState == STATE_DMRDMO1K) 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) calP25.process(); +#endif +#if defined(MODE_NXDN) if (m_modemState == STATE_NXDNCAL1K) calNXDN.process(); +#endif +#if defined(MODE_POCSAG) if (m_modemState == STATE_POCSAGCAL) calPOCSAG.process(); +#endif if (m_modemState == STATE_IDLE) cwIdTX.process(); } + diff --git a/POCSAGTX.cpp b/POCSAGTX.cpp index f8fb935..26db4c6 100644 --- a/POCSAGTX.cpp +++ b/POCSAGTX.cpp @@ -17,6 +17,9 @@ */ #include "Config.h" + +#if defined(MODE_POCSAG) + #include "Globals.h" #include "POCSAGTX.h" @@ -147,3 +150,6 @@ uint8_t CPOCSAGTX::getSpace() const { return m_buffer.getSpace() / POCSAG_FRAME_LENGTH_BYTES; } + +#endif + diff --git a/POCSAGTX.h b/POCSAGTX.h index 5619ed0..943b9a3 100644 --- a/POCSAGTX.h +++ b/POCSAGTX.h @@ -16,11 +16,13 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include "Config.h" + +#if defined(MODE_POCSAG) + #if !defined(POCSAGTX_H) #define POCSAGTX_H -#include "Config.h" - #include "RingBuffer.h" class CPOCSAGTX { @@ -51,3 +53,5 @@ private: #endif +#endif + diff --git a/SerialPort.cpp b/SerialPort.cpp index 910a6b0..590de0d 100644 --- a/SerialPort.cpp +++ b/SerialPort.cpp @@ -195,10 +195,14 @@ void CSerialPort::getStatus() reply[4U] |= m_dcd ? 0x40U : 0x00U; +#if defined(MODE_DSTAR) if (m_dstarEnable) reply[5U] = dstarTX.getSpace(); else reply[5U] = 0U; +#else + reply[5U] = 0U; +#endif if (m_dmrEnable) { if (m_duplex) { @@ -213,10 +217,14 @@ void CSerialPort::getStatus() reply[7U] = 0U; } +#if defined(MODE_YSF) if (m_ysfEnable) reply[8U] = ysfTX.getSpace(); else reply[8U] = 0U; +#else + reply[8U] = 0U; +#endif if (m_p25Enable) reply[9U] = p25TX.getSpace(); @@ -228,15 +236,23 @@ void CSerialPort::getStatus() else reply[10U] = 0U; +#if defined(MODE_M17) if (m_m17Enable) reply[11U] = m17TX.getSpace(); else reply[11U] = 0U; +#else + reply[11U] = 0U; +#endif +#if defined(MODE_POCSAG) if (m_pocsagEnable) reply[12U] = pocsagTX.getSpace(); else reply[12U] = 0U; +#else + reply[12U] = 0U; +#endif if (m_fmEnable) reply[13U] = fm.getSpace(); @@ -368,13 +384,21 @@ uint8_t CSerialPort::setConfig(const uint8_t* data, uint16_t length) m_ax25Enable = ax25Enable; m_duplex = !simplex; +#if defined(MODE_DSTAR) dstarTX.setTXDelay(txDelay); +#endif +#if defined(MODE_YSF) ysfTX.setTXDelay(txDelay); +#endif p25TX.setTXDelay(txDelay); dmrDMOTX.setTXDelay(txDelay); nxdnTX.setTXDelay(txDelay); +#if defined(MODE_M17) m17TX.setTXDelay(txDelay); +#endif +#if defined(MODE_POCSAG) pocsagTX.setTXDelay(txDelay); +#endif ax25TX.setTXDelay(ax25TXDelay); dmrTX.setColorCode(colorCode); @@ -383,10 +407,14 @@ uint8_t CSerialPort::setConfig(const uint8_t* data, uint16_t length) dmrDMORX.setColorCode(colorCode); dmrIdleRX.setColorCode(colorCode); +#if defined(MODE_YSF) ysfTX.setParams(ysfLoDev, ysfTXHang); +#endif p25TX.setParams(p25TXHang); nxdnTX.setParams(nxdnTXHang); +#if defined(MODE_M17) m17TX.setParams(m17TXHang); +#endif ax25RX.setParams(ax25RXTwist, ax25SlotTime, ax25PPersist); 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; } +#if defined(MODE_AX25) uint8_t CSerialPort::setFMParams1(const uint8_t* data, uint16_t length) { 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); } +#endif uint8_t CSerialPort::setMode(const uint8_t* data, uint16_t length) { @@ -598,8 +628,10 @@ void CSerialPort::setMode(MMDVM_STATE modemState) break; } +#if defined(MODE_DSTAR) if (modemState != STATE_DSTAR) dstarRX.reset(); +#endif if (modemState != STATE_DMR) { dmrIdleRX.reset(); @@ -607,8 +639,10 @@ void CSerialPort::setMode(MMDVM_STATE modemState) dmrRX.reset(); } +#if defined(MODE_YSF) if (modemState != STATE_YSF) ysfRX.reset(); +#endif if (modemState != STATE_P25) p25RX.reset(); @@ -616,8 +650,10 @@ void CSerialPort::setMode(MMDVM_STATE modemState) if (modemState != STATE_NXDN) nxdnRX.reset(); +#if defined(MODE_M17) if (modemState != STATE_M17) m17RX.reset(); +#endif if (modemState != STATE_FM) fm.reset(); @@ -739,6 +775,7 @@ void CSerialPort::processMessage(const uint8_t* buffer, uint16_t length) sendACK(); break; +#if defined(MODE_FM) case MMDVM_FM_PARAMS1: err = setFMParams1(buffer, length); if (err == 0U) { @@ -778,10 +815,13 @@ void CSerialPort::processMessage(const uint8_t* buffer, uint16_t length) sendNAK(err); } break; +#endif case MMDVM_CAL_DATA: +#if defined(MODE_DSTAR) if (m_modemState == STATE_DSTARCAL) err = calDStarTX.write(buffer, length); +#endif if (m_modemState == STATE_DMRCAL || m_modemState == STATE_LFCAL || m_modemState == STATE_DMRCAL1K || m_modemState == STATE_DMRDMO1K) 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) @@ -790,8 +830,10 @@ void CSerialPort::processMessage(const uint8_t* buffer, uint16_t length) err = calP25.write(buffer, length); if (m_modemState == STATE_NXDNCAL1K) err = calNXDN.write(buffer, length); +#if defined(MODE_POCSAG) if (m_modemState == STATE_POCSAGCAL) err = calPOCSAG.write(buffer, length); +#endif if (err == 0U) { sendACK(); } else { @@ -810,6 +852,7 @@ void CSerialPort::processMessage(const uint8_t* buffer, uint16_t length) } break; +#if defined(MODE_DSTAR) case MMDVM_DSTAR_HEADER: if (m_dstarEnable) { 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); } break; +#endif case MMDVM_DMR_DATA1: if (m_dmrEnable) { @@ -925,6 +969,7 @@ void CSerialPort::processMessage(const uint8_t* buffer, uint16_t length) } break; +#if defined(MODE_YSF) case MMDVM_YSF_DATA: if (m_ysfEnable) { 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); } break; +#endif case MMDVM_P25_HDR: if (m_p25Enable) { @@ -981,6 +1027,7 @@ void CSerialPort::processMessage(const uint8_t* buffer, uint16_t length) } break; +#if defined(MODE_M17) case MMDVM_M17_DATA: if (m_m17Enable) { 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); } break; +#endif +#if defined(MODE_POCSAG) case MMDVM_POCSAG_DATA: if (m_pocsagEnable) { 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); } break; +#endif case MMDVM_FM_DATA: if (m_fmEnable) { @@ -1057,6 +1107,7 @@ void CSerialPort::processMessage(const uint8_t* buffer, uint16_t length) m_len = 0U; } +#if defined(MODE_DSTAR) void CSerialPort::writeDStarHeader(const uint8_t* header, uint8_t length) { if (m_modemState != STATE_DSTAR && m_modemState != STATE_IDLE) @@ -1135,6 +1186,7 @@ void CSerialPort::writeDStarEOT() writeInt(1U, reply, 3); } +#endif 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); } +#if defined(MODE_YSF) void CSerialPort::writeYSFData(const uint8_t* data, uint8_t length) { if (m_modemState != STATE_YSF && m_modemState != STATE_IDLE) @@ -1215,6 +1268,7 @@ void CSerialPort::writeYSFLost() writeInt(1U, reply, 3); } +#endif void CSerialPort::writeP25Hdr(const uint8_t* data, uint8_t length) { @@ -1319,6 +1373,7 @@ void CSerialPort::writeNXDNLost() writeInt(1U, reply, 3); } +#if defined(MODE_M17) void CSerialPort::writeM17Data(const uint8_t* data, uint8_t length) { if (m_modemState != STATE_M17 && m_modemState != STATE_IDLE) @@ -1358,6 +1413,7 @@ void CSerialPort::writeM17Lost() writeInt(1U, reply, 3); } +#endif void CSerialPort::writeFMData(const uint8_t* data, uint16_t length) { diff --git a/SerialPort.h b/SerialPort.h index 08766f8..a9bec4d 100644 --- a/SerialPort.h +++ b/SerialPort.h @@ -36,32 +36,48 @@ public: void process(); +#if defined(MODE_DSTAR) void writeDStarHeader(const uint8_t* header, uint8_t length); void writeDStarData(const uint8_t* data, uint8_t length); void writeDStarLost(); void writeDStarEOT(); +#endif +#if defined(MODE_DMR) void writeDMRData(bool slot, const uint8_t* data, uint8_t length); void writeDMRLost(bool slot); +#endif +#if defined(MODE_YSF) void writeYSFData(const uint8_t* data, uint8_t length); void writeYSFLost(); +#endif +#if defined(MODE_P25) void writeP25Hdr(const uint8_t* data, uint8_t length); void writeP25Ldu(const uint8_t* data, uint8_t length); void writeP25Lost(); +#endif +#if defined(MODE_NXDN) void writeNXDNData(const uint8_t* data, uint8_t length); void writeNXDNLost(); +#endif +#if defined(MODE_M17) void writeM17Data(const uint8_t* data, uint8_t length); void writeM17Lost(); +#endif +#if defined(MODE_AX25) void writeAX25Data(const uint8_t* data, uint16_t length); +#endif +#if defined(MODE_FM) void writeFMData(const uint8_t* data, uint16_t length); void writeFMStatus(uint8_t status); void writeFMEOT(); +#endif void writeCalData(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 setMode(const uint8_t* data, uint16_t length); 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 setFMParams2(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); - void processMessage(const uint8_t* data, uint16_t length); +#endif // Hardware versions void beginInt(uint8_t n, int speed); diff --git a/YSFRX.cpp b/YSFRX.cpp index 3d4a3b5..d5a0308 100644 --- a/YSFRX.cpp +++ b/YSFRX.cpp @@ -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 * it under the terms of the GNU General Public License as published by @@ -17,6 +17,9 @@ */ #include "Config.h" + +#if defined(MODE_YSF) + #include "Globals.h" #include "YSFRX.h" #include "Utils.h" @@ -402,3 +405,6 @@ void CYSFRX::writeRSSIData(uint8_t* data) m_rssiAccum = 0U; m_rssiCount = 0U; } + +#endif + diff --git a/YSFRX.h b/YSFRX.h index f8abfc2..7cede9b 100644 --- a/YSFRX.h +++ b/YSFRX.h @@ -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 * 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. */ +#include "Config.h" + +#if defined(MODE_YSF) + #if !defined(YSFRX_H) #define YSFRX_H -#include "Config.h" #include "YSFDefines.h" enum YSFRX_STATE { @@ -67,3 +70,5 @@ private: #endif +#endif + diff --git a/YSFTX.cpp b/YSFTX.cpp index cb6f8d4..c2a1a66 100644 --- a/YSFTX.cpp +++ b/YSFTX.cpp @@ -18,6 +18,9 @@ */ #include "Config.h" + +#if defined(MODE_YSF) + #include "Globals.h" #include "YSFTX.h" @@ -189,3 +192,6 @@ void CYSFTX::setParams(bool on, uint8_t txHang) m_loDev = on; m_txHang = txHang * 1200U; } + +#endif + diff --git a/YSFTX.h b/YSFTX.h index 3a4fad5..4b240ce 100644 --- a/YSFTX.h +++ b/YSFTX.h @@ -16,11 +16,13 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include "Config.h" + +#if defined(MODE_YSF) + #if !defined(YSFTX_H) #define YSFTX_H -#include "Config.h" - #include "RingBuffer.h" class CYSFTX { @@ -55,3 +57,5 @@ private: #endif +#endif +