Skip to content

Commit

Permalink
Merge pull request #473 from gatekeep/P25Changes
Browse files Browse the repository at this point in the history
Experimental P25 changes for LDU LC drop
  • Loading branch information
g4klx authored Nov 13, 2018
2 parents 9444eca + b8de542 commit 8b933ae
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 3 deletions.
26 changes: 23 additions & 3 deletions P25Control.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,13 +57,16 @@ m_networkWatchdog(1000U, 0U, 1500U),
m_rfFrames(0U),
m_rfBits(0U),
m_rfErrs(0U),
m_rfUndecodableLC(0U),
m_netFrames(0U),
m_netLost(0U),
m_rfDataFrames(0U),
m_nid(nac),
m_lastDUID(P25_DUID_TERM),
m_audio(),
m_rfData(),
m_rfLastLDU1(),
m_rfLastLDU2(),
m_netData(),
m_rfLSD(),
m_netLSD(),
Expand Down Expand Up @@ -123,6 +126,8 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
else
LogMessage("P25, transmission lost, %.1f seconds, BER: %.1f%%", float(m_rfFrames) / 5.56F, float(m_rfErrs * 100U) / float(m_rfBits));

LogMessage("P25, total frames: %d, bits: %d, undecodable LC: %d, errors: %d, BER: %.4f%%", m_rfFrames, m_rfBits, m_rfUndecodableLC, m_rfErrs, float(m_rfErrs * 100U) / float(m_rfBits));

if (m_netState == RS_NET_IDLE)
m_display->clearP25();

Expand Down Expand Up @@ -225,7 +230,7 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
}
else if (duid == P25_DUID_LDU1) {
if (m_rfState == RS_RF_LISTENING) {
//m_rfData.reset();
m_rfData.reset();
bool ret = m_rfData.decodeLDU1(data + 2U);
if (!ret) {
m_lastDUID = duid;
Expand Down Expand Up @@ -279,7 +284,12 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
if (m_rfState == RS_RF_AUDIO) {
bool ret = m_rfData.decodeLDU1(data + 2U);
if (!ret) {
return false;
LogWarning("P25, LDU1 undecodable LC, using last LDU1 LC");
m_rfData = m_rfLastLDU1;
m_rfUndecodableLC++;
}
else {
m_rfLastLDU1 = m_rfData;
}

// Regenerate Sync
Expand Down Expand Up @@ -328,7 +338,12 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
if (m_rfState == RS_RF_AUDIO) {
bool ret = m_rfData.decodeLDU2(data + 2U);
if (!ret) {
return false;
LogWarning("P25, LDU2 undecodable LC, using last LDU2 LC");
m_rfData = m_rfLastLDU2;
m_rfUndecodableLC++;
}
else {
m_rfLastLDU2 = m_rfData;
}

writeNetwork(m_rfLDU, m_lastDUID, false);
Expand Down Expand Up @@ -479,6 +494,8 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
else
LogMessage("P25, received RF end of voice transmission, %.1f seconds, BER: %.1f%%", float(m_rfFrames) / 5.56F, float(m_rfErrs * 100U) / float(m_rfBits));

LogMessage("P25, total frames: %d, bits: %d, undecodable LC: %d, errors: %d, BER: %.4f%%", m_rfFrames, m_rfBits, m_rfUndecodableLC, m_rfErrs, float(m_rfErrs * 100U) / float(m_rfBits));

m_display->clearP25();

#if defined(DUMP_P25)
Expand Down Expand Up @@ -936,6 +953,9 @@ void CP25Control::createRFHeader()

m_rfFrames = 0U;
m_rfErrs = 0U;
m_rfUndecodableLC = 0U;
m_rfLastLDU1.reset();
m_rfLastLDU2.reset();
m_rfBits = 1U;
m_rfTimeout.start();
m_lastDUID = P25_DUID_HEADER;
Expand Down
3 changes: 3 additions & 0 deletions P25Control.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,13 +65,16 @@ class CP25Control {
unsigned int m_rfFrames;
unsigned int m_rfBits;
unsigned int m_rfErrs;
unsigned int m_rfUndecodableLC;
unsigned int m_netFrames;
unsigned int m_netLost;
unsigned int m_rfDataFrames;
CP25NID m_nid;
unsigned char m_lastDUID;
CP25Audio m_audio;
CP25Data m_rfData;
CP25Data m_rfLastLDU1;
CP25Data m_rfLastLDU2;
CP25Data m_netData;
CP25LowSpeedData m_rfLSD;
CP25LowSpeedData m_netLSD;
Expand Down
19 changes: 19 additions & 0 deletions P25Data.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,25 @@ CP25Data::~CP25Data()
delete[] m_mi;
}

CP25Data& CP25Data::operator=(const CP25Data& data)
{
if (this != &data) {
m_mfId = data.m_mfId;

m_srcId = data.m_srcId;
m_dstId = data.m_dstId;

m_emergency = data.m_emergency;

m_algId = data.m_algId;
m_kId = data.m_kId;

::memcpy(m_mi, data.m_mi, P25_MI_LENGTH_BYTES);
}

return *this;
}

bool CP25Data::decodeHeader(const unsigned char* data)
{
assert(data != NULL);
Expand Down
2 changes: 2 additions & 0 deletions P25Data.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ class CP25Data {
public:
CP25Data();
~CP25Data();

CP25Data& operator=(const CP25Data& data);

bool decodeHeader(const unsigned char* data);
void encodeHeader(unsigned char* data);
Expand Down

0 comments on commit 8b933ae

Please sign in to comment.