First version of initialisation.

This commit is contained in:
Jonathan Naylor 2020-04-12 15:28:56 +01:00
parent 9d725b9479
commit ef65268b45
5 changed files with 75 additions and 87 deletions

12
FM.cpp
View File

@ -35,3 +35,15 @@ void CFM::process()
void CFM::reset() void CFM::reset()
{ {
} }
void CFM::setCallsign(const char* callsign, uint8_t speed, uint16_t frequency, uint8_t time, uint8_t holdoff, uint8_t highLevel, uint8_t lowLevel, bool callAtStart, bool callAtEnd)
{
}
void CFM::setAck(const char* ack, uint8_t speed, uint16_t frequency, uint16_t delay, uint8_t level)
{
}
void CFM::setMisc(uint16_t timeout, uint8_t timeoutLevel, uint8_t ctcssFrequency, uint8_t ctcssThreshold, uint8_t ctcssLevel, uint8_t kerchunkTime, uint8_t hangTime)
{
}

4
FM.h
View File

@ -31,6 +31,10 @@ public:
void reset(); void reset();
void setCallsign(const char* callsign, uint8_t speed, uint16_t frequency, uint8_t time, uint8_t holdoff, uint8_t highLevel, uint8_t lowLevel, bool callAtStart, bool callAtEnd);
void setAck(const char* ack, uint8_t speed, uint16_t frequency, uint16_t delay, uint8_t level);
void setMisc(uint16_t timeout, uint8_t timeoutLevel, uint8_t ctcssFrequency, uint8_t ctcssThreshold, uint8_t ctcssLevel, uint8_t kerchunkTime, uint8_t hangTime);
private: private:
}; };

101
IO.cpp
View File

