Skip to content

Commit 8536294

Browse files
committed
Initial work on the M17 protocol.
1 parent ff19408 commit 8536294

20 files changed

+2029
-44
lines changed

Conf.cpp

+106-11
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,15 @@ enum SECTION {
4343
SECTION_FUSION,
4444
SECTION_P25,
4545
SECTION_NXDN,
46+
SECTION_M17,
4647
SECTION_POCSAG,
4748
SECTION_FM,
4849
SECTION_DSTAR_NETWORK,
4950
SECTION_DMR_NETWORK,
5051
SECTION_FUSION_NETWORK,
5152
SECTION_P25_NETWORK,
5253
SECTION_NXDN_NETWORK,
54+
SECTION_M17_NETWORK,
5355
SECTION_POCSAG_NETWORK,
5456
SECTION_TFTSERIAL,
5557
SECTION_HD44780,
@@ -102,6 +104,7 @@ m_modemDMRTXLevel(50.0F),
102104
m_modemYSFTXLevel(50.0F),
103105
m_modemP25TXLevel(50.0F),
104106
m_modemNXDNTXLevel(50.0F),
107+
m_modemM17TXLevel(50.0F),
105108
m_modemPOCSAGTXLevel(50.0F),
106109
m_modemFMTXLevel(50.0F),
107110
m_modemRSSIMappingFile(),
@@ -164,6 +167,10 @@ m_nxdnSelfOnly(false),
164167
m_nxdnRemoteGateway(false),
165168
m_nxdnTXHang(5U),
166169
m_nxdnModeHang(10U),
170+
m_m17Enabled(false),
171+
m_m17SelfOnly(false),
172+
m_m17TXHang(5U),
173+
m_m17ModeHang(10U),
167174
m_pocsagEnabled(false),
168175
m_pocsagFrequency(0U),
169176
m_fmEnabled(false),
@@ -235,6 +242,12 @@ m_nxdnLocalAddress(),
235242
m_nxdnLocalPort(0U),
236243
m_nxdnNetworkModeHang(3U),
237244
m_nxdnNetworkDebug(false),
245+
m_m17NetworkEnabled(false),
246+
m_m17GatewayAddress(),
247+
m_m17GatewayPort(0U),
248+
m_m17LocalPort(0U),
249+
m_m17NetworkModeHang(3U),
250+
m_m17NetworkDebug(false),
238251
m_pocsagNetworkEnabled(false),
239252
m_pocsagGatewayAddress(),
240253
m_pocsagGatewayPort(0U),
@@ -329,6 +342,8 @@ bool CConf::read()
329342
section = SECTION_P25;
330343
else if (::strncmp(buffer, "[NXDN]", 6U) == 0)
331344
section = SECTION_NXDN;
345+
else if (::strncmp(buffer, "[M17]", 5U) == 0)
346+
section = SECTION_M17;
332347
else if (::strncmp(buffer, "[POCSAG]", 8U) == 0)
333348
section = SECTION_POCSAG;
334349
else if (::strncmp(buffer, "[FM]", 4U) == 0)
@@ -343,6 +358,8 @@ bool CConf::read()
343358
section = SECTION_P25_NETWORK;
344359
else if (::strncmp(buffer, "[NXDN Network]", 14U) == 0)
345360
section = SECTION_NXDN_NETWORK;
361+
else if (::strncmp(buffer, "[M17 Network]", 13U) == 0)
362+
section = SECTION_M17_NETWORK;
346363
else if (::strncmp(buffer, "[POCSAG Network]", 16U) == 0)
347364
section = SECTION_POCSAG_NETWORK;
348365
else if (::strncmp(buffer, "[TFT Serial]", 12U) == 0)
@@ -404,12 +421,12 @@ bool CConf::read()
404421
else if (::strcmp(key, "Duplex") == 0)
405422
m_duplex = ::atoi(value) == 1;
406423
else if (::strcmp(key, "ModeHang") == 0)
407-
m_dstarNetworkModeHang = m_dmrNetworkModeHang = m_fusionNetworkModeHang = m_p25NetworkModeHang =
408-
m_dstarModeHang = m_dmrModeHang = m_fusionModeHang = m_p25ModeHang = (unsigned int)::atoi(value);
424+
m_dstarNetworkModeHang = m_dmrNetworkModeHang = m_fusionNetworkModeHang = m_p25NetworkModeHang = m_nxdnNetworkModeHang = m_m17NetworkModeHang =
425+
m_dstarModeHang = m_dmrModeHang = m_fusionModeHang = m_p25ModeHang = m_nxdnModeHang = m_m17ModeHang = (unsigned int)::atoi(value);
409426
else if (::strcmp(key, "RFModeHang") == 0)
410-
m_dstarModeHang = m_dmrModeHang = m_fusionModeHang = m_p25ModeHang = (unsigned int)::atoi(value);
427+
m_dstarModeHang = m_dmrModeHang = m_fusionModeHang = m_p25ModeHang = m_nxdnModeHang = m_m17ModeHang = (unsigned int)::atoi(value);
411428
else if (::strcmp(key, "NetModeHang") == 0)
412-
m_dstarNetworkModeHang = m_dmrNetworkModeHang = m_fusionNetworkModeHang = m_p25NetworkModeHang = (unsigned int)::atoi(value);
429+
m_dstarNetworkModeHang = m_dmrNetworkModeHang = m_fusionNetworkModeHang = m_p25NetworkModeHang = m_nxdnNetworkModeHang = m_m17NetworkModeHang = (unsigned int)::atoi(value);
413430
else if (::strcmp(key, "Display") == 0)
414431
m_display = value;
415432
else if (::strcmp(key, "Daemon") == 0)
@@ -481,7 +498,7 @@ bool CConf::read()
481498
else if (::strcmp(key, "RXLevel") == 0)
482499
m_modemRXLevel = float(::atof(value));
483500
else if (::strcmp(key, "TXLevel") == 0)
484-
m_modemFMTXLevel = m_modemCWIdTXLevel = m_modemDStarTXLevel = m_modemDMRTXLevel = m_modemYSFTXLevel = m_modemP25TXLevel = m_modemNXDNTXLevel = float(::atof(value));
501+
m_modemFMTXLevel = m_modemCWIdTXLevel = m_modemDStarTXLevel = m_modemDMRTXLevel = m_modemYSFTXLevel = m_modemP25TXLevel = m_modemNXDNTXLevel = m_modemM17TXLevel = float(::atof(value));
485502
else if (::strcmp(key, "CWIdTXLevel") == 0)
486503
m_modemCWIdTXLevel = float(::atof(value));
487504
else if (::strcmp(key, "D-StarTXLevel") == 0)
@@ -494,6 +511,8 @@ bool CConf::read()
494511
m_modemP25TXLevel = float(::atof(value));
495512
else if (::strcmp(key, "NXDNTXLevel") == 0)
496513
m_modemNXDNTXLevel = float(::atof(value));
514+
else if (::strcmp(key, "M17TXLevel") == 0)
515+
m_modemM17TXLevel = float(::atof(value));
497516
else if (::strcmp(key, "POCSAGTXLevel") == 0)
498517
m_modemPOCSAGTXLevel = float(::atof(value));
499518
else if (::strcmp(key, "FMTXLevel") == 0)
@@ -682,13 +701,21 @@ bool CConf::read()
682701
m_nxdnTXHang = (unsigned int)::atoi(value);
683702
else if (::strcmp(key, "ModeHang") == 0)
684703
m_nxdnModeHang = (unsigned int)::atoi(value);
704+
} else if (section == SECTION_M17) {
705+
if (::strcmp(key, "Enable") == 0)
706+
m_m17Enabled = ::atoi(value) == 1;
707+
else if (::strcmp(key, "SelfOnly") == 0)
708+
m_m17SelfOnly = ::atoi(value) == 1;
709+
else if (::strcmp(key, "TXHang") == 0)
710+
m_m17TXHang = (unsigned int)::atoi(value);
711+
else if (::strcmp(key, "ModeHang") == 0)
712+
m_m17ModeHang = (unsigned int)::atoi(value);
685713
} else if (section == SECTION_POCSAG) {
686-
if (::strcmp(key, "Enable") == 0)
687-
m_pocsagEnabled = ::atoi(value) == 1;
688-
else if (::strcmp(key, "Frequency") == 0)
689-
m_pocsagFrequency = (unsigned int)::atoi(value);
690-
}
691-
else if (section == SECTION_FM) {
714+
if (::strcmp(key, "Enable") == 0)
715+
m_pocsagEnabled = ::atoi(value) == 1;
716+
else if (::strcmp(key, "Frequency") == 0)
717+
m_pocsagFrequency = (unsigned int)::atoi(value);
718+
} else if (section == SECTION_FM) {
692719
if (::strcmp(key, "Enable") == 0)
693720
m_fmEnabled = ::atoi(value) == 1;
694721
else if (::strcmp(key, "Callsign") == 0) {
@@ -843,6 +870,19 @@ bool CConf::read()
843870
m_nxdnNetworkModeHang = (unsigned int)::atoi(value);
844871
else if (::strcmp(key, "Debug") == 0)
845872
m_nxdnNetworkDebug = ::atoi(value) == 1;
873+
} else if (section == SECTION_M17_NETWORK) {
874+
if (::strcmp(key, "Enable") == 0)
875+
m_m17NetworkEnabled = ::atoi(value) == 1;
876+
else if (::strcmp(key, "LocalPort") == 0)
877+
m_m17LocalPort = (unsigned int)::atoi(value);
878+
else if (::strcmp(key, "GatewayAddress") == 0)
879+
m_m17GatewayAddress = value;
880+
else if (::strcmp(key, "GatewayPort") == 0)
881+
m_m17GatewayPort = (unsigned int)::atoi(value);
882+
else if (::strcmp(key, "ModeHang") == 0)
883+
m_m17NetworkModeHang = (unsigned int)::atoi(value);
884+
else if (::strcmp(key, "Debug") == 0)
885+
m_m17NetworkDebug = ::atoi(value) == 1;
846886
} else if (section == SECTION_POCSAG_NETWORK) {
847887
if (::strcmp(key, "Enable") == 0)
848888
m_pocsagNetworkEnabled = ::atoi(value) == 1;
@@ -1151,6 +1191,11 @@ float CConf::getModemNXDNTXLevel() const
11511191
return m_modemNXDNTXLevel;
11521192
}
11531193

1194+
float CConf::getModemM17TXLevel() const
1195+
{
1196+
return m_modemM17TXLevel;
1197+
}
1198+
11541199
float CConf::getModemPOCSAGTXLevel() const
11551200
{
11561201
return m_modemPOCSAGTXLevel;
@@ -1461,6 +1506,26 @@ unsigned int CConf::getNXDNModeHang() const
14611506
return m_nxdnModeHang;
14621507
}
14631508

1509+
bool CConf::getM17Enabled() const
1510+
{
1511+
return m_m17Enabled;
1512+
}
1513+
1514+
bool CConf::getM17SelfOnly() const
1515+
{
1516+
return m_m17SelfOnly;
1517+
}
1518+
1519+
unsigned int CConf::getM17TXHang() const
1520+
{
1521+
return m_m17TXHang;
1522+
}
1523+
1524+
unsigned int CConf::getM17ModeHang() const
1525+
{
1526+
return m_m17ModeHang;
1527+
}
1528+
14641529
bool CConf::getPOCSAGEnabled() const
14651530
{
14661531
return m_pocsagEnabled;
@@ -1816,6 +1881,36 @@ bool CConf::getNXDNNetworkDebug() const
18161881
return m_nxdnNetworkDebug;
18171882
}
18181883

1884+
bool CConf::getM17NetworkEnabled() const
1885+
{
1886+
return m_m17NetworkEnabled;
1887+
}
1888+
1889+
std::string CConf::getM17GatewayAddress() const
1890+
{
1891+
return m_m17GatewayAddress;
1892+
}
1893+
1894+
unsigned int CConf::getM17GatewayPort() const
1895+
{
1896+
return m_m17GatewayPort;
1897+
}
1898+
1899+
unsigned int CConf::getM17LocalPort() const
1900+
{
1901+
return m_m17LocalPort;
1902+
}
1903+
1904+
unsigned int CConf::getM17NetworkModeHang() const
1905+
{
1906+
return m_m17NetworkModeHang;
1907+
}
1908+
1909+
bool CConf::getM17NetworkDebug() const
1910+
{
1911+
return m_m17NetworkDebug;
1912+
}
1913+
18191914
bool CConf::getPOCSAGNetworkEnabled() const
18201915
{
18211916
return m_pocsagNetworkEnabled;

Conf.h

+28
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ class CConf
8383
float getModemYSFTXLevel() const;
8484
float getModemP25TXLevel() const;
8585
float getModemNXDNTXLevel() const;
86+
float getModemM17TXLevel() const;
8687
float getModemPOCSAGTXLevel() const;
8788
float getModemFMTXLevel() const;
8889
std::string getModemRSSIMappingFile() const;
@@ -160,6 +161,12 @@ class CConf
160161
unsigned int getNXDNTXHang() const;
161162
unsigned int getNXDNModeHang() const;
162163

164+
// The M17 section
165+
bool getM17Enabled() const;
166+
bool getM17SelfOnly() const;
167+
unsigned int getM17TXHang() const;
168+
unsigned int getM17ModeHang() const;
169+
163170
// The POCSAG section
164171
bool getPOCSAGEnabled() const;
165172
unsigned int getPOCSAGFrequency() const;
@@ -245,6 +252,14 @@ class CConf
245252
unsigned int getNXDNNetworkModeHang() const;
246253
bool getNXDNNetworkDebug() const;
247254

255+
// The M17 Network section
256+
bool getM17NetworkEnabled() const;
257+
std::string getM17GatewayAddress() const;
258+
unsigned int getM17GatewayPort() const;
259+
unsigned int getM17LocalPort() const;
260+
unsigned int getM17NetworkModeHang() const;
261+
bool getM17NetworkDebug() const;
262+
248263
// The POCSAG Network section
249264
bool getPOCSAGNetworkEnabled() const;
250265
std::string getPOCSAGGatewayAddress() const;
@@ -352,6 +367,7 @@ class CConf
352367
float m_modemYSFTXLevel;
353368
float m_modemP25TXLevel;
354369
float m_modemNXDNTXLevel;
370+
float m_modemM17TXLevel;
355371
float m_modemPOCSAGTXLevel;
356372
float m_modemFMTXLevel;
357373
std::string m_modemRSSIMappingFile;
@@ -422,6 +438,11 @@ class CConf
422438
unsigned int m_nxdnTXHang;
423439
unsigned int m_nxdnModeHang;
424440

441+
bool m_m17Enabled;
442+
bool m_m17SelfOnly;
443+
unsigned int m_m17TXHang;
444+
unsigned int m_m17ModeHang;
445+
425446
bool m_pocsagEnabled;
426447
unsigned int m_pocsagFrequency;
427448

@@ -500,6 +521,13 @@ class CConf
500521
unsigned int m_nxdnNetworkModeHang;
501522
bool m_nxdnNetworkDebug;
502523

524+
bool m_m17NetworkEnabled;
525+
std::string m_m17GatewayAddress;
526+
unsigned int m_m17GatewayPort;
527+
unsigned int m_m17LocalPort;
528+
unsigned int m_m17NetworkModeHang;
529+
bool m_m17NetworkDebug;
530+
503531
bool m_pocsagNetworkEnabled;
504532
std::string m_pocsagGatewayAddress;
505533
unsigned int m_pocsagGatewayPort;

Defines.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2015,2016,2017,2018 by Jonathan Naylor G4KLX
2+
* Copyright (C) 2015,2016,2017,2018,2020 by Jonathan Naylor G4KLX
33
*
44
* This program is free software; you can redistribute it and/or modify
55
* it under the terms of the GNU General Public License as published by
@@ -26,6 +26,7 @@ const unsigned char MODE_YSF = 3U;
2626
const unsigned char MODE_P25 = 4U;
2727
const unsigned char MODE_NXDN = 5U;
2828
const unsigned char MODE_POCSAG = 6U;
29+
const unsigned char MODE_M17 = 7U;
2930

3031
const unsigned char MODE_FM = 10U;
3132

0 commit comments

Comments
 (0)