Make DMR trunking state handling order-independent.

The CSBK slot type was only encoded into the ALOHA frame inside
setColorCode(), so it took effect only if a reconfigure happened after
an ALOHA frame had already been received; on the usual command ordering
(SET_CONFIG then ALOHA) the transmitted slot type depended entirely on
the host-supplied bytes. Remember the colour code and stamp the slot
type in writeAloha() as well.

Also clear m_controlChannel when trunking is disabled, so the host has
a way to stop control channel transmission other than rebooting, and
fix a stray tab introduced in createCACH().
This commit is contained in:
Clint Chance 2026-07-12 16:45:24 -05:00
parent 90220cbb9d
commit 96061a6013
2 changed files with 15 additions and 2 deletions

View File

@ -84,7 +84,8 @@ m_frameCount(0U),
m_abortCount(), m_abortCount(),
m_abort(), m_abort(),
m_controlChannel(false), m_controlChannel(false),
m_trunking(false) m_trunking(false),
m_colorCode(0U)
{ {
::memset(m_modState, 0x00U, 16U * sizeof(q15_t)); ::memset(m_modState, 0x00U, 16U * sizeof(q15_t));
@ -227,6 +228,12 @@ uint8_t CDMRTX::writeAloha(const uint8_t* data, uint16_t length)
return 4U; return 4U;
::memcpy(m_aloha, data, length); ::memcpy(m_aloha, data, length);
// Stamp the slot type with the current colour code so that the result
// doesn't depend on the ordering of the ALOHA and SET_CONFIG commands.
CDMRSlotType slotType;
slotType.encode(m_colorCode, DT_CSBK, m_aloha);
m_controlChannel = true; m_controlChannel = true;
return 0U; return 0U;
@ -386,7 +393,7 @@ void CDMRTX::createCACH(uint8_t txSlotIndex, uint8_t rxSlotIndex)
::memcpy(m_shortLC, EMPTY_SHORT_LC, 12U); ::memcpy(m_shortLC, EMPTY_SHORT_LC, 12U);
} else { } else {
::memcpy(m_shortLC, m_newShortLC, 12U); ::memcpy(m_shortLC, m_newShortLC, 12U);
} }
} }
::memcpy(m_poBuffer, m_shortLC + m_cachPtr, 3U); ::memcpy(m_poBuffer, m_shortLC + m_cachPtr, 3U);
@ -426,6 +433,8 @@ void CDMRTX::createCACH(uint8_t txSlotIndex, uint8_t rxSlotIndex)
void CDMRTX::setColorCode(uint8_t colorCode) void CDMRTX::setColorCode(uint8_t colorCode)
{ {
m_colorCode = colorCode;
if (m_trunking) if (m_trunking)
::memcpy(m_idle, TERMINATOR_DATA, DMR_FRAME_LENGTH_BYTES); ::memcpy(m_idle, TERMINATOR_DATA, DMR_FRAME_LENGTH_BYTES);
else else
@ -458,6 +467,9 @@ uint32_t CDMRTX::getFrameCount()
void CDMRTX::setTrunking(bool trunking) void CDMRTX::setTrunking(bool trunking)
{ {
m_trunking = trunking; m_trunking = trunking;
if (!trunking)
m_controlChannel = false;
} }
#endif #endif

View File

@ -83,6 +83,7 @@ private:
bool m_abort[2U]; bool m_abort[2U];
bool m_controlChannel; bool m_controlChannel;
bool m_trunking; bool m_trunking;
uint8_t m_colorCode;
void createData(uint8_t slotIndex); void createData(uint8_t slotIndex);
void createCACH(uint8_t txSlotIndex, uint8_t rxSlotIndex); void createCACH(uint8_t txSlotIndex, uint8_t rxSlotIndex);