Handle group transmissions of Preamble CSBKs.
This commit is contained in:
parent
2cfb1f458e
commit
3f61e9a287
|
@ -28,6 +28,7 @@ CDMRCSBK::CDMRCSBK() :
|
|||
m_data(NULL),
|
||||
m_CSBKO(CSBKO_NONE),
|
||||
m_FID(0x00U),
|
||||
m_GI(false),
|
||||
m_bsId(0U),
|
||||
m_srcId(0U),
|
||||
m_dstId(0U)
|
||||
|
@ -81,6 +82,7 @@ bool CDMRCSBK::put(const unsigned char* bytes)
|
|||
break;
|
||||
|
||||
case CSBKO_PRECCSBK:
|
||||
m_GI = (m_data[2U] & 0x40U) == 0x40U;
|
||||
m_dstId = m_data[4U] << 16 | m_data[5U] << 8 | m_data[6U];
|
||||
m_srcId = m_data[7U] << 16 | m_data[8U] << 8 | m_data[9U];
|
||||
CUtils::dump(1U, "Preamble CSBK", m_data, 12U);
|
||||
|
@ -118,6 +120,11 @@ unsigned char CDMRCSBK::getFID() const
|
|||
return m_FID;
|
||||
}
|
||||
|
||||
bool CDMRCSBK::getGI() const
|
||||
{
|
||||
return m_GI;
|
||||
}
|
||||
|
||||
unsigned int CDMRCSBK::getBSId() const
|
||||
{
|
||||
return m_bsId;
|
||||
|
|
|
@ -48,6 +48,9 @@ public:
|
|||
// For BS Dwn Act
|
||||
unsigned int getBSId() const;
|
||||
|
||||
// For Pre
|
||||
bool getGI() const;
|
||||
|
||||
unsigned int getSrcId() const;
|
||||
unsigned int getDstId() const;
|
||||
|
||||
|
@ -55,6 +58,7 @@ private:
|
|||
unsigned char* m_data;
|
||||
CSBKO m_CSBKO;
|
||||
unsigned char m_FID;
|
||||
bool m_GI;
|
||||
unsigned int m_bsId;
|
||||
unsigned int m_srcId;
|
||||
unsigned int m_dstId;
|
||||
|
|
40
DMRSlot.cpp
40
DMRSlot.cpp
|
@ -124,7 +124,7 @@ void CDMRSlot::writeModem(unsigned char *data)
|
|||
CDMRFullLC fullLC;
|
||||
m_rfLC = fullLC.decode(data + 2U, DT_VOICE_LC_HEADER);
|
||||
if (m_rfLC == NULL) {
|
||||
LogMessage("DMR Slot %u: unable to decode the RF LC", m_slotNo);
|
||||
LogMessage("DMR Slot %u, unable to decode the RF LC", m_slotNo);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -222,7 +222,7 @@ void CDMRSlot::writeModem(unsigned char *data)
|
|||
CDMRDataHeader dataHeader;
|
||||
bool valid = dataHeader.put(data + 2U);
|
||||
if (!valid) {
|
||||
LogMessage("DMR Slot %u: unable to decode the RF data header", m_slotNo);
|
||||
LogMessage("DMR Slot %u, unable to decode the RF data header", m_slotNo);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -266,7 +266,7 @@ void CDMRSlot::writeModem(unsigned char *data)
|
|||
CDMRCSBK csbk;
|
||||
bool valid = csbk.put(data + 2U);
|
||||
if (!valid) {
|
||||
LogMessage("DMR Slot %u: unable to decode the RF CSBK", m_slotNo);
|
||||
LogMessage("DMR Slot %u, unable to decode the RF CSBK", m_slotNo);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -274,6 +274,10 @@ void CDMRSlot::writeModem(unsigned char *data)
|
|||
if (csbko == CSBKO_BSDWNACT)
|
||||
return;
|
||||
|
||||
bool gi = csbk.getGI();
|
||||
unsigned int srcId = csbk.getSrcId();
|
||||
unsigned int dstId = csbk.getDstId();
|
||||
|
||||
// Regenerate the CSBK data
|
||||
csbk.get(data + 2U);
|
||||
|
||||
|
@ -291,27 +295,27 @@ void CDMRSlot::writeModem(unsigned char *data)
|
|||
if (m_duplex)
|
||||
writeQueueRF(data);
|
||||
|
||||
writeNetworkRF(data, DT_CSBK, FLCO_USER_USER, csbk.getSrcId(), csbk.getDstId());
|
||||
writeNetworkRF(data, DT_CSBK, gi ? FLCO_GROUP : FLCO_USER_USER, srcId, dstId);
|
||||
|
||||
switch (csbko) {
|
||||
case CSBKO_UUVREQ:
|
||||
LogMessage("DMR Slot %u, received RF Unit to Unit Voice Service Request CSBK from %u to %u", m_slotNo, csbk.getSrcId(), csbk.getDstId());
|
||||
LogMessage("DMR Slot %u, received RF Unit to Unit Voice Service Request CSBK from %u to %u", m_slotNo, srcId, dstId);
|
||||
break;
|
||||
case CSBKO_UUANSRSP:
|
||||
LogMessage("DMR Slot %u, received RF Unit to Unit Voice Service Answer Response CSBK from %u to %u", m_slotNo, csbk.getSrcId(), csbk.getDstId());
|
||||
LogMessage("DMR Slot %u, received RF Unit to Unit Voice Service Answer Response CSBK from %u to %u", m_slotNo, srcId, dstId);
|
||||
break;
|
||||
case CSBKO_NACKRSP:
|
||||
LogMessage("DMR Slot %u, received RF Negative Acknowledgment Response CSBK from %u to %u", m_slotNo, csbk.getSrcId(), csbk.getDstId());
|
||||
LogMessage("DMR Slot %u, received RF Negative Acknowledgment Response CSBK from %u to %u", m_slotNo, srcId, dstId);
|
||||
break;
|
||||
case CSBKO_PRECCSBK:
|
||||
LogMessage("DMR Slot %u, received RF Preamble CSBK from %u to %u", m_slotNo, csbk.getSrcId(), csbk.getDstId());
|
||||
LogMessage("DMR Slot %u, received RF Preamble CSBK from %u to %s%u", m_slotNo, srcId, gi ? "TG" : "", dstId);
|
||||
break;
|
||||
default:
|
||||
LogWarning("DMR Slot %u, unhandled RF CSBK type - 0x%02X", m_slotNo, csbko);
|
||||
break;
|
||||
}
|
||||
} else if (dataType == DT_RATE_12_DATA || dataType == DT_RATE_34_DATA || dataType == DT_RATE_1_DATA) {
|
||||
if (m_rfState != RS_RF_DATA)
|
||||
if (m_rfState != RS_RF_DATA || m_rfFrames == 0U)
|
||||
return;
|
||||
|
||||
// Regenerate and display the payload
|
||||
|
@ -757,7 +761,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
|||
CDMRDataHeader dataHeader;
|
||||
bool valid = dataHeader.put(data + 2U);
|
||||
if (!valid) {
|
||||
LogMessage("DMR Slot %u: unable to decode the network data header", m_slotNo);
|
||||
LogMessage("DMR Slot %u, unable to decode the network data header", m_slotNo);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -918,7 +922,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
|||
CDMRCSBK csbk;
|
||||
bool valid = csbk.put(data + 2U);
|
||||
if (!valid) {
|
||||
LogMessage("DMR Slot %u: unable to decode the network CSBK", m_slotNo);
|
||||
LogMessage("DMR Slot %u, unable to decode the network CSBK", m_slotNo);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -926,6 +930,10 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
|||
if (csbko == CSBKO_BSDWNACT)
|
||||
return;
|
||||
|
||||
bool gi = csbk.getGI();
|
||||
unsigned int srcId = csbk.getSrcId();
|
||||
unsigned int dstId = csbk.getDstId();
|
||||
|
||||
// Regenerate the CSBK data
|
||||
csbk.get(data + 2U);
|
||||
|
||||
|
@ -951,23 +959,23 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
|||
|
||||
switch (csbko) {
|
||||
case CSBKO_UUVREQ:
|
||||
LogMessage("DMR Slot %u, received network Unit to Unit Voice Service Request CSBK from %u to %u", m_slotNo, csbk.getSrcId(), csbk.getDstId());
|
||||
LogMessage("DMR Slot %u, received network Unit to Unit Voice Service Request CSBK from %u to %u", m_slotNo, srcId, dstId);
|
||||
break;
|
||||
case CSBKO_UUANSRSP:
|
||||
LogMessage("DMR Slot %u, received network Unit to Unit Voice Service Answer Response CSBK from %u to %u", m_slotNo, csbk.getSrcId(), csbk.getDstId());
|
||||
LogMessage("DMR Slot %u, received network Unit to Unit Voice Service Answer Response CSBK from %u to %u", m_slotNo, srcId, dstId);
|
||||
break;
|
||||
case CSBKO_NACKRSP:
|
||||
LogMessage("DMR Slot %u, received network Negative Acknowledgment Response CSBK from %u to %u", m_slotNo, csbk.getSrcId(), csbk.getDstId());
|
||||
LogMessage("DMR Slot %u, received network Negative Acknowledgment Response CSBK from %u to %u", m_slotNo, srcId, dstId);
|
||||
break;
|
||||
case CSBKO_PRECCSBK:
|
||||
LogMessage("DMR Slot %u, received network Preamble CSBK from %u to %u", m_slotNo, csbk.getSrcId(), csbk.getDstId());
|
||||
LogMessage("DMR Slot %u, received network Preamble CSBK from %u to %s%u", m_slotNo, srcId, gi ? "TG" : "", dstId);
|
||||
break;
|
||||
default:
|
||||
LogWarning("DMR Slot %u, unhandled network CSBK type - 0x%02X", m_slotNo, csbko);
|
||||
break;
|
||||
}
|
||||
} else if (dataType == DT_RATE_12_DATA || dataType == DT_RATE_34_DATA || dataType == DT_RATE_1_DATA) {
|
||||
if (m_netState != RS_NET_DATA)
|
||||
if (m_netState != RS_NET_DATA || m_netFrames == 0U)
|
||||
return;
|
||||
|
||||
// Regenerate and display the payload
|
||||
|
|
Loading…
Reference in a new issue