Handle group transmissions of Preamble CSBKs.

This commit is contained in:
Jonathan Naylor 2016-03-14 21:22:09 +00:00
parent 2cfb1f458e
commit 3f61e9a287
3 changed files with 35 additions and 16 deletions

View file

@ -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;

View file

@ -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;

View file

@ -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