diff --git a/DMRLookup.cpp b/DMRLookup.cpp index b959950..413a950 100644 --- a/DMRLookup.cpp +++ b/DMRLookup.cpp @@ -30,7 +30,8 @@ CThread(), m_filename(filename), m_reloadTime(reloadTime), m_table(), -m_stop(false) +m_stop(false), +m_reload(false) { } @@ -48,6 +49,14 @@ bool CDMRLookup::read() return ret; } +void CDMRLookup::reload() +{ + if (m_reloadTime == 0U) + m_table.load(m_filename); + else + m_reload = true; +} + void CDMRLookup::entry() { LogInfo("Started the DMR Id lookup reload thread"); @@ -59,9 +68,10 @@ void CDMRLookup::entry() sleep(1000U); timer.clock(); - if (timer.hasExpired()) { + if (timer.hasExpired() || m_reload) { m_table.load(m_filename); timer.start(); + m_reload = false; } } diff --git a/DMRLookup.h b/DMRLookup.h index c4e5d90..2a9de72 100644 --- a/DMRLookup.h +++ b/DMRLookup.h @@ -1,5 +1,5 @@ /* -* Copyright (C) 2016,2017 by Jonathan Naylor G4KLX +* Copyright (C) 2016,2017,2021 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -31,6 +31,8 @@ public: bool read(); + void reload(); + virtual void entry(); std::string find(unsigned int id); @@ -45,6 +47,7 @@ private: unsigned int m_reloadTime; class CUserDB m_table; bool m_stop; + bool m_reload; }; #endif diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index 8c66568..d289353 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015-2020 by Jonathan Naylor G4KLX + * Copyright (C) 2015-2021 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -53,13 +53,19 @@ const char* DEFAULT_INI_FILE = "/etc/MMDVM.ini"; static bool m_killed = false; static int m_signal = 0; +static bool m_reload = false; #if !defined(_WIN32) && !defined(_WIN64) -static void sigHandler(int signum) +static void sigHandler1(int signum) { m_killed = true; m_signal = signum; } + +static void sigHandler2(int signum) +{ + m_reload = true; +} #endif const char* HEADER1 = "This software is for use on amateur radio networks only,"; @@ -86,9 +92,10 @@ int main(int argc, char** argv) } #if !defined(_WIN32) && !defined(_WIN64) - ::signal(SIGINT, sigHandler); - ::signal(SIGTERM, sigHandler); - ::signal(SIGHUP, sigHandler); + ::signal(SIGINT, sigHandler1); + ::signal(SIGTERM, sigHandler1); + ::signal(SIGHUP, sigHandler1); + ::signal(SIGUSR1, sigHandler2); #endif int ret = 0; @@ -1116,6 +1123,16 @@ int CMMDVMHost::run() if (!m_fixedMode) m_modeTimer.clock(ms); + if (m_reload) { + if (m_dmrLookup != NULL) + m_dmrLookup->reload(); + + if (m_nxdnLookup != NULL) + m_nxdnLookup->reload(); + + m_reload = false; + } + if (m_dstar != NULL) m_dstar->clock(); if (m_dmr != NULL) @@ -2415,32 +2432,32 @@ void CMMDVMHost::remoteControl() case RCD_ENABLE_DSTAR: if (m_dstar != NULL && !m_dstarEnabled) processEnableCommand(m_dstarEnabled, true); - if (m_dstarNetwork != NULL) - m_dstarNetwork->enable(true); + if (m_dstarNetwork != NULL) + m_dstarNetwork->enable(true); break; case RCD_ENABLE_DMR: if (m_dmr != NULL && !m_dmrEnabled) processEnableCommand(m_dmrEnabled, true); - if (m_dmrNetwork != NULL) - m_dmrNetwork->enable(true); + if (m_dmrNetwork != NULL) + m_dmrNetwork->enable(true); break; case RCD_ENABLE_YSF: if (m_ysf != NULL && !m_ysfEnabled) processEnableCommand(m_ysfEnabled, true); - if (m_ysfNetwork != NULL) - m_ysfNetwork->enable(true); + if (m_ysfNetwork != NULL) + m_ysfNetwork->enable(true); break; case RCD_ENABLE_P25: if (m_p25 != NULL && !m_p25Enabled) processEnableCommand(m_p25Enabled, true); - if (m_p25Network != NULL) - m_p25Network->enable(true); + if (m_p25Network != NULL) + m_p25Network->enable(true); break; case RCD_ENABLE_NXDN: if (m_nxdn != NULL && !m_nxdnEnabled) processEnableCommand(m_nxdnEnabled, true); - if (m_nxdnNetwork != NULL) - m_nxdnNetwork->enable(true); + if (m_nxdnNetwork != NULL) + m_nxdnNetwork->enable(true); break; case RCD_ENABLE_M17: if (m_m17 != NULL && m_m17Enabled == false) @@ -2459,32 +2476,32 @@ void CMMDVMHost::remoteControl() case RCD_DISABLE_DSTAR: if (m_dstar != NULL && m_dstarEnabled) processEnableCommand(m_dstarEnabled, false); - if (m_dstarNetwork != NULL) - m_dstarNetwork->enable(false); + if (m_dstarNetwork != NULL) + m_dstarNetwork->enable(false); break; case RCD_DISABLE_DMR: if (m_dmr != NULL && m_dmrEnabled) processEnableCommand(m_dmrEnabled, false); - if (m_dmrNetwork != NULL) - m_dmrNetwork->enable(false); + if (m_dmrNetwork != NULL) + m_dmrNetwork->enable(false); break; case RCD_DISABLE_YSF: if (m_ysf != NULL && m_ysfEnabled) processEnableCommand(m_ysfEnabled, false); - if (m_ysfNetwork != NULL) - m_ysfNetwork->enable(false); + if (m_ysfNetwork != NULL) + m_ysfNetwork->enable(false); break; case RCD_DISABLE_P25: if (m_p25 != NULL && m_p25Enabled) processEnableCommand(m_p25Enabled, false); - if (m_p25Network != NULL) - m_p25Network->enable(false); + if (m_p25Network != NULL) + m_p25Network->enable(false); break; case RCD_DISABLE_NXDN: if (m_nxdn != NULL && m_nxdnEnabled) processEnableCommand(m_nxdnEnabled, false); - if (m_nxdnNetwork != NULL) - m_nxdnNetwork->enable(false); + if (m_nxdnNetwork != NULL) + m_nxdnNetwork->enable(false); break; case RCD_DISABLE_M17: if (m_m17 != NULL && m_m17Enabled == true) @@ -2525,6 +2542,9 @@ void CMMDVMHost::remoteControl() m_modem->sendCWId(cwtext); } break; + case RCD_RELOAD: + m_reload = true; + break; default: break; } diff --git a/NXDNLookup.cpp b/NXDNLookup.cpp index c12ed27..fb1299b 100644 --- a/NXDNLookup.cpp +++ b/NXDNLookup.cpp @@ -1,5 +1,5 @@ /* -* Copyright (C) 2016,2017,2018 by Jonathan Naylor G4KLX +* Copyright (C) 2016,2017,2018,2021 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -30,7 +30,8 @@ CThread(), m_filename(filename), m_reloadTime(reloadTime), m_table(), -m_stop(false) +m_stop(false), +m_reload(false) { } @@ -48,6 +49,14 @@ bool CNXDNLookup::read() return ret; } +void CNXDNLookup::reload() +{ + if (m_reloadTime == 0U) + m_table.load(m_filename); + else + m_reload = true; +} + void CNXDNLookup::entry() { LogInfo("Started the NXDN Id lookup reload thread"); @@ -59,9 +68,10 @@ void CNXDNLookup::entry() sleep(1000U); timer.clock(); - if (timer.hasExpired()) { + if (timer.hasExpired() || m_reload) { m_table.load(m_filename); timer.start(); + m_reload = false; } } diff --git a/NXDNLookup.h b/NXDNLookup.h index c53a927..c49e114 100644 --- a/NXDNLookup.h +++ b/NXDNLookup.h @@ -31,6 +31,8 @@ public: bool read(); + void reload(); + virtual void entry(); std::string find(unsigned int id); @@ -45,6 +47,7 @@ private: unsigned int m_reloadTime; class CUserDB m_table; bool m_stop; + bool m_reload; }; #endif diff --git a/RemoteControl.cpp b/RemoteControl.cpp index af58dc5..fb93e62 100644 --- a/RemoteControl.cpp +++ b/RemoteControl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019,2020 by Jonathan Naylor G4KLX + * Copyright (C) 2019,2020,2021 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -131,6 +131,9 @@ REMOTE_COMMAND CRemoteControl::getCommand() } else if (m_args.at(0U) == "cw" && m_args.size() >= CW_ARGS) { // CW command is in the form of "cw " m_command = RCD_CW; + } else if (m_args.at(0U) == "reload") { + // Reload command is in the form of "reload" + m_command = RCD_RELOAD; } if (m_command == RCD_NONE) { diff --git a/RemoteControl.h b/RemoteControl.h index b4aea18..56c7aa3 100644 --- a/RemoteControl.h +++ b/RemoteControl.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019,2020 by Jonathan Naylor G4KLX + * Copyright (C) 2019,2020,2021 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -52,7 +52,8 @@ enum REMOTE_COMMAND { RCD_DISABLE_FM, RCD_DISABLE_AX25, RCD_PAGE, - RCD_CW + RCD_CW, + RCD_RELOAD }; class CRemoteControl { diff --git a/Version.h b/Version.h index 6b0ecf4..2dedd19 100644 --- a/Version.h +++ b/Version.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015-2020 by Jonathan Naylor G4KLX + * Copyright (C) 2015-2021 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,6 +19,6 @@ #if !defined(VERSION_H) #define VERSION_H -const char* VERSION = "20201226"; +const char* VERSION = "20210101"; #endif