make clearer log messages in the case of coding errors such as TSBK Trellis or CRC errors; allow CRC TSDU errors to be warnings in calibration mode;

pull/12/head
Bryan Biedenkapp 4 years ago
parent d588982b72
commit d2ed457109

@ -92,8 +92,10 @@ bool CSBK::decode(const uint8_t* bytes)
m_data[11U] ^= CSBK_CRC_MASK[1U]; m_data[11U] ^= CSBK_CRC_MASK[1U];
bool valid = edac::CRC::checkCCITT162(m_data, DMR_LC_HEADER_LENGTH_BYTES); bool valid = edac::CRC::checkCCITT162(m_data, DMR_LC_HEADER_LENGTH_BYTES);
if (!valid) if (!valid) {
LogError(LOG_DMR, "CSBK::decode(), failed CRC CCITT-162 check");
return false; return false;
}
// restore the checksum // restore the checksum
m_data[10U] ^= CSBK_CRC_MASK[0U]; m_data[10U] ^= CSBK_CRC_MASK[0U];
@ -191,7 +193,7 @@ bool CSBK::decode(const uint8_t* bytes)
m_dstId = 0U; m_dstId = 0U;
m_dataContent = false; m_dataContent = false;
m_CBF = 0U; m_CBF = 0U;
LogError(LOG_DMR, "unknown CSBK type, csbko = $%02X", m_CSBKO); LogError(LOG_DMR, "CSBK::decode(), unknown CSBK type, csbko = $%02X", m_CSBKO);
return true; return true;
} }
@ -457,6 +459,7 @@ void CSBK::encode(uint8_t* bytes)
m_data[7U] = (m_srcId >> 16) & 0xFFU; // Source ID m_data[7U] = (m_srcId >> 16) & 0xFFU; // Source ID
m_data[8U] = (m_srcId >> 8) & 0xFFU; m_data[8U] = (m_srcId >> 8) & 0xFFU;
m_data[9U] = (m_srcId >> 0) & 0xFFU; m_data[9U] = (m_srcId >> 0) & 0xFFU;
LogError(LOG_DMR, "CSBK::encode(), unknown CSBK type, csbko = $%02X", m_CSBKO);
break; break;
} }

@ -1730,6 +1730,7 @@ void HostCal::processP25BER(const uint8_t* buffer)
lc::TSBK tsbk = lc::TSBK(SiteData(), lookups::IdenTable()); lc::TSBK tsbk = lc::TSBK(SiteData(), lookups::IdenTable());
tsbk.setVerbose(true); // always verbose in CAL tsbk.setVerbose(true); // always verbose in CAL
tsbk.setWarnCRC(true);
Utils::dump(1U, "Raw TSBK Dump", buffer + 1U, P25_TSDU_FRAME_LENGTH_BYTES); Utils::dump(1U, "Raw TSBK Dump", buffer + 1U, P25_TSDU_FRAME_LENGTH_BYTES);

