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"
#if defined(MODE_DSTAR)
#include "Globals.h"
#include "CalDStarRX.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.
*/
#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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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,32 +158,48 @@ 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
#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 CCWIdTX cwIdTX;

82
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}
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));
#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);
}
}

16
IO.h
View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -41,9 +41,15 @@ bool m_duplex = true;
bool m_tx = false;
bool m_dcd = false;
#if defined(MODE_DSTAR)
CDStarRX dstarRX;
CDStarTX dstarTX;
CCalDStarRX calDStarRX;
CCalDStarTX calDStarTX;
#endif
#if defined(MODE_DMR)
CDMRIdleRX dmrIdleRX;
CDMRRX dmrRX;
CDMRTX dmrTX;
@ -51,31 +57,48 @@ 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
CCalDStarRX calDStarRX;
CCalDStarTX calDStarTX;
CCalDMR calDMR;
CCalP25 calP25;
CCalNXDN calNXDN;
CCalFM calFM;
CCalPOCSAG calPOCSAG;
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 (m_modemState == STATE_P25CAL1K)
calP25.process();
if (m_modemState == STATE_NXDNCAL1K)
calNXDN.process();
if (m_modemState == STATE_POCSAGCAL)
calPOCSAG.process();
#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();

View File

@ -38,9 +38,15 @@ bool m_duplex = true;
bool m_tx = false;
bool m_dcd = false;
#if defined(MODE_DSTAR)
CDStarRX dstarRX;
CDStarTX dstarTX;
CCalDStarRX calDStarRX;
CCalDStarTX calDStarTX;
#endif
#if defined(MODE_DMR)
CDMRIdleRX dmrIdleRX;
CDMRRX dmrRX;
CDMRTX dmrTX;
@ -48,31 +54,48 @@ 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
CCalDStarRX calDStarRX;
CCalDStarTX calDStarTX;
CCalDMR calDMR;
CCalFM calFM;
CCalP25 calP25;
CCalNXDN calNXDN;
CCalPOCSAG calPOCSAG;
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();
}

View File

@ -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

View File

@ -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

View File

@ -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)
{

View File

@ -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);

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
* 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

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
* 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

View File

@ -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

View File

@ -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