@ -80,6 +80,8 @@ m_ysfTXLevel(128 * 128),
m_p25TXLevel(128 * 128), m_p25TXLevel(128 * 128),
m_nxdnTXLevel(128 * 128), m_nxdnTXLevel(128 * 128),
m_pocsagTXLevel(128 * 128), m_pocsagTXLevel(128 * 128),
m_fmRXLevel(128 * 128),
m_fmTXLevel(128 * 128),
m_rxDCOffset(DC_OFFSET), m_rxDCOffset(DC_OFFSET),
m_txDCOffset(DC_OFFSET), m_txDCOffset(DC_OFFSET),
m_ledCount(0U), m_ledCount(0U),
@ -144,6 +146,7 @@ void CIO::selfTest()
setP25Int(ledValue); setP25Int(ledValue);
setNXDNInt(ledValue); setNXDNInt(ledValue);
setPOCSAGInt(ledValue); setPOCSAGInt(ledValue);
setFMInt(ledValue);
#endif #endif
delayInt(250); delayInt(250);
} }
@ -155,105 +158,46 @@ void CIO::selfTest()
setP25Int(false); setP25Int(false);
setNXDNInt(false); setNXDNInt(false);
setPOCSAGInt(false); setPOCSAGInt(false);
setFMInt(false);
delayInt(250); delayInt(250);
setDStarInt(true);
setDMRInt(true); setDMRInt(true);
setYSFInt(false);
setP25Int(false);
setNXDNInt(false);
setPOCSAGInt(false);
delayInt(250); delayInt(250);
setDStarInt(true);
setDMRInt(true);
setYSFInt(true); setYSFInt(true);
setP25Int(false);
setNXDNInt(false);
setPOCSAGInt(false);
delayInt(250); delayInt(250);
setDStarInt(true);
setDMRInt(true);
setYSFInt(true);
setP25Int(true); setP25Int(true);
setNXDNInt(false);
setPOCSAGInt(false);
delayInt(250); delayInt(250);
setDStarInt(true);
setDMRInt(true);
setYSFInt(true);
setP25Int(true);
setNXDNInt(true); setNXDNInt(true);
setPOCSAGInt(false);
delayInt(250); delayInt(250);
setDStarInt(true);
setDMRInt(true);
setYSFInt(true);
setP25Int(true);
setNXDNInt(true);
setPOCSAGInt(true); setPOCSAGInt(true);
delayInt(250); delayInt(250);
setFMInt(true);
setDStarInt(true); delayInt(250);
setDMRInt(true); setFMInt(false);
setYSFInt(true);
setP25Int(true); delayInt(250);
setNXDNInt(true);
setPOCSAGInt(false); setPOCSAGInt(false);
delayInt(250); delayInt(250);
setDStarInt(true);
setDMRInt(true);
setYSFInt(true);
setP25Int(true);
setNXDNInt(false); setNXDNInt(false);
setPOCSAGInt(false);
delayInt(250); delayInt(250);
setDStarInt(true);
setDMRInt(true);
setYSFInt(true);
setP25Int(false); setP25Int(false);
setNXDNInt(false);
setPOCSAGInt(false);
delayInt(250); delayInt(250);
setDStarInt(true);
setDMRInt(true);
setYSFInt(false); setYSFInt(false);
setP25Int(false);
setNXDNInt(false);
setPOCSAGInt(false);
delayInt(250); delayInt(250);
setDStarInt(true);
setDMRInt(false); setDMRInt(false);
setYSFInt(false);
setP25Int(false);
setNXDNInt(false);
setPOCSAGInt(false);
delayInt(250); delayInt(250);
setDStarInt(false); setDStarInt(false);
setDMRInt(false);
setYSFInt(false);
setP25Int(false);
setNXDNInt(false);
setPOCSAGInt(false);
#endif #endif
} }
@ -405,11 +349,19 @@ void CIO::process()
if (m_fmEnable) { if (m_fmEnable) {
bool cos = getCOSInt(); bool cos = getCOSInt();
q15_t FMVals[RX_BLOCK_SIZE];
#if defined(USE_DCBLOCKER) #if defined(USE_DCBLOCKER)
fm.samples(cos, dcSamples, RX_BLOCK_SIZE); for (uint16_t i = 0U; i < RX_BLOCK_SIZE; i++) {
q31_t res1 = dcSamples[i] * m_fmRXLevel;
FMVals[i] = q15_t(__SSAT((res1 >> 15), 16));
}
#else #else
fm.samples(cos, samples, RX_BLOCK_SIZE); for (uint16_t i = 0U; i < RX_BLOCK_SIZE; i++) {
q31_t res1 = samples[i] * m_fmRXLevel;
FMVals[i] = q15_t(__SSAT((res1 >> 15), 16));
}
#endif #endif
fm.samples(cos, FMVals, RX_BLOCK_SIZE);
} }
} else if (m_modemState == STATE_DSTAR) { } else if (m_modemState == STATE_DSTAR) {
if (m_dstarEnable) { if (m_dstarEnable) {
@ -471,11 +423,19 @@ void CIO::process()
} }
} else if (m_modemState == STATE_FM) { } else if (m_modemState == STATE_FM) {
bool cos = getCOSInt(); bool cos = getCOSInt();
q15_t FMVals[RX_BLOCK_SIZE];
#if defined(USE_DCBLOCKER) #if defined(USE_DCBLOCKER)
fm.samples(cos, dcSamples, RX_BLOCK_SIZE); for (uint16_t i = 0U; i < RX_BLOCK_SIZE; i++) {
q31_t res1 = dcSamples[i] * m_fmRXLevel;
FMVals[i] = q15_t(__SSAT((res1 >> 15), 16));
}
#else #else
fm.samples(cos, samples, RX_BLOCK_SIZE); for (uint16_t i = 0U; i < RX_BLOCK_SIZE; i++) {
q31_t res1 = samples[i] * m_fmRXLevel;
FMVals[i] = q15_t(__SSAT((res1 >> 15), 16));
}
#endif #endif
fm.samples(cos, FMVals, RX_BLOCK_SIZE);
} else if (m_modemState == STATE_DSTARCAL) { } 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);
@ -576,7 +536,7 @@ void CIO::setMode()
#endif #endif
} }
void CIO::setParameters(bool rxInvert, bool txInvert, bool pttInvert, uint8_t rxLevel, uint8_t cwIdTXLevel, uint8_t dstarTXLevel, uint8_t dmrTXLevel, uint8_t ysfTXLevel, uint8_t p25TXLevel, uint8_t nxdnTXLevel, uint8_t pocsagTXLevel, uint8_t fmTXLevel, int16_t txDCOffset, int16_t rxDCOffset) void CIO::setParameters(bool rxInvert, bool txInvert, bool pttInvert, uint8_t rxLevel, uint8_t cwIdTXLevel, uint8_t dstarTXLevel, uint8_t dmrTXLevel, uint8_t ysfTXLevel, uint8_t p25TXLevel, uint8_t nxdnTXLevel, uint8_t pocsagTXLevel, uint8_t fmRXLevel, uint8_t fmTXLevel, int16_t txDCOffset, int16_t rxDCOffset)
{ {
m_pttInvert = pttInvert; m_pttInvert = pttInvert;
@ -588,6 +548,7 @@ void CIO::setParameters(bool rxInvert, bool txInvert, bool pttInvert, uint8_t rx
m_p25TXLevel = q15_t(p25TXLevel * 128); m_p25TXLevel = q15_t(p25TXLevel * 128);
m_nxdnTXLevel = q15_t(nxdnTXLevel * 128); m_nxdnTXLevel = q15_t(nxdnTXLevel * 128);
m_pocsagTXLevel = q15_t(pocsagTXLevel * 128); m_pocsagTXLevel = q15_t(pocsagTXLevel * 128);
m_fmRXLevel = q15_t(fmRXLevel * 128);
m_fmTXLevel = q15_t(fmTXLevel * 128); m_fmTXLevel = q15_t(fmTXLevel * 128);
m_rxDCOffset = DC_OFFSET + rxDCOffset; m_rxDCOffset = DC_OFFSET + rxDCOffset;

3
IO.h
View File

@ -42,7 +42,7 @@ public:
void interrupt(); void interrupt();
void setParameters(bool rxInvert, bool txInvert, bool pttInvert, uint8_t rxLevel, uint8_t cwIdTXLevel, uint8_t dstarTXLevel, uint8_t dmrTXLevel, uint8_t ysfTXLevel, uint8_t p25TXLevel, uint8_t nxdnTXLevel, uint8_t pocsagTXLevel, uint8_t fmTXLevel, int16_t txDCOffset, int16_t rxDCOffset); void setParameters(bool rxInvert, bool txInvert, bool pttInvert, uint8_t rxLevel, uint8_t cwIdTXLevel, uint8_t dstarTXLevel, uint8_t dmrTXLevel, uint8_t ysfTXLevel, uint8_t p25TXLevel, uint8_t nxdnTXLevel, uint8_t pocsagTXLevel, uint8_t fmRXLevel, uint8_t fmTXLevel, int16_t txDCOffset, int16_t rxDCOffset);
void getOverflow(bool& adcOverflow, bool& dacOverflow); void getOverflow(bool& adcOverflow, bool& dacOverflow);
@ -86,6 +86,7 @@ private:
q15_t m_p25TXLevel; q15_t m_p25TXLevel;
q15_t m_nxdnTXLevel; q15_t m_nxdnTXLevel;
q15_t m_pocsagTXLevel; q15_t m_pocsagTXLevel;
q15_t m_fmRXLevel;
q15_t m_fmTXLevel; q15_t m_fmTXLevel;
uint16_t m_rxDCOffset; uint16_t m_rxDCOffset;

View File

@ -262,7 +262,7 @@ void CSerialPort::getVersion()
uint8_t CSerialPort::setConfig(const uint8_t* data, uint8_t length) uint8_t CSerialPort::setConfig(const uint8_t* data, uint8_t length)
{ {
if (length < 18U) if (length < 20U)
return 4U; return 4U;
bool rxInvert = (data[0U] & 0x01U) == 0x01U; bool rxInvert = (data[0U] & 0x01U) == 0x01U;
@ -327,6 +327,9 @@ uint8_t CSerialPort::setConfig(const uint8_t* data, uint8_t length)
uint8_t pocsagTXLevel = data[17U]; uint8_t pocsagTXLevel = data[17U];
uint8_t fmTXLevel = data[18U];
uint8_t fmRXLevel = data[19U];
m_modemState = modemState; m_modemState = modemState;
m_dstarEnable = dstarEnable; m_dstarEnable = dstarEnable;
@ -353,7 +356,7 @@ uint8_t CSerialPort::setConfig(const uint8_t* data, uint8_t length)
ysfTX.setParams(ysfLoDev, ysfTXHang); ysfTX.setParams(ysfLoDev, ysfTXHang);
io.setParameters(rxInvert, txInvert, pttInvert, rxLevel, cwIdTXLevel, dstarTXLevel, dmrTXLevel, ysfTXLevel, p25TXLevel, nxdnTXLevel, pocsagTXLevel, txDCOffset, rxDCOffset); io.setParameters(rxInvert, txInvert, pttInvert, rxLevel, cwIdTXLevel, dstarTXLevel, dmrTXLevel, ysfTXLevel, p25TXLevel, nxdnTXLevel, pocsagTXLevel, fmTXLevel, fmRXLevel, txDCOffset, rxDCOffset);
io.start(); io.start();
@ -375,12 +378,14 @@ uint8_t CSerialPort::setFMParams1(const uint8_t* data, uint8_t length)
bool callAtStart = (data[6U] & 0x01U) == 0x01U; bool callAtStart = (data[6U] & 0x01U) == 0x01U;
bool callAtEnd = (data[6U] & 0x02U) == 0x02U; bool callAtEnd = (data[6U] & 0x02U) == 0x02U;
char callsign; char callsign[50U];
uint8_t n = 0U; uint8_t n = 0U;
for (uint8_t i = 7U; i < length; i++, n++) for (uint8_t i = 7U; i < length; i++, n++)
callsign[n] = data[i]; callsign[n] = data[i];
callsign[n] = '\0'; callsign[n] = '\0';
fm.setCallsign(callsign, speed, frequency, time, holdoff, highLevel, lowLevel, callAtStart, callAtEnd);
return 0U; return 0U;
} }
@ -391,21 +396,23 @@ uint8_t CSerialPort::setFMParams2(const uint8_t* data, uint8_t length)
uint8_t speed = data[0U]; uint8_t speed = data[0U];
uint16_t frequency = data[1U] * 10U; uint16_t frequency = data[1U] * 10U;
uint8_t delay = data[2U] * 10U; uint16_t delay = data[2U] * 10U;
uint8_t level = data[3U]; uint8_t level = data[3U];
char ack; char ack[50U];
uint8_t n = 0U; uint8_t n = 0U;
for (uint8_t i = 4U; i < length; i++, n++) for (uint8_t i = 4U; i < length; i++, n++)
ack[n] = data[i]; ack[n] = data[i];
ack[n] = '\0'; ack[n] = '\0';
fm.setAck(ack, speed, frequency, delay, level);
return 0U; return 0U;
} }
uint8_t CSerialPort::setFMParams3(const uint8_t* data, uint8_t length) uint8_t CSerialPort::setFMParams3(const uint8_t* data, uint8_t length)
{ {
if (length < 9U) if (length < 7U)
return 4U; return 4U;
uint16_t timeout = data[0U] * 5U; uint16_t timeout = data[0U] * 5U;
@ -415,10 +422,10 @@ uint8_t CSerialPort::setFMParams3(const uint8_t* data, uint8_t length)
uint8_t ctcssThreshold = data[3U]; uint8_t ctcssThreshold = data[3U];
uint8_t ctcssLevel = data[4U]; uint8_t ctcssLevel = data[4U];
uint8_t inputLevel = data[5U]; uint8_t kerchunkTime = data[5U];
uint8_t outputLevel = data[6U]; uint8_t hangTime = data[6U];
uint8_t kerchunkTime = data[7U];
uint8_t hangTime = data[8U]; fm.setMisc(timeout, timeoutLevel, ctcssFrequency, ctcssThreshold, ctcssLevel, kerchunkTime, hangTime);
return 0U; return 0U;
} }
@ -529,6 +536,9 @@ void CSerialPort::setMode(MMDVM_STATE modemState)
if (modemState != STATE_NXDN) if (modemState != STATE_NXDN)
nxdnRX.reset(); nxdnRX.reset();
if (modemState != STATE_FM)
fm.reset();
cwIdTX.reset(); cwIdTX.reset();
m_modemState = modemState; m_modemState = modemState;