Add RSSI display for all modes.

This commit is contained in:
Jonathan Naylor
2017-01-05 19:15:10 +00:00
parent 8debea45e4
commit af721f89e2
18 changed files with 381 additions and 129 deletions

View File

@@ -11,6 +11,7 @@
* GNU General Public License for more details.
*/
#include "DMRAccessControl.h"
#include "DMRSlotType.h"
#include "DMRShortLC.h"
#include "DMRTrellis.h"
@@ -18,11 +19,11 @@
#include "BPTC19696.h"
#include "DMRSlot.h"
#include "DMRCSBK.h"
#include "DMREMB.h"
#include "Utils.h"
#include "Sync.h"
#include "CRC.h"
#include "Log.h"
#include "DMRAccessControl.h"
#include <cassert>
#include <ctime>
@@ -84,8 +85,11 @@ m_rfErrs(0U),
m_netErrs(0U),
m_lastFrame(NULL),
m_lastFrameValid(false),
m_lastEMB(),
m_rssi(0U),
m_maxRSSI(0U),
m_minRSSI(0U),
m_aveRSSI(0U),
m_rssiCount(0U),
m_fp(NULL)
{
m_lastFrame = new unsigned char[DMR_FRAME_LENGTH_BYTES + 2U];
@@ -103,13 +107,13 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len)
assert(data != NULL);
if (data[0U] == TAG_LOST && m_rfState == RS_RF_AUDIO) {
LogMessage("DMR Slot %u, RF transmission lost, %.1f seconds, BER: %.1f%%", m_slotNo, float(m_rfFrames) / 16.667F, float(m_rfErrs * 100U) / float(m_rfBits));
LogMessage("DMR Slot %u, RF voice transmission lost, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", m_slotNo, float(m_rfFrames) / 16.667F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCount);
writeEndRF(true);
return;
}
if (data[0U] == TAG_LOST && m_rfState == RS_RF_DATA) {
LogMessage("DMR Slot %u, RF transmission lost", m_slotNo);
LogMessage("DMR Slot %u, RF data transmission lost", m_slotNo);
writeEndRF();
return;
}
@@ -131,6 +135,14 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len)
// RSSI is always reported as positive
m_rssi = (rssi >= 0) ? rssi : -rssi;
if (m_rssi > m_minRSSI)
m_minRSSI = m_rssi;
if (m_rssi < m_maxRSSI)
m_maxRSSI = m_rssi;
m_aveRSSI += m_rssi;
m_rssiCount++;
}
bool dataSync = (data[1U] & DMR_SYNC_DATA) == DMR_SYNC_DATA;
@@ -155,13 +167,20 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len)
unsigned int srcId = lc->getSrcId();
unsigned int dstId = lc->getDstId();
FLCO flco = lc->getFLCO();
if (!CDMRAccessControl::validateId(srcId)) {
if (!CDMRAccessControl::validateSrcId(srcId)) {
LogMessage("DMR Slot %u, RF user %u rejected", m_slotNo, srcId);
delete lc;
return;
}
if (!CDMRAccessControl::validateTGId(m_slotNo, flco == FLCO_GROUP, dstId)) {
LogMessage("DMR Slot %u, RF user %u rejected for using TG %u", m_slotNo, srcId, dstId);
delete lc;
return;
}
m_rfLC = lc;
// Regenerate the LC data
@@ -184,6 +203,11 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len)
m_rfBits = 1U;
m_rfErrs = 0U;
m_minRSSI = m_rssi;
m_maxRSSI = m_rssi;
m_aveRSSI = m_rssi;
m_rssiCount = 1U;
if (m_duplex) {
m_queue.clear();
m_modem->writeDMRAbort(m_slotNo);
@@ -201,11 +225,11 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len)
std::string dst = m_lookup->find(dstId);
if (m_netState == RS_NET_IDLE) {
setShortLC(m_slotNo, dstId, m_rfLC->getFLCO(), true);
m_display->writeDMR(m_slotNo, src, m_rfLC->getFLCO() == FLCO_GROUP, dst, "R");
setShortLC(m_slotNo, dstId, flco, true);
m_display->writeDMR(m_slotNo, src, flco == FLCO_GROUP, dst, "R");
}
LogMessage("DMR Slot %u, received RF voice header from %s to %s%s", m_slotNo, src.c_str(), m_rfLC->getFLCO() == FLCO_GROUP ? "TG " : "", dst.c_str());
LogMessage("DMR Slot %u, received RF voice header from %s to %s%s", m_slotNo, src.c_str(), flco == FLCO_GROUP ? "TG " : "", dst.c_str());
} else if (dataType == DT_VOICE_PI_HEADER) {
if (m_rfState != RS_RF_AUDIO)
return;
@@ -254,7 +278,7 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len)
writeQueueRF(data);
}
LogMessage("DMR Slot %u, received RF end of voice transmission, %.1f seconds, BER: %.1f%%", m_slotNo, float(m_rfFrames) / 16.667F, float(m_rfErrs * 100U) / float(m_rfBits));
LogMessage("DMR Slot %u, received RF end of voice transmission, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", m_slotNo, float(m_rfFrames) / 16.667F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCount);
writeEndRF();
} else if (dataType == DT_DATA_HEADER) {
@@ -270,11 +294,16 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len)
unsigned int srcId = dataHeader.getSrcId();
unsigned int dstId = dataHeader.getDstId();
if (!CDMRAccessControl::validateId(srcId)) {
if (!CDMRAccessControl::validateSrcId(srcId)) {
LogMessage("DMR Slot %u, RF user %u rejected", m_slotNo, srcId);
return;
}
if (!CDMRAccessControl::validateTGId(m_slotNo, gi, dstId)) {
LogMessage("DMR Slot %u, RF user %u rejected for using TG %u", m_slotNo, srcId, dstId);
return;
}
m_rfFrames = dataHeader.getBlocks();
m_rfDataHeader = dataHeader;
@@ -329,10 +358,15 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len)
unsigned int dstId = csbk.getDstId();
if (srcId != 0U || dstId != 0U) {
if (!CDMRAccessControl::validateId(srcId)) {
if (!CDMRAccessControl::validateSrcId(srcId)) {
LogMessage("DMR Slot %u, RF user %u rejected", m_slotNo, srcId);
return;
}
if (!CDMRAccessControl::validateTGId(m_slotNo, gi, dstId)) {
LogMessage("DMR Slot %u, RF user %u rejected for using TG %u", m_slotNo, srcId, dstId);
return;
}
}
// Regenerate the CSBK data
@@ -490,13 +524,20 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len)
if (lc != NULL) {
unsigned int srcId = lc->getSrcId();
unsigned int dstId = lc->getDstId();
FLCO flco = lc->getFLCO();
if (!CDMRAccessControl::validateId(srcId)) {
if (!CDMRAccessControl::validateSrcId(srcId)) {
LogMessage("DMR Slot %u, RF user %u rejected", m_slotNo, srcId);
delete lc;
return;
}
if (!CDMRAccessControl::validateTGId(m_slotNo, flco == FLCO_GROUP, dstId)) {
LogMessage("DMR Slot %u, RF user %u rejected for using TG %u", m_slotNo, srcId, dstId);
delete lc;
return;
}
m_rfLC = lc;
// Create a dummy start frame to replace the received frame
@@ -516,12 +557,18 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len)
start[1U] = 0x00U;
m_rfTimeoutTimer.start();
m_rfEmbeddedLC.reset();
m_rfFrames = 0U;
m_rfSeqNo = 0U;
m_rfBits = 1U;
m_rfErrs = 0U;
m_minRSSI = m_rssi;
m_maxRSSI = m_rssi;
m_aveRSSI = m_rssi;
m_rssiCount = 1U;
if (m_duplex) {
m_queue.clear();
m_modem->writeDMRAbort(m_slotNo);
@@ -565,11 +612,11 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len)
std::string dst = m_lookup->find(dstId);
if (m_netState == RS_NET_IDLE) {
setShortLC(m_slotNo, dstId, m_rfLC->getFLCO(), true);
m_display->writeDMR(m_slotNo, src, m_rfLC->getFLCO() == FLCO_GROUP, dst, "R");
setShortLC(m_slotNo, dstId, flco, true);
m_display->writeDMR(m_slotNo, src, flco == FLCO_GROUP, dst, "R");
}
LogMessage("DMR Slot %u, received RF late entry from %s to %s%s", m_slotNo, src.c_str(), m_rfLC->getFLCO() == FLCO_GROUP ? "TG " : "", dst.c_str());
LogMessage("DMR Slot %u, received RF late entry from %s to %s%s", m_slotNo, src.c_str(), flco == FLCO_GROUP ? "TG " : "", dst.c_str());
}
}
}
@@ -1105,11 +1152,12 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
m_netBits += 141U;
// Change the color code in the EMB
m_lastEMB.putData(data + 2U);
m_lastEMB.setColorCode(m_colorCode);
m_lastEMB.getData(data + 2U);
CDMREMB emb;
emb.putData(data + 2U);
emb.setColorCode(m_colorCode);
emb.getData(data + 2U);
m_netEmbeddedLC.addData(data + 2U, m_lastEMB.getLCSS());
m_netEmbeddedLC.addData(data + 2U, emb.getLCSS());
data[0U] = TAG_DATA;
data[1U] = 0x00U;
@@ -1582,6 +1630,10 @@ void CDMRSlot::insertSilence(unsigned int count)
unsigned char fid = m_netLC->getFID();
CDMREMB emb;
emb.setColorCode(m_colorCode);
emb.setLCSS(0U);
for (unsigned int i = 0U; i < count; i++) {
// Only use our silence frame if its AMBE audio data
if (fid == FID_ETSI || fid == FID_DMRA) {
@@ -1595,10 +1647,7 @@ void CDMRSlot::insertSilence(unsigned int count)
CSync::addDMRAudioSync(data + 2U, m_duplex);
} else {
::memset(data + 2U + 13U, 0x00U, 7U);
m_lastEMB.setColorCode(m_colorCode);
m_lastEMB.setLCSS(0U);
m_lastEMB.getData(data + 2U);
emb.getData(data + 2U);
}
writeQueueNet(data);