correct issue with end of voice not transmitting properly due to refactor; fix issue with verbosity not being applied for TSDU and TDULC; fix issue where MFID was not being preserved;

3.0-rcon_maint
Bryan Biedenkapp 3 years ago
parent 9a3d00abd0
commit 6fbd038b4e

@ -1029,44 +1029,48 @@ int Host::run()
} }
} }
else { else {
// if we have no P25 data, and we're either idle or P25 state, check if we nextLen = 0U;
// need to be starting the CC running flag or writing end of voice call data
if (m_state == STATE_IDLE || m_state == STATE_P25) {
if (p25->getCCHalted()) {
p25->setCCHalted(false);
}
// write end of voice if necessary
ret = p25->writeRF_VoiceEnd();
if (ret) {
if (m_state == STATE_IDLE) {
m_modeTimer.setTimeout(m_netModeHang);
setState(STATE_P25);
}
if (m_state == STATE_P25) {
m_modeTimer.start();
}
}
}
} }
}
}
// if the modem is in duplex -- handle P25 CC burst control if (nextLen == 0U) {
if (m_duplex) { // if we have no P25 data, and we're either idle or P25 state, check if we
if (p25BcastDurationTimer.isPaused() && !p25->getCCHalted()) { // need to be starting the CC running flag or writing end of voice call data
p25BcastDurationTimer.resume(); if (m_state == STATE_IDLE || m_state == STATE_P25) {
} if (p25->getCCHalted()) {
p25->setCCHalted(false);
}
if (p25->getCCHalted()) { // write end of voice if necessary
p25->setCCHalted(false); ret = p25->writeRF_VoiceEnd();
if (ret) {
if (m_state == STATE_IDLE) {
m_modeTimer.setTimeout(m_netModeHang);
setState(STATE_P25);
} }
if (g_fireP25Control) { if (m_state == STATE_P25) {
m_modeTimer.stop(); m_modeTimer.start();
} }
} }
} }
} }
// if the modem is in duplex -- handle P25 CC burst control
if (m_duplex) {
if (p25BcastDurationTimer.isPaused() && !p25->getCCHalted()) {
p25BcastDurationTimer.resume();
}
if (p25->getCCHalted()) {
p25->setCCHalted(false);
}
if (g_fireP25Control) {
m_modeTimer.stop();
}
}
} }
#endif // defined(ENABLE_P25) #endif // defined(ENABLE_P25)

@ -199,7 +199,7 @@ bool TDULC::decode(const uint8_t* data, uint8_t* rs)
} }
if (m_verbose) { if (m_verbose) {
Utils::dump(2U, "Decoded TDULC", rs, P25_TDULC_LENGTH_BYTES); Utils::dump(2U, "TDULC::decode(), TDULC Value", rs, P25_TDULC_LENGTH_BYTES);
} }
return true; return true;
@ -215,17 +215,18 @@ void TDULC::encode(uint8_t* data, const uint8_t* rs)
assert(data != nullptr); assert(data != nullptr);
assert(rs != nullptr); assert(rs != nullptr);
if (m_verbose) {
Utils::dump(2U, "Encoded TDULC", rs, P25_TDULC_LENGTH_BYTES);
}
uint8_t outRs[P25_TDULC_LENGTH_BYTES]; uint8_t outRs[P25_TDULC_LENGTH_BYTES];
::memset(outRs, 0x00U, P25_TDULC_LENGTH_BYTES); ::memset(outRs, 0x00U, P25_TDULC_LENGTH_BYTES);
::memcpy(outRs, rs, P25_TDULC_LENGTH_BYTES); ::memcpy(outRs, rs, P25_TDULC_LENGTH_BYTES);
outRs[0U] = m_lco; // LCO
if (m_implicit) if (m_implicit)
outRs[0U] |= 0x40U; // Implicit Operation outRs[0U] |= 0x40U; // Implicit Operation
if (m_verbose) {
Utils::dump(2U, "TDULC::encode(), TDULC Value", outRs, P25_TDULC_LENGTH_BYTES);
}
// encode RS (24,12,13) FEC // encode RS (24,12,13) FEC
m_rs.encode241213(outRs); m_rs.encode241213(outRs);

