mirror of https://github.com/markqvist/MMDVM.git
Disassociate the ADC overload detection from the DCD LED.
parent
d4e56965da
commit
b8457aed4c
|
@ -48,6 +48,7 @@ m_buffer(),
|
|||
m_bitPtr(0U),
|
||||
m_dataPtr(0U),
|
||||
m_syncPtr(0U),
|
||||
m_startPtr(0U),
|
||||
m_endPtr(NOENDPTR),
|
||||
m_delayPtr(0U),
|
||||
m_maxCorr(0),
|
||||
|
@ -83,6 +84,7 @@ void CDMRSlotRX::reset()
|
|||
m_control = CONTROL_NONE;
|
||||
m_syncCount = 0U;
|
||||
m_state = DMRRXS_NONE;
|
||||
m_startPtr = 0U;
|
||||
m_endPtr = NOENDPTR;
|
||||
}
|
||||
|
||||
|
@ -92,6 +94,15 @@ bool CDMRSlotRX::processSample(q15_t sample)
|
|||
if (m_delayPtr < m_delay)
|
||||
return m_state != DMRRXS_NONE;
|
||||
|
||||
if (m_state != DMRRXS_NONE) {
|
||||
if (m_dataPtr > m_startPtr && m_dataPtr < m_endPtr)
|
||||
io.setADCDetection(true);
|
||||
else
|
||||
io.setADCDetection(false);
|
||||
} else {
|
||||
io.setADCDetection(false);
|
||||
}
|
||||
|
||||
// Ensure that the buffer doesn't overflow
|
||||
if (m_dataPtr > m_endPtr || m_dataPtr >= 900U)
|
||||
return m_state != DMRRXS_NONE;
|
||||
|
@ -285,10 +296,11 @@ void CDMRSlotRX::correlateSync(bool first)
|
|||
m_averagePtr = 0U;
|
||||
}
|
||||
|
||||
m_maxCorr = corr;
|
||||
m_control = CONTROL_DATA;
|
||||
m_syncPtr = m_dataPtr;
|
||||
m_endPtr = m_dataPtr + DMR_SLOT_TYPE_LENGTH_SAMPLES / 2U + DMR_INFO_LENGTH_SAMPLES / 2U - 1U;
|
||||
m_maxCorr = corr;
|
||||
m_control = CONTROL_DATA;
|
||||
m_syncPtr = m_dataPtr;
|
||||
m_startPtr = m_dataPtr - DMR_SLOT_TYPE_LENGTH_SAMPLES / 2U - DMR_INFO_LENGTH_SAMPLES / 2U;
|
||||
m_endPtr = m_dataPtr + DMR_SLOT_TYPE_LENGTH_SAMPLES / 2U + DMR_INFO_LENGTH_SAMPLES / 2U - 1U;
|
||||
}
|
||||
} else { // if (voice)
|
||||
uint8_t errs = 0U;
|
||||
|
@ -309,10 +321,11 @@ void CDMRSlotRX::correlateSync(bool first)
|
|||
m_averagePtr = 0U;
|
||||
}
|
||||
|
||||
m_maxCorr = corr;
|
||||
m_control = CONTROL_VOICE;
|
||||
m_syncPtr = m_dataPtr;
|
||||
m_endPtr = m_dataPtr + DMR_SLOT_TYPE_LENGTH_SAMPLES / 2U + DMR_INFO_LENGTH_SAMPLES / 2U - 1U;
|
||||
m_maxCorr = corr;
|
||||
m_control = CONTROL_VOICE;
|
||||
m_syncPtr = m_dataPtr;
|
||||
m_startPtr = m_dataPtr - DMR_SLOT_TYPE_LENGTH_SAMPLES / 2U - DMR_INFO_LENGTH_SAMPLES / 2U;
|
||||
m_endPtr = m_dataPtr + DMR_SLOT_TYPE_LENGTH_SAMPLES / 2U + DMR_INFO_LENGTH_SAMPLES / 2U - 1U;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -48,6 +48,7 @@ private:
|
|||
uint16_t m_bitPtr;
|
||||
uint16_t m_dataPtr;
|
||||
uint16_t m_syncPtr;
|
||||
uint16_t m_startPtr;
|
||||
uint16_t m_endPtr;
|
||||
uint16_t m_delayPtr;
|
||||
q31_t m_maxCorr;
|
||||
|
|
|
@ -333,7 +333,9 @@ void CDStarRX::processNone(bool bit)
|
|||
// Exact matching of the data sync bit sequence
|
||||
if (countBits32((m_patternBuffer & DATA_SYNC_MASK) ^ DATA_SYNC_DATA) == 0U) {
|
||||
DEBUG1("DStarRX: found data sync in None");
|
||||
|
||||
io.setDecode(true);
|
||||
io.setADCDetection(true);
|
||||
|
||||
#if defined(WANT_DEBUG)
|
||||
q15_t min = 16000;
|
||||
|
@ -374,6 +376,7 @@ void CDStarRX::processHeader(bool bit)
|
|||
bool ok = rxHeader(m_rxBuffer, header);
|
||||
if (ok) {
|
||||
io.setDecode(true);
|
||||
io.setADCDetection(true);
|
||||
|
||||
serial.writeDStarHeader(header, DSTAR_HEADER_LENGTH_BYTES);
|
||||
|
||||
|
@ -401,7 +404,9 @@ void CDStarRX::processData(bool bit)
|
|||
// Fuzzy matching of the end frame sequences
|
||||
if (countBits32((m_patternBuffer & END_SYNC_MASK) ^ END_SYNC_DATA) <= END_SYNC_ERRS) {
|
||||
DEBUG1("DStarRX: Found end sync in Data");
|
||||
|
||||
io.setDecode(false);
|
||||
io.setADCDetection(false);
|
||||
|
||||
serial.writeDStarEOT();
|
||||
|
||||
|
@ -440,7 +445,9 @@ void CDStarRX::processData(bool bit)
|
|||
m_dataBits--;
|
||||
if (m_dataBits == 0U) {
|
||||
DEBUG1("DStarRX: data sync timed out, lost lock");
|
||||
|
||||
io.setDecode(false);
|
||||
io.setADCDetection(false);
|
||||
|
||||
serial.writeDStarLost();
|
||||
|
||||
|
|
8
IO.cpp
8
IO.cpp
|
@ -120,6 +120,7 @@ m_txLevel(128 * 128),
|
|||
m_ledCount(0U),
|
||||
m_ledValue(true),
|
||||
m_dcd(false),
|
||||
m_detect(false),
|
||||
m_overflow(0U),
|
||||
m_overcount(0U),
|
||||
m_count(0U),
|
||||
|
@ -299,7 +300,7 @@ void CIO::process()
|
|||
m_rxBuffer.get(sample, control[i]);
|
||||
|
||||
// Detect ADC overflow
|
||||
if (m_dcd && (sample == 0U || sample == 4095U))
|
||||
if (m_detect && (sample == 0U || sample == 4095U))
|
||||
m_overflow++;
|
||||
m_overcount++;
|
||||
|
||||
|
@ -449,6 +450,11 @@ void CIO::setDecode(bool dcd)
|
|||
m_dcd = dcd;
|
||||
}
|
||||
|
||||
void CIO::setADCDetection(bool detect)
|
||||
{
|
||||
m_detect = detect;
|
||||
}
|
||||
|
||||
void CIO::setMode()
|
||||
{
|
||||
#if !defined(__MBED__)
|
||||
|
|
2
IO.h
2
IO.h
|
@ -36,6 +36,7 @@ public:
|
|||
uint16_t getSpace() const;
|
||||
|
||||
void setDecode(bool dcd);
|
||||
void setADCDetection(bool detect);
|
||||
void setMode();
|
||||
|
||||
void interrupt();
|
||||
|
@ -82,6 +83,7 @@ private:
|
|||
bool m_ledValue;
|
||||
|
||||
bool m_dcd;
|
||||
bool m_detect;
|
||||
|
||||
uint16_t m_overflow;
|
||||
uint16_t m_overcount;
|
||||
|
|
|
@ -167,7 +167,9 @@ void CYSFRX::processNone(q15_t sample)
|
|||
m_lostCount = MAX_SYNC_FRAMES;
|
||||
m_bufferPtr = YSF_SYNC_LENGTH_BITS;
|
||||
m_state = YSFRXS_DATA;
|
||||
|
||||
io.setDecode(true);
|
||||
io.setADCDetection(true);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -226,7 +228,9 @@ void CYSFRX::processData(q15_t sample)
|
|||
m_lostCount--;
|
||||
if (m_lostCount == 0U) {
|
||||
DEBUG1("YSFRX: sync timed out, lost lock");
|
||||
|
||||
io.setDecode(false);
|
||||
io.setADCDetection(false);
|
||||
|
||||
serial.writeYSFLost();
|
||||
|
||||
|
|
Loading…
Reference in New Issue