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 c1dbdba..4c52c6a 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 @@ -51,13 +51,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,"; @@ -84,9 +90,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; @@ -982,6 +989,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) @@ -2074,18 +2091,23 @@ void CMMDVMHost::remoteControl() } m_pocsag->sendPage(ric, text); } + break; case RCD_CW: setMode(MODE_IDLE); // Force the modem to go idle so that we can send the CW text. - if (!m_modem->hasTX()){ - std::string cwtext; - for (unsigned int i = 0U; i < m_remoteControl->getArgCount(); i++) { - if (i > 0U) - cwtext += " "; - cwtext += m_remoteControl->getArgString(i); - } - m_display->writeCW(); - m_modem->sendCWId(cwtext); - } + if (!m_modem->hasTX()){ + std::string cwtext; + for (unsigned int i = 0U; i < m_remoteControl->getArgCount(); i++) { + if (i > 0U) + cwtext += " "; + cwtext += m_remoteControl->getArgString(i); + } + m_display->writeCW(); + 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 3c2d2a8..b42718f 100644 --- a/RemoteControl.cpp +++ b/RemoteControl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Jonathan Naylor G4KLX + * Copyright (C) 2019,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 @@ -121,6 +121,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 c8d060d..3f07f03 100644 --- a/RemoteControl.h +++ b/RemoteControl.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Jonathan Naylor G4KLX + * Copyright (C) 2019,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 @@ -47,7 +47,8 @@ enum REMOTE_COMMAND { RCD_DISABLE_NXDN, RCD_DISABLE_FM, RCD_PAGE, - RCD_CW + RCD_CW, + RCD_RELOAD }; class CRemoteControl { diff --git a/Version.h b/Version.h index efee250..6c41a8d 100644 --- a/Version.h +++ b/Version.h @@ -19,6 +19,6 @@ #if !defined(VERSION_H) #define VERSION_H -const char* VERSION = "20201215"; +const char* VERSION = "20210101"; #endif