diff --git a/Conf.cpp b/Conf.cpp index 0c04165..87eb796 100644 --- a/Conf.cpp +++ b/Conf.cpp @@ -55,7 +55,8 @@ enum SECTION { SECTION_NEXTION, SECTION_OLED, SECTION_LCDPROC, - SECTION_TGREWRITE + SECTION_TGREWRITE, + SECTION_LOCKFILE }; CConf::CConf(const std::string& file) : @@ -238,7 +239,9 @@ m_lcdprocAddress(), m_lcdprocPort(0U), m_lcdprocLocalPort(0U), m_lcdprocDisplayClock(false), -m_lcdprocUTC(false) +m_lcdprocUTC(false), +m_lockFileEnabled(false), +m_lockFileName() { } @@ -314,6 +317,8 @@ bool CConf::read() section = SECTION_OLED; else if (::strncmp(buffer, "[LCDproc]", 9U) == 0) section = SECTION_LCDPROC; + else if (::strncmp(buffer, "[LOCKFILE]", 9U) == 0) + section = SECTION_LOCKFILE; else section = SECTION_NONE; @@ -785,6 +790,11 @@ bool CConf::read() m_lcdprocUTC = ::atoi(value) == 1; else if (::strcmp(key, "DimOnIdle") == 0) m_lcdprocDimOnIdle = ::atoi(value) == 1; + } else if (section == SECTION_LOCKFILE) { + if (::strcmp(key, "Enable") == 0) + m_lockFileEnabled = ::atoi(value) == 1; + else if (::strcmp(key, "File") == 0) + m_lockFileName = value; } } @@ -1692,3 +1702,13 @@ bool CConf::getNextionTempInFahrenheit() const { return m_nextionTempInFahrenheit; } + +bool CConf::getLockFileEnabled() const +{ + return m_lockFileEnabled; +} + +std::string CConf::getLockFileName() const +{ + return m_lockFileName; +} diff --git a/Conf.h b/Conf.h index efff32b..f9f0de3 100644 --- a/Conf.h +++ b/Conf.h @@ -262,6 +262,11 @@ public: bool getLCDprocUTC() const; bool getLCDprocDimOnIdle() const; + // The Lock File section + bool getLockFileEnabled() const; + std::string getLockFileName() const; + + private: std::string m_file; std::string m_callsign; @@ -469,6 +474,9 @@ private: bool m_lcdprocDisplayClock; bool m_lcdprocUTC; bool m_lcdprocDimOnIdle; + + bool m_lockFileEnabled; + std::string m_lockFileName; }; #endif diff --git a/DMRSlot.cpp b/DMRSlot.cpp index b8715e0..65c6dd8 100644 --- a/DMRSlot.cpp +++ b/DMRSlot.cpp @@ -826,6 +826,8 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len) return false; if (m_rfN == m_lastrfN) return false; + if (m_rfN != (m_lastrfN + 1U)) + return false; m_lastrfN = m_rfN; // Regenerate the EMB diff --git a/MMDVM.ini b/MMDVM.ini index 7e94c0e..d654a61 100644 --- a/MMDVM.ini +++ b/MMDVM.ini @@ -240,3 +240,7 @@ Port=13666 DimOnIdle=0 DisplayClock=1 UTC=0 + +[LOCKFILE] +Enable=0 +File=/tmp/MMDVM_Active.lck diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index 52e8025..ff0bb42 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -155,7 +155,9 @@ m_dmrLookup(NULL), m_nxdnLookup(NULL), m_callsign(), m_id(0U), -m_cwCallsign() +m_cwCallsign(), +m_lockFileEnabled(false), +m_lockFileName() { } @@ -342,6 +344,12 @@ int CMMDVMHost::run() m_modem->setTransparentDataParams(sendFrameType); } + if (m_conf.getLockFileEnabled()) { + m_lockFileName = m_conf.getLockFileName(); + LogInfo("Lock File Parameters"); + LogInfo(" Name: %s", m_lockFileName.c_str()); + } + if (m_conf.getCWIdEnabled()) { unsigned int time = m_conf.getCWIdTime(); m_cwCallsign = m_conf.getCWIdCallsign(); @@ -576,6 +584,7 @@ int CMMDVMHost::run() while (!m_killed) { bool lockout1 = m_modem->hasLockout(); bool lockout2 = false; + if (m_ump != NULL) lockout2 = m_ump->getLockout(); if ((lockout1 || lockout2) && m_mode != MODE_LOCKOUT) @@ -596,6 +605,9 @@ int CMMDVMHost::run() m_ump->setCD(cd); } + if (m_mode == MODE_IDLE) + removeLockFile(); + unsigned char data[200U]; unsigned int len; bool ret; @@ -1381,6 +1393,7 @@ void CMMDVMHost::setMode(unsigned char mode) m_mode = MODE_DSTAR; m_modeTimer.start(); m_cwIdTimer.stop(); + createLockFile(); break; case MODE_DMR: @@ -1404,6 +1417,7 @@ void CMMDVMHost::setMode(unsigned char mode) m_mode = MODE_DMR; m_modeTimer.start(); m_cwIdTimer.stop(); + createLockFile(); break; case MODE_YSF: @@ -1423,6 +1437,7 @@ void CMMDVMHost::setMode(unsigned char mode) m_mode = MODE_YSF; m_modeTimer.start(); m_cwIdTimer.stop(); + createLockFile(); break; case MODE_P25: @@ -1442,6 +1457,7 @@ void CMMDVMHost::setMode(unsigned char mode) m_mode = MODE_P25; m_modeTimer.start(); m_cwIdTimer.stop(); + createLockFile(); break; case MODE_NXDN: @@ -1461,6 +1477,7 @@ void CMMDVMHost::setMode(unsigned char mode) m_mode = MODE_NXDN; m_modeTimer.start(); m_cwIdTimer.stop(); + createLockFile(); break; case MODE_POCSAG: @@ -1480,6 +1497,7 @@ void CMMDVMHost::setMode(unsigned char mode) m_mode = MODE_POCSAG; m_modeTimer.start(); m_cwIdTimer.stop(); + createLockFile(); break; case MODE_LOCKOUT: @@ -1564,11 +1582,41 @@ void CMMDVMHost::setMode(unsigned char mode) m_cwIdTimer.start(); } m_display->setIdle(); - if (mode==MODE_QUIT) { + if (mode == MODE_QUIT) { m_display->setQuit(); + removeLockFile(); } m_mode = MODE_IDLE; m_modeTimer.stop(); + removeLockFile(); break; } } + +void CMMDVMHost::createLockFile() +{ + if (m_lockFileEnabled) { + FILE* fp = ::fopen(m_lockFileName.c_str(), "r"); + if (fp == NULL) { //if file does not exist, create it + fp = ::fopen(m_lockFileName.c_str(), "wt"); + if (fp != NULL) { + ::fputs("ACTIVE\n", fp); + ::fclose(fp); + } + } + else { + ::fclose(fp); + } + } +} + +void CMMDVMHost::removeLockFile() +{ + if (m_lockFileEnabled) { + FILE* fp = ::fopen(m_lockFileName.c_str(), "r"); + if (fp != NULL) { + ::fclose(fp); + ::remove(m_lockFileName.c_str()); + } + } +} diff --git a/MMDVMHost.h b/MMDVMHost.h index 889fe69..645437c 100644 --- a/MMDVMHost.h +++ b/MMDVMHost.h @@ -35,6 +35,8 @@ #include + + class CMMDVMHost { public: @@ -83,6 +85,8 @@ private: std::string m_callsign; unsigned int m_id; std::string m_cwCallsign; + bool m_lockFileEnabled; + std::string m_lockFileName; void readParams(); bool createModem(); @@ -94,6 +98,9 @@ private: bool createPOCSAGNetwork(); void setMode(unsigned char mode); + + void createLockFile(); + void removeLockFile(); }; #endif