From 2f9eb3523dd763bdfc684bb4231680469f1eafd5 Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Mon, 20 Feb 2017 21:35:23 +0000 Subject: [PATCH] Add full frame dumping. --- DMRDMORX.cpp | 31 ++++++++++++++++++++++++++----- DMRDMORX.h | 4 ++-- DMRSlotRX.cpp | 30 ++++++++++++++++++++++++------ DMRSlotRX.h | 4 ++-- P25RX.cpp | 34 +++++++++++++++++++++++++++------- P25RX.h | 3 ++- SerialPort.cpp | 32 +++++++++++++++++++++++++++++--- SerialPort.h | 3 ++- YSFRX.cpp | 30 +++++++++++++++++++++++++----- YSFRX.h | 3 ++- 10 files changed, 141 insertions(+), 33 deletions(-) diff --git a/DMRDMORX.cpp b/DMRDMORX.cpp index 9541249..aff6ef3 100644 --- a/DMRDMORX.cpp +++ b/DMRDMORX.cpp @@ -18,7 +18,8 @@ #define WANT_DEBUG -// #define DUMP_SAMPLES +// #define DUMP_SYNC_SAMPLES +#define DUMP_SAMPLES #include "Config.h" #include "Globals.h" @@ -129,9 +130,13 @@ 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_SYNC_SAMPLES) + if (m_control == CONTROL_DATA || m_control == CONTROL_VOICE) + writeSyncSamples(); +#endif #if defined(DUMP_SAMPLES) if (m_control == CONTROL_DATA || m_control == CONTROL_VOICE) - writeSync(); + writeSamples(ptr); #endif if (m_control == CONTROL_DATA) { @@ -432,8 +437,8 @@ void CDMRDMORX::writeRSSIData(uint8_t* frame) #endif } -#if defined(DUMP_SAMPLES) -void CDMRDMORX::writeSync() +#if defined(DUMP_SYNC_SAMPLES) +void CDMRDMORX::writeSyncSamples() { uint16_t ptr = m_syncPtr + DMO_BUFFER_LENGTH_SAMPLES - DMR_SYNC_LENGTH_SAMPLES + DMR_RADIO_SYMBOL_LENGTH; if (ptr >= DMO_BUFFER_LENGTH_SAMPLES) @@ -449,7 +454,23 @@ void CDMRDMORX::writeSync() ptr -= DMO_BUFFER_LENGTH_SAMPLES; } - serial.writeSamples(STATE_DMR, sync, DMR_SYNC_LENGTH_SYMBOLS); + serial.writeSyncSamples(STATE_DMR, sync, DMR_SYNC_LENGTH_SYMBOLS); } #endif +#if defined(DUMP_SAMPLES) +void CDMRDMORX::writeSamples(uint16_t start) +{ + 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 >= DMO_BUFFER_LENGTH_SAMPLES) + start -= DMO_BUFFER_LENGTH_SAMPLES; + } + + serial.writeSamples(STATE_DMR, samples, DMR_FRAME_LENGTH_SYMBOLS); +} +#endif diff --git a/DMRDMORX.h b/DMRDMORX.h index 8fd209a..74803d2 100644 --- a/DMRDMORX.h +++ b/DMRDMORX.h @@ -64,8 +64,8 @@ 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 writeSync(); + void writeSyncSamples(); + void writeSamples(uint16_t start); }; #endif - diff --git a/DMRSlotRX.cpp b/DMRSlotRX.cpp index 4986025..812d86c 100644 --- a/DMRSlotRX.cpp +++ b/DMRSlotRX.cpp @@ -18,7 +18,8 @@ #define WANT_DEBUG -// #define DUMP_SAMPLES +// #define DUMP_SYNC_SAMPLES +#define DUMP_SAMPLES #include "Config.h" #include "Globals.h" @@ -132,11 +133,15 @@ 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_SYNC_SAMPLES) + if (m_control == CONTROL_DATA || m_control == CONTROL_VOICE) + writeSyncSamples(); +#endif #if defined(DUMP_SAMPLES) if (m_control == CONTROL_DATA || m_control == CONTROL_VOICE) - writeSync(); + writeSamples(ptr); #endif - + if (m_control == CONTROL_DATA) { // Data sync uint8_t colorCode; @@ -409,8 +414,8 @@ void CDMRSlotRX::writeRSSIData(uint8_t* frame) #endif } -#if defined(DUMP_SAMPLES) -void CDMRSlotRX::writeSync() +#if defined(DUMP_SYNC_SAMPLES) +void CDMRSlotRX::writeSyncSamples() { uint16_t ptr = m_syncPtr - DMR_SYNC_LENGTH_SAMPLES + DMR_RADIO_SYMBOL_LENGTH; @@ -421,7 +426,20 @@ void CDMRSlotRX::writeSync() ptr += DMR_RADIO_SYMBOL_LENGTH; } - serial.writeSamples(STATE_DMR, sync, DMR_SYNC_LENGTH_SYMBOLS); + serial.writeSyncSamples(STATE_DMR, sync, DMR_SYNC_LENGTH_SYMBOLS); } #endif +#if defined(DUMP_SAMPLES) +void CDMRSlotRX::writeSamples(uint16_t start) +{ + 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; + } + + serial.writeSamples(STATE_DMR, samples, DMR_FRAME_LENGTH_SYMBOLS); +} +#endif diff --git a/DMRSlotRX.h b/DMRSlotRX.h index 904ed90..df4c0cd 100644 --- a/DMRSlotRX.h +++ b/DMRSlotRX.h @@ -67,8 +67,8 @@ 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 writeSync(); + void writeSyncSamples(); + void writeSamples(uint16_t start); }; #endif - diff --git a/P25RX.cpp b/P25RX.cpp index 590749b..3f384fa 100644 --- a/P25RX.cpp +++ b/P25RX.cpp @@ -18,7 +18,8 @@ #define WANT_DEBUG -#define DUMP_SAMPLES +// #define DUMP_SYNC_SAMPLES +#define DUMP_SAMPLES #include "Config.h" #include "Globals.h" @@ -180,8 +181,8 @@ void CP25RX::processHdr(q15_t sample) uint8_t frame[P25_HDR_FRAME_LENGTH_BYTES + 1U]; samplesToBits(m_hdrStartPtr, P25_HDR_FRAME_LENGTH_SYMBOLS, frame, 8U, m_centreVal, m_thresholdVal); -#if defined(DUMP_SAMPLES) - writeSync(m_hdrStartPtr); +#if defined(DUMP_SYNC_SAMPLES) + writeSyncSamples(m_hdrStartPtr); #endif frame[0U] = 0x01U; @@ -229,8 +230,11 @@ 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_SYNC_SAMPLES) + writeSyncSamples(m_lduStartPtr); +#endif #if defined(DUMP_SAMPLES) - writeSync(m_lduStartPtr); + writeSamples(m_lduStartPtr); #endif // We've not seen a data sync for too long, signal RXLOST and change to RX_NONE @@ -477,8 +481,8 @@ void CP25RX::writeRSSILdu(uint8_t* ldu) m_rssiCount = 0U; } -#if defined(DUMP_SAMPLES) -void CP25RX::writeSync(uint16_t start) +#if defined(DUMP_SYNC_SAMPLES) +void CP25RX::writeSyncSamples(uint16_t start) { q15_t sync[P25_SYNC_LENGTH_SYMBOLS]; @@ -490,7 +494,23 @@ void CP25RX::writeSync(uint16_t start) start -= P25_LDU_FRAME_LENGTH_SAMPLES; } - serial.writeSamples(STATE_P25, sync, P25_SYNC_LENGTH_SYMBOLS); + serial.writeSyncSamples(STATE_P25, sync, P25_SYNC_LENGTH_SYMBOLS); } #endif +#if defined(DUMP_SAMPLES) +void CP25RX::writeSamples(uint16_t start) +{ + q15_t samples[P25_LDU_FRAME_LENGTH_SYMBOLS]; + + for (uint16_t i = 0U; i < P25_LDU_FRAME_LENGTH_SYMBOLS; i++) { + samples[i] = m_buffer[start]; + + start += P25_RADIO_SYMBOL_LENGTH; + if (start >= P25_LDU_FRAME_LENGTH_SAMPLES) + start -= P25_LDU_FRAME_LENGTH_SAMPLES; + } + + serial.writeSamples(STATE_P25, samples, P25_LDU_FRAME_LENGTH_SYMBOLS); +} +#endif diff --git a/P25RX.h b/P25RX.h index a34965b..6524e77 100644 --- a/P25RX.h +++ b/P25RX.h @@ -67,7 +67,8 @@ 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 writeSync(uint16_t start); + void writeSyncSamples(uint16_t start); + void writeSamples(uint16_t start); }; #endif diff --git a/SerialPort.cpp b/SerialPort.cpp index c54d524..f841f03 100644 --- a/SerialPort.cpp +++ b/SerialPort.cpp @@ -62,7 +62,8 @@ const uint8_t MMDVM_NAK = 0x7FU; const uint8_t MMDVM_SERIAL = 0x80U; -const uint8_t MMDVM_SAMPLES = 0xF0U; +const uint8_t MMDVM_SAMPLES = 0xEFU; +const uint8_t MMDVM_SYNC_SAMPLES = 0xF0U; const uint8_t MMDVM_DEBUG1 = 0xF1U; const uint8_t MMDVM_DEBUG2 = 0xF2U; @@ -70,6 +71,7 @@ const uint8_t MMDVM_DEBUG3 = 0xF3U; const uint8_t MMDVM_DEBUG4 = 0xF4U; const uint8_t MMDVM_DEBUG5 = 0xF5U; + #if defined(EXTERNAL_OSC) const uint8_t HARDWARE[] = "MMDVM 20170206 TCXO (D-Star/DMR/System Fusion/P25/RSSI/CW Id)"; #else @@ -925,13 +927,13 @@ void CSerialPort::writeRSSIData(const uint8_t* data, uint8_t length) writeInt(1U, reply, count); } -void CSerialPort::writeSamples(unsigned char mode, const q15_t* samples, unsigned char nSamples) +void CSerialPort::writeSyncSamples(uint8_t mode, const q15_t* samples, uint8_t nSamples) { uint8_t reply[130U]; reply[0U] = MMDVM_FRAME_START; reply[1U] = 0U; - reply[2U] = MMDVM_SAMPLES; + reply[2U] = MMDVM_SYNC_SAMPLES; reply[3U] = mode; @@ -948,6 +950,30 @@ void CSerialPort::writeSamples(unsigned char mode, const q15_t* samples, unsigne writeInt(1U, reply, count, true); } +void CSerialPort::writeSamples(uint8_t mode, const q15_t* samples, uint16_t nSamples) +{ + uint8_t reply[1800U]; + + reply[0U] = MMDVM_FRAME_START; + reply[1U] = 0U; + reply[2U] = MMDVM_SAMPLES; + + reply[5U] = mode; + + uint16_t count = 6U; + for (uint16_t i = 0U; i < nSamples; i++) { + uint16_t val = uint16_t(samples[i] + 2048); + + reply[count++] = (val >> 8) & 0xFF; + reply[count++] = (val >> 0) & 0xFF; + } + + reply[3U] = (count >> 8) & 0xFFU; + reply[4U] = (count >> 0) & 0xFFU; + + writeInt(1U, reply, count, true); +} + void CSerialPort::writeDebug(const char* text) { uint8_t reply[130U]; diff --git a/SerialPort.h b/SerialPort.h index b870ac8..c99e9ba 100644 --- a/SerialPort.h +++ b/SerialPort.h @@ -49,7 +49,8 @@ public: void writeCalData(const uint8_t* data, uint8_t length); void writeRSSIData(const uint8_t* data, uint8_t length); - void writeSamples(unsigned char mode, const q15_t* samples, unsigned char nSamples); + void writeSyncSamples(uint8_t mode, const q15_t* samples, uint8_t nSamples); + void writeSamples(uint8_t mode, 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 64d88d5..d9936b8 100644 --- a/YSFRX.cpp +++ b/YSFRX.cpp @@ -18,7 +18,8 @@ #define WANT_DEBUG -#define DUMP_SAMPLES +// #define DUMP_SYNC_SAMPLES +#define DUMP_SAMPLES #include "Config.h" #include "Globals.h" @@ -182,8 +183,11 @@ 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_SYNC_SAMPLES) + writeSyncSamples(m_startPtr); +#endif #if defined(DUMP_SAMPLES) - writeSync(m_startPtr); + writeSamples(m_startPtr); #endif // We've not seen a data sync for too long, signal RXLOST and change to RX_NONE @@ -412,8 +416,8 @@ void CYSFRX::writeRSSIData(uint8_t* data) m_rssiCount = 0U; } -#if defined(DUMP_SAMPLES) -void CYSFRX::writeSync(uint16_t start) +#if defined(DUMP_SYNC_SAMPLES) +void CYSFRX::writeSyncSamples(uint16_t start) { q15_t sync[YSF_SYNC_LENGTH_SYMBOLS]; @@ -425,7 +429,23 @@ void CYSFRX::writeSync(uint16_t start) start -= YSF_FRAME_LENGTH_SAMPLES; } - serial.writeSamples(STATE_YSF, sync, YSF_SYNC_LENGTH_SYMBOLS); + serial.writeSyncSamples(STATE_YSF, sync, YSF_SYNC_LENGTH_SYMBOLS); } #endif +#if defined(DUMP_SAMPLES) +void CYSFRX::writeSamples(uint16_t start) +{ + q15_t samples[YSF_FRAME_LENGTH_SYMBOLS]; + + for (uint16_t i = 0U; i < YSF_FRAME_LENGTH_SYMBOLS; i++) { + samples[i] = m_buffer[start]; + + start += YSF_RADIO_SYMBOL_LENGTH; + if (start >= YSF_FRAME_LENGTH_SAMPLES) + start -= YSF_FRAME_LENGTH_SAMPLES; + } + + serial.writeSamples(STATE_YSF, samples, YSF_FRAME_LENGTH_SYMBOLS); +} +#endif diff --git a/YSFRX.h b/YSFRX.h index 870daab..1b282e5 100644 --- a/YSFRX.h +++ b/YSFRX.h @@ -63,7 +63,8 @@ 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 writeSync(uint16_t start); + void writeSyncSamples(uint16_t start); + void writeSamples(uint16_t start); }; #endif