mirror of
https://github.com/LX3JL/xlxd.git
synced 2026-03-15 09:43:51 +01:00
Attempt to extract callsign from 10 char YSF frames. When YSF headers are missed (late entries), extract callsign from one of the VD2 frames. If no DMR ID can be found after all of these attempts, use an optional default DMR ID, defined in main.h. Also append a main.h defined module char on RPTR1 when no char exists in REF mode. This is the case for OpenSpot 1 users that can not assign a module char to their RPTR1 when in REF mode. DPlus reflectors allow RPTR1 callsings with no module char, but stock xlxd does not.
This commit is contained in:
parent
3c3367fee6
commit
cd8f730e5e
|
|
@ -117,10 +117,10 @@ bool CCallsign::IsValid(void) const
|
|||
}
|
||||
|
||||
// prefix
|
||||
// all chars are number, uppercase or space
|
||||
// all chars are number, letter, special char, or space
|
||||
for ( i = 0; i < CALLSUFFIX_LEN; i++ )
|
||||
{
|
||||
valid &= IsLetter(m_Suffix[i]) || IsNumber(m_Suffix[i]) || IsSpace(m_Suffix[i]);
|
||||
valid &= IsLetter(m_Suffix[i]) || IsNumber(m_Suffix[i]) || IsSpace(m_Suffix[i]) || IsLetterLC(m_Suffix[i]) || IsSpecialChar(m_Suffix[i]);
|
||||
}
|
||||
|
||||
// module
|
||||
|
|
@ -365,3 +365,14 @@ bool CCallsign::IsSpace(char c) const
|
|||
{
|
||||
return (c == ' ');
|
||||
}
|
||||
|
||||
bool CCallsign::IsLetterLC(char c) const
|
||||
{
|
||||
return ((c >= 'a') && (c <= 'z'));
|
||||
}
|
||||
|
||||
bool CCallsign::IsSpecialChar(char c) const
|
||||
{
|
||||
return ((c >= '!') && (c <= '/'));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -85,6 +85,8 @@ protected:
|
|||
bool IsNumber(char) const;
|
||||
bool IsLetter(char) const;
|
||||
bool IsSpace(char) const;
|
||||
bool IsLetterLC(char) const;
|
||||
bool IsSpecialChar(char) const;
|
||||
|
||||
protected:
|
||||
// data
|
||||
|
|
|
|||
|
|
@ -919,12 +919,28 @@ void CDmrmmdvmProtocol::EncodeDvPacket(
|
|||
{
|
||||
uint8 tag[] = { 'D','M','R','D' };
|
||||
Buffer->Set(tag, sizeof(tag));
|
||||
uint8_t cs[12];
|
||||
|
||||
// DMR header
|
||||
// uiSeqId
|
||||
Buffer->Append((uint8)seqid);
|
||||
// uiSrcId
|
||||
uint32 uiSrcId = Header.GetMyCallsign().GetDmrid();
|
||||
DvFrame0.GetMyCallsign().GetCallsign(cs);
|
||||
|
||||
if(uiSrcId == 0){
|
||||
uiSrcId = DvFrame0.GetMyCallsign().GetDmrid();
|
||||
}
|
||||
if(uiSrcId == 0){
|
||||
uiSrcId = DvFrame1.GetMyCallsign().GetDmrid();
|
||||
}
|
||||
if(uiSrcId == 0){
|
||||
uiSrcId = DvFrame2.GetMyCallsign().GetDmrid();
|
||||
}
|
||||
if(uiSrcId == 0){
|
||||
uiSrcId = DMRMMDVM_DEFAULTID;
|
||||
}
|
||||
|
||||
AppendDmrIdToBuffer(Buffer, uiSrcId);
|
||||
// uiDstId = TG9
|
||||
uint32 uiDstId = 9; // ModuleToDmrDestId(Header.GetRpt2Module());
|
||||
|
|
|
|||
|
|
@ -63,13 +63,16 @@ CDvFramePacket::CDvFramePacket(const uint8 *ambe, const uint8 *sync, uint16 sid,
|
|||
|
||||
// ysf constructor
|
||||
|
||||
CDvFramePacket::CDvFramePacket(const uint8 *ambe, uint16 sid, uint8 pid, uint8 spid, uint8 fid)
|
||||
CDvFramePacket::CDvFramePacket(const uint8 *ambe, uint16 sid, uint8 pid, uint8 spid, uint8 fid, CCallsign cs)
|
||||
: CPacket(sid, pid, spid, fid)
|
||||
{
|
||||
::memcpy(m_uiAmbePlus, ambe, sizeof(m_uiAmbePlus));
|
||||
::memset(m_uiDvSync, 0, sizeof(m_uiDvSync));
|
||||
::memset(m_uiAmbe, 0, sizeof(m_uiAmbe));
|
||||
::memset(m_uiDvData, 0, sizeof(m_uiDvData));
|
||||
uint8_t c[12];
|
||||
cs.GetCallsign(c);
|
||||
m_Callsign.SetCallsign((char *)c);
|
||||
}
|
||||
|
||||
// xlx constructor
|
||||
|
|
@ -95,6 +98,9 @@ CDvFramePacket::CDvFramePacket(const CDvFramePacket &DvFrame)
|
|||
::memcpy(m_uiDvData, DvFrame.m_uiDvData, sizeof(m_uiDvData));
|
||||
::memcpy(m_uiAmbePlus, DvFrame.m_uiAmbePlus, sizeof(m_uiAmbePlus));
|
||||
::memcpy(m_uiDvSync, DvFrame.m_uiDvSync, sizeof(m_uiDvSync));
|
||||
uint8_t c[12];
|
||||
DvFrame.GetMyCallsign().GetCallsign(c);
|
||||
m_Callsign.SetCallsign((char *)c);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@
|
|||
#define cdvframepacket_h
|
||||
|
||||
#include "cpacket.h"
|
||||
#include "ccallsign.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
// defines
|
||||
|
|
@ -55,7 +56,7 @@ public:
|
|||
CDvFramePacket();
|
||||
CDvFramePacket(const struct dstar_dvframe *, uint16, uint8);
|
||||
CDvFramePacket(const uint8 *, const uint8 *, uint16, uint8, uint8);
|
||||
CDvFramePacket(const uint8 *, uint16, uint8, uint8, uint8);
|
||||
CDvFramePacket(const uint8 *, uint16, uint8, uint8, uint8, CCallsign);
|
||||
CDvFramePacket(uint16, uint8, const uint8 *, const uint8 *, uint8, uint8, const uint8 *, const uint8 *);
|
||||
CDvFramePacket(const CDvFramePacket &);
|
||||
|
||||
|
|
@ -75,6 +76,7 @@ public:
|
|||
const uint8 *GetAmbePlus(void) const { return m_uiAmbePlus; }
|
||||
const uint8 *GetDvData(void) const { return m_uiDvData; }
|
||||
const uint8 *GetDvSync(void) const { return m_uiDvSync; }
|
||||
const CCallsign &GetMyCallsign(void) const { return m_Callsign; }
|
||||
|
||||
// set
|
||||
void SetDvData(uint8 *);
|
||||
|
|
@ -95,6 +97,7 @@ protected:
|
|||
// data (dmr)
|
||||
uint8 m_uiAmbePlus[AMBEPLUS_SIZE];
|
||||
uint8 m_uiDvSync[DVSYNC_SIZE];
|
||||
CCallsign m_Callsign;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -48,7 +48,17 @@ CDvHeaderPacket::CDvHeaderPacket(const struct dstar_header *buffer, uint16 sid,
|
|||
m_uiFlag2 = buffer->Flag2;
|
||||
m_uiFlag3 = buffer->Flag3;
|
||||
m_csUR.SetCallsign(buffer->UR, CALLSIGN_LEN);
|
||||
m_csRPT1.SetCallsign(buffer->RPT1, CALLSIGN_LEN);
|
||||
|
||||
if((buffer->RPT1)[7] == 0x20){
|
||||
char rptr1[8];
|
||||
memcpy(rptr1, buffer->RPT1, 8);
|
||||
rptr1[7] = DPLUS_DEFAULT_RPTR1_SUFFIX;
|
||||
m_csRPT1.SetCallsign(rptr1, CALLSIGN_LEN);
|
||||
}
|
||||
else{
|
||||
m_csRPT1.SetCallsign(buffer->RPT1, CALLSIGN_LEN);
|
||||
}
|
||||
|
||||
m_csRPT2.SetCallsign(buffer->RPT2, CALLSIGN_LEN);
|
||||
m_csMY.SetCallsign(buffer->MY, CALLSIGN_LEN);
|
||||
m_csMY.SetSuffix(buffer->SUFFIX, CALLSUFFIX_LEN);
|
||||
|
|
|
|||
|
|
@ -59,8 +59,8 @@ CDvLastFramePacket::CDvLastFramePacket
|
|||
|
||||
// ysf constructor
|
||||
|
||||
CDvLastFramePacket::CDvLastFramePacket(const uint8 *ambe, uint16 sid, uint8 pid, uint8 spid, uint8 fid)
|
||||
: CDvFramePacket(ambe, sid, pid, spid, fid)
|
||||
CDvLastFramePacket::CDvLastFramePacket(const uint8 *ambe, uint16 sid, uint8 pid, uint8 spid, uint8 fid, CCallsign cs)
|
||||
: CDvFramePacket(ambe, sid, pid, spid, fid, cs)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ public:
|
|||
CDvLastFramePacket();
|
||||
CDvLastFramePacket(const struct dstar_dvframe *, uint16, uint8);
|
||||
CDvLastFramePacket(const uint8 *, const uint8 *, uint16, uint8, uint8);
|
||||
CDvLastFramePacket(const uint8 *, uint16, uint8, uint8, uint8);
|
||||
CDvLastFramePacket(const uint8 *, uint16, uint8, uint8, uint8, CCallsign);
|
||||
CDvLastFramePacket(uint16, uint8, const uint8 *, const uint8 *, uint8, uint8, const uint8 *, const uint8 *);
|
||||
CDvLastFramePacket(const CDvLastFramePacket &);
|
||||
|
||||
|
|
|
|||
|
|
@ -441,6 +441,7 @@ bool CYsfProtocol::IsValidDvPacket(const CBuffer &Buffer, CYSFFICH *Fich)
|
|||
|
||||
bool CYsfProtocol::IsValidDvHeaderPacket(const CIp &Ip, const CYSFFICH &Fich, const CBuffer &Buffer, CDvHeaderPacket **header, CDvFramePacket **frames)
|
||||
{
|
||||
CCallsign csMY;
|
||||
bool valid = false;
|
||||
*header = NULL;
|
||||
frames[0] = NULL;
|
||||
|
|
@ -460,7 +461,7 @@ bool CYsfProtocol::IsValidDvHeaderPacket(const CIp &Ip, const CYSFFICH &Fich, co
|
|||
char sz[YSF_CALLSIGN_LENGTH+1];
|
||||
::memcpy(sz, &(Buffer.data()[14]), YSF_CALLSIGN_LENGTH);
|
||||
sz[YSF_CALLSIGN_LENGTH] = 0;
|
||||
CCallsign csMY = CCallsign((const char *)sz);
|
||||
csMY = CCallsign((const char *)sz);
|
||||
::memcpy(sz, &(Buffer.data()[4]), YSF_CALLSIGN_LENGTH);
|
||||
sz[YSF_CALLSIGN_LENGTH] = 0;
|
||||
CCallsign rpt1 = CCallsign((const char *)sz);
|
||||
|
|
@ -478,12 +479,12 @@ bool CYsfProtocol::IsValidDvHeaderPacket(const CIp &Ip, const CYSFFICH &Fich, co
|
|||
{
|
||||
uint8 uiAmbe[AMBE_SIZE];
|
||||
::memset(uiAmbe, 0x00, sizeof(uiAmbe));
|
||||
frames[0] = new CDvFramePacket(uiAmbe, uiStreamId, Fich.getFN(), 0, 0);
|
||||
frames[1] = new CDvFramePacket(uiAmbe, uiStreamId, Fich.getFN(), 1, 0);
|
||||
frames[0] = new CDvFramePacket(uiAmbe, uiStreamId, Fich.getFN(), 0, 0, csMY);
|
||||
frames[1] = new CDvFramePacket(uiAmbe, uiStreamId, Fich.getFN(), 1, 0, csMY);
|
||||
}
|
||||
|
||||
// check validity of packets
|
||||
if ( ((*header) == NULL) || !(*header)->IsValid() ||
|
||||
if ( ((*header) == NULL) || //!(*header)->IsValid() ||
|
||||
(frames[0] == NULL) || !(frames[0]->IsValid()) ||
|
||||
(frames[1] == NULL) || !(frames[1]->IsValid()) )
|
||||
|
||||
|
|
@ -494,6 +495,7 @@ bool CYsfProtocol::IsValidDvHeaderPacket(const CIp &Ip, const CYSFFICH &Fich, co
|
|||
delete frames[1];
|
||||
frames[0] = NULL;
|
||||
frames[1] = NULL;
|
||||
valid = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -531,12 +533,23 @@ bool CYsfProtocol::IsValidDvFramePacket(const CIp &Ip, const CYSFFICH &Fich, con
|
|||
CYsfUtils::DecodeVD2Vchs((unsigned char *)&(Buffer.data()[35]), ambes);
|
||||
|
||||
// get DV frames
|
||||
char sz[YSF_CALLSIGN_LENGTH+1];
|
||||
::memcpy(sz, &(Buffer.data()[14]), YSF_CALLSIGN_LENGTH);
|
||||
sz[YSF_CALLSIGN_LENGTH] = 0;
|
||||
|
||||
for(int i = 0; i < YSF_CALLSIGN_LENGTH; ++i){
|
||||
if( (sz[i] == '/') || (sz[i] == '\\') || (sz[i] == '-') || (sz[i] == ' ') ){
|
||||
sz[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
CCallsign csMY = CCallsign((const char *)sz);
|
||||
uint8 fid = Buffer.data()[34];
|
||||
frames[0] = new CDvFramePacket(ambe0, uiStreamId, Fich.getFN(), 0, fid);
|
||||
frames[1] = new CDvFramePacket(ambe1, uiStreamId, Fich.getFN(), 1, fid);
|
||||
frames[2] = new CDvFramePacket(ambe2, uiStreamId, Fich.getFN(), 2, fid);
|
||||
frames[3] = new CDvFramePacket(ambe3, uiStreamId, Fich.getFN(), 3, fid);
|
||||
frames[4] = new CDvFramePacket(ambe4, uiStreamId, Fich.getFN(), 4, fid);
|
||||
frames[0] = new CDvFramePacket(ambe0, uiStreamId, Fich.getFN(), 0, fid, csMY);
|
||||
frames[1] = new CDvFramePacket(ambe1, uiStreamId, Fich.getFN(), 1, fid, csMY);
|
||||
frames[2] = new CDvFramePacket(ambe2, uiStreamId, Fich.getFN(), 2, fid, csMY);
|
||||
frames[3] = new CDvFramePacket(ambe3, uiStreamId, Fich.getFN(), 3, fid, csMY);
|
||||
frames[4] = new CDvFramePacket(ambe4, uiStreamId, Fich.getFN(), 4, fid, csMY);
|
||||
|
||||
// check validity of packets
|
||||
if ( (frames[0] == NULL) || !(frames[0]->IsValid()) ||
|
||||
|
|
@ -582,8 +595,19 @@ bool CYsfProtocol::IsValidDvLastFramePacket(const CIp &Ip, const CYSFFICH &Fich,
|
|||
{
|
||||
uint8 uiAmbe[AMBE_SIZE];
|
||||
::memset(uiAmbe, 0x00, sizeof(uiAmbe));
|
||||
frames[0] = new CDvFramePacket(uiAmbe, uiStreamId, Fich.getFN(), 0, 0);
|
||||
frames[1] = new CDvLastFramePacket(uiAmbe, uiStreamId, Fich.getFN(), 1, 0);
|
||||
char sz[YSF_CALLSIGN_LENGTH+1];
|
||||
::memcpy(sz, &(Buffer.data()[14]), YSF_CALLSIGN_LENGTH);
|
||||
sz[YSF_CALLSIGN_LENGTH] = 0;
|
||||
|
||||
for(int i = 0; i < YSF_CALLSIGN_LENGTH; ++i){
|
||||
if( (sz[i] == '/') || (sz[i] == '\\') || (sz[i] == '-') || (sz[i] == ' ') ){
|
||||
sz[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
CCallsign csMY = CCallsign((const char *)sz);
|
||||
frames[0] = new CDvFramePacket(uiAmbe, uiStreamId, Fich.getFN(), 0, 0, csMY);
|
||||
frames[1] = new CDvLastFramePacket(uiAmbe, uiStreamId, Fich.getFN(), 1, 0, csMY);
|
||||
}
|
||||
|
||||
// check validity of packets
|
||||
|
|
|
|||
|
|
@ -91,6 +91,7 @@
|
|||
#define DPLUS_PORT 20001 // UDP port
|
||||
#define DPLUS_KEEPALIVE_PERIOD 1 // in seconds
|
||||
#define DPLUS_KEEPALIVE_TIMEOUT (DPLUS_KEEPALIVE_PERIOD*10) // in seconds
|
||||
#define DPLUS_DEFAULT_RPTR1_SUFFIX ' ' // RPTR1 suffix to append when missing, use ' ' to leave unchanged
|
||||
|
||||
// DCS
|
||||
#define DCS_PORT 30051 // UDP port
|
||||
|
|
@ -116,6 +117,7 @@
|
|||
#define DMRMMDVM_KEEPALIVE_TIMEOUT (DMRMMDVM_KEEPALIVE_PERIOD*10) // in seconds
|
||||
#define DMRMMDVM_REFLECTOR_SLOT DMR_SLOT2
|
||||
#define DMRMMDVM_REFLECTOR_COLOUR 1
|
||||
#define DMRMMDVM_DEFAULTID 3161894 // Default DMRID used for unrecognized callsigns from other modes. 0 = unused
|
||||
|
||||
// YSF
|
||||
#define YSF_PORT 42000 // UDP port
|
||||
|
|
|
|||
Loading…
Reference in a new issue