@ -257,7 +257,7 @@ bool TSBK::decode(const uint8_t* data, uint8_t* tsbk, bool rawTSBK)
} }
if (m_verbose) { if (m_verbose) {
Utils::dump(2U, "Decoded TSBK", tsbk, P25_TSBK_LENGTH_BYTES); Utils::dump(2U, "TSBK::decode(), TSBK Value", tsbk, P25_TSBK_LENGTH_BYTES);
} }
m_lco = tsbk[0U] & 0x3F; // LCO m_lco = tsbk[0U] & 0x3F; // LCO

@ -197,6 +197,8 @@ bool Trunk::process(uint8_t* data, uint32_t len, lc::TSBK* preDecodedTSBK)
uint32_t srcId = tsbk->getSrcId(); uint32_t srcId = tsbk->getSrcId();
uint32_t dstId = tsbk->getDstId(); uint32_t dstId = tsbk->getDstId();
m_lastMFID = tsbk->getMFId();
// handle standard P25 reference opcodes // handle standard P25 reference opcodes
switch (tsbk->getLCO()) { switch (tsbk->getLCO()) {
case TSBK_IOSP_GRP_VCH: case TSBK_IOSP_GRP_VCH:
@ -1151,6 +1153,7 @@ void Trunk::setTSBKVerbose(bool verbose)
{ {
m_dumpTSBK = verbose; m_dumpTSBK = verbose;
lc::TSBK::setVerbose(verbose); lc::TSBK::setVerbose(verbose);
lc::TDULC::setVerbose(verbose);
} }
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
@ -1181,6 +1184,7 @@ Trunk::Trunk(Control* p25, network::BaseNetwork* network, bool dumpTSBKData, boo
m_adjSiteUpdateCnt(), m_adjSiteUpdateCnt(),
m_sccbTable(), m_sccbTable(),
m_sccbUpdateCnt(), m_sccbUpdateCnt(),
m_lastMFID(P25_MFG_STANDARD),
m_noStatusAck(false), m_noStatusAck(false),
m_noMessageAck(true), m_noMessageAck(true),
m_unitToUnitAvailCheck(true), m_unitToUnitAvailCheck(true),
@ -1208,6 +1212,9 @@ Trunk::Trunk(Control* p25, network::BaseNetwork* network, bool dumpTSBKData, boo
m_adjSiteUpdateInterval = ADJ_SITE_TIMER_TIMEOUT; m_adjSiteUpdateInterval = ADJ_SITE_TIMER_TIMEOUT;
m_adjSiteUpdateTimer.setTimeout(m_adjSiteUpdateInterval); m_adjSiteUpdateTimer.setTimeout(m_adjSiteUpdateInterval);
m_adjSiteUpdateTimer.start(); m_adjSiteUpdateTimer.start();
lc::TSBK::setVerbose(verbose);
lc::TDULC::setVerbose(verbose);
} }
/// <summary> /// <summary>
@ -2195,6 +2202,7 @@ bool Trunk::writeRF_TSDU_Grant(uint32_t srcId, uint32_t dstId, uint8_t serviceOp
} }
std::unique_ptr<IOSP_GRP_VCH> iosp = new_unique(IOSP_GRP_VCH); std::unique_ptr<IOSP_GRP_VCH> iosp = new_unique(IOSP_GRP_VCH);
iosp->setMFId(m_lastMFID);
iosp->setSrcId(srcId); iosp->setSrcId(srcId);
iosp->setDstId(dstId); iosp->setDstId(dstId);
iosp->setGrpVchNo(chNo); iosp->setGrpVchNo(chNo);
@ -2216,6 +2224,7 @@ bool Trunk::writeRF_TSDU_Grant(uint32_t srcId, uint32_t dstId, uint8_t serviceOp
} }
std::unique_ptr<IOSP_UU_VCH> iosp = new_unique(IOSP_UU_VCH); std::unique_ptr<IOSP_UU_VCH> iosp = new_unique(IOSP_UU_VCH);
iosp->setMFId(m_lastMFID);
iosp->setSrcId(srcId); iosp->setSrcId(srcId);
iosp->setDstId(dstId); iosp->setDstId(dstId);
iosp->setGrpVchNo(chNo); iosp->setGrpVchNo(chNo);
@ -2247,6 +2256,7 @@ bool Trunk::writeRF_TSDU_Grant(uint32_t srcId, uint32_t dstId, uint8_t serviceOp
bool Trunk::writeRF_TSDU_SNDCP_Grant(uint32_t srcId, uint32_t dstId, bool skip, bool net) bool Trunk::writeRF_TSDU_SNDCP_Grant(uint32_t srcId, uint32_t dstId, bool skip, bool net)
{ {
std::unique_ptr<OSP_SNDCP_CH_GNT> osp = new_unique(OSP_SNDCP_CH_GNT); std::unique_ptr<OSP_SNDCP_CH_GNT> osp = new_unique(OSP_SNDCP_CH_GNT);
osp->setMFId(m_lastMFID);
osp->setSrcId(srcId); osp->setSrcId(srcId);
osp->setDstId(dstId); osp->setDstId(dstId);
@ -2320,6 +2330,7 @@ bool Trunk::writeRF_TSDU_SNDCP_Grant(uint32_t srcId, uint32_t dstId, bool skip,
void Trunk::writeRF_TSDU_UU_Ans_Req(uint32_t srcId, uint32_t dstId) void Trunk::writeRF_TSDU_UU_Ans_Req(uint32_t srcId, uint32_t dstId)
{ {
std::unique_ptr<IOSP_UU_ANS> iosp = new_unique(IOSP_UU_ANS); std::unique_ptr<IOSP_UU_ANS> iosp = new_unique(IOSP_UU_ANS);
iosp->setMFId(m_lastMFID);
iosp->setSrcId(srcId); iosp->setSrcId(srcId);
iosp->setDstId(dstId); iosp->setDstId(dstId);
@ -2339,6 +2350,7 @@ void Trunk::writeRF_TSDU_UU_Ans_Req(uint32_t srcId, uint32_t dstId)
void Trunk::writeRF_TSDU_ACK_FNE(uint32_t srcId, uint32_t service, bool extended, bool noNetwork) void Trunk::writeRF_TSDU_ACK_FNE(uint32_t srcId, uint32_t service, bool extended, bool noNetwork)
{ {
std::unique_ptr<IOSP_ACK_RSP> iosp = new_unique(IOSP_ACK_RSP); std::unique_ptr<IOSP_ACK_RSP> iosp = new_unique(IOSP_ACK_RSP);
iosp->setMFId(m_lastMFID);
iosp->setSrcId(srcId); iosp->setSrcId(srcId);
iosp->setService(service); iosp->setService(service);
@ -2365,6 +2377,7 @@ void Trunk::writeRF_TSDU_ACK_FNE(uint32_t srcId, uint32_t service, bool extended
void Trunk::writeRF_TSDU_Deny(uint32_t dstId, uint8_t reason, uint8_t service, bool aiv) void Trunk::writeRF_TSDU_Deny(uint32_t dstId, uint8_t reason, uint8_t service, bool aiv)
{ {
std::unique_ptr<OSP_DENY_RSP> osp = new_unique(OSP_DENY_RSP); std::unique_ptr<OSP_DENY_RSP> osp = new_unique(OSP_DENY_RSP);
osp->setMFId(m_lastMFID);
osp->setAIV(aiv); osp->setAIV(aiv);
osp->setSrcId(P25_WUID_FNE); osp->setSrcId(P25_WUID_FNE);
osp->setDstId(dstId); osp->setDstId(dstId);
@ -2389,6 +2402,7 @@ bool Trunk::writeRF_TSDU_Grp_Aff_Rsp(uint32_t srcId, uint32_t dstId)
bool ret = false; bool ret = false;
std::unique_ptr<IOSP_GRP_AFF> iosp = new_unique(IOSP_GRP_AFF); std::unique_ptr<IOSP_GRP_AFF> iosp = new_unique(IOSP_GRP_AFF);
iosp->setMFId(m_lastMFID);
iosp->setAnnounceGroup(m_patchSuperGroup); // this isn't right... iosp->setAnnounceGroup(m_patchSuperGroup); // this isn't right...
iosp->setSrcId(srcId); iosp->setSrcId(srcId);
iosp->setDstId(dstId); iosp->setDstId(dstId);
@ -2445,6 +2459,7 @@ bool Trunk::writeRF_TSDU_Grp_Aff_Rsp(uint32_t srcId, uint32_t dstId)
void Trunk::writeRF_TSDU_U_Reg_Rsp(uint32_t srcId, uint32_t sysId) void Trunk::writeRF_TSDU_U_Reg_Rsp(uint32_t srcId, uint32_t sysId)
{ {
std::unique_ptr<IOSP_U_REG> iosp = new_unique(IOSP_U_REG); std::unique_ptr<IOSP_U_REG> iosp = new_unique(IOSP_U_REG);
iosp->setMFId(m_lastMFID);
iosp->setResponse(P25_RSP_ACCEPT); iosp->setResponse(P25_RSP_ACCEPT);
iosp->setSrcId(srcId); iosp->setSrcId(srcId);
iosp->setDstId(srcId); iosp->setDstId(srcId);
@ -2503,6 +2518,7 @@ void Trunk::writeRF_TSDU_U_Dereg_Ack(uint32_t srcId)
::ActivityLog("P25", true, "unit deregistration request from %u", srcId); ::ActivityLog("P25", true, "unit deregistration request from %u", srcId);
std::unique_ptr<OSP_U_DEREG_ACK> osp = new_unique(OSP_U_DEREG_ACK); std::unique_ptr<OSP_U_DEREG_ACK> osp = new_unique(OSP_U_DEREG_ACK);
osp->setMFId(m_lastMFID);
osp->setSrcId(P25_WUID_FNE); osp->setSrcId(P25_WUID_FNE);
osp->setDstId(srcId); osp->setDstId(srcId);
@ -2523,6 +2539,7 @@ void Trunk::writeRF_TSDU_U_Dereg_Ack(uint32_t srcId)
void Trunk::writeRF_TSDU_Queue(uint32_t dstId, uint8_t reason, uint8_t service, bool aiv) void Trunk::writeRF_TSDU_Queue(uint32_t dstId, uint8_t reason, uint8_t service, bool aiv)
{ {
std::unique_ptr<OSP_QUE_RSP> osp = new_unique(OSP_QUE_RSP); std::unique_ptr<OSP_QUE_RSP> osp = new_unique(OSP_QUE_RSP);
osp->setMFId(m_lastMFID);
osp->setAIV(aiv); osp->setAIV(aiv);
osp->setSrcId(P25_WUID_FNE); osp->setSrcId(P25_WUID_FNE);
osp->setDstId(dstId); osp->setDstId(dstId);
@ -2548,6 +2565,7 @@ bool Trunk::writeRF_TSDU_Loc_Reg_Rsp(uint32_t srcId, uint32_t dstId, bool grp)
bool ret = false; bool ret = false;
std::unique_ptr<OSP_LOC_REG_RSP> osp = new_unique(OSP_LOC_REG_RSP); std::unique_ptr<OSP_LOC_REG_RSP> osp = new_unique(OSP_LOC_REG_RSP);
osp->setMFId(m_lastMFID);
osp->setResponse(P25_RSP_ACCEPT); osp->setResponse(P25_RSP_ACCEPT);
osp->setDstId(dstId); osp->setDstId(dstId);
osp->setSrcId(srcId); osp->setSrcId(srcId);

@ -127,6 +127,8 @@ namespace p25
std::unordered_map<uint8_t, SiteData> m_sccbTable; std::unordered_map<uint8_t, SiteData> m_sccbTable;
std::unordered_map<uint8_t, uint8_t> m_sccbUpdateCnt; std::unordered_map<uint8_t, uint8_t> m_sccbUpdateCnt;
uint8_t m_lastMFID;
bool m_noStatusAck; bool m_noStatusAck;
bool m_noMessageAck; bool m_noMessageAck;
bool m_unitToUnitAvailCheck; bool m_unitToUnitAvailCheck;

Loading…
Cancel
Save

Powered by TurnKey Linux.