Test the use of a reverse burst at the end of a transmission.

This commit is contained in:
Jonathan Naylor 2020-07-14 12:20:42 +01:00
parent 20013e3adc
commit dc41fd83d2
5 changed files with 22 additions and 9 deletions

17
FM.cpp
View File

@ -45,6 +45,7 @@ m_kerchunkTimer(),
m_ackMinTimer(), m_ackMinTimer(),
m_ackDelayTimer(), m_ackDelayTimer(),
m_hangTimer(), m_hangTimer(),
m_reverseTimer(),
m_filterStage1( 724, 1448, 724, 32768, -37895, 21352),//3rd order Cheby Filter 300 to 2700Hz, 0.2dB passband ripple, sampling rate 24kHz m_filterStage1( 724, 1448, 724, 32768, -37895, 21352),//3rd order Cheby Filter 300 to 2700Hz, 0.2dB passband ripple, sampling rate 24kHz
m_filterStage2(32768, 0,-32768, 32768, -50339, 19052), m_filterStage2(32768, 0,-32768, 32768, -50339, 19052),
m_filterStage3(32768, -65536, 32768, 32768, -64075, 31460), m_filterStage3(32768, -65536, 32768, 32768, -64075, 31460),
@ -57,6 +58,8 @@ m_rxLevel(1),
m_inputRB(4800U), // 200ms of audio m_inputRB(4800U), // 200ms of audio
m_outputRB(2400U) // 100ms of audio m_outputRB(2400U) // 100ms of audio
{ {
m_reverseTimer.setTimeout(0U, 150U);
insertDelay(100U); insertDelay(100U);
} }
@ -141,10 +144,9 @@ void CFM::samples(bool cos, const q15_t* samples, uint8_t length)
if (!m_callsign.isRunning() && !m_rfAck.isRunning()) if (!m_callsign.isRunning() && !m_rfAck.isRunning())
currentSample += m_timeoutTone.getAudio(); currentSample += m_timeoutTone.getAudio();
currentSample += m_ctcssTX.getAudio(); currentSample += m_ctcssTX.getAudio(m_reverseTimer.isRunning());
if (m_modemState == STATE_FM) m_outputRB.put(currentSample);
m_outputRB.put(currentSample);
} }
} }
@ -165,6 +167,7 @@ void CFM::reset()
m_ackMinTimer.stop(); m_ackMinTimer.stop();
m_ackDelayTimer.stop(); m_ackDelayTimer.stop();
m_hangTimer.stop(); m_hangTimer.stop();
m_reverseTimer.stop();
m_ctcssRX.reset(); m_ctcssRX.reset();
m_rfAck.stop(); m_rfAck.stop();
@ -254,7 +257,10 @@ void CFM::stateMachine(bool validSignal)
} }
if (m_state == FS_LISTENING && m_modemState == STATE_FM) { if (m_state == FS_LISTENING && m_modemState == STATE_FM) {
if (!m_callsign.isWanted() && !m_rfAck.isWanted()) { if (!m_callsign.isWanted() && !m_rfAck.isWanted() && !m_reverseTimer.isRunning())
m_reverseTimer.start();
if (!m_callsign.isWanted() && !m_rfAck.isWanted() && m_reverseTimer.isRunning() && m_reverseTimer.hasExpired()) {
DEBUG1("Change to STATE_IDLE"); DEBUG1("Change to STATE_IDLE");
m_modemState = STATE_IDLE; m_modemState = STATE_IDLE;
m_callsignTimer.stop(); m_callsignTimer.stop();
@ -263,6 +269,7 @@ void CFM::stateMachine(bool validSignal)
m_ackMinTimer.stop(); m_ackMinTimer.stop();
m_ackDelayTimer.stop(); m_ackDelayTimer.stop();
m_hangTimer.stop(); m_hangTimer.stop();
m_reverseTimer.stop();
} }
} }
} }
@ -276,6 +283,7 @@ void CFM::clock(uint8_t length)
m_ackMinTimer.clock(length); m_ackMinTimer.clock(length);
m_ackDelayTimer.clock(length); m_ackDelayTimer.clock(length);
m_hangTimer.clock(length); m_hangTimer.clock(length);
m_reverseTimer.clock(length);
} }
void CFM::listeningState(bool validSignal) void CFM::listeningState(bool validSignal)
@ -299,6 +307,7 @@ void CFM::listeningState(bool validSignal)
beginRelaying(); beginRelaying();
m_callsignTimer.start(); m_callsignTimer.start();
m_reverseTimer.stop();
io.setDecode(true); io.setDecode(true);
io.setADCDetection(true); io.setADCDetection(true);

1
FM.h
View File

@ -75,6 +75,7 @@ private:
CFMTimer m_ackMinTimer; CFMTimer m_ackMinTimer;
CFMTimer m_ackDelayTimer; CFMTimer m_ackDelayTimer;
CFMTimer m_hangTimer; CFMTimer m_hangTimer;
CFMTimer m_reverseTimer;
CFMDirectFormI m_filterStage1; CFMDirectFormI m_filterStage1;
CFMDirectFormI m_filterStage2; CFMDirectFormI m_filterStage2;
CFMDirectFormI m_filterStage3; CFMDirectFormI m_filterStage3;

View File

@ -115,11 +115,14 @@ uint8_t CFMCTCSSTX::setParams(uint8_t frequency, uint8_t level)
return 0U; return 0U;
} }
q15_t CFMCTCSSTX::getAudio() q15_t CFMCTCSSTX::getAudio(bool reverse)
{ {
q15_t sample = m_values[m_n++]; q15_t sample = m_values[m_n++];
if(m_n >= m_length) if (m_n >= m_length)
m_n = 0U; m_n = 0U;
return sample; if (reverse)
return -sample;
else
return sample;
} }

View File

@ -27,7 +27,7 @@ public:
uint8_t setParams(uint8_t frequency, uint8_t level); uint8_t setParams(uint8_t frequency, uint8_t level);
q15_t getAudio(); q15_t getAudio(bool reverse);
private: private:
q15_t* m_values; q15_t* m_values;

View File

@ -103,7 +103,7 @@ const uint8_t MMDVM_DEBUG5 = 0xF5U;
#define HW_TYPE "MMDVM" #define HW_TYPE "MMDVM"
#endif #endif
#define DESCRIPTION "20200713 (D-Star/DMR/System Fusion/P25/NXDN/POCSAG/FM)" #define DESCRIPTION "20200714 (D-Star/DMR/System Fusion/P25/NXDN/POCSAG/FM)"
#if defined(GITVERSION) #if defined(GITVERSION)
#define concat(h, a, b, c) h " " a " " b " GitID #" c "" #define concat(h, a, b, c) h " " a " " b " GitID #" c ""