diff --git a/DMRData.cpp b/DMRData.cpp index 3952ce4..b9308a2 100644 --- a/DMRData.cpp +++ b/DMRData.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015 Jonathan Naylor, G4KLX + * Copyright (C) 2015,2016 Jonathan Naylor, G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -29,7 +29,9 @@ m_dstId(data.m_dstId), m_flco(data.m_flco), m_dataType(data.m_dataType), m_seqNo(data.m_seqNo), -m_n(data.m_n) +m_n(data.m_n), +m_ber(data.m_ber), +m_rssi(data.m_rssi) { m_data = new unsigned char[2U * DMR_FRAME_LENGTH_BYTES]; ::memcpy(m_data, data.m_data, 2U * DMR_FRAME_LENGTH_BYTES); @@ -43,7 +45,9 @@ m_dstId(0U), m_flco(FLCO_GROUP), m_dataType(0U), m_seqNo(0U), -m_n(0U) +m_n(0U), +m_ber(0U), +m_rssi(0U) { m_data = new unsigned char[2U * DMR_FRAME_LENGTH_BYTES]; } @@ -65,6 +69,8 @@ CDMRData& CDMRData::operator=(const CDMRData& data) m_dataType = data.m_dataType; m_seqNo = data.m_seqNo; m_n = data.m_n; + m_ber = data.m_ber; + m_rssi = data.m_rssi; } return *this; @@ -142,6 +148,26 @@ void CDMRData::setN(unsigned char n) m_n = n; } +unsigned char CDMRData::getBER() const +{ + return m_ber; +} + +void CDMRData::setBER(unsigned char ber) +{ + m_ber = ber; +} + +unsigned char CDMRData::getRSSI() const +{ + return m_rssi; +} + +void CDMRData::setRSSI(unsigned char rssi) +{ + m_rssi = rssi; +} + unsigned int CDMRData::getData(unsigned char* buffer) const { assert(buffer != NULL); diff --git a/DMRData.h b/DMRData.h index 7fcc0a3..5a5be24 100644 --- a/DMRData.h +++ b/DMRData.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015 by Jonathan Naylor, G4KLX + * Copyright (C) 2015,2016 by Jonathan Naylor, G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -45,6 +45,12 @@ public: unsigned char getDataType() const; void setDataType(unsigned char dataType); + unsigned char getBER() const; + void setBER(unsigned char ber); + + unsigned char getRSSI() const; + void setRSSI(unsigned char ber); + void setData(const unsigned char* buffer); unsigned int getData(unsigned char* buffer) const; @@ -57,6 +63,8 @@ private: unsigned char m_dataType; unsigned char m_seqNo; unsigned char m_n; + unsigned char m_ber; + unsigned char m_rssi; }; #endif diff --git a/DMRIPSC.cpp b/DMRIPSC.cpp index e584448..0d0ba94 100644 --- a/DMRIPSC.cpp +++ b/DMRIPSC.cpp @@ -28,7 +28,7 @@ const unsigned int BUFFER_LENGTH = 500U; -const unsigned int HOMEBREW_DATA_PACKET_LENGTH = 53U; +const unsigned int HOMEBREW_DATA_PACKET_LENGTH = 55U; CDMRIPSC::CDMRIPSC(const std::string& address, unsigned int port, unsigned int id, const std::string& password, bool duplex, const char* version, bool debug, bool slot1, bool slot2) : @@ -265,6 +265,10 @@ bool CDMRIPSC::write(const CDMRData& data) data.getData(buffer + 20U); + buffer[53U] = data.getBER(); + + buffer[54U] = data.getRSSI(); + if (m_debug) CUtils::dump(1U, "IPSC Transmitted", buffer, HOMEBREW_DATA_PACKET_LENGTH); diff --git a/DMRSlot.cpp b/DMRSlot.cpp index fb28845..da029f1 100644 --- a/DMRSlot.cpp +++ b/DMRSlot.cpp @@ -394,9 +394,10 @@ void CDMRSlot::writeModem(unsigned char *data) // Convert the Audio Sync to be from the BS CSync::addDMRAudioSync(data + 2U); + unsigned int errors = 0U; unsigned char fid = m_rfLC->getFID(); if (fid == FID_ETSI || fid == FID_DMRA) { - unsigned int errors = m_fec.regenerateDMR(data + 2U); + errors = m_fec.regenerateDMR(data + 2U); LogDebug("DMR Slot %u, audio sequence no. 0, errs: %u/141", m_slotNo, errors); m_rfErrs += errors; } @@ -409,7 +410,7 @@ void CDMRSlot::writeModem(unsigned char *data) if (m_duplex) writeQueueRF(data); - writeNetworkRF(data, DT_VOICE_SYNC); + writeNetworkRF(data, DT_VOICE_SYNC, errors); } else if (m_rfState == RS_RF_LISTENING) { m_rfState = RS_RF_LATE_ENTRY; } @@ -428,9 +429,10 @@ void CDMRSlot::writeModem(unsigned char *data) emb.setLCSS(lcss); emb.getData(data + 2U); + unsigned int errors = 0U; unsigned char fid = m_rfLC->getFID(); if (fid == FID_ETSI || fid == FID_DMRA) { - unsigned int errors = m_fec.regenerateDMR(data + 2U); + errors = m_fec.regenerateDMR(data + 2U); LogDebug("DMR Slot %u, audio sequence no. %u, errs: %u/141", m_slotNo, m_rfN, errors); m_rfErrs += errors; } @@ -443,7 +445,7 @@ void CDMRSlot::writeModem(unsigned char *data) if (m_duplex) writeQueueRF(data); - writeNetworkRF(data, DT_VOICE); + writeNetworkRF(data, DT_VOICE, errors); } else if (m_rfState == RS_RF_LATE_ENTRY) { CDMREMB emb; emb.putData(data + 2U); @@ -498,9 +500,10 @@ void CDMRSlot::writeModem(unsigned char *data) emb.getData(data + 2U); // Send the original audio frame out + unsigned int errors = 0U; unsigned char fid = m_rfLC->getFID(); if (fid == FID_ETSI || fid == FID_DMRA) { - unsigned int errors = m_fec.regenerateDMR(data + 2U); + errors = m_fec.regenerateDMR(data + 2U); LogDebug("DMR Slot %u, audio sequence no. %u, errs: %u/141", m_slotNo, m_rfN, errors); m_rfErrs += errors; } @@ -513,7 +516,7 @@ void CDMRSlot::writeModem(unsigned char *data) if (m_duplex) writeQueueRF(data); - writeNetworkRF(data, DT_VOICE); + writeNetworkRF(data, DT_VOICE, errors); m_rfState = RS_RF_AUDIO; @@ -1133,7 +1136,7 @@ void CDMRSlot::writeQueueRF(const unsigned char *data) m_queue.addData(data, len); } -void CDMRSlot::writeNetworkRF(const unsigned char* data, unsigned char dataType, FLCO flco, unsigned int srcId, unsigned int dstId) +void CDMRSlot::writeNetworkRF(const unsigned char* data, unsigned char dataType, FLCO flco, unsigned int srcId, unsigned int dstId, unsigned char errors) { assert(data != NULL); @@ -1155,6 +1158,7 @@ void CDMRSlot::writeNetworkRF(const unsigned char* data, unsigned char dataType, dmrData.setFLCO(flco); dmrData.setN(m_rfN); dmrData.setSeqNo(m_rfSeqNo); + dmrData.setBER(errors); m_rfSeqNo++; @@ -1163,12 +1167,12 @@ void CDMRSlot::writeNetworkRF(const unsigned char* data, unsigned char dataType, m_network->write(dmrData); } -void CDMRSlot::writeNetworkRF(const unsigned char* data, unsigned char dataType) +void CDMRSlot::writeNetworkRF(const unsigned char* data, unsigned char dataType, unsigned char errors) { assert(data != NULL); assert(m_rfLC != NULL); - writeNetworkRF(data, dataType, m_rfLC->getFLCO(), m_rfLC->getSrcId(), m_rfLC->getDstId()); + writeNetworkRF(data, dataType, m_rfLC->getFLCO(), m_rfLC->getSrcId(), m_rfLC->getDstId(), errors); } void CDMRSlot::writeQueueNet(const unsigned char *data) diff --git a/DMRSlot.h b/DMRSlot.h index a12d14a..23fda24 100644 --- a/DMRSlot.h +++ b/DMRSlot.h @@ -99,8 +99,8 @@ private: void writeQueueRF(const unsigned char* data); void writeQueueNet(const unsigned char* data); - void writeNetworkRF(const unsigned char* data, unsigned char dataType); - void writeNetworkRF(const unsigned char* data, unsigned char dataType, FLCO flco, unsigned int srcId, unsigned int dstId); + void writeNetworkRF(const unsigned char* data, unsigned char dataType, unsigned char errors = 0U); + void writeNetworkRF(const unsigned char* data, unsigned char dataType, FLCO flco, unsigned int srcId, unsigned int dstId, unsigned char errors = 0U); void writeEndRF(bool writeEnd = false); void writeEndNet(bool writeEnd = false);