@ -75,7 +75,7 @@ const uint32_t MAX_PREAMBLE_TDU_CNT = 64U;
/// <param name="rssi">Instance of the RSSIInterpolator class.</param> /// <param name="rssi">Instance of the RSSIInterpolator class.</param>
/// <param name="dumpPDUData"></param> /// <param name="dumpPDUData"></param>
/// <param name="repeatPDU"></param> /// <param name="repeatPDU"></param>
/// <param name="dumpTSBKData"></param> /// <param name="dumpTSBKData">Flag indicating whether TSBK data is dumped to the log.</param>
/// <param name="debug">Flag indicating whether P25 debug is enabled.</param> /// <param name="debug">Flag indicating whether P25 debug is enabled.</param>
/// <param name="verbose">Flag indicating whether P25 verbose logging is enabled.</param> /// <param name="verbose">Flag indicating whether P25 verbose logging is enabled.</param>
Control::Control(uint32_t nac, uint32_t callHang, uint32_t queueSize, modem::Modem* modem, network::BaseNetwork* network, Control::Control(uint32_t nac, uint32_t callHang, uint32_t queueSize, modem::Modem* modem, network::BaseNetwork* network,

@ -1148,7 +1148,7 @@ void TrunkPacket::setTSBKVerbose(bool verbose)
/// </summary> /// </summary>
/// <param name="p25">Instance of the Control class.</param> /// <param name="p25">Instance of the Control class.</param>
/// <param name="network">Instance of the BaseNetwork class.</param> /// <param name="network">Instance of the BaseNetwork class.</param>
/// <param name="dumpTSBKData"></param> /// <param name="dumpTSBKData">Flag indicating whether TSBK data is dumped to the log.</param>
/// <param name="debug">Flag indicating whether P25 debug is enabled.</param> /// <param name="debug">Flag indicating whether P25 debug is enabled.</param>
/// <param name="verbose">Flag indicating whether P25 verbose logging is enabled.</param> /// <param name="verbose">Flag indicating whether P25 verbose logging is enabled.</param>
TrunkPacket::TrunkPacket(Control* p25, network::BaseNetwork* network, bool dumpTSBKData, bool debug, bool verbose) : TrunkPacket::TrunkPacket(Control* p25, network::BaseNetwork* network, bool dumpTSBKData, bool debug, bool verbose) :

@ -176,11 +176,13 @@ bool LC::decodeHDU(const uint8_t* data)
// decode RS (36,20,17) FEC // decode RS (36,20,17) FEC
try { try {
bool ret = m_rs.decode362017(rs); bool ret = m_rs.decode362017(rs);
if (!ret) if (!ret) {
LogError(LOG_P25, "LC::decodeHDU(), failed to decode RS (36,20,17) FEC");
return false; return false;
}
} }
catch (...) { catch (...) {
Utils::dump(2U, "P25, RS crashed with input data", rs, P25_HDU_LENGTH_BYTES); Utils::dump(2U, "P25, RS excepted with input data", rs, P25_HDU_LENGTH_BYTES);
return false; return false;
} }
@ -299,11 +301,13 @@ bool LC::decodeLDU1(const uint8_t * data)
// decode RS (24,12,13) FEC // decode RS (24,12,13) FEC
try { try {
bool ret = m_rs.decode241213(rs); bool ret = m_rs.decode241213(rs);
if (!ret) if (!ret) {
LogError(LOG_P25, "LC::decodeLDU1(), failed to decode RS (24,12,13) FEC");
return false; return false;
}
} }
catch (...) { catch (...) {
Utils::dump(2U, "P25, RS crashed with input data", rs, P25_LDU_LC_LENGTH_BYTES); Utils::dump(2U, "P25, RS excepted with input data", rs, P25_LDU_LC_LENGTH_BYTES);
return false; return false;
} }
@ -391,11 +395,13 @@ bool LC::decodeLDU2(const uint8_t * data)
// decode RS (24,16,9) FEC // decode RS (24,16,9) FEC
try { try {
bool ret = m_rs.decode24169(rs); bool ret = m_rs.decode24169(rs);
if (!ret) if (!ret) {
LogError(LOG_P25, "LC::decodeLDU2(), failed to decode RS (24,16,9) FEC");
return false; return false;
}
} }
catch (...) { catch (...) {
Utils::dump(2U, "P25, RS crashed with input data", rs, P25_LDU_LC_LENGTH_BYTES); Utils::dump(2U, "P25, RS excepted with input data", rs, P25_LDU_LC_LENGTH_BYTES);
return false; return false;
} }
@ -556,7 +562,7 @@ bool LC::decodeLC(const uint8_t * rs)
} }
break; break;
default: default:
LogError(LOG_P25, "unknown LC value, mfId = $%02X, lco = $%02X", m_mfId, m_lco); LogError(LOG_P25, "LC::decodeLC(), unknown LC value, mfId = $%02X, lco = $%02X", m_mfId, m_lco);
return false; return false;
} }
@ -626,7 +632,7 @@ void LC::encodeLC(uint8_t * rs)
rsValue = (rsValue << 8) + m_siteData.serviceClass(); // System Service Class rsValue = (rsValue << 8) + m_siteData.serviceClass(); // System Service Class
break; break;
default: default:
LogError(LOG_P25, "unknown LC value, mfId = $%02X, lco = $%02X", m_mfId, m_lco); LogError(LOG_P25, "LC::encodeLC(), unknown LC value, mfId = $%02X, lco = $%02X", m_mfId, m_lco);
break; break;
} }

