Merge remote-tracking branch 'g4klx/nxdn' into nxdn
This commit is contained in:
commit
7ff25c0e76
|
@ -106,6 +106,7 @@ bool CNXDNControl::writeModem(unsigned char *data, unsigned int len)
|
||||||
if (type == TAG_LOST) {
|
if (type == TAG_LOST) {
|
||||||
m_rfState = RS_RF_LISTENING;
|
m_rfState = RS_RF_LISTENING;
|
||||||
m_rfMask = 0x00U;
|
m_rfMask = 0x00U;
|
||||||
|
m_rfLayer3.reset();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -131,12 +132,8 @@ bool CNXDNControl::writeModem(unsigned char *data, unsigned int len)
|
||||||
m_rssiCount++;
|
m_rssiCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// CUtils::dump(2U, "NXDN, raw data", data + 2U, NXDN_FRAME_LENGTH_BYTES);
|
|
||||||
|
|
||||||
scrambler(data + 2U);
|
scrambler(data + 2U);
|
||||||
|
|
||||||
// CUtils::dump(2U, "NXDN, after descrambling", data + 2U, NXDN_FRAME_LENGTH_BYTES);
|
|
||||||
|
|
||||||
CNXDNLICH lich;
|
CNXDNLICH lich;
|
||||||
bool valid = lich.decode(data + 2U);
|
bool valid = lich.decode(data + 2U);
|
||||||
|
|
||||||
|
@ -200,6 +197,7 @@ bool CNXDNControl::processVoice(unsigned char usc, unsigned char option, unsigne
|
||||||
if (m_rfState != RS_RF_AUDIO) {
|
if (m_rfState != RS_RF_AUDIO) {
|
||||||
m_rfState = RS_RF_LISTENING;
|
m_rfState = RS_RF_LISTENING;
|
||||||
m_rfMask = 0x00U;
|
m_rfMask = 0x00U;
|
||||||
|
m_rfLayer3.reset();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -275,6 +273,40 @@ bool CNXDNControl::processVoice(unsigned char usc, unsigned char option, unsigne
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
if (m_rfState == RS_RF_LISTENING) {
|
if (m_rfState == RS_RF_LISTENING) {
|
||||||
|
CNXDNFACCH1 facch;
|
||||||
|
bool valid = false;
|
||||||
|
switch (option) {
|
||||||
|
case NXDN_LICH_STEAL_FACCH:
|
||||||
|
valid = facch.decode(data + 2U, NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS);
|
||||||
|
if (!valid)
|
||||||
|
valid = facch.decode(data + 2U, NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS + NXDN_FACCH1_LENGTH_BITS);
|
||||||
|
break;
|
||||||
|
case NXDN_LICH_STEAL_FACCH1_1:
|
||||||
|
valid = facch.decode(data + 2U, NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS);
|
||||||
|
break;
|
||||||
|
case NXDN_LICH_STEAL_FACCH1_2:
|
||||||
|
valid = facch.decode(data + 2U, NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS + NXDN_FACCH1_LENGTH_BITS);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool hasInfo = false;
|
||||||
|
if (valid) {
|
||||||
|
unsigned char buffer[10U];
|
||||||
|
facch.getData(buffer);
|
||||||
|
|
||||||
|
CNXDNLayer3 layer3;
|
||||||
|
layer3.decode(buffer, NXDN_FACCH1_LENGTH_BITS);
|
||||||
|
|
||||||
|
hasInfo = layer3.getHasInfo();
|
||||||
|
if (!hasInfo)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
m_rfLayer3 = layer3;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hasInfo) {
|
||||||
unsigned char message[3U];
|
unsigned char message[3U];
|
||||||
sacch.getData(message);
|
sacch.getData(message);
|
||||||
|
|
||||||
|
@ -303,9 +335,10 @@ bool CNXDNControl::processVoice(unsigned char usc, unsigned char option, unsigne
|
||||||
if (m_rfMask != 0x0FU)
|
if (m_rfMask != 0x0FU)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
bool hasInfo = m_rfLayer3.getHasInfo();
|
hasInfo = m_rfLayer3.getHasInfo();
|
||||||
if (!hasInfo)
|
if (!hasInfo)
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned short srcId = m_rfLayer3.getSourceUnitId();
|
unsigned short srcId = m_rfLayer3.getSourceUnitId();
|
||||||
unsigned short dstId = m_rfLayer3.getDestinationGroupId();
|
unsigned short dstId = m_rfLayer3.getDestinationGroupId();
|
||||||
|
@ -336,6 +369,46 @@ bool CNXDNControl::processVoice(unsigned char usc, unsigned char option, unsigne
|
||||||
m_display->writeNXDN(source.c_str(), grp, dstId, "R");
|
m_display->writeNXDN(source.c_str(), grp, dstId, "R");
|
||||||
|
|
||||||
m_rfState = RS_RF_AUDIO;
|
m_rfState = RS_RF_AUDIO;
|
||||||
|
|
||||||
|
// Create a dummy start message
|
||||||
|
unsigned char start[NXDN_FRAME_LENGTH_BYTES + 2U];
|
||||||
|
|
||||||
|
start[0U] = TAG_DATA;
|
||||||
|
start[1U] = 0x00U;
|
||||||
|
|
||||||
|
// Generate the sync
|
||||||
|
CSync::addNXDNSync(start + 2U);
|
||||||
|
|
||||||
|
// Generate the LICH
|
||||||
|
CNXDNLICH lich;
|
||||||
|
lich.setRFCT(NXDN_LICH_RFCT_RDCH);
|
||||||
|
lich.setFCT(NXDN_LICH_USC_SACCH_NS);
|
||||||
|
lich.setOption(NXDN_LICH_STEAL_FACCH);
|
||||||
|
lich.setDirection(m_remoteGateway ? NXDN_LICH_DIRECTION_INBOUND : NXDN_LICH_DIRECTION_OUTBOUND);
|
||||||
|
lich.encode(start + 2U);
|
||||||
|
|
||||||
|
CNXDNSACCH sacch;
|
||||||
|
sacch.setRAN(m_ran);
|
||||||
|
sacch.setStructure(NXDN_SR_SINGLE);
|
||||||
|
sacch.setData(SACCH_IDLE);
|
||||||
|
sacch.encode(start + 2U);
|
||||||
|
|
||||||
|
unsigned char message[22U];
|
||||||
|
m_rfLayer3.getData(message);
|
||||||
|
|
||||||
|
facch.setData(message);
|
||||||
|
facch.encode(start + 2U, NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS);
|
||||||
|
facch.encode(start + 2U, NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS + NXDN_FACCH1_LENGTH_BITS);
|
||||||
|
|
||||||
|
scrambler(start + 2U);
|
||||||
|
|
||||||
|
// writeNetwork(start, m_rfFrames, );
|
||||||
|
|
||||||
|
#if defined(DUMP_NXDN)
|
||||||
|
writeFile(start + 2U);
|
||||||
|
#endif
|
||||||
|
if (m_duplex)
|
||||||
|
writeQueueRF(start);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -673,6 +746,7 @@ void CNXDNControl::writeEndRF()
|
||||||
m_rfState = RS_RF_LISTENING;
|
m_rfState = RS_RF_LISTENING;
|
||||||
|
|
||||||
m_rfMask = 0x00U;
|
m_rfMask = 0x00U;
|
||||||
|
m_rfLayer3.reset();
|
||||||
|
|
||||||
m_rfTimeoutTimer.stop();
|
m_rfTimeoutTimer.stop();
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,6 @@
|
||||||
#include "NXDNDefines.h"
|
#include "NXDNDefines.h"
|
||||||
#include "NXDNCRC.h"
|
#include "NXDNCRC.h"
|
||||||
#include "Utils.h"
|
#include "Utils.h"
|
||||||
#include "Log.h"
|
|
||||||
|
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
|
@ -18,7 +18,6 @@
|
||||||
|
|
||||||
#include "NXDNDefines.h"
|
#include "NXDNDefines.h"
|
||||||
#include "NXDNLayer3.h"
|
#include "NXDNLayer3.h"
|
||||||
#include "Log.h"
|
|
||||||
|
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
@ -53,8 +52,8 @@ void CNXDNLayer3::decode(const unsigned char* bytes, unsigned int length, unsign
|
||||||
assert(bytes != NULL);
|
assert(bytes != NULL);
|
||||||
|
|
||||||
for (unsigned int i = 0U; i < length; i++, offset++) {
|
for (unsigned int i = 0U; i < length; i++, offset++) {
|
||||||
bool b = READ_BIT1(bytes, offset);
|
bool b = READ_BIT1(bytes, i);
|
||||||
WRITE_BIT1(m_data, i, b);
|
WRITE_BIT1(m_data, offset, b);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -102,6 +101,16 @@ bool CNXDNLayer3::getHasInfo() const
|
||||||
type != NXDN_MESSAGE_TYPE_SDCALL_IV;
|
type != NXDN_MESSAGE_TYPE_SDCALL_IV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CNXDNLayer3::getData(unsigned char* data) const
|
||||||
|
{
|
||||||
|
::memcpy(data, m_data, 22U);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CNXDNLayer3::reset()
|
||||||
|
{
|
||||||
|
::memset(m_data, 0x00U, 22U);
|
||||||
|
}
|
||||||
|
|
||||||
CNXDNLayer3& CNXDNLayer3::operator=(const CNXDNLayer3& layer3)
|
CNXDNLayer3& CNXDNLayer3::operator=(const CNXDNLayer3& layer3)
|
||||||
{
|
{
|
||||||
if (&layer3 != this)
|
if (&layer3 != this)
|
||||||
|
|
|
@ -36,6 +36,10 @@ public:
|
||||||
unsigned char getCallOptions() const;
|
unsigned char getCallOptions() const;
|
||||||
bool getHasInfo() const;
|
bool getHasInfo() const;
|
||||||
|
|
||||||
|
void getData(unsigned char* data) const;
|
||||||
|
|
||||||
|
void reset();
|
||||||
|
|
||||||
CNXDNLayer3& operator=(const CNXDNLayer3& layer3);
|
CNXDNLayer3& operator=(const CNXDNLayer3& layer3);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -22,7 +22,6 @@
|
||||||
#include "NXDNDefines.h"
|
#include "NXDNDefines.h"
|
||||||
#include "NXDNCRC.h"
|
#include "NXDNCRC.h"
|
||||||
#include "Utils.h"
|
#include "Utils.h"
|
||||||
#include "Log.h"
|
|
||||||
|
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
|
@ -22,7 +22,6 @@
|
||||||
#include "NXDNDefines.h"
|
#include "NXDNDefines.h"
|
||||||
#include "NXDNCRC.h"
|
#include "NXDNCRC.h"
|
||||||
#include "Utils.h"
|
#include "Utils.h"
|
||||||
#include "Log.h"
|
|
||||||
|
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
Loading…
Reference in a new issue