diff --git a/DMRDMORX.cpp b/DMRDMORX.cpp index 32b43ff..dffda63 100644 --- a/DMRDMORX.cpp +++ b/DMRDMORX.cpp @@ -129,10 +129,6 @@ bool CDMRDMORX::processSample(q15_t sample, uint16_t rssi) ptr -= DMO_BUFFER_LENGTH_SAMPLES; samplesToBits(ptr, DMR_FRAME_LENGTH_SYMBOLS, frame, 8U, centre, threshold); -#if defined(DUMP_SAMPLES) - if (m_control == CONTROL_DATA || m_control == CONTROL_VOICE) - writeSamples(ptr); -#endif if (m_control == CONTROL_DATA) { // Data sync @@ -151,6 +147,9 @@ bool CDMRDMORX::processSample(q15_t sample, uint16_t rssi) case DT_DATA_HEADER: DEBUG4("DMRDMORX: data header found pos/centre/threshold", m_syncPtr, centre, threshold); writeRSSIData(frame); +#if defined(DUMP_SAMPLES) + writeSamples(ptr, frame[0U]); +#endif m_state = DMORXS_DATA; m_type = 0x00U; break; @@ -160,18 +159,27 @@ bool CDMRDMORX::processSample(q15_t sample, uint16_t rssi) if (m_state == DMORXS_DATA) { DEBUG4("DMRDMORX: data payload found pos/centre/threshold", m_syncPtr, centre, threshold); writeRSSIData(frame); +#if defined(DUMP_SAMPLES) + writeSamples(ptr, frame[0U]); +#endif m_type = dataType; } break; case DT_VOICE_LC_HEADER: DEBUG4("DMRDMORX: voice header found pos/centre/threshold", m_syncPtr, centre, threshold); writeRSSIData(frame); +#if defined(DUMP_SAMPLES) + writeSamples(ptr, frame[0U]); +#endif m_state = DMORXS_VOICE; break; case DT_VOICE_PI_HEADER: if (m_state == DMORXS_VOICE) { DEBUG4("DMRDMORX: voice pi header found pos/centre/threshold", m_syncPtr, centre, threshold); writeRSSIData(frame); +#if defined(DUMP_SAMPLES) + writeSamples(ptr, frame[0U]); +#endif } m_state = DMORXS_VOICE; break; @@ -179,12 +187,18 @@ bool CDMRDMORX::processSample(q15_t sample, uint16_t rssi) if (m_state == DMORXS_VOICE) { DEBUG4("DMRDMORX: voice terminator found pos/centre/threshold", m_syncPtr, centre, threshold); writeRSSIData(frame); +#if defined(DUMP_SAMPLES) + writeSamples(ptr, frame[0U]); +#endif reset(); } break; default: // DT_CSBK DEBUG4("DMRDMORX: csbk found pos/centre/threshold", m_syncPtr, centre, threshold); writeRSSIData(frame); +#if defined(DUMP_SAMPLES) + writeSamples(ptr, frame[0U]); +#endif reset(); break; } @@ -193,6 +207,9 @@ bool CDMRDMORX::processSample(q15_t sample, uint16_t rssi) // Voice sync DEBUG4("DMRDMORX: voice sync found pos/centre/threshold", m_syncPtr, centre, threshold); writeRSSIData(frame); +#if defined(DUMP_SAMPLES) + writeSamples(ptr, frame[0U]); +#endif m_state = DMORXS_VOICE; m_syncCount = 0U; m_n = 0U; @@ -214,10 +231,16 @@ bool CDMRDMORX::processSample(q15_t sample, uint16_t rssi) } serial.writeDMRData(true, frame, DMR_FRAME_LENGTH_BYTES + 1U); +#if defined(DUMP_SAMPLES) + writeSamples(ptr, frame[0U]); +#endif } else if (m_state == DMORXS_DATA) { if (m_type != 0x00U) { frame[0U] = CONTROL_DATA | m_type; writeRSSIData(frame); +#if defined(DUMP_SAMPLES) + writeSamples(ptr, frame[0U]); +#endif } } } @@ -433,7 +456,7 @@ void CDMRDMORX::writeRSSIData(uint8_t* frame) } #if defined(DUMP_SAMPLES) -void CDMRDMORX::writeSamples(uint16_t start) +void CDMRDMORX::writeSamples(uint16_t start, uint8_t control) { q15_t samples[DMR_FRAME_LENGTH_SYMBOLS]; @@ -445,6 +468,6 @@ void CDMRDMORX::writeSamples(uint16_t start) start -= DMO_BUFFER_LENGTH_SAMPLES; } - serial.writeSamples(STATE_DMR, samples, DMR_FRAME_LENGTH_SYMBOLS); + serial.writeSamples(STATE_DMR, control, samples, DMR_FRAME_LENGTH_SYMBOLS); } #endif diff --git a/DMRDMORX.h b/DMRDMORX.h index 7ec766c..0b20764 100644 --- a/DMRDMORX.h +++ b/DMRDMORX.h @@ -64,7 +64,7 @@ private: void correlateSync(bool first); void samplesToBits(uint16_t start, uint8_t count, uint8_t* buffer, uint16_t offset, q15_t centre, q15_t threshold); void writeRSSIData(uint8_t* frame); - void writeSamples(uint16_t start); + void writeSamples(uint16_t start, uint8_t control); }; #endif diff --git a/DMRIdleRX.cpp b/DMRIdleRX.cpp index c3ac7b3..8296c03 100644 --- a/DMRIdleRX.cpp +++ b/DMRIdleRX.cpp @@ -18,6 +18,8 @@ #define WANT_DEBUG +// #define DUMP_SAMPLES + #include "Config.h" #include "Globals.h" #include "DMRIdleRX.h" @@ -159,6 +161,9 @@ void CDMRIdleRX::processSample(q15_t sample) if (colorCode == m_colorCode && dataType == DT_CSBK) { frame[0U] = CONTROL_IDLE | CONTROL_DATA | DT_CSBK; serial.writeDMRData(false, frame, DMR_FRAME_LENGTH_BYTES + 1U); +#if defined(DUMP_SAMPLES) + writeSamples(ptr, frame[0U]); +#endif } m_endPtr = NOENDPTR; @@ -212,3 +217,19 @@ void CDMRIdleRX::setColorCode(uint8_t colorCode) m_colorCode = colorCode; } +#if defined(DUMP_SAMPLES) +void CDMRIdleRX::writeSamples(uint16_t start, uint8_t control) +{ + q15_t samples[DMR_FRAME_LENGTH_SYMBOLS]; + + for (uint16_t i = 0U; i < DMR_FRAME_LENGTH_SYMBOLS; i++) { + samples[i] = m_buffer[start]; + + start += DMR_RADIO_SYMBOL_LENGTH; + if (start >= DMR_FRAME_LENGTH_SAMPLES) + start -= DMR_FRAME_LENGTH_SAMPLES; + } + + serial.writeSamples(STATE_DMR, control, samples, DMR_FRAME_LENGTH_SYMBOLS); +} +#endif diff --git a/DMRIdleRX.h b/DMRIdleRX.h index fbb82fa..79be1b7 100644 --- a/DMRIdleRX.h +++ b/DMRIdleRX.h @@ -43,8 +43,9 @@ private: q15_t m_threshold; uint8_t m_colorCode; - void processSample(q15_t sample); - void samplesToBits(uint16_t start, uint8_t count, uint8_t* buffer, uint16_t offset, q15_t centre, q15_t threshold); + void processSample(q15_t sample); + void samplesToBits(uint16_t start, uint8_t count, uint8_t* buffer, uint16_t offset, q15_t centre, q15_t threshold); + void writeSamples(uint16_t start, uint8_t control); }; #endif diff --git a/DMRSlotRX.cpp b/DMRSlotRX.cpp index 3bb0482..a86f9b9 100644 --- a/DMRSlotRX.cpp +++ b/DMRSlotRX.cpp @@ -132,10 +132,6 @@ bool CDMRSlotRX::processSample(q15_t sample, uint16_t rssi) uint16_t ptr = m_endPtr - DMR_FRAME_LENGTH_SAMPLES + DMR_RADIO_SYMBOL_LENGTH + 1U; samplesToBits(ptr, DMR_FRAME_LENGTH_SYMBOLS, frame, 8U, centre, threshold); -#if defined(DUMP_SAMPLES) - if (m_control == CONTROL_DATA || m_control == CONTROL_VOICE) - writeSamples(ptr); -#endif if (m_control == CONTROL_DATA) { // Data sync @@ -154,6 +150,9 @@ bool CDMRSlotRX::processSample(q15_t sample, uint16_t rssi) case DT_DATA_HEADER: DEBUG5("DMRSlotRX: data header found slot/pos/centre/threshold", m_slot ? 2U : 1U, m_syncPtr, centre, threshold); writeRSSIData(frame); +#if defined(DUMP_SAMPLES) + writeSamples(ptr, frame[0U]); +#endif m_state = DMRRXS_DATA; m_type = 0x00U; break; @@ -163,18 +162,27 @@ bool CDMRSlotRX::processSample(q15_t sample, uint16_t rssi) if (m_state == DMRRXS_DATA) { DEBUG5("DMRSlotRX: data payload found slot/pos/centre/threshold", m_slot ? 2U : 1U, m_syncPtr, centre, threshold); writeRSSIData(frame); +#if defined(DUMP_SAMPLES) + writeSamples(ptr, frame[0U]); +#endif m_type = dataType; } break; case DT_VOICE_LC_HEADER: DEBUG5("DMRSlotRX: voice header found slot/pos/centre/threshold", m_slot ? 2U : 1U, m_syncPtr, centre, threshold); writeRSSIData(frame); +#if defined(DUMP_SAMPLES) + writeSamples(ptr, frame[0U]); +#endif m_state = DMRRXS_VOICE; break; case DT_VOICE_PI_HEADER: if (m_state == DMRRXS_VOICE) { DEBUG5("DMRSlotRX: voice pi header found slot/pos/centre/threshold", m_slot ? 2U : 1U, m_syncPtr, centre, threshold); writeRSSIData(frame); +#if defined(DUMP_SAMPLES) + writeSamples(ptr, frame[0U]); +#endif } m_state = DMRRXS_VOICE; break; @@ -182,6 +190,9 @@ bool CDMRSlotRX::processSample(q15_t sample, uint16_t rssi) if (m_state == DMRRXS_VOICE) { DEBUG5("DMRSlotRX: voice terminator found slot/pos/centre/threshold", m_slot ? 2U : 1U, m_syncPtr, centre, threshold); writeRSSIData(frame); +#if defined(DUMP_SAMPLES) + writeSamples(ptr, frame[0U]); +#endif m_state = DMRRXS_NONE; m_endPtr = NOENDPTR; } @@ -189,6 +200,9 @@ bool CDMRSlotRX::processSample(q15_t sample, uint16_t rssi) default: // DT_CSBK DEBUG5("DMRSlotRX: csbk found slot/pos/centre/threshold", m_slot ? 2U : 1U, m_syncPtr, centre, threshold); writeRSSIData(frame); +#if defined(DUMP_SAMPLES) + writeSamples(ptr, frame[0U]); +#endif m_state = DMRRXS_NONE; m_endPtr = NOENDPTR; break; @@ -198,6 +212,9 @@ bool CDMRSlotRX::processSample(q15_t sample, uint16_t rssi) // Voice sync DEBUG5("DMRSlotRX: voice sync found slot/pos/centre/threshold", m_slot ? 2U : 1U, m_syncPtr, centre, threshold); writeRSSIData(frame); +#if defined(DUMP_SAMPLES) + writeSamples(ptr, frame[0U]); +#endif m_state = DMRRXS_VOICE; m_syncCount = 0U; m_n = 0U; @@ -220,10 +237,16 @@ bool CDMRSlotRX::processSample(q15_t sample, uint16_t rssi) } serial.writeDMRData(m_slot, frame, DMR_FRAME_LENGTH_BYTES + 1U); +#if defined(DUMP_SAMPLES) + writeSamples(ptr, frame[0U]); +#endif } else if (m_state == DMRRXS_DATA) { if (m_type != 0x00U) { frame[0U] = CONTROL_DATA | m_type; writeRSSIData(frame); +#if defined(DUMP_SAMPLES) + writeSamples(ptr, frame[0U]); +#endif } } } @@ -410,7 +433,7 @@ void CDMRSlotRX::writeRSSIData(uint8_t* frame) } #if defined(DUMP_SAMPLES) -void CDMRSlotRX::writeSamples(uint16_t start) +void CDMRSlotRX::writeSamples(uint16_t start, uint8_t control) { q15_t samples[DMR_FRAME_LENGTH_SYMBOLS]; @@ -419,6 +442,6 @@ void CDMRSlotRX::writeSamples(uint16_t start) start += DMR_RADIO_SYMBOL_LENGTH; } - serial.writeSamples(STATE_DMR, samples, DMR_FRAME_LENGTH_SYMBOLS); + serial.writeSamples(STATE_DMR, control, samples, DMR_FRAME_LENGTH_SYMBOLS); } #endif diff --git a/DMRSlotRX.h b/DMRSlotRX.h index 037557d..858f223 100644 --- a/DMRSlotRX.h +++ b/DMRSlotRX.h @@ -67,7 +67,7 @@ private: void correlateSync(bool first); void samplesToBits(uint16_t start, uint8_t count, uint8_t* buffer, uint16_t offset, q15_t centre, q15_t threshold); void writeRSSIData(uint8_t* frame); - void writeSamples(uint16_t start); + void writeSamples(uint16_t start, uint8_t control); }; #endif diff --git a/P25RX.cpp b/P25RX.cpp index 7faaec2..a01f2a2 100644 --- a/P25RX.cpp +++ b/P25RX.cpp @@ -226,9 +226,6 @@ void CP25RX::processLdu(q15_t sample) uint8_t frame[P25_LDU_FRAME_LENGTH_BYTES + 3U]; samplesToBits(m_lduStartPtr, P25_LDU_FRAME_LENGTH_SYMBOLS, frame, 8U, m_centreVal, m_thresholdVal); -#if defined(DUMP_SAMPLES) - writeSamples(m_lduStartPtr); -#endif // We've not seen a data sync for too long, signal RXLOST and change to RX_NONE m_lostCount--; @@ -247,9 +244,10 @@ void CP25RX::processLdu(q15_t sample) m_maxCorr = 0; } else { frame[0U] = m_lostCount == (MAX_SYNC_FRAMES - 1U) ? 0x01U : 0x00U; - writeRSSILdu(frame); - +#if defined(DUMP_SAMPLES) + writeSamples(m_lduStartPtr, frame[0U]); +#endif m_maxCorr = 0; } } @@ -475,7 +473,7 @@ void CP25RX::writeRSSILdu(uint8_t* ldu) } #if defined(DUMP_SAMPLES) -void CP25RX::writeSamples(uint16_t start) +void CP25RX::writeSamples(uint16_t start, uint8_t control) { q15_t samples[P25_LDU_FRAME_LENGTH_SYMBOLS]; @@ -487,6 +485,6 @@ void CP25RX::writeSamples(uint16_t start) start -= P25_LDU_FRAME_LENGTH_SAMPLES; } - serial.writeSamples(STATE_P25, samples, P25_LDU_FRAME_LENGTH_SYMBOLS); + serial.writeSamples(STATE_P25, control, samples, P25_LDU_FRAME_LENGTH_SYMBOLS); } #endif diff --git a/P25RX.h b/P25RX.h index 71cc5f2..904d5a6 100644 --- a/P25RX.h +++ b/P25RX.h @@ -67,7 +67,7 @@ private: void calculateLevels(uint16_t start, uint16_t count); void samplesToBits(uint16_t start, uint16_t count, uint8_t* buffer, uint16_t offset, q15_t centre, q15_t threshold); void writeRSSILdu(uint8_t* ldu); - void writeSamples(uint16_t start); + void writeSamples(uint16_t start, uint8_t control); }; #endif diff --git a/SerialPort.cpp b/SerialPort.cpp index 58db192..9d59449 100644 --- a/SerialPort.cpp +++ b/SerialPort.cpp @@ -926,7 +926,7 @@ void CSerialPort::writeRSSIData(const uint8_t* data, uint8_t length) writeInt(1U, reply, count); } -void CSerialPort::writeSamples(uint8_t mode, const q15_t* samples, uint16_t nSamples) +void CSerialPort::writeSamples(uint8_t mode, uint8_t control, const q15_t* samples, uint16_t nSamples) { uint8_t reply[1800U]; @@ -935,8 +935,9 @@ void CSerialPort::writeSamples(uint8_t mode, const q15_t* samples, uint16_t nSam reply[2U] = MMDVM_SAMPLES; reply[5U] = mode; + reply[6U] = control; - uint16_t count = 6U; + uint16_t count = 7U; for (uint16_t i = 0U; i < nSamples; i++) { uint16_t val = uint16_t(samples[i] + 2048); diff --git a/SerialPort.h b/SerialPort.h index f7ceec6..2a3522f 100644 --- a/SerialPort.h +++ b/SerialPort.h @@ -49,7 +49,7 @@ public: void writeCalData(const uint8_t* data, uint8_t length); void writeRSSIData(const uint8_t* data, uint8_t length); - void writeSamples(uint8_t mode, const q15_t* samples, uint16_t nSamples); + void writeSamples(uint8_t mode, uint8_t control, const q15_t* samples, uint16_t nSamples); void writeDebug(const char* text); void writeDebug(const char* text, int16_t n1); diff --git a/YSFRX.cpp b/YSFRX.cpp index 4fa7fe1..bc7483b 100644 --- a/YSFRX.cpp +++ b/YSFRX.cpp @@ -182,9 +182,6 @@ void CYSFRX::processData(q15_t sample) uint8_t frame[YSF_FRAME_LENGTH_BYTES + 3U]; samplesToBits(m_startPtr, YSF_FRAME_LENGTH_SYMBOLS, frame, 8U, m_centreVal, m_thresholdVal); -#if defined(DUMP_SAMPLES) - writeSamples(m_startPtr); -#endif // We've not seen a data sync for too long, signal RXLOST and change to RX_NONE m_lostCount--; @@ -203,9 +200,10 @@ void CYSFRX::processData(q15_t sample) m_maxCorr = 0; } else { frame[0U] = m_lostCount == (MAX_SYNC_FRAMES - 1U) ? 0x01U : 0x00U; - writeRSSIData(frame); - +#if defined(DUMP_SAMPLES) + writeSamples(m_startPtr, frame[0U]); +#endif m_maxCorr = 0; } } @@ -413,7 +411,7 @@ void CYSFRX::writeRSSIData(uint8_t* data) } #if defined(DUMP_SAMPLES) -void CYSFRX::writeSamples(uint16_t start) +void CYSFRX::writeSamples(uint16_t start, uint8_t control) { q15_t samples[YSF_FRAME_LENGTH_SYMBOLS]; @@ -425,6 +423,6 @@ void CYSFRX::writeSamples(uint16_t start) start -= YSF_FRAME_LENGTH_SAMPLES; } - serial.writeSamples(STATE_YSF, samples, YSF_FRAME_LENGTH_SYMBOLS); + serial.writeSamples(STATE_YSF, control, samples, YSF_FRAME_LENGTH_SYMBOLS); } #endif diff --git a/YSFRX.h b/YSFRX.h index ebf17af..e8e7edc 100644 --- a/YSFRX.h +++ b/YSFRX.h @@ -63,7 +63,7 @@ private: void calculateLevels(uint16_t start, uint16_t count); void samplesToBits(uint16_t start, uint16_t count, uint8_t* buffer, uint16_t offset, q15_t centre, q15_t threshold); void writeRSSIData(uint8_t* data); - void writeSamples(uint16_t start); + void writeSamples(uint16_t start, uint8_t control); }; #endif