mirror of https://github.com/g4klx/MMDVM.git
Merge remote-tracking branch 'g4klx/nxdn' into nxdn
This commit is contained in:
commit
01b7641bd1
|
@ -43,7 +43,7 @@ const uint8_t DATA_SYNC_ERRS = 2U;
|
|||
// D-Star bit order version of 0x55 0x55 0xC8 0x7A
|
||||
const uint32_t END_SYNC_DATA = 0xAAAA135EU;
|
||||
const uint32_t END_SYNC_MASK = 0xFFFFFFFFU;
|
||||
const uint8_t END_SYNC_ERRS = 3U;
|
||||
const uint8_t END_SYNC_ERRS = 1U;
|
||||
|
||||
const uint8_t BIT_MASK_TABLE0[] = {0x7FU, 0xBFU, 0xDFU, 0xEFU, 0xF7U, 0xFBU, 0xFDU, 0xFEU};
|
||||
const uint8_t BIT_MASK_TABLE1[] = {0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U};
|
||||
|
|
23
IO.cpp
23
IO.cpp
|
@ -300,15 +300,19 @@ void CIO::process()
|
|||
dstarRX.samples(GMSKVals, rssi, RX_BLOCK_SIZE);
|
||||
}
|
||||
|
||||
if (m_p25Enable) {
|
||||
q15_t P25Vals[RX_BLOCK_SIZE];
|
||||
::arm_fir_fast_q15(&m_boxcarFilter, dcSamples, P25Vals, RX_BLOCK_SIZE);
|
||||
if (m_p25Enable || m_nxdnEnable) {
|
||||
q15_t C4FSKVals[RX_BLOCK_SIZE];
|
||||
::arm_fir_fast_q15(&m_boxcarFilter, dcSamples, C4FSKVals, RX_BLOCK_SIZE);
|
||||
|
||||
p25RX.samples(P25Vals, rssi, RX_BLOCK_SIZE);
|
||||
if (m_p25Enable)
|
||||
p25RX.samples(C4FSKVals, rssi, RX_BLOCK_SIZE);
|
||||
|
||||
if (m_nxdnEnable)
|
||||
nxdnRX.samples(C4FSKVals, rssi, RX_BLOCK_SIZE);
|
||||
}
|
||||
|
||||
// XXX YSF should use dcSamples, but DMR not
|
||||
if (m_dmrEnable || m_ysfEnable || m_nxdnEnable) {
|
||||
if (m_dmrEnable || m_ysfEnable) {
|
||||
q15_t C4FSKVals[RX_BLOCK_SIZE];
|
||||
::arm_fir_fast_q15(&m_rrcFilter, samples, C4FSKVals, RX_BLOCK_SIZE);
|
||||
|
||||
|
@ -321,9 +325,6 @@ void CIO::process()
|
|||
|
||||
if (m_ysfEnable)
|
||||
ysfRX.samples(C4FSKVals, rssi, RX_BLOCK_SIZE);
|
||||
|
||||
if (m_nxdnEnable)
|
||||
nxdnRX.samples(C4FSKVals, rssi, RX_BLOCK_SIZE);
|
||||
}
|
||||
} else if (m_modemState == STATE_DSTAR) {
|
||||
if (m_dstarEnable) {
|
||||
|
@ -363,10 +364,10 @@ void CIO::process()
|
|||
}
|
||||
} else if (m_modemState == STATE_NXDN) {
|
||||
if (m_nxdnEnable) {
|
||||
q15_t C4FSKVals[RX_BLOCK_SIZE];
|
||||
::arm_fir_fast_q15(&m_rrcFilter, dcSamples, C4FSKVals, RX_BLOCK_SIZE);
|
||||
q15_t NXDNVals[RX_BLOCK_SIZE];
|
||||
::arm_fir_fast_q15(&m_boxcarFilter, dcSamples, NXDNVals, RX_BLOCK_SIZE);
|
||||
|
||||
nxdnRX.samples(C4FSKVals, rssi, RX_BLOCK_SIZE);
|
||||
nxdnRX.samples(NXDNVals, rssi, RX_BLOCK_SIZE);
|
||||
}
|
||||
} else if (m_modemState == STATE_DSTARCAL) {
|
||||
q15_t GMSKVals[RX_BLOCK_SIZE];
|
||||
|
|
|
@ -912,7 +912,7 @@ void CIO::interrupt()
|
|||
|
||||
bool CIO::getCOSInt()
|
||||
{
|
||||
return GPIO_ReadOutputDataBit(PORT_COS, PIN_COS) == Bit_SET;
|
||||
return GPIO_ReadInputDataBit(PORT_COS, PIN_COS) == Bit_SET;
|
||||
}
|
||||
|
||||
void CIO::setLEDInt(bool on)
|
||||
|
|
|
@ -30,8 +30,8 @@ const unsigned int NXDN_FSW_LENGTH_BITS = 20U;
|
|||
const unsigned int NXDN_FSW_LENGTH_SYMBOLS = NXDN_FSW_LENGTH_BITS / 2U;
|
||||
const unsigned int NXDN_FSW_LENGTH_SAMPLES = NXDN_FSW_LENGTH_SYMBOLS * NXDN_RADIO_SYMBOL_LENGTH;
|
||||
|
||||
const uint8_t NXDN_FSW_BYTES[] = {0x0CU, 0xDFU, 0x59U};
|
||||
const uint8_t NXDN_FSW_BYTES_MASK[] = {0x0FU, 0xFFU, 0xFFU};
|
||||
const uint8_t NXDN_FSW_BYTES[] = {0xCDU, 0xF5U, 0x90U};
|
||||
const uint8_t NXDN_FSW_BYTES_MASK[] = {0xFFU, 0xFFU, 0xF0U};
|
||||
const uint8_t NXDN_FSW_BYTES_LENGTH = 3U;
|
||||
|
||||
const uint32_t NXDN_FSW_BITS = 0x000CDF59U;
|
||||
|
|
19
NXDNRX.cpp
19
NXDNRX.cpp
|
@ -23,10 +23,9 @@
|
|||
|
||||
const q15_t SCALING_FACTOR = 18750; // Q15(0.55)
|
||||
|
||||
const uint8_t MAX_FSW_BIT_START_ERRS = 2U;
|
||||
const uint8_t MAX_FSW_BIT_RUN_ERRS = 4U;
|
||||
const uint8_t MAX_FSW_BIT_ERRS = 1U;
|
||||
|
||||
const uint8_t MAX_FSW_SYMBOLS_ERRS = 3U;
|
||||
const uint8_t MAX_FSW_SYMBOLS_ERRS = 1U;
|
||||
|
||||
const uint8_t BIT_MASK_TABLE[] = {0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U};
|
||||
|
||||
|
@ -36,7 +35,7 @@ const uint8_t NOAVEPTR = 99U;
|
|||
|
||||
const uint16_t NOENDPTR = 9999U;
|
||||
|
||||
const unsigned int MAX_FSW_FRAMES = 4U + 1U;
|
||||
const unsigned int MAX_FSW_FRAMES = 5U + 1U;
|
||||
|
||||
CNXDNRX::CNXDNRX() :
|
||||
m_state(NXDNRXS_NONE),
|
||||
|
@ -256,17 +255,11 @@ bool CNXDNRX::correlateFSW()
|
|||
uint8_t sync[NXDN_FSW_BYTES_LENGTH];
|
||||
samplesToBits(startPtr, NXDN_FSW_LENGTH_SYMBOLS, sync, 0U, m_centreVal, m_thresholdVal);
|
||||
|
||||
uint8_t maxErrs;
|
||||
if (m_state == NXDNRXS_NONE)
|
||||
maxErrs = MAX_FSW_BIT_START_ERRS;
|
||||
else
|
||||
maxErrs = MAX_FSW_BIT_RUN_ERRS;
|
||||
|
||||
uint8_t errs = 0U;
|
||||
for (uint8_t i = 0U; i < NXDN_FSW_BYTES_LENGTH; i++)
|
||||
errs += countBits8((sync[i] & NXDN_FSW_BYTES_MASK[i]) ^ NXDN_FSW_BYTES[i]);
|
||||
|
||||
if (errs <= maxErrs) {
|
||||
if (errs <= MAX_FSW_BIT_ERRS) {
|
||||
m_maxCorr = corr;
|
||||
m_lostCount = MAX_FSW_FRAMES;
|
||||
m_fswPtr = m_dataPtr;
|
||||
|
@ -388,8 +381,8 @@ void CNXDNRX::writeRSSIData(uint8_t* data)
|
|||
if (m_rssiCount > 0U) {
|
||||
uint16_t rssi = m_rssiAccum / m_rssiCount;
|
||||
|
||||
data[121U] = (rssi >> 8) & 0xFFU;
|
||||
data[122U] = (rssi >> 0) & 0xFFU;
|
||||
data[49U] = (rssi >> 8) & 0xFFU;
|
||||
data[50U] = (rssi >> 0) & 0xFFU;
|
||||
|
||||
serial.writeNXDNData(data, NXDN_FRAME_LENGTH_BYTES + 3U);
|
||||
} else {
|
||||
|
|
17
NXDNTX.cpp
17
NXDNTX.cpp
|
@ -29,13 +29,13 @@ static q15_t RRC_0_2_FILTER[] = {0, 0, 0, 0, 850, 219, -720, -1548, -1795, -1172
|
|||
-4544, -1431, 1447, 3073, 3120, 1927, 237, -1172, -1795, -1548, -720, 219, 850}; // numTaps = 45, L = 5
|
||||
const uint16_t RRC_0_2_FILTER_PHASE_LEN = 9U; // phaseLength = numTaps/L
|
||||
|
||||
const q15_t NXDN_LEVELA = 1683;
|
||||
const q15_t NXDN_LEVELB = 561;
|
||||
const q15_t NXDN_LEVELC = -561;
|
||||
const q15_t NXDN_LEVELD = -1683;
|
||||
const q15_t NXDN_LEVELA = 1680;
|
||||
const q15_t NXDN_LEVELB = 560;
|
||||
const q15_t NXDN_LEVELC = -560;
|
||||
const q15_t NXDN_LEVELD = -1680;
|
||||
|
||||
const uint8_t NXDN_START_SYNC = 0x77U;
|
||||
const uint8_t NXDN_END_SYNC = 0xFFU;
|
||||
const uint8_t NXDN_PREAMBLE[] = {0x57U, 0x75U, 0xFDU};
|
||||
const uint8_t NXDN_SYNC = 0x5FU;
|
||||
|
||||
CNXDNTX::CNXDNTX() :
|
||||
m_buffer(1500U),
|
||||
|
@ -62,7 +62,10 @@ void CNXDNTX::process()
|
|||
if (m_poLen == 0U) {
|
||||
if (!m_tx) {
|
||||
for (uint16_t i = 0U; i < m_txDelay; i++)
|
||||
m_poBuffer[m_poLen++] = NXDN_START_SYNC;
|
||||
m_poBuffer[m_poLen++] = NXDN_SYNC;
|
||||
m_poBuffer[m_poLen++] = NXDN_PREAMBLE[0U];
|
||||
m_poBuffer[m_poLen++] = NXDN_PREAMBLE[1U];
|
||||
m_poBuffer[m_poLen++] = NXDN_PREAMBLE[2U];
|
||||
} else {
|
||||
for (uint8_t i = 0U; i < NXDN_FRAME_LENGTH_BYTES; i++) {
|
||||
uint8_t c = m_buffer.get();
|
||||
|
|
Loading…
Reference in New Issue