@ -164,11 +164,13 @@ bool TDULC::decode(const uint8_t* data)
// decode RS (24,12,13) FEC // decode RS (24,12,13) FEC
try { try {
bool ret = m_rs.decode241213(rs); bool ret = m_rs.decode241213(rs);
if (!ret) if (!ret) {
LogError(LOG_P25, "TDULC::decode(), failed to decode RS (24,12,13) FEC");
return false; return false;
}
} }
catch (...) { catch (...) {
Utils::dump(2U, "P25, RS crashed with input data", rs, P25_TDULC_LENGTH_BYTES); Utils::dump(2U, "P25, RS excepted with input data", rs, P25_TDULC_LENGTH_BYTES);
return false; return false;
} }
@ -299,7 +301,7 @@ bool TDULC::decodeLC(const uint8_t* rs)
} }
break; break;
default: default:
LogError(LOG_P25, "unknown LC value, mfId = $%02X, lco = $%02X", m_mfId, m_lco); LogError(LOG_P25, "TDULC::decodeLC(), unknown LC value, mfId = $%02X, lco = $%02X", m_mfId, m_lco);
return false; return false;
} }
@ -385,7 +387,7 @@ void TDULC::encodeLC(uint8_t* rs)
rsValue = (rsValue << 32) + calcBaseFreq; // Base Frequency rsValue = (rsValue << 32) + calcBaseFreq; // Base Frequency
} }
else { else {
LogError(LOG_P25, "invalid values for LC_IDEN_UP, baseFrequency = %uHz, txOffsetMhz = %uMHz, chBandwidthKhz = %fKHz, chSpaceKhz = %fKHz", LogError(LOG_P25, "TDULC::encodeLC(), invalid values for LC_IDEN_UP, baseFrequency = %uHz, txOffsetMhz = %uMHz, chBandwidthKhz = %fKHz, chSpaceKhz = %fKHz",
m_siteIdenEntry.baseFrequency(), m_siteIdenEntry.txOffsetMhz(), m_siteIdenEntry.chBandwidthKhz(), m_siteIdenEntry.baseFrequency(), m_siteIdenEntry.txOffsetMhz(), m_siteIdenEntry.chBandwidthKhz(),
m_siteIdenEntry.chSpaceKhz()); m_siteIdenEntry.chSpaceKhz());
return; // blatently ignore creating this TSBK return; // blatently ignore creating this TSBK
@ -415,7 +417,7 @@ void TDULC::encodeLC(uint8_t* rs)
rsValue = (rsValue << 8) + m_adjServiceClass; // System Service Class rsValue = (rsValue << 8) + m_adjServiceClass; // System Service Class
} }
else { else {
LogError(LOG_P25, "invalid values for LC_ADJ_STS_BCAST, tsbkAdjSiteRFSSId = $%02X, tsbkAdjSiteId = $%02X, tsbkAdjSiteChannel = $%02X", LogError(LOG_P25, "TDULC::encodeLC(), invalid values for LC_ADJ_STS_BCAST, tsbkAdjSiteRFSSId = $%02X, tsbkAdjSiteId = $%02X, tsbkAdjSiteChannel = $%02X",
m_adjRfssId, m_adjSiteId, m_adjChannelNo); m_adjRfssId, m_adjSiteId, m_adjChannelNo);
return; // blatently ignore creating this TSBK return; // blatently ignore creating this TSBK
} }
@ -441,7 +443,7 @@ void TDULC::encodeLC(uint8_t* rs)
rsValue = (rsValue << 8) + m_siteData.serviceClass(); // System Service Class rsValue = (rsValue << 8) + m_siteData.serviceClass(); // System Service Class
break; break;
default: default:
LogError(LOG_P25, "unknown LC value, mfId = $%02X, lco = $%02X", m_mfId, m_lco); LogError(LOG_P25, "TDULC::encodeLC(), unknown LC value, mfId = $%02X, lco = $%02X", m_mfId, m_lco);
break; break;
} }

