diff --git a/Defines.h b/Defines.h index 97897fb..faaeb6f 100644 --- a/Defines.h +++ b/Defines.h @@ -19,10 +19,11 @@ #if !defined(Defines_H) #define Defines_H -const unsigned char MODE_IDLE = 0U; -const unsigned char MODE_DSTAR = 1U; -const unsigned char MODE_DMR = 2U; -const unsigned char MODE_YSF = 3U; +const unsigned char MODE_IDLE = 0U; +const unsigned char MODE_LOCKOUT = 1U; +const unsigned char MODE_DSTAR = 2U; +const unsigned char MODE_DMR = 3U; +const unsigned char MODE_YSF = 4U; const unsigned char TAG_HEADER = 0x00U; const unsigned char TAG_DATA = 0x01U; diff --git a/Display.h b/Display.h index 1344bf2..c786a47 100644 --- a/Display.h +++ b/Display.h @@ -30,6 +30,8 @@ public: virtual void setIdle() = 0; + virtual void setLockout() = 0; + virtual void setDStar() = 0; virtual void writeDStar(const char* my1, const char* my2, const char* your) = 0; virtual void clearDStar() = 0; diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index 466b345..7806df3 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -583,6 +583,22 @@ void CMMDVMHost::setMode(unsigned char mode, bool logging) m_modeTimer.start(); break; + case MODE_LOCKOUT: + if (logging) + LogMessage("Mode set to Lockout"); + if (m_dstarNetwork != NULL) + m_dstarNetwork->enable(false); + if (m_dmrNetwork != NULL) + m_dmrNetwork->enable(false); + if (m_mode == MODE_DMR) + m_modem->writeDMRStart(false); + else + m_modem->setMode(MODE_IDLE); + m_display->setLockout(); + m_mode = MODE_LOCKOUT; + m_modeTimer.stop(); + break; + default: if (logging) LogMessage("Mode set to Idle"); diff --git a/Modem.cpp b/Modem.cpp index 8691fde..f9f4bff 100644 --- a/Modem.cpp +++ b/Modem.cpp @@ -104,7 +104,8 @@ m_dstarSpace(0U), m_dmrSpace1(0U), m_dmrSpace2(0U), m_ysfSpace(0U), -m_tx(false) +m_tx(false), +m_lockout(false) { assert(!port.empty()); @@ -357,13 +358,15 @@ void CModem::clock(unsigned int ms) if (txOverflow) LogError("MMDVM TX buffer has overflowed"); + m_lockout = (m_buffer[5U] & 0x10U) == 0x10U; + m_dstarSpace = m_buffer[6U]; m_dmrSpace1 = m_buffer[7U]; m_dmrSpace2 = m_buffer[8U]; m_ysfSpace = m_buffer[9U]; m_inactivityTimer.start(); - // LogMessage("status=%02X, tx=%d, space=%u,%u,%u,%u", m_buffer[5U], int(m_tx), m_dstarSpace, m_dmrSpace1, m_dmrSpace2, m_ysfSpace); + // LogMessage("status=%02X, tx=%d, space=%u,%u,%u,%u, lockout=%d", m_buffer[5U], int(m_tx), m_dstarSpace, m_dmrSpace1, m_dmrSpace2, m_ysfSpace, int(m_lockout)); } break; @@ -638,6 +641,11 @@ bool CModem::hasYSFSpace() const return space > 1U; } +bool CModem::hasLockout() const +{ + return m_lockout; +} + bool CModem::writeYSFData(const unsigned char* data, unsigned int length) { assert(data != NULL); diff --git a/Modem.h b/Modem.h index a6f7a13..6224f66 100644 --- a/Modem.h +++ b/Modem.h @@ -52,6 +52,8 @@ public: bool hasDMRSpace2() const; bool hasYSFSpace() const; + bool hasLockout() const; + bool writeDStarData(const unsigned char* data, unsigned int length); bool writeDMRData1(const unsigned char* data, unsigned int length); bool writeDMRData2(const unsigned char* data, unsigned int length); @@ -98,6 +100,7 @@ private: unsigned int m_dmrSpace2; unsigned int m_ysfSpace; bool m_tx; + bool m_lockout; bool readVersion(); bool readStatus(); diff --git a/NullDisplay.cpp b/NullDisplay.cpp index 3b51959..015b5e2 100644 --- a/NullDisplay.cpp +++ b/NullDisplay.cpp @@ -35,6 +35,10 @@ void CNullDisplay::setIdle() { } +void CNullDisplay::setLockout() +{ +} + void CNullDisplay::setDStar() { } diff --git a/NullDisplay.h b/NullDisplay.h index f35df00..8514f81 100644 --- a/NullDisplay.h +++ b/NullDisplay.h @@ -33,6 +33,8 @@ public: virtual void setIdle(); + virtual void setLockout(); + virtual void setDStar(); virtual void writeDStar(const char* my1, const char* my2, const char* your); virtual void clearDStar(); diff --git a/TFTSerial.cpp b/TFTSerial.cpp index 8b5bb3c..d246be0 100644 --- a/TFTSerial.cpp +++ b/TFTSerial.cpp @@ -90,6 +90,24 @@ void CTFTSerial::setIdle() // Draw all mode insignias displayBitmap(0U, 30U, "ALL_sm.bmp"); + + gotoPosText(0U, 8U); + displayText("IDLE"); +} + +void CTFTSerial::setLockout() +{ + // Clear the screen + clearScreen(); + + // Draw MMDVM logo + displayBitmap(0U, 0U, "MMDVM_sm.bmp"); + + // Draw all mode insignias + displayBitmap(0U, 30U, "ALL_sm.bmp"); + + gotoPosText(0U, 8U); + displayText("LOCKOUT"); } void CTFTSerial::setDStar() diff --git a/TFTSerial.h b/TFTSerial.h index f457303..ad04b6d 100644 --- a/TFTSerial.h +++ b/TFTSerial.h @@ -34,6 +34,8 @@ public: virtual void setIdle(); + virtual void setLockout(); + virtual void setDStar(); virtual void writeDStar(const char* my1, const char* my2, const char* your); virtual void clearDStar();