Allow for per mode RF and Network mode hang times.

This commit is contained in:
Jonathan Naylor 2017-09-01 09:25:54 +01:00
parent 0efaf55102
commit 31828da9d2
5 changed files with 164 additions and 66 deletions

105
Conf.cpp
View file

@ -58,8 +58,6 @@ m_callsign(),
m_id(0U), m_id(0U),
m_timeout(120U), m_timeout(120U),
m_duplex(true), m_duplex(true),
m_rfModeHang(10U),
m_netModeHang(3U),
m_display(), m_display(),
m_daemon(false), m_daemon(false),
m_rxFrequency(0U), m_rxFrequency(0U),
@ -107,6 +105,7 @@ m_dstarBlackList(),
m_dstarAckReply(true), m_dstarAckReply(true),
m_dstarAckTime(750U), m_dstarAckTime(750U),
m_dstarErrorReply(true), m_dstarErrorReply(true),
m_dstarModeHang(10U),
m_dmrEnabled(false), m_dmrEnabled(false),
m_dmrBeacons(false), m_dmrBeacons(false),
m_dmrId(0U), m_dmrId(0U),
@ -121,20 +120,25 @@ m_dmrSlot1TGWhiteList(),
m_dmrSlot2TGWhiteList(), m_dmrSlot2TGWhiteList(),
m_dmrCallHang(3U), m_dmrCallHang(3U),
m_dmrTXHang(4U), m_dmrTXHang(4U),
m_dmrModeHang(10U),
m_fusionEnabled(false), m_fusionEnabled(false),
m_fusionLowDeviation(false), m_fusionLowDeviation(false),
m_fusionRemoteGateway(false), m_fusionRemoteGateway(false),
m_fusionSelfOnly(false), m_fusionSelfOnly(false),
m_fusionSQLEnabled(false), m_fusionSQLEnabled(false),
m_fusionSQL(0U), m_fusionSQL(0U),
m_fusionModeHang(10U),
m_p25Enabled(false), m_p25Enabled(false),
m_p25Id(0U), m_p25Id(0U),
m_p25NAC(0x293U), m_p25NAC(0x293U),
m_p25SelfOnly(false), m_p25SelfOnly(false),
m_p25OverrideUID(false),
m_p25ModeHang(10U),
m_dstarNetworkEnabled(false), m_dstarNetworkEnabled(false),
m_dstarGatewayAddress(), m_dstarGatewayAddress(),
m_dstarGatewayPort(0U), m_dstarGatewayPort(0U),
m_dstarLocalPort(0U), m_dstarLocalPort(0U),
m_dstarNetworkModeHang(3U),
m_dstarNetworkDebug(false), m_dstarNetworkDebug(false),
m_dmrNetworkEnabled(false), m_dmrNetworkEnabled(false),
m_dmrNetworkAddress(), m_dmrNetworkAddress(),
@ -146,18 +150,20 @@ m_dmrNetworkDebug(false),
m_dmrNetworkJitter(300U), m_dmrNetworkJitter(300U),
m_dmrNetworkSlot1(true), m_dmrNetworkSlot1(true),
m_dmrNetworkSlot2(true), m_dmrNetworkSlot2(true),
m_dmrNetworkModeHang(3U),
m_fusionNetworkEnabled(false), m_fusionNetworkEnabled(false),
m_fusionNetworkMyAddress(), m_fusionNetworkMyAddress(),
m_fusionNetworkMyPort(0U), m_fusionNetworkMyPort(0U),
m_fusionNetworkGwyAddress(), m_fusionNetworkGwyAddress(),
m_fusionNetworkGwyPort(0U), m_fusionNetworkGwyPort(0U),
m_fusionNetworkModeHang(3U),
m_fusionNetworkDebug(false), m_fusionNetworkDebug(false),
m_p25NetworkEnabled(false), m_p25NetworkEnabled(false),
m_p25GatewayAddress(), m_p25GatewayAddress(),
m_p25GatewayPort(0U), m_p25GatewayPort(0U),
m_p25LocalPort(0U), m_p25LocalPort(0U),
m_p25NetworkModeHang(3U),
m_p25NetworkDebug(false), m_p25NetworkDebug(false),
m_p25OverrideUID(false),
m_tftSerialPort("/dev/ttyAMA0"), m_tftSerialPort("/dev/ttyAMA0"),
m_tftSerialBrightness(50U), m_tftSerialBrightness(50U),
m_hd44780Rows(2U), m_hd44780Rows(2U),
@ -274,11 +280,12 @@ bool CConf::read()
else if (::strcmp(key, "Duplex") == 0) else if (::strcmp(key, "Duplex") == 0)
m_duplex = ::atoi(value) == 1; m_duplex = ::atoi(value) == 1;
else if (::strcmp(key, "ModeHang") == 0) else if (::strcmp(key, "ModeHang") == 0)
m_rfModeHang = m_netModeHang = (unsigned int)::atoi(value); m_dstarNetworkModeHang = m_dmrNetworkModeHang = m_fusionNetworkModeHang = m_p25NetworkModeHang =
m_dstarModeHang = m_dmrModeHang = m_fusionModeHang = m_p25ModeHang = (unsigned int)::atoi(value);
else if (::strcmp(key, "RFModeHang") == 0) else if (::strcmp(key, "RFModeHang") == 0)
m_rfModeHang = (unsigned int)::atoi(value); m_dstarModeHang = m_dmrModeHang = m_fusionModeHang = m_p25ModeHang = (unsigned int)::atoi(value);
else if (::strcmp(key, "NetModeHang") == 0) else if (::strcmp(key, "NetModeHang") == 0)
m_netModeHang = (unsigned int)::atoi(value); m_dstarNetworkModeHang = m_dmrNetworkModeHang = m_fusionNetworkModeHang = m_p25NetworkModeHang = (unsigned int)::atoi(value);
else if (::strcmp(key, "Display") == 0) else if (::strcmp(key, "Display") == 0)
m_display = value; m_display = value;
else if (::strcmp(key, "Daemon") == 0) else if (::strcmp(key, "Daemon") == 0)
@ -399,6 +406,8 @@ bool CConf::read()
m_dstarAckTime = (unsigned int)::atoi(value); m_dstarAckTime = (unsigned int)::atoi(value);
else if (::strcmp(key, "ErrorReply") == 0) else if (::strcmp(key, "ErrorReply") == 0)
m_dstarErrorReply = ::atoi(value) == 1; m_dstarErrorReply = ::atoi(value) == 1;
else if (::strcmp(key, "ModeHang") == 0)
m_dstarModeHang = (unsigned int)::atoi(value);
} else if (section == SECTION_DMR) { } else if (section == SECTION_DMR) {
if (::strcmp(key, "Enable") == 0) if (::strcmp(key, "Enable") == 0)
m_dmrEnabled = ::atoi(value) == 1; m_dmrEnabled = ::atoi(value) == 1;
@ -458,6 +467,8 @@ bool CConf::read()
m_dmrTXHang = (unsigned int)::atoi(value); m_dmrTXHang = (unsigned int)::atoi(value);
else if (::strcmp(key, "CallHang") == 0) else if (::strcmp(key, "CallHang") == 0)
m_dmrCallHang = (unsigned int)::atoi(value); m_dmrCallHang = (unsigned int)::atoi(value);
else if (::strcmp(key, "ModeHang") == 0)
m_dmrModeHang = (unsigned int)::atoi(value);
} else if (section == SECTION_FUSION) { } else if (section == SECTION_FUSION) {
if (::strcmp(key, "Enable") == 0) if (::strcmp(key, "Enable") == 0)
m_fusionEnabled = ::atoi(value) == 1; m_fusionEnabled = ::atoi(value) == 1;
@ -470,6 +481,8 @@ bool CConf::read()
m_fusionRemoteGateway = ::atoi(value) == 1; m_fusionRemoteGateway = ::atoi(value) == 1;
else if (::strcmp(key, "SelfOnly") == 0) else if (::strcmp(key, "SelfOnly") == 0)
m_fusionSelfOnly = ::atoi(value) == 1; m_fusionSelfOnly = ::atoi(value) == 1;
else if (::strcmp(key, "ModeHang") == 0)
m_fusionModeHang = (unsigned int)::atoi(value);
} else if (section == SECTION_P25) { } else if (section == SECTION_P25) {
if (::strcmp(key, "Enable") == 0) if (::strcmp(key, "Enable") == 0)
m_p25Enabled = ::atoi(value) == 1; m_p25Enabled = ::atoi(value) == 1;
@ -481,6 +494,8 @@ bool CConf::read()
m_p25OverrideUID = ::atoi(value) == 1; m_p25OverrideUID = ::atoi(value) == 1;
else if (::strcmp(key, "SelfOnly") == 0) else if (::strcmp(key, "SelfOnly") == 0)
m_p25SelfOnly = ::atoi(value) == 1; m_p25SelfOnly = ::atoi(value) == 1;
else if (::strcmp(key, "ModeHang") == 0)
m_p25ModeHang = (unsigned int)::atoi(value);
} else if (section == SECTION_DSTAR_NETWORK) { } else if (section == SECTION_DSTAR_NETWORK) {
if (::strcmp(key, "Enable") == 0) if (::strcmp(key, "Enable") == 0)
m_dstarNetworkEnabled = ::atoi(value) == 1; m_dstarNetworkEnabled = ::atoi(value) == 1;
@ -490,6 +505,8 @@ bool CConf::read()
m_dstarGatewayPort = (unsigned int)::atoi(value); m_dstarGatewayPort = (unsigned int)::atoi(value);
else if (::strcmp(key, "LocalPort") == 0) else if (::strcmp(key, "LocalPort") == 0)
m_dstarLocalPort = (unsigned int)::atoi(value); m_dstarLocalPort = (unsigned int)::atoi(value);
else if (::strcmp(key, "ModeHang") == 0)
m_dstarNetworkModeHang = (unsigned int)::atoi(value);
else if (::strcmp(key, "Debug") == 0) else if (::strcmp(key, "Debug") == 0)
m_dstarNetworkDebug = ::atoi(value) == 1; m_dstarNetworkDebug = ::atoi(value) == 1;
} else if (section == SECTION_DMR_NETWORK) { } else if (section == SECTION_DMR_NETWORK) {
@ -513,6 +530,8 @@ bool CConf::read()
m_dmrNetworkSlot1 = ::atoi(value) == 1; m_dmrNetworkSlot1 = ::atoi(value) == 1;
else if (::strcmp(key, "Slot2") == 0) else if (::strcmp(key, "Slot2") == 0)
m_dmrNetworkSlot2 = ::atoi(value) == 1; m_dmrNetworkSlot2 = ::atoi(value) == 1;
else if (::strcmp(key, "ModeHang") == 0)
m_dmrNetworkModeHang = (unsigned int)::atoi(value);
} else if (section == SECTION_FUSION_NETWORK) { } else if (section == SECTION_FUSION_NETWORK) {
if (::strcmp(key, "Enable") == 0) if (::strcmp(key, "Enable") == 0)
m_fusionNetworkEnabled = ::atoi(value) == 1; m_fusionNetworkEnabled = ::atoi(value) == 1;
@ -524,6 +543,8 @@ bool CConf::read()
m_fusionNetworkGwyAddress = value; m_fusionNetworkGwyAddress = value;
else if (::strcmp(key, "GwyPort") == 0) else if (::strcmp(key, "GwyPort") == 0)
m_fusionNetworkGwyPort = (unsigned int)::atoi(value); m_fusionNetworkGwyPort = (unsigned int)::atoi(value);
else if (::strcmp(key, "ModeHang") == 0)
m_fusionNetworkModeHang = (unsigned int)::atoi(value);
else if (::strcmp(key, "Debug") == 0) else if (::strcmp(key, "Debug") == 0)
m_fusionNetworkDebug = ::atoi(value) == 1; m_fusionNetworkDebug = ::atoi(value) == 1;
} else if (section == SECTION_P25_NETWORK) { } else if (section == SECTION_P25_NETWORK) {
@ -535,6 +556,8 @@ bool CConf::read()
m_p25GatewayPort = (unsigned int)::atoi(value); m_p25GatewayPort = (unsigned int)::atoi(value);
else if (::strcmp(key, "LocalPort") == 0) else if (::strcmp(key, "LocalPort") == 0)
m_p25LocalPort = (unsigned int)::atoi(value); m_p25LocalPort = (unsigned int)::atoi(value);
else if (::strcmp(key, "ModeHang") == 0)
m_p25NetworkModeHang = (unsigned int)::atoi(value);
else if (::strcmp(key, "Debug") == 0) else if (::strcmp(key, "Debug") == 0)
m_p25NetworkDebug = ::atoi(value) == 1; m_p25NetworkDebug = ::atoi(value) == 1;
} else if (section == SECTION_TFTSERIAL) { } else if (section == SECTION_TFTSERIAL) {
@ -630,16 +653,6 @@ bool CConf::getDuplex() const
return m_duplex; return m_duplex;
} }
unsigned int CConf::getRFModeHang() const
{
return m_rfModeHang;
}
unsigned int CConf::getNetModeHang() const
{
return m_netModeHang;
}
std::string CConf::getDisplay() const std::string CConf::getDisplay() const
{ {
return m_display; return m_display;
@ -875,6 +888,11 @@ bool CConf::getDStarErrorReply() const
return m_dstarErrorReply; return m_dstarErrorReply;
} }
unsigned int CConf::getDStarModeHang() const
{
return m_dstarModeHang;
}
bool CConf::getDMREnabled() const bool CConf::getDMREnabled() const
{ {
return m_dmrEnabled; return m_dmrEnabled;
@ -945,6 +963,11 @@ unsigned int CConf::getDMRTXHang() const
return m_dmrTXHang; return m_dmrTXHang;
} }
unsigned int CConf::getDMRModeHang() const
{
return m_dmrModeHang;
}
bool CConf::getFusionEnabled() const bool CConf::getFusionEnabled() const
{ {
return m_fusionEnabled; return m_fusionEnabled;
@ -975,6 +998,11 @@ unsigned char CConf::getFusionSQL() const
return m_fusionSQL; return m_fusionSQL;
} }
unsigned int CConf::getFusionModeHang() const
{
return m_fusionModeHang;
}
bool CConf::getP25Enabled() const bool CConf::getP25Enabled() const
{ {
return m_p25Enabled; return m_p25Enabled;
@ -990,6 +1018,21 @@ unsigned int CConf::getP25NAC() const
return m_p25NAC; return m_p25NAC;
} }
bool CConf::getP25OverrideUID() const
{
return m_p25OverrideUID;
}
bool CConf::getP25SelfOnly() const
{
return m_p25SelfOnly;
}
unsigned int CConf::getP25ModeHang() const
{
return m_p25ModeHang;
}
bool CConf::getDStarNetworkEnabled() const bool CConf::getDStarNetworkEnabled() const
{ {
return m_dstarNetworkEnabled; return m_dstarNetworkEnabled;
@ -1010,6 +1053,11 @@ unsigned int CConf::getDStarLocalPort() const
return m_dstarLocalPort; return m_dstarLocalPort;
} }
unsigned int CConf::getDStarNetworkModeHang() const
{
return m_dstarNetworkModeHang;
}
bool CConf::getDStarNetworkDebug() const bool CConf::getDStarNetworkDebug() const
{ {
return m_dstarNetworkDebug; return m_dstarNetworkDebug;
@ -1045,6 +1093,11 @@ std::string CConf::getDMRNetworkOptions() const
return m_dmrNetworkOptions; return m_dmrNetworkOptions;
} }
unsigned int CConf::getDMRNetworkModeHang() const
{
return m_dmrNetworkModeHang;
}
bool CConf::getDMRNetworkDebug() const bool CConf::getDMRNetworkDebug() const
{ {
return m_dmrNetworkDebug; return m_dmrNetworkDebug;
@ -1090,6 +1143,11 @@ unsigned int CConf::getFusionNetworkGwyPort() const
return m_fusionNetworkGwyPort; return m_fusionNetworkGwyPort;
} }
unsigned int CConf::getFusionNetworkModeHang() const
{
return m_fusionNetworkModeHang;
}
bool CConf::getFusionNetworkDebug() const bool CConf::getFusionNetworkDebug() const
{ {
return m_fusionNetworkDebug; return m_fusionNetworkDebug;
@ -1115,21 +1173,16 @@ unsigned int CConf::getP25LocalPort() const
return m_p25LocalPort; return m_p25LocalPort;
} }
unsigned int CConf::getP25NetworkModeHang() const
{
return m_p25NetworkModeHang;
}
bool CConf::getP25NetworkDebug() const bool CConf::getP25NetworkDebug() const
{ {
return m_p25NetworkDebug; return m_p25NetworkDebug;
} }
bool CConf::getP25OverrideUID() const
{
return m_p25OverrideUID;
}
bool CConf::getP25SelfOnly() const
{
return m_p25SelfOnly;
}
std::string CConf::getTFTSerialPort() const std::string CConf::getTFTSerialPort() const
{ {
return m_tftSerialPort; return m_tftSerialPort;

24
Conf.h
View file

@ -35,8 +35,6 @@ public:
unsigned int getId() const; unsigned int getId() const;
unsigned int getTimeout() const; unsigned int getTimeout() const;
bool getDuplex() const; bool getDuplex() const;
unsigned int getRFModeHang() const;
unsigned int getNetModeHang() const;
std::string getDisplay() const; std::string getDisplay() const;
bool getDaemon() const; bool getDaemon() const;
@ -98,6 +96,7 @@ public:
bool getDStarAckReply() const; bool getDStarAckReply() const;
unsigned int getDStarAckTime() const; unsigned int getDStarAckTime() const;
bool getDStarErrorReply() const; bool getDStarErrorReply() const;
unsigned int getDStarModeHang() const;
// The DMR section // The DMR section
bool getDMREnabled() const; bool getDMREnabled() const;
@ -114,6 +113,7 @@ public:
std::vector<unsigned int> getDMRSlot2TGWhiteList() const; std::vector<unsigned int> getDMRSlot2TGWhiteList() const;
unsigned int getDMRCallHang() const; unsigned int getDMRCallHang() const;
unsigned int getDMRTXHang() const; unsigned int getDMRTXHang() const;
unsigned int getDMRModeHang() const;
// The System Fusion section // The System Fusion section
bool getFusionEnabled() const; bool getFusionEnabled() const;
@ -122,18 +122,22 @@ public:
bool getFusionSelfOnly() const; bool getFusionSelfOnly() const;
bool getFusionSQLEnabled() const; bool getFusionSQLEnabled() const;
unsigned char getFusionSQL() const; unsigned char getFusionSQL() const;
unsigned int getFusionModeHang() const;
// The P25 section // The P25 section
bool getP25Enabled() const; bool getP25Enabled() const;
unsigned int getP25Id() const; unsigned int getP25Id() const;
unsigned int getP25NAC() const; unsigned int getP25NAC() const;
bool getP25SelfOnly() const; bool getP25SelfOnly() const;
bool getP25OverrideUID() const;
unsigned int getP25ModeHang() const;
// The D-Star Network section // The D-Star Network section
bool getDStarNetworkEnabled() const; bool getDStarNetworkEnabled() const;
std::string getDStarGatewayAddress() const; std::string getDStarGatewayAddress() const;
unsigned int getDStarGatewayPort() const; unsigned int getDStarGatewayPort() const;
unsigned int getDStarLocalPort() const; unsigned int getDStarLocalPort() const;
unsigned int getDStarNetworkModeHang() const;
bool getDStarNetworkDebug() const; bool getDStarNetworkDebug() const;
// The DMR Network section // The DMR Network section
@ -147,6 +151,7 @@ public:
unsigned int getDMRNetworkJitter() const; unsigned int getDMRNetworkJitter() const;
bool getDMRNetworkSlot1() const; bool getDMRNetworkSlot1() const;
bool getDMRNetworkSlot2() const; bool getDMRNetworkSlot2() const;
unsigned int getDMRNetworkModeHang() const;
// The System Fusion Network section // The System Fusion Network section
bool getFusionNetworkEnabled() const; bool getFusionNetworkEnabled() const;
@ -154,6 +159,7 @@ public:
unsigned int getFusionNetworkMyPort() const; unsigned int getFusionNetworkMyPort() const;
std::string getFusionNetworkGwyAddress() const; std::string getFusionNetworkGwyAddress() const;
unsigned int getFusionNetworkGwyPort() const; unsigned int getFusionNetworkGwyPort() const;
unsigned int getFusionNetworkModeHang() const;
bool getFusionNetworkDebug() const; bool getFusionNetworkDebug() const;
// The P25 Network section // The P25 Network section
@ -161,8 +167,8 @@ public:
std::string getP25GatewayAddress() const; std::string getP25GatewayAddress() const;
unsigned int getP25GatewayPort() const; unsigned int getP25GatewayPort() const;
unsigned int getP25LocalPort() const; unsigned int getP25LocalPort() const;
unsigned int getP25NetworkModeHang() const;
bool getP25NetworkDebug() const; bool getP25NetworkDebug() const;
bool getP25OverrideUID() const;
// The TFTSERIAL section // The TFTSERIAL section
std::string getTFTSerialPort() const; std::string getTFTSerialPort() const;
@ -207,8 +213,6 @@ private:
unsigned int m_id; unsigned int m_id;
unsigned int m_timeout; unsigned int m_timeout;
bool m_duplex; bool m_duplex;
unsigned int m_rfModeHang;
unsigned int m_netModeHang;
std::string m_display; std::string m_display;
bool m_daemon; bool m_daemon;
@ -263,6 +267,7 @@ private:
bool m_dstarAckReply; bool m_dstarAckReply;
unsigned int m_dstarAckTime; unsigned int m_dstarAckTime;
bool m_dstarErrorReply; bool m_dstarErrorReply;
unsigned int m_dstarModeHang;
bool m_dmrEnabled; bool m_dmrEnabled;
bool m_dmrBeacons; bool m_dmrBeacons;
@ -278,6 +283,7 @@ private:
std::vector<unsigned int> m_dmrSlot2TGWhiteList; std::vector<unsigned int> m_dmrSlot2TGWhiteList;
unsigned int m_dmrCallHang; unsigned int m_dmrCallHang;
unsigned int m_dmrTXHang; unsigned int m_dmrTXHang;
unsigned int m_dmrModeHang;
bool m_fusionEnabled; bool m_fusionEnabled;
bool m_fusionLowDeviation; bool m_fusionLowDeviation;
@ -285,16 +291,20 @@ private:
bool m_fusionSelfOnly; bool m_fusionSelfOnly;
bool m_fusionSQLEnabled; bool m_fusionSQLEnabled;
unsigned char m_fusionSQL; unsigned char m_fusionSQL;
unsigned int m_fusionModeHang;
bool m_p25Enabled; bool m_p25Enabled;
unsigned int m_p25Id; unsigned int m_p25Id;
unsigned int m_p25NAC; unsigned int m_p25NAC;
bool m_p25SelfOnly; bool m_p25SelfOnly;
bool m_p25OverrideUID;
unsigned int m_p25ModeHang;
bool m_dstarNetworkEnabled; bool m_dstarNetworkEnabled;
std::string m_dstarGatewayAddress; std::string m_dstarGatewayAddress;
unsigned int m_dstarGatewayPort; unsigned int m_dstarGatewayPort;
unsigned int m_dstarLocalPort; unsigned int m_dstarLocalPort;
unsigned int m_dstarNetworkModeHang;
bool m_dstarNetworkDebug; bool m_dstarNetworkDebug;
bool m_dmrNetworkEnabled; bool m_dmrNetworkEnabled;
@ -307,20 +317,22 @@ private:
unsigned int m_dmrNetworkJitter; unsigned int m_dmrNetworkJitter;
bool m_dmrNetworkSlot1; bool m_dmrNetworkSlot1;
bool m_dmrNetworkSlot2; bool m_dmrNetworkSlot2;
unsigned int m_dmrNetworkModeHang;
bool m_fusionNetworkEnabled; bool m_fusionNetworkEnabled;
std::string m_fusionNetworkMyAddress; std::string m_fusionNetworkMyAddress;
unsigned int m_fusionNetworkMyPort; unsigned int m_fusionNetworkMyPort;
std::string m_fusionNetworkGwyAddress; std::string m_fusionNetworkGwyAddress;
unsigned int m_fusionNetworkGwyPort; unsigned int m_fusionNetworkGwyPort;
unsigned int m_fusionNetworkModeHang;
bool m_fusionNetworkDebug; bool m_fusionNetworkDebug;
bool m_p25NetworkEnabled; bool m_p25NetworkEnabled;
std::string m_p25GatewayAddress; std::string m_p25GatewayAddress;
unsigned int m_p25GatewayPort; unsigned int m_p25GatewayPort;
unsigned int m_p25LocalPort; unsigned int m_p25LocalPort;
unsigned int m_p25NetworkModeHang;
bool m_p25NetworkDebug; bool m_p25NetworkDebug;
bool m_p25OverrideUID;
std::string m_tftSerialPort; std::string m_tftSerialPort;
unsigned int m_tftSerialBrightness; unsigned int m_tftSerialBrightness;

View file

@ -70,6 +70,7 @@ SelfOnly=0
AckReply=1 AckReply=1
AckTime=750 AckTime=750
ErrorReply=1 ErrorReply=1
# ModeHang=10
[DMR] [DMR]
Enable=1 Enable=1
@ -83,6 +84,7 @@ DumpTAData=1
# Slot2TGWhiteList= # Slot2TGWhiteList=
CallHang=3 CallHang=3
TXHang=4 TXHang=4
# ModeHang=10
[System Fusion] [System Fusion]
Enable=1 Enable=1
@ -90,18 +92,21 @@ LowDeviation=0
SelfOnly=0 SelfOnly=0
#DSQ=1 #DSQ=1
RemoteGateway=0 RemoteGateway=0
# ModeHang=10
[P25] [P25]
Enable=1 Enable=1
NAC=293 NAC=293
SelfOnly=0 SelfOnly=0
OverrideUIDCheck=0 OverrideUIDCheck=0
# ModeHang=10
[D-Star Network] [D-Star Network]
Enable=1 Enable=1
GatewayAddress=127.0.0.1 GatewayAddress=127.0.0.1
GatewayPort=20010 GatewayPort=20010
LocalPort=20011 LocalPort=20011
# ModeHang=3
Debug=0 Debug=0
[DMR Network] [DMR Network]
@ -114,6 +119,7 @@ Password=PASSWORD
# Options= # Options=
Slot1=1 Slot1=1
Slot2=1 Slot2=1
# ModeHang=3
Debug=0 Debug=0
[System Fusion Network] [System Fusion Network]
@ -122,6 +128,7 @@ LocalAddress=127.0.0.1
LocalPort=3200 LocalPort=3200
GwyAddress=127.0.0.1 GwyAddress=127.0.0.1
GwyPort=4200 GwyPort=4200
# ModeHang=3
Debug=0 Debug=0
[P25 Network] [P25 Network]
@ -129,6 +136,7 @@ Enable=1
GatewayAddress=127.0.0.1 GatewayAddress=127.0.0.1
GatewayPort=42020 GatewayPort=42020
LocalPort=32010 LocalPort=32010
# ModeHang=3
Debug=0 Debug=0
[TFT Serial] [TFT Serial]

View file

@ -135,8 +135,14 @@ m_p25Network(NULL),
m_display(NULL), m_display(NULL),
m_ump(NULL), m_ump(NULL),
m_mode(MODE_IDLE), m_mode(MODE_IDLE),
m_rfModeHang(10U), m_dstarRFModeHang(10U),
m_netModeHang(3U), m_dmrRFModeHang(10U),
m_ysfRFModeHang(10U),
m_p25RFModeHang(10U),
m_dstarNetModeHang(3U),
m_dmrNetModeHang(3U),
m_ysfNetModeHang(3U),
m_p25NetModeHang(3U),
m_modeTimer(1000U), m_modeTimer(1000U),
m_dmrTXTimer(1000U), m_dmrTXTimer(1000U),
m_cwIdTimer(1000U), m_cwIdTimer(1000U),
@ -342,13 +348,15 @@ int CMMDVMHost::run()
bool ackReply = m_conf.getDStarAckReply(); bool ackReply = m_conf.getDStarAckReply();
unsigned int ackTime = m_conf.getDStarAckTime(); unsigned int ackTime = m_conf.getDStarAckTime();
bool errorReply = m_conf.getDStarErrorReply(); bool errorReply = m_conf.getDStarErrorReply();
m_dstarRFModeHang = m_conf.getDStarModeHang();
LogInfo("D-Star Parameters"); LogInfo("D-Star RF Parameters");
LogInfo(" Module: %s", module.c_str()); LogInfo(" Module: %s", module.c_str());
LogInfo(" Self Only: %s", selfOnly ? "yes" : "no"); LogInfo(" Self Only: %s", selfOnly ? "yes" : "no");
LogInfo(" Ack Reply: %s", ackReply ? "yes" : "no"); LogInfo(" Ack Reply: %s", ackReply ? "yes" : "no");
LogInfo(" Ack Time: %ums", ackTime); LogInfo(" Ack Time: %ums", ackTime);
LogInfo(" Error Reply: %s", errorReply ? "yes" : "no"); LogInfo(" Error Reply: %s", errorReply ? "yes" : "no");
LogInfo(" Mode Hang: %us", m_dstarRFModeHang);
if (blackList.size() > 0U) if (blackList.size() > 0U)
LogInfo(" Black List: %u", blackList.size()); LogInfo(" Black List: %u", blackList.size());
@ -371,16 +379,20 @@ int CMMDVMHost::run()
unsigned int callHang = m_conf.getDMRCallHang(); unsigned int callHang = m_conf.getDMRCallHang();
unsigned int txHang = m_conf.getDMRTXHang(); unsigned int txHang = m_conf.getDMRTXHang();
unsigned int jitter = m_conf.getDMRNetworkJitter(); unsigned int jitter = m_conf.getDMRNetworkJitter();
m_dmrRFModeHang = m_conf.getDMRModeHang();
if (txHang > m_rfModeHang) if (txHang > m_dmrRFModeHang)
txHang = m_rfModeHang; txHang = m_dmrRFModeHang;
if (txHang > m_netModeHang)
txHang = m_netModeHang; if (m_conf.getDMRNetworkEnabled()) {
if (txHang > m_dmrNetModeHang)
txHang = m_dmrNetModeHang;
}
if (callHang > txHang) if (callHang > txHang)
callHang = txHang; callHang = txHang;
LogInfo("DMR Parameters"); LogInfo("DMR RF Parameters");
LogInfo(" Id: %u", id); LogInfo(" Id: %u", id);
LogInfo(" Color Code: %u", colorCode); LogInfo(" Color Code: %u", colorCode);
LogInfo(" Self Only: %s", selfOnly ? "yes" : "no"); LogInfo(" Self Only: %s", selfOnly ? "yes" : "no");
@ -399,6 +411,7 @@ int CMMDVMHost::run()
LogInfo(" Call Hang: %us", callHang); LogInfo(" Call Hang: %us", callHang);
LogInfo(" TX Hang: %us", txHang); LogInfo(" TX Hang: %us", txHang);
LogInfo(" Mode Hang: %us", m_dmrRFModeHang);
dmr = new CDMRControl(id, colorCode, callHang, selfOnly, embeddedLCOnly, dumpTAData, prefixes, blackList, whiteList, slot1TGWhiteList, slot2TGWhiteList, m_timeout, m_modem, m_dmrNetwork, m_display, m_duplex, m_lookup, rssi, jitter); dmr = new CDMRControl(id, colorCode, callHang, selfOnly, embeddedLCOnly, dumpTAData, prefixes, blackList, whiteList, slot1TGWhiteList, slot2TGWhiteList, m_timeout, m_modem, m_dmrNetwork, m_display, m_duplex, m_lookup, rssi, jitter);
@ -412,14 +425,16 @@ int CMMDVMHost::run()
bool selfOnly = m_conf.getFusionSelfOnly(); bool selfOnly = m_conf.getFusionSelfOnly();
bool sqlEnabled = m_conf.getFusionSQLEnabled(); bool sqlEnabled = m_conf.getFusionSQLEnabled();
unsigned char sql = m_conf.getFusionSQL(); unsigned char sql = m_conf.getFusionSQL();
m_ysfRFModeHang = m_conf.getFusionModeHang();
LogInfo("YSF Parameters"); LogInfo("YSF RF Parameters");
LogInfo(" Low Deviation: %s", lowDeviation ? "yes" : "no"); LogInfo(" Low Deviation: %s", lowDeviation ? "yes" : "no");
LogInfo(" Remote Gateway: %s", remoteGateway ? "yes" : "no"); LogInfo(" Remote Gateway: %s", remoteGateway ? "yes" : "no");
LogInfo(" Self Only: %s", selfOnly ? "yes" : "no"); LogInfo(" Self Only: %s", selfOnly ? "yes" : "no");
LogInfo(" DSQ: %s", sqlEnabled ? "yes" : "no"); LogInfo(" DSQ: %s", sqlEnabled ? "yes" : "no");
if (sqlEnabled) if (sqlEnabled)
LogInfo(" DSQ Value: %u", sql); LogInfo(" DSQ Value: %u", sql);
LogInfo(" Mode Hang: %us", m_ysfRFModeHang);
ysf = new CYSFControl(m_callsign, selfOnly, m_ysfNetwork, m_display, m_timeout, m_duplex, lowDeviation, remoteGateway, rssi); ysf = new CYSFControl(m_callsign, selfOnly, m_ysfNetwork, m_display, m_timeout, m_duplex, lowDeviation, remoteGateway, rssi);
ysf->setSQL(sqlEnabled, sql); ysf->setSQL(sqlEnabled, sql);
@ -431,12 +446,14 @@ int CMMDVMHost::run()
unsigned int nac = m_conf.getP25NAC(); unsigned int nac = m_conf.getP25NAC();
bool uidOverride = m_conf.getP25OverrideUID(); bool uidOverride = m_conf.getP25OverrideUID();
bool selfOnly = m_conf.getP25SelfOnly(); bool selfOnly = m_conf.getP25SelfOnly();
m_p25RFModeHang = m_conf.getP25ModeHang();
LogInfo("P25 Parameters"); LogInfo("P25 RF Parameters");
LogInfo(" Id: %u", id); LogInfo(" Id: %u", id);
LogInfo(" NAC: $%03X", nac); LogInfo(" NAC: $%03X", nac);
LogInfo(" UID Override: %s", uidOverride ? "yes" : "no"); LogInfo(" UID Override: %s", uidOverride ? "yes" : "no");
LogInfo(" Self Only: %s", selfOnly ? "yes" : "no"); LogInfo(" Self Only: %s", selfOnly ? "yes" : "no");
LogInfo(" Mode Hang: %us", m_p25RFModeHang);
p25 = new CP25Control(nac, id, selfOnly, uidOverride, m_p25Network, m_display, m_timeout, m_duplex, m_lookup, rssi); p25 = new CP25Control(nac, id, selfOnly, uidOverride, m_p25Network, m_display, m_timeout, m_duplex, m_lookup, rssi);
} }
@ -477,7 +494,7 @@ int CMMDVMHost::run()
if (m_mode == MODE_IDLE) { if (m_mode == MODE_IDLE) {
bool ret = dstar->writeModem(data, len); bool ret = dstar->writeModem(data, len);
if (ret) { if (ret) {
m_modeTimer.setTimeout(m_rfModeHang); m_modeTimer.setTimeout(m_dstarRFModeHang);
setMode(MODE_DSTAR); setMode(MODE_DSTAR);
} }
} else if (m_mode == MODE_DSTAR) { } else if (m_mode == MODE_DSTAR) {
@ -494,12 +511,12 @@ int CMMDVMHost::run()
if (m_duplex) { if (m_duplex) {
bool ret = dmr->processWakeup(data); bool ret = dmr->processWakeup(data);
if (ret) { if (ret) {
m_modeTimer.setTimeout(m_rfModeHang); m_modeTimer.setTimeout(m_dmrRFModeHang);
setMode(MODE_DMR); setMode(MODE_DMR);
dmrBeaconTimer.stop(); dmrBeaconTimer.stop();
} }
} else { } else {
m_modeTimer.setTimeout(m_rfModeHang); m_modeTimer.setTimeout(m_dmrRFModeHang);
setMode(MODE_DMR); setMode(MODE_DMR);
dmr->writeModemSlot1(data, len); dmr->writeModemSlot1(data, len);
dmrBeaconTimer.stop(); dmrBeaconTimer.stop();
@ -531,12 +548,12 @@ int CMMDVMHost::run()
if (m_duplex) { if (m_duplex) {
bool ret = dmr->processWakeup(data); bool ret = dmr->processWakeup(data);
if (ret) { if (ret) {
m_modeTimer.setTimeout(m_rfModeHang); m_modeTimer.setTimeout(m_dmrRFModeHang);
setMode(MODE_DMR); setMode(MODE_DMR);
dmrBeaconTimer.stop(); dmrBeaconTimer.stop();
} }
} else { } else {
m_modeTimer.setTimeout(m_rfModeHang); m_modeTimer.setTimeout(m_dmrRFModeHang);
setMode(MODE_DMR); setMode(MODE_DMR);
dmr->writeModemSlot2(data, len); dmr->writeModemSlot2(data, len);
dmrBeaconTimer.stop(); dmrBeaconTimer.stop();
@ -567,7 +584,7 @@ int CMMDVMHost::run()
if (m_mode == MODE_IDLE) { if (m_mode == MODE_IDLE) {
bool ret = ysf->writeModem(data, len); bool ret = ysf->writeModem(data, len);
if (ret) { if (ret) {
m_modeTimer.setTimeout(m_rfModeHang); m_modeTimer.setTimeout(m_ysfRFModeHang);
setMode(MODE_YSF); setMode(MODE_YSF);
} }
} else if (m_mode == MODE_YSF) { } else if (m_mode == MODE_YSF) {
@ -583,7 +600,7 @@ int CMMDVMHost::run()
if (m_mode == MODE_IDLE) { if (m_mode == MODE_IDLE) {
bool ret = p25->writeModem(data, len); bool ret = p25->writeModem(data, len);
if (ret) { if (ret) {
m_modeTimer.setTimeout(m_rfModeHang); m_modeTimer.setTimeout(m_p25RFModeHang);
setMode(MODE_P25); setMode(MODE_P25);
} }
} else if (m_mode == MODE_P25) { } else if (m_mode == MODE_P25) {
@ -603,7 +620,7 @@ int CMMDVMHost::run()
len = dstar->readModem(data); len = dstar->readModem(data);
if (len > 0U) { if (len > 0U) {
if (m_mode == MODE_IDLE) { if (m_mode == MODE_IDLE) {
m_modeTimer.setTimeout(m_netModeHang); m_modeTimer.setTimeout(m_dstarNetModeHang);
setMode(MODE_DSTAR); setMode(MODE_DSTAR);
} }
if (m_mode == MODE_DSTAR) { if (m_mode == MODE_DSTAR) {
@ -622,7 +639,7 @@ int CMMDVMHost::run()
len = dmr->readModemSlot1(data); len = dmr->readModemSlot1(data);
if (len > 0U) { if (len > 0U) {
if (m_mode == MODE_IDLE) { if (m_mode == MODE_IDLE) {
m_modeTimer.setTimeout(m_netModeHang); m_modeTimer.setTimeout(m_dmrNetModeHang);
setMode(MODE_DMR); setMode(MODE_DMR);
} }
if (m_mode == MODE_DMR) { if (m_mode == MODE_DMR) {
@ -644,7 +661,7 @@ int CMMDVMHost::run()
len = dmr->readModemSlot2(data); len = dmr->readModemSlot2(data);
if (len > 0U) { if (len > 0U) {
if (m_mode == MODE_IDLE) { if (m_mode == MODE_IDLE) {
m_modeTimer.setTimeout(m_netModeHang); m_modeTimer.setTimeout(m_dmrNetModeHang);
setMode(MODE_DMR); setMode(MODE_DMR);
} }
if (m_mode == MODE_DMR) { if (m_mode == MODE_DMR) {
@ -668,7 +685,7 @@ int CMMDVMHost::run()
len = ysf->readModem(data); len = ysf->readModem(data);
if (len > 0U) { if (len > 0U) {
if (m_mode == MODE_IDLE) { if (m_mode == MODE_IDLE) {
m_modeTimer.setTimeout(m_netModeHang); m_modeTimer.setTimeout(m_ysfNetModeHang);
setMode(MODE_YSF); setMode(MODE_YSF);
} }
if (m_mode == MODE_YSF) { if (m_mode == MODE_YSF) {
@ -687,14 +704,13 @@ int CMMDVMHost::run()
len = p25->readModem(data); len = p25->readModem(data);
if (len > 0U) { if (len > 0U) {
if (m_mode == MODE_IDLE) { if (m_mode == MODE_IDLE) {
m_modeTimer.setTimeout(m_netModeHang); m_modeTimer.setTimeout(m_p25NetModeHang);
setMode(MODE_P25); setMode(MODE_P25);
} }
if (m_mode == MODE_P25) { if (m_mode == MODE_P25) {
m_modem->writeP25Data(data, len); m_modem->writeP25Data(data, len);
m_modeTimer.start(); m_modeTimer.start();
} } else if (m_mode != MODE_LOCKOUT) {
else if (m_mode != MODE_LOCKOUT) {
LogWarning("P25 data received when in mode %u", m_mode); LogWarning("P25 data received when in mode %u", m_mode);
} }
} }
@ -873,14 +889,16 @@ bool CMMDVMHost::createModem()
bool CMMDVMHost::createDStarNetwork() bool CMMDVMHost::createDStarNetwork()
{ {
std::string gatewayAddress = m_conf.getDStarGatewayAddress(); std::string gatewayAddress = m_conf.getDStarGatewayAddress();
unsigned int gatewayPort = m_conf.getDStarGatewayPort(); unsigned int gatewayPort = m_conf.getDStarGatewayPort();
unsigned int localPort = m_conf.getDStarLocalPort(); unsigned int localPort = m_conf.getDStarLocalPort();
bool debug = m_conf.getDStarNetworkDebug(); bool debug = m_conf.getDStarNetworkDebug();
m_dstarNetModeHang = m_conf.getDStarNetworkModeHang();
LogInfo("D-Star Network Parameters"); LogInfo("D-Star Network Parameters");
LogInfo(" Gateway Address: %s", gatewayAddress.c_str()); LogInfo(" Gateway Address: %s", gatewayAddress.c_str());
LogInfo(" Gateway Port: %u", gatewayPort); LogInfo(" Gateway Port: %u", gatewayPort);
LogInfo(" Local Port: %u", localPort); LogInfo(" Local Port: %u", localPort);
LogInfo(" Mode Hang: %us", m_dstarNetModeHang);
m_dstarNetwork = new CDStarNetwork(gatewayAddress, gatewayPort, localPort, m_duplex, VERSION, debug); m_dstarNetwork = new CDStarNetwork(gatewayAddress, gatewayPort, localPort, m_duplex, VERSION, debug);
@ -908,6 +926,7 @@ bool CMMDVMHost::createDMRNetwork()
bool slot1 = m_conf.getDMRNetworkSlot1(); bool slot1 = m_conf.getDMRNetworkSlot1();
bool slot2 = m_conf.getDMRNetworkSlot2(); bool slot2 = m_conf.getDMRNetworkSlot2();
HW_TYPE hwType = m_modem->getHWType(); HW_TYPE hwType = m_modem->getHWType();
m_dmrNetModeHang = m_conf.getDMRNetworkModeHang();
LogInfo("DMR Network Parameters"); LogInfo("DMR Network Parameters");
LogInfo(" Address: %s", address.c_str()); LogInfo(" Address: %s", address.c_str());
@ -919,6 +938,7 @@ bool CMMDVMHost::createDMRNetwork()
LogInfo(" Jitter: %ums", jitter); LogInfo(" Jitter: %ums", jitter);
LogInfo(" Slot 1: %s", slot1 ? "enabled" : "disabled"); LogInfo(" Slot 1: %s", slot1 ? "enabled" : "disabled");
LogInfo(" Slot 2: %s", slot2 ? "enabled" : "disabled"); LogInfo(" Slot 2: %s", slot2 ? "enabled" : "disabled");
LogInfo(" Mode Hang: %us", m_dmrNetModeHang);
m_dmrNetwork = new CDMRNetwork(address, port, local, id, password, m_duplex, VERSION, debug, slot1, slot2, hwType); m_dmrNetwork = new CDMRNetwork(address, port, local, id, password, m_duplex, VERSION, debug, slot1, slot2, hwType);
@ -971,6 +991,7 @@ bool CMMDVMHost::createYSFNetwork()
unsigned int myPort = m_conf.getFusionNetworkMyPort(); unsigned int myPort = m_conf.getFusionNetworkMyPort();
std::string gwyAddress = m_conf.getFusionNetworkGwyAddress(); std::string gwyAddress = m_conf.getFusionNetworkGwyAddress();
unsigned int gwyPort = m_conf.getFusionNetworkGwyPort(); unsigned int gwyPort = m_conf.getFusionNetworkGwyPort();
m_ysfNetModeHang = m_conf.getFusionNetworkModeHang();
bool debug = m_conf.getFusionNetworkDebug(); bool debug = m_conf.getFusionNetworkDebug();
LogInfo("System Fusion Network Parameters"); LogInfo("System Fusion Network Parameters");
@ -978,6 +999,7 @@ bool CMMDVMHost::createYSFNetwork()
LogInfo(" Local Port: %u", myPort); LogInfo(" Local Port: %u", myPort);
LogInfo(" Gateway Address: %s", gwyAddress.c_str()); LogInfo(" Gateway Address: %s", gwyAddress.c_str());
LogInfo(" Gateway Port: %u", gwyPort); LogInfo(" Gateway Port: %u", gwyPort);
LogInfo(" Mode Hang: %us", m_ysfNetModeHang);
m_ysfNetwork = new CYSFNetwork(myAddress, myPort, gwyAddress, gwyPort, m_callsign, debug); m_ysfNetwork = new CYSFNetwork(myAddress, myPort, gwyAddress, gwyPort, m_callsign, debug);
@ -998,12 +1020,14 @@ bool CMMDVMHost::createP25Network()
std::string gatewayAddress = m_conf.getP25GatewayAddress(); std::string gatewayAddress = m_conf.getP25GatewayAddress();
unsigned int gatewayPort = m_conf.getP25GatewayPort(); unsigned int gatewayPort = m_conf.getP25GatewayPort();
unsigned int localPort = m_conf.getP25LocalPort(); unsigned int localPort = m_conf.getP25LocalPort();
m_p25NetModeHang = m_conf.getP25NetworkModeHang();
bool debug = m_conf.getP25NetworkDebug(); bool debug = m_conf.getP25NetworkDebug();
LogInfo("P25 Network Parameters"); LogInfo("P25 Network Parameters");
LogInfo(" Gateway Address: %s", gatewayAddress.c_str()); LogInfo(" Gateway Address: %s", gatewayAddress.c_str());
LogInfo(" Gateway Port: %u", gatewayPort); LogInfo(" Gateway Port: %u", gatewayPort);
LogInfo(" Local Port: %u", localPort); LogInfo(" Local Port: %u", localPort);
LogInfo(" Mode Hang: %us", m_p25NetModeHang);
m_p25Network = new CP25Network(gatewayAddress, gatewayPort, localPort, debug); m_p25Network = new CP25Network(gatewayAddress, gatewayPort, localPort, debug);
@ -1030,16 +1054,11 @@ void CMMDVMHost::readParams()
m_id = m_conf.getId(); m_id = m_conf.getId();
m_timeout = m_conf.getTimeout(); m_timeout = m_conf.getTimeout();
m_rfModeHang = m_conf.getRFModeHang();
m_netModeHang = m_conf.getNetModeHang();
LogInfo("General Parameters"); LogInfo("General Parameters");
LogInfo(" Callsign: %s", m_callsign.c_str()); LogInfo(" Callsign: %s", m_callsign.c_str());
LogInfo(" Id: %u", m_id); LogInfo(" Id: %u", m_id);
LogInfo(" Duplex: %s", m_duplex ? "yes" : "no"); LogInfo(" Duplex: %s", m_duplex ? "yes" : "no");
LogInfo(" Timeout: %us", m_timeout); LogInfo(" Timeout: %us", m_timeout);
LogInfo(" RF Mode Hang: %us", m_rfModeHang);
LogInfo(" Net Mode Hang: %us", m_netModeHang);
LogInfo(" D-Star: %s", m_dstarEnabled ? "enabled" : "disabled"); LogInfo(" D-Star: %s", m_dstarEnabled ? "enabled" : "disabled");
LogInfo(" DMR: %s", m_dmrEnabled ? "enabled" : "disabled"); LogInfo(" DMR: %s", m_dmrEnabled ? "enabled" : "disabled");
LogInfo(" YSF: %s", m_ysfEnabled ? "enabled" : "disabled"); LogInfo(" YSF: %s", m_ysfEnabled ? "enabled" : "disabled");

View file

@ -50,8 +50,14 @@ private:
CDisplay* m_display; CDisplay* m_display;
CUMP* m_ump; CUMP* m_ump;
unsigned char m_mode; unsigned char m_mode;
unsigned int m_rfModeHang; unsigned int m_dstarRFModeHang;
unsigned int m_netModeHang; unsigned int m_dmrRFModeHang;
unsigned int m_ysfRFModeHang;
unsigned int m_p25RFModeHang;
unsigned int m_dstarNetModeHang;
unsigned int m_dmrNetModeHang;
unsigned int m_ysfNetModeHang;
unsigned int m_p25NetModeHang;
CTimer m_modeTimer; CTimer m_modeTimer;
CTimer m_dmrTXTimer; CTimer m_dmrTXTimer;
CTimer m_cwIdTimer; CTimer m_cwIdTimer;