Allow for sync-less data frames.

48kHz
Jonathan Naylor 2016-02-23 20:51:57 +00:00
parent ff5fe8e4c1
commit c09d8c78ee
2 changed files with 41 additions and 7 deletions

View File

@ -49,7 +49,8 @@ m_threshold(0),
m_control(0x00U), m_control(0x00U),
m_syncCount(0U), m_syncCount(0U),
m_colorCode(0U), m_colorCode(0U),
m_n(0U) m_n(0U),
m_state(DMRSRXS_NONE)
{ {
} }
@ -72,13 +73,14 @@ void CDMRSlotRX::reset()
m_threshold = 0; m_threshold = 0;
m_centre = 0; m_centre = 0;
m_endPtr = NOENDPTR; m_endPtr = NOENDPTR;
m_state = DMRSRXS_NONE;
} }
bool CDMRSlotRX::processSample(q15_t sample) bool CDMRSlotRX::processSample(q15_t sample)
{ {
// Ensure that the buffer doesn't overflow // Ensure that the buffer doesn't overflow
if (m_dataPtr > m_endPtr || m_dataPtr >= 900U) if (m_dataPtr > m_endPtr || m_dataPtr >= 900U)
return m_endPtr != NOENDPTR; return m_state != DMRSRXS_NONE;
m_buffer[m_dataPtr] = sample; m_buffer[m_dataPtr] = sample;
@ -119,14 +121,24 @@ bool CDMRSlotRX::processSample(q15_t sample)
switch (dataType) { switch (dataType) {
case DT_DATA_HEADER: case DT_DATA_HEADER:
m_state = DMRSRXS_DATA;
DEBUG3("DMRSlotRX: data header for slot/data type", m_slot ? 2U : 1U, dataType);
serial.writeDMRData(m_slot, frame, DMR_FRAME_LENGTH_BYTES + 1U);
break;
case DT_VOICE_LC_HEADER: case DT_VOICE_LC_HEADER:
m_state = DMRSRXS_VOICE;
DEBUG3("DMRSlotRX: voice header for slot/data type", m_slot ? 2U : 1U, dataType);
serial.writeDMRData(m_slot, frame, DMR_FRAME_LENGTH_BYTES + 1U);
break;
case DT_VOICE_PI_HEADER: case DT_VOICE_PI_HEADER:
DEBUG3("DMRSlotRX: header for slot/data type", m_slot ? 2U : 1U, dataType); m_state = DMRSRXS_VOICE;
DEBUG3("DMRSlotRX: pi header for slot/data type", m_slot ? 2U : 1U, dataType);
serial.writeDMRData(m_slot, frame, DMR_FRAME_LENGTH_BYTES + 1U); serial.writeDMRData(m_slot, frame, DMR_FRAME_LENGTH_BYTES + 1U);
break; break;
case DT_TERMINATOR_WITH_LC: case DT_TERMINATOR_WITH_LC:
DEBUG2("DMRSlotRX: terminator for slot", m_slot ? 2U : 1U); DEBUG2("DMRSlotRX: terminator for slot", m_slot ? 2U : 1U);
m_endPtr = NOENDPTR; m_endPtr = NOENDPTR;
m_state = DMRSRXS_NONE;
serial.writeDMRData(m_slot, frame, DMR_FRAME_LENGTH_BYTES + 1U); serial.writeDMRData(m_slot, frame, DMR_FRAME_LENGTH_BYTES + 1U);
break; break;
default: default:
@ -139,6 +151,7 @@ bool CDMRSlotRX::processSample(q15_t sample)
// Voice sync // Voice sync
DEBUG2("DMRSlotRX: voice sync for slot", m_slot ? 2U : 1U); DEBUG2("DMRSlotRX: voice sync for slot", m_slot ? 2U : 1U);
serial.writeDMRData(m_slot, frame, DMR_FRAME_LENGTH_BYTES + 1U); serial.writeDMRData(m_slot, frame, DMR_FRAME_LENGTH_BYTES + 1U);
m_state = DMRSRXS_VOICE;
m_syncCount = 0U; m_syncCount = 0U;
m_n = 0U; m_n = 0U;
} else { } else {
@ -150,12 +163,26 @@ bool CDMRSlotRX::processSample(q15_t sample)
m_threshold = 0; m_threshold = 0;
m_centre = 0; m_centre = 0;
m_endPtr = NOENDPTR; m_endPtr = NOENDPTR;
m_state = DMRSRXS_NONE;
return false; return false;
} }
// Voice data if (m_state == DMRSRXS_VOICE) {
frame[0U] |= ++m_n; // Voice data
serial.writeDMRData(m_slot, frame, DMR_FRAME_LENGTH_BYTES + 1U); frame[0U] |= ++m_n;
serial.writeDMRData(m_slot, frame, DMR_FRAME_LENGTH_BYTES + 1U);
} else if (m_state == DMRSRXS_DATA) {
// Data data
uint8_t colorCode;
uint8_t dataType;
CDMRSlotType slotType;
slotType.decode(frame + 1U, colorCode, dataType);
if (colorCode == m_colorCode) {
frame[0U] |= dataType;
serial.writeDMRData(m_slot, frame, DMR_FRAME_LENGTH_BYTES + 1U);
}
}
} }
} }
@ -165,7 +192,7 @@ bool CDMRSlotRX::processSample(q15_t sample)
if (m_bitPtr >= DMR_RADIO_SYMBOL_LENGTH) if (m_bitPtr >= DMR_RADIO_SYMBOL_LENGTH)
m_bitPtr = 0U; m_bitPtr = 0U;
return m_endPtr != NOENDPTR; return m_state != DMRSRXS_NONE;
} }
void CDMRSlotRX::correlateSync(q15_t sample) void CDMRSlotRX::correlateSync(q15_t sample)

View File

@ -22,6 +22,12 @@
#include "Config.h" #include "Config.h"
#include "DMRDefines.h" #include "DMRDefines.h"
enum DMRSRXS {
DMRSRXS_NONE,
DMRSRXS_VOICE,
DMRSRXS_DATA
};
class CDMRSlotRX { class CDMRSlotRX {
public: public:
CDMRSlotRX(bool slot); CDMRSlotRX(bool slot);
@ -49,6 +55,7 @@ private:
uint8_t m_syncCount; uint8_t m_syncCount;
uint8_t m_colorCode; uint8_t m_colorCode;
uint8_t m_n; uint8_t m_n;
DMRSRXS m_state;
void correlateSync(q15_t sample); void correlateSync(q15_t sample);
void samplesToBits(uint16_t start, uint8_t count, uint8_t* buffer, uint16_t offset, q15_t centre, q15_t threshold); void samplesToBits(uint16_t start, uint8_t count, uint8_t* buffer, uint16_t offset, q15_t centre, q15_t threshold);