Update the Short LC in the CACH for data transmissions.

This commit is contained in:
Jonathan Naylor
2016-01-26 18:28:39 +00:00
parent c79fef5dae
commit 53d557bd57
2 changed files with 44 additions and 20 deletions

View File

@@ -34,8 +34,10 @@ unsigned char* CDMRSlot::m_idle = NULL;
FLCO CDMRSlot::m_flco1; FLCO CDMRSlot::m_flco1;
unsigned char CDMRSlot::m_id1 = 0U; unsigned char CDMRSlot::m_id1 = 0U;
bool CDMRSlot::m_voice1 = true;
FLCO CDMRSlot::m_flco2; FLCO CDMRSlot::m_flco2;
unsigned char CDMRSlot::m_id2 = 0U; unsigned char CDMRSlot::m_id2 = 0U;
bool CDMRSlot::m_voice2 = true;
// #define DUMP_DMR // #define DUMP_DMR
@@ -136,7 +138,8 @@ void CDMRSlot::writeModem(unsigned char *data)
} }
m_state = RS_RELAYING_RF_AUDIO; m_state = RS_RELAYING_RF_AUDIO;
setShortLC(m_slotNo, m_lc->getDstId(), m_lc->getFLCO());
setShortLC(m_slotNo, m_lc->getDstId(), m_lc->getFLCO(), true);
m_display->writeDMR(m_slotNo, m_lc->getSrcId(), m_lc->getFLCO() == FLCO_GROUP, m_lc->getDstId()); m_display->writeDMR(m_slotNo, m_lc->getSrcId(), m_lc->getFLCO() == FLCO_GROUP, m_lc->getDstId());
@@ -223,7 +226,7 @@ void CDMRSlot::writeModem(unsigned char *data)
m_state = RS_RELAYING_RF_DATA; m_state = RS_RELAYING_RF_DATA;
setShortLC(m_slotNo, m_lc->getDstId(), gi ? FLCO_GROUP : FLCO_USER_USER); setShortLC(m_slotNo, m_lc->getDstId(), gi ? FLCO_GROUP : FLCO_USER_USER, false);
m_display->writeDMR(m_slotNo, srcId, gi, dstId); m_display->writeDMR(m_slotNo, srcId, gi, dstId);
@@ -394,7 +397,7 @@ void CDMRSlot::writeModem(unsigned char *data)
m_state = RS_RELAYING_RF_AUDIO; m_state = RS_RELAYING_RF_AUDIO;
setShortLC(m_slotNo, m_lc->getDstId(), m_lc->getFLCO()); setShortLC(m_slotNo, m_lc->getDstId(), m_lc->getFLCO(), true);
m_display->writeDMR(m_slotNo, m_lc->getSrcId(), m_lc->getFLCO() == FLCO_GROUP, m_lc->getDstId()); m_display->writeDMR(m_slotNo, m_lc->getSrcId(), m_lc->getFLCO() == FLCO_GROUP, m_lc->getDstId());
@@ -485,7 +488,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
m_state = RS_RELAYING_NETWORK_AUDIO; m_state = RS_RELAYING_NETWORK_AUDIO;
setShortLC(m_slotNo, m_lc->getDstId(), m_lc->getFLCO()); setShortLC(m_slotNo, m_lc->getDstId(), m_lc->getFLCO(), true);
m_display->writeDMR(m_slotNo, m_lc->getSrcId(), m_lc->getFLCO() == FLCO_GROUP, m_lc->getDstId()); m_display->writeDMR(m_slotNo, m_lc->getSrcId(), m_lc->getFLCO() == FLCO_GROUP, m_lc->getDstId());
@@ -586,7 +589,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
m_state = RS_RELAYING_NETWORK_DATA; m_state = RS_RELAYING_NETWORK_DATA;
setShortLC(m_slotNo, dmrData.getDstId(), gi ? FLCO_GROUP : FLCO_USER_USER); setShortLC(m_slotNo, dmrData.getDstId(), gi ? FLCO_GROUP : FLCO_USER_USER, false);
m_display->writeDMR(m_slotNo, dmrData.getSrcId(), gi, dmrData.getDstId()); m_display->writeDMR(m_slotNo, dmrData.getSrcId(), gi, dmrData.getDstId());
@@ -611,7 +614,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
m_state = RS_RELAYING_NETWORK_AUDIO; m_state = RS_RELAYING_NETWORK_AUDIO;
setShortLC(m_slotNo, m_lc->getDstId(), m_lc->getFLCO()); setShortLC(m_slotNo, m_lc->getDstId(), m_lc->getFLCO(), true);
m_display->writeDMR(m_slotNo, m_lc->getSrcId(), m_lc->getFLCO() == FLCO_GROUP, m_lc->getDstId()); m_display->writeDMR(m_slotNo, m_lc->getSrcId(), m_lc->getFLCO() == FLCO_GROUP, m_lc->getDstId());
@@ -890,7 +893,7 @@ void CDMRSlot::init(unsigned int colorCode, CModem* modem, CHomebrewDMRIPSC* net
slotType.getData(m_idle + 2U); slotType.getData(m_idle + 2U);
} }
void CDMRSlot::setShortLC(unsigned int slotNo, unsigned int id, FLCO flco) void CDMRSlot::setShortLC(unsigned int slotNo, unsigned int id, FLCO flco, bool voice)
{ {
assert(m_modem != NULL); assert(m_modem != NULL);
@@ -898,6 +901,7 @@ void CDMRSlot::setShortLC(unsigned int slotNo, unsigned int id, FLCO flco)
case 1U: case 1U:
m_id1 = 0U; m_id1 = 0U;
m_flco1 = flco; m_flco1 = flco;
m_voice1 = voice;
if (id != 0U) { if (id != 0U) {
unsigned char buffer[3U]; unsigned char buffer[3U];
buffer[0U] = (id << 16) & 0xFFU; buffer[0U] = (id << 16) & 0xFFU;
@@ -909,6 +913,7 @@ void CDMRSlot::setShortLC(unsigned int slotNo, unsigned int id, FLCO flco)
case 2U: case 2U:
m_id2 = 0U; m_id2 = 0U;
m_flco2 = flco; m_flco2 = flco;
m_voice2 = voice;
if (id != 0U) { if (id != 0U) {
unsigned char buffer[3U]; unsigned char buffer[3U];
buffer[0U] = (id << 16) & 0xFFU; buffer[0U] = (id << 16) & 0xFFU;
@@ -930,18 +935,32 @@ void CDMRSlot::setShortLC(unsigned int slotNo, unsigned int id, FLCO flco)
if (m_id1 != 0U) { if (m_id1 != 0U) {
lc[2U] = m_id1; lc[2U] = m_id1;
if (m_voice1) {
if (m_flco1 == FLCO_GROUP) if (m_flco1 == FLCO_GROUP)
lc[1U] |= 0x80U; lc[1U] |= 0x80U;
else else
lc[1U] |= 0x90U; lc[1U] |= 0x90U;
} else {
if (m_flco1 == FLCO_GROUP)
lc[1U] |= 0xB0U;
else
lc[1U] |= 0xA0U;
}
} }
if (m_id2 != 0U) { if (m_id2 != 0U) {
lc[3U] = m_id2; lc[3U] = m_id2;
if (m_voice2) {
if (m_flco2 == FLCO_GROUP) if (m_flco2 == FLCO_GROUP)
lc[1U] |= 0x08U; lc[1U] |= 0x08U;
else else
lc[1U] |= 0x09U; lc[1U] |= 0x09U;
} else {
if (m_flco2 == FLCO_GROUP)
lc[1U] |= 0x0BU;
else
lc[1U] |= 0x0AU;
}
} }
lc[4U] = CCRC::crc8(lc, 4U); lc[4U] = CCRC::crc8(lc, 4U);
@@ -1040,6 +1059,9 @@ void CDMRSlot::insertSilence(unsigned int count)
CDMRSync sync; CDMRSync sync;
sync.addSync(data + 2U, DST_BS_AUDIO); sync.addSync(data + 2U, DST_BS_AUDIO);
} else { } else {
// Set the Embedded LC to 0x00
::memset(data + 2U + 13U, 0x00U, 5U);
// Color Code will have been set earlier // Color Code will have been set earlier
m_lastEMB.setLCSS(0U); m_lastEMB.setLCSS(0U);
m_lastEMB.getData(data + 2U); m_lastEMB.getData(data + 2U);

View File

@@ -79,8 +79,10 @@ private:
static FLCO m_flco1; static FLCO m_flco1;
static unsigned char m_id1; static unsigned char m_id1;
static bool m_voice1;
static FLCO m_flco2; static FLCO m_flco2;
static unsigned char m_id2; static unsigned char m_id2;
static bool m_voice2;
void writeQueue(const unsigned char* data); void writeQueue(const unsigned char* data);
void writeNetwork(const unsigned char* data, unsigned char dataType); void writeNetwork(const unsigned char* data, unsigned char dataType);
@@ -95,7 +97,7 @@ private:
bool insertSilence(const unsigned char* data, unsigned char seqNo); bool insertSilence(const unsigned char* data, unsigned char seqNo);
void insertSilence(unsigned int count); void insertSilence(unsigned int count);
static void setShortLC(unsigned int slotNo, unsigned int id, FLCO flco = FLCO_GROUP); static void setShortLC(unsigned int slotNo, unsigned int id, FLCO flco = FLCO_GROUP, bool voice = true);
}; };
#endif #endif