mirror of
https://github.com/ShaYmez/xlxd.git
synced 2026-07-27 20:34:31 -04:00
xlxd 2.0.0
Added compatibility with protocols DMR Homebrew (MMDVM) and DMR Plus (dongle)
This commit is contained in:
+72
-9
@@ -25,6 +25,7 @@
|
||||
#include "main.h"
|
||||
#include <string.h>
|
||||
#include <cctype>
|
||||
#include "cdmriddir.h"
|
||||
#include "ccallsign.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
@@ -36,19 +37,39 @@ CCallsign::CCallsign()
|
||||
::memset(m_Callsign, ' ', sizeof(m_Callsign));
|
||||
::memset(m_Suffix, ' ', sizeof(m_Suffix));
|
||||
m_Module = ' ';
|
||||
m_uiDmrid = 0;
|
||||
}
|
||||
|
||||
CCallsign::CCallsign(const char *sz)
|
||||
CCallsign::CCallsign(const char *sz, uint32 dmrid)
|
||||
{
|
||||
// blank all
|
||||
::memset(m_Callsign, ' ', sizeof(m_Callsign));
|
||||
::memset(m_Suffix, ' ', sizeof(m_Suffix));
|
||||
m_Module = ' ';
|
||||
// and copy
|
||||
::memcpy(m_Callsign, sz, MIN(strlen(sz), sizeof(m_Callsign)-1));
|
||||
if ( strlen(sz) >= sizeof(m_Callsign) )
|
||||
m_uiDmrid = dmrid;
|
||||
|
||||
// and populate
|
||||
if ( ::strlen(sz) > 0 )
|
||||
{
|
||||
m_Module = sz[sizeof(m_Callsign)-1];
|
||||
// callsign valid
|
||||
::memcpy(m_Callsign, sz, MIN(strlen(sz), sizeof(m_Callsign)-1));
|
||||
if ( strlen(sz) >= sizeof(m_Callsign) )
|
||||
{
|
||||
m_Module = sz[sizeof(m_Callsign)-1];
|
||||
}
|
||||
// dmrid ok ?
|
||||
if ( m_uiDmrid == 0 )
|
||||
{
|
||||
m_uiDmrid = g_DmridDir.FindDmrid(*this);
|
||||
}
|
||||
}
|
||||
else if ( m_uiDmrid != 0 )
|
||||
{
|
||||
const CCallsign *callsign = g_DmridDir.FindCallsign(m_uiDmrid);
|
||||
if ( callsign != NULL )
|
||||
{
|
||||
::memcpy(m_Callsign, callsign->m_Callsign, sizeof(m_Callsign));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,9 +78,9 @@ CCallsign::CCallsign(const CCallsign &callsign)
|
||||
::memcpy(m_Callsign, callsign.m_Callsign, sizeof(m_Callsign));
|
||||
::memcpy(m_Suffix, callsign.m_Suffix, sizeof(m_Suffix));
|
||||
m_Module = callsign.m_Module;
|
||||
m_uiDmrid = callsign.m_uiDmrid;
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
// status
|
||||
|
||||
@@ -97,6 +118,9 @@ bool CCallsign::IsValid(void) const
|
||||
// is an letter or space
|
||||
valid &= IsLetter(m_Module) || IsSpace(m_Module);
|
||||
|
||||
// dmrid is not tested, as it can be NULL
|
||||
// if station does is not dmr registered
|
||||
|
||||
// done
|
||||
return valid;
|
||||
}
|
||||
@@ -114,8 +138,9 @@ bool CCallsign::HasSuffix(void) const
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
// set
|
||||
|
||||
void CCallsign::SetCallsign(const char *sz)
|
||||
void CCallsign::SetCallsign(const char *sz, bool UpdateDmrid)
|
||||
{
|
||||
// set callsign
|
||||
::memset(m_Callsign, ' ', sizeof(m_Callsign));
|
||||
m_Module = ' ';
|
||||
::memcpy(m_Callsign, sz, MIN(strlen(sz), sizeof(m_Callsign)-1));
|
||||
@@ -123,10 +148,16 @@ void CCallsign::SetCallsign(const char *sz)
|
||||
{
|
||||
m_Module = sz[sizeof(m_Callsign)-1];
|
||||
}
|
||||
// and update dmrid
|
||||
if ( UpdateDmrid )
|
||||
{
|
||||
m_uiDmrid = g_DmridDir.FindDmrid(*this);
|
||||
}
|
||||
}
|
||||
|
||||
void CCallsign::SetCallsign(const uint8 *buffer, int len)
|
||||
void CCallsign::SetCallsign(const uint8 *buffer, int len, bool UpdateDmrid)
|
||||
{
|
||||
// set callsign
|
||||
::memset(m_Callsign, ' ', sizeof(m_Callsign));
|
||||
m_Module = ' ';
|
||||
::memcpy(m_Callsign, buffer, MIN(len, sizeof(m_Callsign)-1));
|
||||
@@ -141,6 +172,31 @@ void CCallsign::SetCallsign(const uint8 *buffer, int len)
|
||||
{
|
||||
m_Module = (char)buffer[sizeof(m_Callsign)-1];
|
||||
}
|
||||
if ( UpdateDmrid )
|
||||
{
|
||||
m_uiDmrid = g_DmridDir.FindDmrid(*this);
|
||||
}
|
||||
}
|
||||
|
||||
void CCallsign::SetDmrid(uint32 dmrid, bool UpdateCallsign)
|
||||
{
|
||||
m_uiDmrid = dmrid;
|
||||
if ( UpdateCallsign )
|
||||
{
|
||||
const CCallsign *callsign = g_DmridDir.FindCallsign(dmrid);
|
||||
if ( callsign != NULL )
|
||||
{
|
||||
::memcpy(m_Callsign, callsign->m_Callsign, sizeof(m_Callsign));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CCallsign::SetDmrid(const uint8 *buffer, bool UpdateCallsign)
|
||||
{
|
||||
char sz[9];
|
||||
::memcpy(sz, buffer, 8);
|
||||
sz[8] = 0;
|
||||
SetDmrid((uint32)::strtol(sz, NULL, 16), UpdateCallsign);
|
||||
}
|
||||
|
||||
void CCallsign::SetModule(char c)
|
||||
@@ -224,11 +280,17 @@ bool CCallsign::HasSameCallsignWithWildcard(const CCallsign &callsign) const
|
||||
return same;
|
||||
}
|
||||
|
||||
bool CCallsign::HasLowerCallsign(const CCallsign &Callsign) const
|
||||
{
|
||||
return (::memcmp(m_Callsign, Callsign.m_Callsign, sizeof(m_Callsign)) < 0);
|
||||
}
|
||||
|
||||
bool CCallsign::HasSameModule(const CCallsign &Callsign) const
|
||||
{
|
||||
return (m_Module == Callsign.m_Module);
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
// operators
|
||||
|
||||
@@ -236,7 +298,8 @@ bool CCallsign::operator ==(const CCallsign &callsign) const
|
||||
{
|
||||
return ((::memcmp(callsign.m_Callsign, m_Callsign, sizeof(m_Callsign)) == 0) &&
|
||||
(m_Module == callsign.m_Module) &&
|
||||
(::memcmp(callsign.m_Suffix, m_Suffix, sizeof(m_Suffix)) == 0));
|
||||
(::memcmp(callsign.m_Suffix, m_Suffix, sizeof(m_Suffix)) == 0) &&
|
||||
(m_uiDmrid == callsign.m_uiDmrid) );
|
||||
}
|
||||
|
||||
CCallsign::operator const char *() const
|
||||
|
||||
Reference in New Issue
Block a user