@ -61,9 +61,20 @@ TSBK::TSBK(SiteData siteData, lookups::IdenTable entry) : TSBK(siteData)
/// <param name="siteData"></param> /// <param name="siteData"></param>
/// <param name="entry"></param> /// <param name="entry"></param>
/// <param name="verbose"></param> /// <param name="verbose"></param>
TSBK::TSBK(SiteData siteData, lookups::IdenTable entry, bool verbose) : TSBK(siteData) TSBK::TSBK(SiteData siteData, lookups::IdenTable entry, bool verbose) : TSBK(siteData, entry, verbose, false)
{ {
m_verbose = verbose; m_verbose = verbose;
}
/// <summary>
/// Initializes a new instance of the TSBK class.
/// </summary>
/// <param name="siteData"></param>
/// <param name="entry"></param>
/// <param name="verbose"></param>
TSBK::TSBK(SiteData siteData, lookups::IdenTable entry, bool verbose, bool warnCRC) : TSBK(siteData)
{
m_warnCRC = warnCRC;
m_siteIdenEntry = entry; m_siteIdenEntry = entry;
} }
@ -106,6 +117,7 @@ TSBK& TSBK::operator=(const TSBK& data)
{ {
if (this != &data) { if (this != &data) {
m_verbose = data.m_verbose; m_verbose = data.m_verbose;
m_warnCRC = data.m_warnCRC;
m_protect = data.m_protect; m_protect = data.m_protect;
m_lco = data.m_lco; m_lco = data.m_lco;
m_mfId = data.m_mfId; m_mfId = data.m_mfId;
@ -185,21 +197,27 @@ bool TSBK::decode(const uint8_t* data)
// decode 1/2 rate Trellis & check CRC-CCITT 16 // decode 1/2 rate Trellis & check CRC-CCITT 16
try { try {
bool ret = m_trellis.decode12(raw, tsbk); bool ret = m_trellis.decode12(raw, tsbk);
if (m_verbose && !ret) { if (!ret) {
LogDebug(LOG_P25, "TSBK::decode(): failed to decode Trellis 1/2 rate"); LogError(LOG_P25, "TSBK::decode(), failed to decode Trellis 1/2 rate coding");
} }
if (ret) { if (ret) {
ret = edac::CRC::checkCCITT162(tsbk, P25_TSBK_LENGTH_BYTES); ret = edac::CRC::checkCCITT162(tsbk, P25_TSBK_LENGTH_BYTES);
if (m_verbose && !ret) { if (!ret) {
LogDebug(LOG_P25, "TSBK::decode(): CRC CCITT-162 failed to match"); if (m_warnCRC) {
LogWarning(LOG_P25, "TSBK::decode(), failed CRC CCITT-162 check");
ret = true; // ignore CRC error
}
else {
LogError(LOG_P25, "TSBK::decode(), failed CRC CCITT-162 check");
}
} }
} }
if (!ret) if (!ret)
return false; return false;
} }
catch (...) { catch (...) {
Utils::dump(2U, "P25, CRC failed with input data", tsbk, P25_TSBK_LENGTH_BYTES); Utils::dump(2U, "P25, decoding excepted with input data", tsbk, P25_TSBK_LENGTH_BYTES);
return false; return false;
} }
@ -247,7 +265,7 @@ bool TSBK::decode(const uint8_t* data)
m_mfId = P25_MFG_STANDARD; m_mfId = P25_MFG_STANDARD;
break; break;
default: default:
LogError(LOG_P25, "unknown TSBK LCO value, mfId = $%02X, lco = $%02X", m_mfId, m_lco); LogError(LOG_P25, "TSBK::decode(), unknown TSBK LCO value, mfId = $%02X, lco = $%02X", m_mfId, m_lco);
break; break;
} }
@ -391,7 +409,7 @@ bool TSBK::decode(const uint8_t* data)
m_adjServiceClass = (uint8_t)(tsbkValue & 0xFFU); // Site Service Class m_adjServiceClass = (uint8_t)(tsbkValue & 0xFFU); // Site Service Class
break; break;
default: default:
LogError(LOG_P25, "unknown TSBK LCO value, mfId = $%02X, lco = $%02X", m_mfId, m_lco); LogError(LOG_P25, "TSBK::decode(), unknown TSBK LCO value, mfId = $%02X, lco = $%02X", m_mfId, m_lco);
break; break;
} }
@ -522,10 +540,10 @@ void TSBK::encode(uint8_t * data, bool singleBlock)
{ {
if (m_response == 0U) { if (m_response == 0U) {
if (m_lco == TSBK_OSP_QUE_RSP) { if (m_lco == TSBK_OSP_QUE_RSP) {
LogError(LOG_P25, "invalid values for TSBK_OSP_QUE_RSP, reason = %u", m_response); LogError(LOG_P25, "TSBK::encode(), invalid values for TSBK_OSP_QUE_RSP, reason = %u", m_response);
} }
else { else {
LogError(LOG_P25, "invalid values for TSBK_OSP_DENY_RSP, reason = %u", m_response); LogError(LOG_P25, "TSBK::encode(), invalid values for TSBK_OSP_DENY_RSP, reason = %u", m_response);
} }
return; // blatently ignore creating this TSBK return; // blatently ignore creating this TSBK
} }
@ -606,7 +624,7 @@ void TSBK::encode(uint8_t * data, bool singleBlock)
tsbkValue = (tsbkValue << 32) + calcBaseFreq; // Base Frequency tsbkValue = (tsbkValue << 32) + calcBaseFreq; // Base Frequency
} }
else { else {
LogError(LOG_P25, "invalid values for TSBK_OSP_IDEN_UP_VU, baseFrequency = %uHz, txOffsetMhz = %uMHz, chBandwidthKhz = %fKHz, chSpaceKhz = %fKHz", LogError(LOG_P25, "TSBK::encode(), invalid values for TSBK_OSP_IDEN_UP_VU, baseFrequency = %uHz, txOffsetMhz = %uMHz, chBandwidthKhz = %fKHz, chSpaceKhz = %fKHz",
m_siteIdenEntry.baseFrequency(), m_siteIdenEntry.txOffsetMhz(), m_siteIdenEntry.chBandwidthKhz(), m_siteIdenEntry.baseFrequency(), m_siteIdenEntry.txOffsetMhz(), m_siteIdenEntry.chBandwidthKhz(),
m_siteIdenEntry.chSpaceKhz()); m_siteIdenEntry.chSpaceKhz());
return; // blatently ignore creating this TSBK return; // blatently ignore creating this TSBK
@ -672,7 +690,7 @@ void TSBK::encode(uint8_t * data, bool singleBlock)
tsbkValue = (tsbkValue << 8) + m_adjServiceClass; // System Service Class tsbkValue = (tsbkValue << 8) + m_adjServiceClass; // System Service Class
} }
else { else {
LogError(LOG_P25, "invalid values for OSP_ADJ_STS_BCAST, adjRfssId = $%02X, adjSiteId = $%02X, adjChannelId = %u, adjChannelNo = $%02X, adjSvcClass = $%02X", LogError(LOG_P25, "TSBK::encode(), invalid values for OSP_ADJ_STS_BCAST, adjRfssId = $%02X, adjSiteId = $%02X, adjChannelId = %u, adjChannelNo = $%02X, adjSvcClass = $%02X",
m_adjRfssId, m_adjSiteId, m_adjChannelId, m_adjChannelNo, m_adjServiceClass); m_adjRfssId, m_adjSiteId, m_adjChannelId, m_adjChannelNo, m_adjServiceClass);
return; // blatently ignore creating this TSBK return; // blatently ignore creating this TSBK
} }
@ -683,7 +701,7 @@ void TSBK::encode(uint8_t * data, bool singleBlock)
if ((m_siteIdenEntry.chBandwidthKhz() != 0.0F) && (m_siteIdenEntry.chSpaceKhz() != 0.0F) && if ((m_siteIdenEntry.chBandwidthKhz() != 0.0F) && (m_siteIdenEntry.chSpaceKhz() != 0.0F) &&
(m_siteIdenEntry.txOffsetMhz() != 0.0F) && (m_siteIdenEntry.baseFrequency() != 0U)) { (m_siteIdenEntry.txOffsetMhz() != 0.0F) && (m_siteIdenEntry.baseFrequency() != 0U)) {
if (m_siteIdenEntry.baseFrequency() < 762000000U) { if (m_siteIdenEntry.baseFrequency() < 762000000U) {
LogError(LOG_P25, "invalid values for TSBK_OSP_IDEN_UP, baseFrequency = %uHz", LogError(LOG_P25, "TSBK::encode(), invalid values for TSBK_OSP_IDEN_UP, baseFrequency = %uHz",
m_siteIdenEntry.baseFrequency()); m_siteIdenEntry.baseFrequency());
return; // blatently ignore creating this TSBK return; // blatently ignore creating this TSBK
} }
@ -703,7 +721,7 @@ void TSBK::encode(uint8_t * data, bool singleBlock)
tsbkValue = (tsbkValue << 32) + calcBaseFreq; // Base Frequency tsbkValue = (tsbkValue << 32) + calcBaseFreq; // Base Frequency
} }
else { else {
LogError(LOG_P25, "invalid values for TSBK_OSP_IDEN_UP, baseFrequency = %uHz, txOffsetMhz = %uMHz, chBandwidthKhz = %fKHz, chSpaceKhz = %fKHz", LogError(LOG_P25, "TSBK::encode(), invalid values for TSBK_OSP_IDEN_UP, baseFrequency = %uHz, txOffsetMhz = %uMHz, chBandwidthKhz = %fKHz, chSpaceKhz = %fKHz",
m_siteIdenEntry.baseFrequency(), m_siteIdenEntry.txOffsetMhz(), m_siteIdenEntry.chBandwidthKhz(), m_siteIdenEntry.baseFrequency(), m_siteIdenEntry.txOffsetMhz(), m_siteIdenEntry.chBandwidthKhz(),
m_siteIdenEntry.chSpaceKhz()); m_siteIdenEntry.chSpaceKhz());
return; // blatently ignore creating this TSBK return; // blatently ignore creating this TSBK
@ -712,7 +730,7 @@ void TSBK::encode(uint8_t * data, bool singleBlock)
break; break;
default: default:
if (m_mfId == P25_MFG_STANDARD) { if (m_mfId == P25_MFG_STANDARD) {
LogError(LOG_P25, "unknown TSBK LCO value, mfId = $%02X, lco = $%02X", m_mfId, m_lco); LogError(LOG_P25, "TSBK::encode(), unknown TSBK LCO value, mfId = $%02X, lco = $%02X", m_mfId, m_lco);
} }
break; break;
} }
@ -767,7 +785,7 @@ void TSBK::encode(uint8_t * data, bool singleBlock)
} }
} }
else { else {
LogError(LOG_P25, "invalid values for TSBK_OSP_MOT_GRG_DEL, patchSuperGroupId = $%02X, patchGroup1Id = $%02X", LogError(LOG_P25, "TSBK::encode(), invalid values for TSBK_OSP_MOT_GRG_DEL, patchSuperGroupId = $%02X, patchGroup1Id = $%02X",
m_patchSuperGroupId, m_patchGroup1Id); m_patchSuperGroupId, m_patchGroup1Id);
return; // blatently ignore creating this TSBK return; // blatently ignore creating this TSBK
} }
@ -783,7 +801,7 @@ void TSBK::encode(uint8_t * data, bool singleBlock)
tsbkValue = (tsbkValue << 24) + m_srcId; // Source Radio Address tsbkValue = (tsbkValue << 24) + m_srcId; // Source Radio Address
} }
else { else {
LogError(LOG_P25, "invalid values for TSBK_OSP_MOT_GRG_VCH_GRANT, patchSuperGroupId = $%02X", m_patchSuperGroupId); LogError(LOG_P25, "TSBK::encode(), invalid values for TSBK_OSP_MOT_GRG_VCH_GRANT, patchSuperGroupId = $%02X", m_patchSuperGroupId);
return; // blatently ignore creating this TSBK return; // blatently ignore creating this TSBK
} }
} }
@ -824,7 +842,7 @@ void TSBK::encode(uint8_t * data, bool singleBlock)
case TSBK_OSP_U_DEREG_ACK: case TSBK_OSP_U_DEREG_ACK:
break; break;
default: default:
LogError(LOG_P25, "unknown TSBK LCO value, mfId = $%02X, lco = $%02X", m_mfId, m_lco); LogError(LOG_P25, "TSBK::encode(), unknown TSBK LCO value, mfId = $%02X, lco = $%02X", m_mfId, m_lco);
break; break;
} }
} }
@ -839,7 +857,7 @@ void TSBK::encode(uint8_t * data, bool singleBlock)
tsbkValue = (tsbkValue << 24) + m_srcId; // Source Radio Address tsbkValue = (tsbkValue << 24) + m_srcId; // Source Radio Address
break; break;
default: default:
LogError(LOG_P25, "unknown TSBK LCO value, mfId = $%02X, lco = $%02X", m_mfId, m_lco); LogError(LOG_P25, "TSBK::encode(), unknown TSBK LCO value, mfId = $%02X, lco = $%02X", m_mfId, m_lco);
break; break;
} }
} }
@ -915,6 +933,7 @@ void TSBK::setCallsign(std::string callsign)
/// <param name="siteData"></param> /// <param name="siteData"></param>
TSBK::TSBK(SiteData siteData) : TSBK::TSBK(SiteData siteData) :
m_verbose(false), m_verbose(false),
m_warnCRC(false),
m_protect(false), m_protect(false),
m_lco(LC_GROUP), m_lco(LC_GROUP),
m_mfId(P25_MFG_STANDARD), m_mfId(P25_MFG_STANDARD),

