mirror of
https://github.com/g4klx/MMDVMHost
synced 2025-12-23 08:45:48 +08:00
Update the Short LC in the CACH for data transmissions.
This commit is contained in:
36
DMRSlot.cpp
36
DMRSlot.cpp
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user