fix incorrect handling of activity type for payload channel;

pull/24/head
Bryan Biedenkapp 3 years ago
parent 72b6fc443c
commit 87d26b04fb

@ -420,7 +420,8 @@ Slot* Control::getTSCCSlot() const
/// <param name="slotNo">DMR slot number.</param> /// <param name="slotNo">DMR slot number.</param>
/// <param name="dstId"></param> /// <param name="dstId"></param>
/// <param name="group"></param> /// <param name="group"></param>
void Control::tsccActivateSlot(uint32_t slotNo, uint32_t dstId, bool group) /// <param name="voice"></param>
void Control::tsccActivateSlot(uint32_t slotNo, uint32_t dstId, bool group, bool voice)
{ {
if (m_verbose) { if (m_verbose) {
LogMessage(LOG_DMR, "DMR Slot %u, payload activation, group = %u, dstId = %u", LogMessage(LOG_DMR, "DMR Slot %u, payload activation, group = %u, dstId = %u",
@ -436,11 +437,11 @@ void Control::tsccActivateSlot(uint32_t slotNo, uint32_t dstId, bool group)
switch (slotNo) { switch (slotNo) {
case 1U: case 1U:
m_tsccPayloadActive = true; m_tsccPayloadActive = true;
m_slot1->setTSCCActivated(dstId, group); m_slot1->setTSCCActivated(dstId, group, voice);
break; break;
case 2U: case 2U:
m_tsccPayloadActive = true; m_tsccPayloadActive = true;
m_slot2->setTSCCActivated(dstId, group); m_slot2->setTSCCActivated(dstId, group, voice);
break; break;
default: default:
LogError(LOG_DMR, "DMR, invalid slot, TSCC payload activation, slotNo = %u", slotNo); LogError(LOG_DMR, "DMR, invalid slot, TSCC payload activation, slotNo = %u", slotNo);

@ -100,7 +100,7 @@ namespace dmr
/// <summary>Helper to return the slot carrying the TSCC.</summary> /// <summary>Helper to return the slot carrying the TSCC.</summary>
Slot* getTSCCSlot() const; Slot* getTSCCSlot() const;
/// <summary>Helper to payload activate the slot carrying granted payload traffic.</summary> /// <summary>Helper to payload activate the slot carrying granted payload traffic.</summary>
void tsccActivateSlot(uint32_t slotNo, uint32_t dstId, bool group); void tsccActivateSlot(uint32_t slotNo, uint32_t dstId, bool group, bool voice);
/// <summary>Helper to clear an activated payload slot.</summary> /// <summary>Helper to clear an activated payload slot.</summary>
void tsccClearActivatedSlot(uint32_t slotNo); void tsccClearActivatedSlot(uint32_t slotNo);

@ -158,6 +158,7 @@ Slot::Slot(uint32_t slotNo, uint32_t timeout, uint32_t tgHang, uint32_t queueSiz
m_dedicatedTSCC(false), m_dedicatedTSCC(false),
m_tsccPayloadDstId(0U), m_tsccPayloadDstId(0U),
m_tsccPayloadGroup(false), m_tsccPayloadGroup(false),
m_tsccPayloadVoice(true),
m_verbose(verbose), m_verbose(verbose),
m_debug(debug) m_debug(debug)
{ {
@ -470,7 +471,7 @@ void Slot::clock()
if (m_rfState == RS_RF_LISTENING && m_netState == RS_NET_IDLE) { if (m_rfState == RS_RF_LISTENING && m_netState == RS_NET_IDLE) {
if (m_tsccPayloadDstId > 0U) { if (m_tsccPayloadDstId > 0U) {
if ((m_dmr->m_tsccCnt % 2) > 0) { if ((m_dmr->m_tsccCnt % 2) > 0) {
setShortLC(m_slotNo, m_tsccPayloadDstId, m_tsccPayloadGroup ? FLCO_GROUP : FLCO_PRIVATE, false); setShortLC(m_slotNo, m_tsccPayloadDstId, m_tsccPayloadGroup ? FLCO_GROUP : FLCO_PRIVATE, m_tsccPayloadVoice);
} }
} }
} }

@ -106,7 +106,7 @@ namespace dmr
/// <summary>Helper to enable and configure TSCC support for this slot.</summary> /// <summary>Helper to enable and configure TSCC support for this slot.</summary>
void setTSCC(bool enable, bool dedicated); void setTSCC(bool enable, bool dedicated);
/// <summary>Sets a flag indicating whether the slot is a TSCC payload slot.</summary> /// <summary>Sets a flag indicating whether the slot is a TSCC payload slot.</summary>
void setTSCCActivated(uint32_t dstId, bool group) { m_tsccPayloadDstId = dstId; m_tsccPayloadGroup = group; } void setTSCCActivated(uint32_t dstId, bool group, bool voice) { m_tsccPayloadDstId = dstId; m_tsccPayloadGroup = group; m_tsccPayloadVoice = voice; }
/// <summary>Sets a flag indicating whether the DMR control channel can send permit-tg to voice channels.</summary> /// <summary>Sets a flag indicating whether the DMR control channel can send permit-tg to voice channels.</summary>
void setControlPermitTG(bool controlPermitTG) { m_controlPermitTG = controlPermitTG; } void setControlPermitTG(bool controlPermitTG) { m_controlPermitTG = controlPermitTG; }
/// <summary>Helper to set the voice error silence threshold.</summary> /// <summary>Helper to set the voice error silence threshold.</summary>
@ -194,6 +194,7 @@ namespace dmr
uint32_t m_tsccPayloadDstId; uint32_t m_tsccPayloadDstId;
bool m_tsccPayloadGroup; bool m_tsccPayloadGroup;
bool m_tsccPayloadVoice;
bool m_controlPermitTG; bool m_controlPermitTG;
@ -264,7 +265,7 @@ namespace dmr
void writeRF_ControlData(uint16_t frameCnt, uint8_t n); void writeRF_ControlData(uint16_t frameCnt, uint8_t n);
/// <summary>Clears the flag indicating whether the slot is a TSCC payload slot.</summary> /// <summary>Clears the flag indicating whether the slot is a TSCC payload slot.</summary>
void clearTSCCActivated() { m_tsccPayloadDstId = 0U; m_tsccPayloadGroup = false; } void clearTSCCActivated() { m_tsccPayloadDstId = 0U; m_tsccPayloadGroup = false; m_tsccPayloadVoice = true; }
/// <summary>Helper to set the DMR short LC.</summary> /// <summary>Helper to set the DMR short LC.</summary>
static void setShortLC(uint32_t slotNo, uint32_t id, uint8_t flco = FLCO_GROUP, bool voice = true); static void setShortLC(uint32_t slotNo, uint32_t id, uint8_t flco = FLCO_GROUP, bool voice = true);

@ -849,16 +849,18 @@ bool ControlSignaling::writeRF_CSBK_Grant(uint32_t srcId, uint32_t dstId, uint8_
req["dstId"].set<uint32_t>(dstId); req["dstId"].set<uint32_t>(dstId);
req["slot"].set<uint8_t>(slot); req["slot"].set<uint8_t>(slot);
req["group"].set<bool>(grp); req["group"].set<bool>(grp);
bool voice = true;
req["voice"].set<bool>(voice);
RESTClient::send(voiceChData.address(), voiceChData.port(), voiceChData.password(), RESTClient::send(voiceChData.address(), voiceChData.port(), voiceChData.password(),
HTTP_PUT, PUT_DMR_TSCC_PAYLOAD_ACT, req, m_tscc->m_debug); HTTP_PUT, PUT_DMR_TSCC_PAYLOAD_ACT, req, m_tscc->m_debug);
} }
else { else {
::LogError(LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_RAND (Random Access), failed to activate payload channel, chNo = %u, slot = %u", m_tscc->m_slotNo, chNo, slot); ::LogError(LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_RAND (Random Access), failed to activate payload channel, chNo = %u, slot = %u", m_tscc->m_slotNo, chNo, slot);
} }
} }
else { else {
m_slot->m_dmr->tsccActivateSlot(slot, dstId, grp); m_slot->m_dmr->tsccActivateSlot(slot, dstId, grp, true);
} }
// callback RCON to permit-tg on the specified voice channel // callback RCON to permit-tg on the specified voice channel
@ -911,6 +913,8 @@ bool ControlSignaling::writeRF_CSBK_Grant(uint32_t srcId, uint32_t dstId, uint8_
req["dstId"].set<uint32_t>(dstId); req["dstId"].set<uint32_t>(dstId);
req["slot"].set<uint8_t>(slot); req["slot"].set<uint8_t>(slot);
req["group"].set<bool>(grp); req["group"].set<bool>(grp);
bool voice = true;
req["voice"].set<bool>(voice);
RESTClient::send(voiceChData.address(), voiceChData.port(), voiceChData.password(), RESTClient::send(voiceChData.address(), voiceChData.port(), voiceChData.password(),
HTTP_PUT, PUT_DMR_TSCC_PAYLOAD_ACT, req, m_tscc->m_debug); HTTP_PUT, PUT_DMR_TSCC_PAYLOAD_ACT, req, m_tscc->m_debug);
@ -920,7 +924,7 @@ bool ControlSignaling::writeRF_CSBK_Grant(uint32_t srcId, uint32_t dstId, uint8_
} }
} }
else { else {
m_slot->m_dmr->tsccActivateSlot(slot, dstId, grp); m_slot->m_dmr->tsccActivateSlot(slot, dstId, grp, true);
} }
// callback RCON to permit-tg on the specified voice channel // callback RCON to permit-tg on the specified voice channel
@ -1082,6 +1086,8 @@ bool ControlSignaling::writeRF_CSBK_Data_Grant(uint32_t srcId, uint32_t dstId, u
req["dstId"].set<uint32_t>(dstId); req["dstId"].set<uint32_t>(dstId);
req["slot"].set<uint8_t>(slot); req["slot"].set<uint8_t>(slot);
req["group"].set<bool>(grp); req["group"].set<bool>(grp);
bool voice = false;
req["voice"].set<bool>(voice);
RESTClient::send(voiceChData.address(), voiceChData.port(), voiceChData.password(), RESTClient::send(voiceChData.address(), voiceChData.port(), voiceChData.password(),
HTTP_PUT, PUT_DMR_TSCC_PAYLOAD_ACT, req, m_tscc->m_debug); HTTP_PUT, PUT_DMR_TSCC_PAYLOAD_ACT, req, m_tscc->m_debug);
@ -1091,7 +1097,7 @@ bool ControlSignaling::writeRF_CSBK_Data_Grant(uint32_t srcId, uint32_t dstId, u
} }
} }
else { else {
m_slot->m_dmr->tsccActivateSlot(slot, dstId, grp); m_slot->m_dmr->tsccActivateSlot(slot, dstId, grp, false);
} }
std::unique_ptr<CSBK_TD_GRANT> csbk = new_unique(CSBK_TD_GRANT); std::unique_ptr<CSBK_TD_GRANT> csbk = new_unique(CSBK_TD_GRANT);
@ -1124,6 +1130,8 @@ bool ControlSignaling::writeRF_CSBK_Data_Grant(uint32_t srcId, uint32_t dstId, u
req["dstId"].set<uint32_t>(dstId); req["dstId"].set<uint32_t>(dstId);
req["slot"].set<uint8_t>(slot); req["slot"].set<uint8_t>(slot);
req["group"].set<bool>(grp); req["group"].set<bool>(grp);
bool voice = false;
req["voice"].set<bool>(voice);
RESTClient::send(voiceChData.address(), voiceChData.port(), voiceChData.password(), RESTClient::send(voiceChData.address(), voiceChData.port(), voiceChData.password(),
HTTP_PUT, PUT_DMR_TSCC_PAYLOAD_ACT, req, m_tscc->m_debug); HTTP_PUT, PUT_DMR_TSCC_PAYLOAD_ACT, req, m_tscc->m_debug);
@ -1133,7 +1141,7 @@ bool ControlSignaling::writeRF_CSBK_Data_Grant(uint32_t srcId, uint32_t dstId, u
} }
} }
else { else {
m_slot->m_dmr->tsccActivateSlot(slot, dstId, grp); m_slot->m_dmr->tsccActivateSlot(slot, dstId, grp, false);
} }
std::unique_ptr<CSBK_PD_GRANT> csbk = new_unique(CSBK_PD_GRANT); std::unique_ptr<CSBK_PD_GRANT> csbk = new_unique(CSBK_PD_GRANT);

@ -1438,15 +1438,22 @@ void RESTAPI::restAPI_PutTSCCPayloadActivate(const HTTPPayload& request, HTTPPay
return; return;
} }
// validate voice flag is a boolean within the JSON blob
if (!req["voice"].is<bool>()) {
errorPayload(reply, "voice flag was not valid");
return;
}
uint32_t dstId = req["dstId"].get<uint32_t>(); uint32_t dstId = req["dstId"].get<uint32_t>();
bool group = req["group"].get<bool>(); bool group = req["group"].get<bool>();
bool voice = req["voice"].get<bool>();
if (dstId == 0U) { if (dstId == 0U) {
errorPayload(reply, "destination ID was not valid"); errorPayload(reply, "destination ID was not valid");
return; return;
} }
m_dmr->tsccActivateSlot(slot, dstId, group); m_dmr->tsccActivateSlot(slot, dstId, group, voice);
} }
#else #else
errorPayload(reply, "DMR operations are unavailable", HTTPPayload::SERVICE_UNAVAILABLE); errorPayload(reply, "DMR operations are unavailable", HTTPPayload::SERVICE_UNAVAILABLE);

Loading…
Cancel
Save

Powered by TurnKey Linux.