mirror of
https://github.com/g4klx/MMDVMHost
synced 2025-12-20 22:45:44 +08:00
Add RSSI display for all modes.
This commit is contained in:
95
DMRSlot.cpp
95
DMRSlot.cpp
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user