diff --git a/DStarRX.cpp b/DStarRX.cpp index c606c79..4ec7199 100644 --- a/DStarRX.cpp +++ b/DStarRX.cpp @@ -259,8 +259,8 @@ m_pathMemory1(), m_pathMemory2(), m_pathMemory3(), m_fecOutput(), -m_samples(), -m_samplesPtr(0U) +m_rssiAccum(0U), +m_rssiCount(0U) { } @@ -272,13 +272,15 @@ void CDStarRX::reset() m_patternBuffer = 0x00U; m_rxBufferBits = 0U; m_dataBits = 0U; - m_samplesPtr = 0U; + m_rssiAccum = 0U; + m_rssiCount = 0U; } void CDStarRX::samples(const q15_t* samples, const uint16_t* rssi, uint8_t length) { for (uint16_t i = 0U; i < length; i++) { - m_samples[m_samplesPtr] = samples[i]; + m_rssiAccum += rssi[i]; + m_rssiCount++; bool bit = samples[i] < THRESHOLD; @@ -298,26 +300,22 @@ void CDStarRX::samples(const q15_t* samples, const uint16_t* rssi, uint8_t lengt switch (m_rxState) { case DSRXS_NONE: - processNone(bit, rssi[i]); + processNone(bit); break; case DSRXS_HEADER: - processHeader(bit, rssi[i]); + processHeader(bit); break; case DSRXS_DATA: - processData(bit, rssi[i]); + processData(bit); break; default: break; } } - - m_samplesPtr++; - if (m_samplesPtr >= DSTAR_DATA_SYNC_LENGTH_BITS) - m_samplesPtr = 0U; } } -void CDStarRX::processNone(bool bit, uint16_t rssi) +void CDStarRX::processNone(bool bit) { m_patternBuffer <<= 1; if (bit) @@ -330,6 +328,9 @@ void CDStarRX::processNone(bool bit, uint16_t rssi) ::memset(m_rxBuffer, 0x00U, DSTAR_FEC_SECTION_LENGTH_BYTES); m_rxBufferBits = 0U; + m_rssiAccum = 0U; + m_rssiCount = 0U; + m_rxState = DSRXS_HEADER; return; } @@ -341,8 +342,12 @@ void CDStarRX::processNone(bool bit, uint16_t rssi) io.setDecode(true); io.setADCDetection(true); + // Suppress RSSI on the dummy sync message + m_rssiAccum = 0U; + m_rssiCount = 0U; + ::memcpy(m_rxBuffer, DSTAR_DATA_SYNC_BYTES, DSTAR_DATA_LENGTH_BYTES); - writeRSSIData(m_rxBuffer, rssi); + writeRSSIData(m_rxBuffer); ::memset(m_rxBuffer, 0x00U, DSTAR_DATA_LENGTH_BYTES + 2U); m_rxBufferBits = 0U; @@ -353,7 +358,7 @@ void CDStarRX::processNone(bool bit, uint16_t rssi) } } -void CDStarRX::processHeader(bool bit, uint16_t rssi) +void CDStarRX::processHeader(bool bit) { m_patternBuffer <<= 1; if (bit) @@ -371,7 +376,7 @@ void CDStarRX::processHeader(bool bit, uint16_t rssi) io.setDecode(true); io.setADCDetection(true); - writeRSSIHeader(header, rssi); + writeRSSIHeader(header); ::memset(m_rxBuffer, 0x00U, DSTAR_DATA_LENGTH_BYTES + 2U); m_rxBufferBits = 0U; @@ -385,7 +390,7 @@ void CDStarRX::processHeader(bool bit, uint16_t rssi) } } -void CDStarRX::processData(bool bit, uint16_t rssi) +void CDStarRX::processData(bool bit) { m_patternBuffer <<= 1; if (bit) @@ -458,10 +463,10 @@ void CDStarRX::processData(bool bit, uint16_t rssi) m_rxBuffer[9U] = DSTAR_DATA_SYNC_BYTES[9U]; m_rxBuffer[10U] = DSTAR_DATA_SYNC_BYTES[10U]; m_rxBuffer[11U] = DSTAR_DATA_SYNC_BYTES[11U]; - writeRSSIData(m_rxBuffer, rssi); + writeRSSIData(m_rxBuffer); } else { - serial.writeDStarData(m_rxBuffer, DSTAR_DATA_LENGTH_BYTES); - } + serial.writeDStarData(m_rxBuffer, DSTAR_DATA_LENGTH_BYTES); + } // Start the next frame ::memset(m_rxBuffer, 0x00U, DSTAR_DATA_LENGTH_BYTES + 2U); @@ -469,28 +474,46 @@ void CDStarRX::processData(bool bit, uint16_t rssi) } } -void CDStarRX::writeRSSIHeader(unsigned char* header, uint16_t rssi) +void CDStarRX::writeRSSIHeader(unsigned char* header) { #if defined(SEND_RSSI_DATA) - header[41U] = (rssi >> 8) & 0xFFU; - header[42U] = (rssi >> 0) & 0xFFU; + if (m_rssiCount > 0U) { + uint16_t rssi = m_rssiAccum / m_rssiCount; - serial.writeDStarHeader(header, DSTAR_HEADER_LENGTH_BYTES + 2U); + header[41U] = (rssi >> 8) & 0xFFU; + header[42U] = (rssi >> 0) & 0xFFU; + + serial.writeDStarHeader(header, DSTAR_HEADER_LENGTH_BYTES + 2U); + } else { + serial.writeDStarHeader(header, DSTAR_HEADER_LENGTH_BYTES + 0U); + } #else serial.writeDStarHeader(header, DSTAR_HEADER_LENGTH_BYTES + 0U); #endif + + m_rssiAccum = 0U; + m_rssiCount = 0U; } -void CDStarRX::writeRSSIData(unsigned char* data, uint16_t rssi) +void CDStarRX::writeRSSIData(unsigned char* data) { #if defined(SEND_RSSI_DATA) - data[12U] = (rssi >> 8) & 0xFFU; - data[13U] = (rssi >> 0) & 0xFFU; + if (m_rssiCount > 0U) { + uint16_t rssi = m_rssiAccum / m_rssiCount; - serial.writeDStarData(data, DSTAR_DATA_LENGTH_BYTES + 2U); + data[12U] = (rssi >> 8) & 0xFFU; + data[13U] = (rssi >> 0) & 0xFFU; + + serial.writeDStarData(data, DSTAR_DATA_LENGTH_BYTES + 2U); + } else { + serial.writeDStarData(data, DSTAR_DATA_LENGTH_BYTES + 0U); + } #else serial.writeDStarData(data, DSTAR_DATA_LENGTH_BYTES + 0U); #endif + + m_rssiAccum = 0U; + m_rssiCount = 0U; } bool CDStarRX::rxHeader(uint8_t* in, uint8_t* out) diff --git a/DStarRX.h b/DStarRX.h index 5154be7..53d9bdf 100644 --- a/DStarRX.h +++ b/DStarRX.h @@ -51,14 +51,14 @@ private: unsigned int m_pathMemory2[42U]; unsigned int m_pathMemory3[42U]; uint8_t m_fecOutput[42U]; - q15_t m_samples[DSTAR_DATA_SYNC_LENGTH_BITS]; - uint8_t m_samplesPtr; + uint32_t m_rssiAccum; + uint16_t m_rssiCount; - void processNone(bool bit, uint16_t rssi); - void processHeader(bool bit, uint16_t rssi); - void processData(bool bit, uint16_t rssi); - void writeRSSIHeader(unsigned char* header, uint16_t rssi); - void writeRSSIData(unsigned char* data, uint16_t rssi); + void processNone(bool bit); + void processHeader(bool bit); + void processData(bool bit); + void writeRSSIHeader(unsigned char* header); + void writeRSSIData(unsigned char* data); bool rxHeader(uint8_t* in, uint8_t* out); void acs(int* metric); void viterbiDecode(int* data); diff --git a/P25RX.cpp b/P25RX.cpp index 071910a..1633761 100644 --- a/P25RX.cpp +++ b/P25RX.cpp @@ -55,7 +55,9 @@ m_bufferPtr(0U), m_symbolPtr(0U), m_lostCount(0U), m_centre(0), -m_threshold(0) +m_threshold(0), +m_rssiAccum(0U), +m_rssiCount(0U) { m_buffer = m_outBuffer + 1U; } @@ -71,11 +73,16 @@ void CP25RX::reset() m_lostCount = 0U; m_centre = 0; m_threshold = 0; + m_rssiAccum = 0U; + m_rssiCount = 0U; } void CP25RX::samples(const q15_t* samples, const uint16_t* rssi, uint8_t length) { for (uint16_t i = 0U; i < length; i++) { + m_rssiAccum += rssi[i]; + m_rssiCount++; + bool bit = samples[i] < 0; if (bit != m_prev) { @@ -95,7 +102,7 @@ void CP25RX::samples(const q15_t* samples, const uint16_t* rssi, uint8_t length) if (m_state == P25RXS_NONE) processNone(samples[i]); else - processData(samples[i], rssi[i]); + processData(samples[i]); } } } @@ -162,6 +169,8 @@ void CP25RX::processNone(q15_t sample) m_lostCount = MAX_SYNC_FRAMES; m_bufferPtr = P25_SYNC_LENGTH_BITS; m_state = P25RXS_DATA; + m_rssiAccum = 0U; + m_rssiCount = 0U; io.setDecode(true); io.setADCDetection(true); @@ -173,7 +182,7 @@ void CP25RX::processNone(q15_t sample) m_symbolPtr = 0U; } -void CP25RX::processData(q15_t sample, uint16_t rssi) +void CP25RX::processData(q15_t sample) { sample -= m_centre; @@ -216,6 +225,9 @@ void CP25RX::processData(q15_t sample, uint16_t rssi) m_outBuffer[0U] = 0x01U; serial.writeP25Hdr(m_outBuffer, P25_HDR_FRAME_LENGTH_BYTES + 1U); + m_rssiAccum = 0U; + m_rssiCount = 0U; + // Restore the sync that's now in the wrong place for (uint8_t i = 0U; i < P25_SYNC_LENGTH_BYTES; i++) m_buffer[i] = P25_SYNC_BYTES[i]; @@ -251,7 +263,7 @@ void CP25RX::processData(q15_t sample, uint16_t rssi) } else { m_outBuffer[0U] = m_lostCount == (MAX_SYNC_FRAMES - 1U) ? 0x01U : 0x00U; - writeRSSILdu(m_outBuffer, rssi); + writeRSSILdu(m_outBuffer); // Start the next frame ::memset(m_outBuffer, 0x00U, P25_LDU_FRAME_LENGTH_BYTES + 3U); @@ -260,14 +272,23 @@ void CP25RX::processData(q15_t sample, uint16_t rssi) } } -void CP25RX::writeRSSILdu(uint8_t* ldu, uint16_t rssi) +void CP25RX::writeRSSILdu(uint8_t* ldu) { #if defined(SEND_RSSI_DATA) - ldu[216U] = (rssi >> 8) & 0xFFU; - ldu[217U] = (rssi >> 0) & 0xFFU; + if (m_rssiCount > 0U) { + uint16_t rssi = m_rssiAccum / m_rssiCount; - serial.writeP25Ldu(ldu, P25_LDU_FRAME_LENGTH_BYTES + 3U); + ldu[216U] = (rssi >> 8) & 0xFFU; + ldu[217U] = (rssi >> 0) & 0xFFU; + + serial.writeP25Ldu(ldu, P25_LDU_FRAME_LENGTH_BYTES + 3U); + } else { + serial.writeP25Ldu(ldu, P25_LDU_FRAME_LENGTH_BYTES + 1U); + } #else serial.writeP25Ldu(ldu, P25_LDU_FRAME_LENGTH_BYTES + 1U); #endif + + m_rssiAccum = 0U; + m_rssiCount = 0U; } diff --git a/P25RX.h b/P25RX.h index f68fe93..a9a7ca4 100644 --- a/P25RX.h +++ b/P25RX.h @@ -49,10 +49,12 @@ private: uint16_t m_lostCount; q15_t m_centre; q15_t m_threshold; + uint32_t m_rssiAccum; + uint16_t m_rssiCount; void processNone(q15_t sample); - void processData(q15_t sample, uint16_t rssi); - void writeRSSILdu(uint8_t* data, uint16_t rssi); + void processData(q15_t sample); + void writeRSSILdu(uint8_t* data); }; #endif diff --git a/YSFRX.cpp b/YSFRX.cpp index cb54e23..2d85c84 100644 --- a/YSFRX.cpp +++ b/YSFRX.cpp @@ -55,7 +55,9 @@ m_bufferPtr(0U), m_symbolPtr(0U), m_lostCount(0U), m_centre(0), -m_threshold(0) +m_threshold(0), +m_rssiAccum(0U), +m_rssiCount(0U) { m_buffer = m_outBuffer + 1U; } @@ -71,11 +73,16 @@ void CYSFRX::reset() m_lostCount = 0U; m_centre = 0; m_threshold = 0; + m_rssiAccum = 0U; + m_rssiCount = 0U; } void CYSFRX::samples(const q15_t* samples, const uint16_t* rssi, uint8_t length) { for (uint16_t i = 0U; i < length; i++) { + m_rssiAccum += rssi[i]; + m_rssiCount++; + bool bit = samples[i] < 0; if (bit != m_prev) { @@ -95,7 +102,7 @@ void CYSFRX::samples(const q15_t* samples, const uint16_t* rssi, uint8_t length) if (m_state == YSFRXS_NONE) processNone(samples[i]); else - processData(samples[i], rssi[i]); + processData(samples[i]); } } } @@ -162,6 +169,8 @@ void CYSFRX::processNone(q15_t sample) m_lostCount = MAX_SYNC_FRAMES; m_bufferPtr = YSF_SYNC_LENGTH_BITS; m_state = YSFRXS_DATA; + m_rssiAccum = 0U; + m_rssiCount = 0U; io.setDecode(true); io.setADCDetection(true); @@ -173,7 +182,7 @@ void CYSFRX::processNone(q15_t sample) m_symbolPtr = 0U; } -void CYSFRX::processData(q15_t sample, uint16_t rssi) +void CYSFRX::processData(q15_t sample) { sample -= m_centre; @@ -233,7 +242,7 @@ void CYSFRX::processData(q15_t sample, uint16_t rssi) } else { m_outBuffer[0U] = m_lostCount == (MAX_SYNC_FRAMES - 1U) ? 0x01U : 0x00U; - writeRSSIData(m_outBuffer, rssi); + writeRSSIData(m_outBuffer); // Start the next frame ::memset(m_outBuffer, 0x00U, YSF_FRAME_LENGTH_BYTES + 3U); @@ -242,14 +251,23 @@ void CYSFRX::processData(q15_t sample, uint16_t rssi) } } -void CYSFRX::writeRSSIData(uint8_t* data, uint16_t rssi) +void CYSFRX::writeRSSIData(uint8_t* data) { #if defined(SEND_RSSI_DATA) - data[120U] = (rssi >> 8) & 0xFFU; - data[121U] = (rssi >> 0) & 0xFFU; + if (m_rssiCount > 0U) { + uint16_t rssi = m_rssiAccum / m_rssiCount; - serial.writeYSFData(data, YSF_FRAME_LENGTH_BYTES + 3U); + data[120U] = (rssi >> 8) & 0xFFU; + data[121U] = (rssi >> 0) & 0xFFU; + + serial.writeYSFData(data, YSF_FRAME_LENGTH_BYTES + 3U); + } else { + serial.writeYSFData(data, YSF_FRAME_LENGTH_BYTES + 1U); + } #else serial.writeYSFData(data, YSF_FRAME_LENGTH_BYTES + 1U); #endif + + m_rssiAccum = 0U; + m_rssiCount = 0U; } diff --git a/YSFRX.h b/YSFRX.h index 5f18993..0bdac7a 100644 --- a/YSFRX.h +++ b/YSFRX.h @@ -49,10 +49,12 @@ private: uint16_t m_lostCount; q15_t m_centre; q15_t m_threshold; + uint32_t m_rssiAccum; + uint16_t m_rssiCount; void processNone(q15_t sample); - void processData(q15_t sample, uint16_t rssi); - void writeRSSIData(unsigned char* data, uint16_t rssi); + void processData(q15_t sample); + void writeRSSIData(unsigned char* data); }; #endif