mirror of
https://github.com/g4klx/MMDVMHost
synced 2025-12-24 09:35:40 +08:00
Merge branch 'master' into P25
This commit is contained in:
61
DMRSlot.cpp
61
DMRSlot.cpp
@@ -152,13 +152,19 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
||||
if (lc == NULL)
|
||||
return;
|
||||
|
||||
unsigned int id = lc->getSrcId();
|
||||
unsigned int sid = lc->getSrcId();
|
||||
unsigned int did = lc->getDstId();
|
||||
if (!DMRAccessControl::validateAccess(id, did, m_slotNo, false)) {
|
||||
if (!DMRAccessControl::validateAccess(sid, did, m_slotNo, false)) {
|
||||
delete lc;
|
||||
return;
|
||||
}
|
||||
|
||||
unsigned int rw_id = DMRAccessControl::DstIdRewrite(did,sid,m_slotNo,false,lc);
|
||||
if (rw_id) {
|
||||
|
||||
lc->setDstId(rw_id);
|
||||
}
|
||||
|
||||
m_rfLC = lc;
|
||||
|
||||
// Store the LC for the embedded LC
|
||||
@@ -196,7 +202,7 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
||||
|
||||
m_rfState = RS_RF_AUDIO;
|
||||
|
||||
std::string src = m_lookup->find(id);
|
||||
std::string src = m_lookup->find(sid);
|
||||
std::string dst = m_lookup->find(m_rfLC->getDstId());
|
||||
|
||||
if (m_netState == RS_NET_IDLE) {
|
||||
@@ -249,13 +255,16 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
||||
writeNetworkRF(data, DT_TERMINATOR_WITH_LC);
|
||||
|
||||
if (m_duplex) {
|
||||
|
||||
for (unsigned int i = 0U; i < m_hangCount; i++)
|
||||
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));
|
||||
|
||||
writeEndRF();
|
||||
DMRAccessControl::setOverEndTime();
|
||||
} else if (dataType == DT_DATA_HEADER) {
|
||||
if (m_rfState == RS_RF_DATA)
|
||||
return;
|
||||
@@ -271,6 +280,7 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
||||
if (!DMRAccessControl::validateAccess(srcId, dstId, m_slotNo, false))
|
||||
return;
|
||||
|
||||
|
||||
m_rfFrames = dataHeader.getBlocks();
|
||||
|
||||
m_rfDataHeader = dataHeader;
|
||||
@@ -325,7 +335,7 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
||||
unsigned int dstId = csbk.getDstId();
|
||||
if (!DMRAccessControl::validateAccess(srcId, dstId, m_slotNo, false))
|
||||
return;
|
||||
|
||||
|
||||
// Regenerate the CSBK data
|
||||
csbk.get(data + 2U);
|
||||
|
||||
@@ -478,12 +488,16 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
||||
|
||||
CDMRLC* lc = m_rfEmbeddedLC.addData(data + 2U, emb.getLCSS());
|
||||
if (lc != NULL) {
|
||||
unsigned int id = lc->getSrcId();
|
||||
unsigned int sid = lc->getSrcId();
|
||||
unsigned int did = lc->getDstId();
|
||||
if (!DMRAccessControl::validateAccess(id,did,m_slotNo,false)) {
|
||||
if (!DMRAccessControl::validateAccess(sid,did,m_slotNo,false)) {
|
||||
delete lc;
|
||||
return;
|
||||
}
|
||||
unsigned int rw_id = DMRAccessControl::DstIdRewrite(did,sid,m_slotNo,false,lc);
|
||||
if (rw_id) {
|
||||
lc->setDstId(rw_id);
|
||||
}
|
||||
|
||||
m_rfLC = lc;
|
||||
|
||||
@@ -644,9 +658,11 @@ void CDMRSlot::writeEndRF(bool writeEnd)
|
||||
|
||||
data[0U] = TAG_EOT;
|
||||
data[1U] = 0x00U;
|
||||
|
||||
|
||||
|
||||
for (unsigned int i = 0U; i < m_hangCount; i++)
|
||||
writeQueueRF(data);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -719,8 +735,10 @@ void CDMRSlot::writeEndNet(bool writeEnd)
|
||||
data[1U] = 0x00U;
|
||||
|
||||
if (m_duplex) {
|
||||
|
||||
for (unsigned int i = 0U; i < m_hangCount; i++)
|
||||
writeQueueNet(data);
|
||||
|
||||
} else {
|
||||
for (unsigned int i = 0U; i < 3U; i++)
|
||||
writeQueueNet(data);
|
||||
@@ -759,9 +777,16 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
||||
}
|
||||
|
||||
unsigned int did = m_netLC->getDstId();
|
||||
unsigned int id = m_netLC->getSrcId();
|
||||
if (!DMRAccessControl::validateAccess(id, did, m_slotNo, true))
|
||||
unsigned int sid = m_netLC->getSrcId();
|
||||
if (!DMRAccessControl::validateAccess(sid, did, m_slotNo, true))
|
||||
return;
|
||||
|
||||
// Test dst rewrite
|
||||
unsigned int rw_id = DMRAccessControl::DstIdRewrite(did, sid,m_slotNo, true,m_netLC);
|
||||
if (rw_id) {
|
||||
|
||||
m_netLC->setDstId(rw_id);
|
||||
}
|
||||
|
||||
// Store the LC for the embedded LC
|
||||
m_netEmbeddedLC.setData(*m_netLC);
|
||||
@@ -822,9 +847,16 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
||||
return;
|
||||
|
||||
unsigned int did = m_netLC->getDstId();
|
||||
unsigned int id = m_netLC->getSrcId();
|
||||
if (!DMRAccessControl::validateAccess(id, did, m_slotNo, true))
|
||||
unsigned int sid = m_netLC->getSrcId();
|
||||
if (!DMRAccessControl::validateAccess(sid, did, m_slotNo, true))
|
||||
return;
|
||||
|
||||
// Test dst rewrite
|
||||
unsigned int rw_id = DMRAccessControl::DstIdRewrite(did,sid,m_slotNo,true, m_netLC);
|
||||
if (rw_id) {
|
||||
|
||||
m_netLC->setDstId(rw_id);
|
||||
}
|
||||
|
||||
// Regenerate the Slot Type
|
||||
CDMRSlotType slotType;
|
||||
@@ -875,8 +907,10 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
||||
data[1U] = 0x00U;
|
||||
|
||||
if (m_duplex) {
|
||||
|
||||
for (unsigned int i = 0U; i < m_hangCount; i++)
|
||||
writeQueueNet(data);
|
||||
|
||||
} else {
|
||||
for (unsigned int i = 0U; i < 3U; i++)
|
||||
writeQueueNet(data);
|
||||
@@ -891,6 +925,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
||||
LogMessage("DMR Slot %u, received network end of voice transmission, %.1f seconds, %u%% packet loss, BER: %.1f%%", m_slotNo, float(m_netFrames) / 16.667F, (m_netLost * 100U) / m_netFrames, float(m_netErrs * 100U) / float(m_netBits));
|
||||
|
||||
writeEndNet();
|
||||
DMRAccessControl::setOverEndTime();
|
||||
} else if (dataType == DT_DATA_HEADER) {
|
||||
if (m_netState == RS_NET_DATA)
|
||||
return;
|
||||
@@ -1333,7 +1368,7 @@ void CDMRSlot::writeQueueNet(const unsigned char *data)
|
||||
m_queue.addData(data, len);
|
||||
}
|
||||
|
||||
void CDMRSlot::init(unsigned int id, unsigned int colorCode, unsigned int callHang, bool selfOnly, const std::vector<unsigned int>& prefixes, const std::vector<unsigned int>& SrcIdBlacklist, const std::vector<unsigned int>& DstIdBlacklistSlot1RF, const std::vector<unsigned int>& DstIdWhitelistSlot1RF, const std::vector<unsigned int>& DstIdBlacklistSlot2RF, const std::vector<unsigned int>& DstIdWhitelistSlot2RF, const std::vector<unsigned int>& DstIdBlacklistSlot1NET, const std::vector<unsigned int>& DstIdWhitelistSlot1NET, const std::vector<unsigned int>& DstIdBlacklistSlot2NET, const std::vector<unsigned int>& DstIdWhitelistSlot2NET, CModem* modem, CDMRNetwork* network, CDisplay* display, bool duplex, CDMRLookup* lookup, int rssiMultiplier, int rssiOffset, unsigned int jitter)
|
||||
void CDMRSlot::init(unsigned int id, unsigned int colorCode, unsigned int callHang, bool selfOnly, const std::vector<unsigned int>& prefixes, const std::vector<unsigned int>& SrcIdBlacklist, const std::vector<unsigned int>& DstIdBlacklistSlot1RF, const std::vector<unsigned int>& DstIdWhitelistSlot1RF, const std::vector<unsigned int>& DstIdBlacklistSlot2RF, const std::vector<unsigned int>& DstIdWhitelistSlot2RF, const std::vector<unsigned int>& DstIdBlacklistSlot1NET, const std::vector<unsigned int>& DstIdWhitelistSlot1NET, const std::vector<unsigned int>& DstIdBlacklistSlot2NET, const std::vector<unsigned int>& DstIdWhitelistSlot2NET, CModem* modem, CDMRNetwork* network, CDisplay* display, bool duplex, CDMRLookup* lookup, int rssiMultiplier, int rssiOffset, unsigned int jitter, bool TGRewriteSlot1, bool TGRewriteSlot2, bool BMAutoRewrite, bool BMRewriteReflectorVoicePrompts)
|
||||
{
|
||||
assert(id != 0U);
|
||||
assert(modem != NULL);
|
||||
@@ -1368,7 +1403,7 @@ void CDMRSlot::init(unsigned int id, unsigned int colorCode, unsigned int callHa
|
||||
slotType.getData(m_idle + 2U);
|
||||
|
||||
//Load black and white lists to DMRAccessControl
|
||||
DMRAccessControl::init(DstIdBlacklistSlot1RF, DstIdWhitelistSlot1RF, DstIdBlacklistSlot2RF, DstIdWhitelistSlot2RF, DstIdBlacklistSlot1NET, DstIdWhitelistSlot1NET, DstIdBlacklistSlot2NET, DstIdWhitelistSlot2NET, SrcIdBlacklist, m_selfOnly, m_prefixes, m_id);
|
||||
DMRAccessControl::init(DstIdBlacklistSlot1RF, DstIdWhitelistSlot1RF, DstIdBlacklistSlot2RF, DstIdWhitelistSlot2RF, DstIdBlacklistSlot1NET, DstIdWhitelistSlot1NET, DstIdBlacklistSlot2NET, DstIdWhitelistSlot2NET, SrcIdBlacklist, m_selfOnly, m_prefixes, m_id,callHang, TGRewriteSlot1, TGRewriteSlot2, BMAutoRewrite, BMRewriteReflectorVoicePrompts);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user