@ -63,6 +63,8 @@ namespace p25
/// <summary>Initializes a new instance of the TSBK class.</summary> /// <summary>Initializes a new instance of the TSBK class.</summary>
TSBK(SiteData siteData, lookups::IdenTable entry, bool verbose); TSBK(SiteData siteData, lookups::IdenTable entry, bool verbose);
/// <summary>Initializes a new instance of the TSBK class.</summary> /// <summary>Initializes a new instance of the TSBK class.</summary>
TSBK(SiteData siteData, lookups::IdenTable entry, bool verbose, bool warnCRC);
/// <summary>Initializes a new instance of the TSBK class.</summary>
TSBK(LC* lc); TSBK(LC* lc);
/// <summary>Finalizes a instance of the TSBK class.</summary> /// <summary>Finalizes a instance of the TSBK class.</summary>
~TSBK(); ~TSBK();
@ -84,6 +86,8 @@ namespace p25
public: public:
/// <summary>Flag indicating verbose log output.</summary> /// <summary>Flag indicating verbose log output.</summary>
__PROPERTY(bool, verbose, Verbose); __PROPERTY(bool, verbose, Verbose);
/// <summary>Flag indicating CRC-errors should be warnings and not errors.</summary>
__PROPERTY(bool, warnCRC, WarnCRC);
/** Common Data */ /** Common Data */
/// <summary>Flag indicating the link control data is protected.</summary> /// <summary>Flag indicating the link control data is protected.</summary>

Loading…
Cancel
Save

Powered by TurnKey Linux.