From c7ff885c72d30e4de088482dcb20e1ddd41b92c3 Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Sat, 12 Oct 2024 17:27:37 -0400 Subject: [PATCH] replace spinbox with line edit; correct issue where AffListWnd and PeerListWnd would steal focus preventing input; --- src/sysview/AffListWnd.h | 1 - src/sysview/DynRegroupSubscriberWnd.h | 60 ++++++++++++++++++++++----- src/sysview/InhibitSubscriberWnd.h | 55 +++++++++++++++++++----- src/sysview/PageSubscriberWnd.h | 54 +++++++++++++++++++----- src/sysview/PeerListWnd.h | 1 - src/sysview/RadioCheckSubscriberWnd.h | 55 +++++++++++++++++++----- src/sysview/TransmitWndBase.h | 54 ++++++++++++++++++++++-- src/sysview/UninhibitSubscriberWnd.h | 55 +++++++++++++++++++----- src/tged/TGEditWnd.h | 7 ++++ 9 files changed, 282 insertions(+), 60 deletions(-) diff --git a/src/sysview/AffListWnd.h b/src/sysview/AffListWnd.h index ad5ca1ff..63af7aac 100644 --- a/src/sysview/AffListWnd.h +++ b/src/sysview/AffListWnd.h @@ -147,7 +147,6 @@ public: } } - setFocusWidget(&m_listView); redraw(); } diff --git a/src/sysview/DynRegroupSubscriberWnd.h b/src/sysview/DynRegroupSubscriberWnd.h index 3e234708..f8072409 100644 --- a/src/sysview/DynRegroupSubscriberWnd.h +++ b/src/sysview/DynRegroupSubscriberWnd.h @@ -91,10 +91,11 @@ private: FLabel m_dialogLabel{"Dynamic Regroup Subscriber", this}; FLabel m_subscriberLabel{"Subscriber ID: ", this}; - FSpinBox m_subscriber{this}; + RIDLineEdit m_subscriber{this}; FLabel m_tgLabel{"Talkgroup ID: ", this}; TGIdLineEdit m_tgId{this}; + uint32_t m_srcId = 1U; uint32_t m_selectedTgId = 1U; /** @@ -141,19 +142,51 @@ private: m_subscriberLabel.setGeometry(FPoint(2, 8), FSize(25, 1)); m_subscriber.setGeometry(FPoint(28, 8), FSize(20, 1)); - m_subscriber.setRange(0, 16777211); - m_subscriber.setValue(1); + m_subscriber.setText(std::to_string(m_srcId)); m_subscriber.setShadow(false); - m_subscriber.addCallback("changed", [&]() { - if (m_subscriber.getValue() >= 1 && m_subscriber.getValue() <= 16777211) { - m_txButton.setEnable(true); + m_subscriber.addCallback("up-pressed", [&]() { + uint32_t rid = ::atoi(m_subscriber.getText().c_str()); + rid++; + if (rid > 16777215U) { + rid = 16777215U; } - else { - m_txButton.setEnable(false); + + m_subscriber.setText(std::to_string(rid)); + + m_srcId = rid; + redraw(); + }); + m_subscriber.addCallback("down-pressed", [&]() { + uint32_t rid = ::atoi(m_subscriber.getText().c_str()); + rid--; + if (rid < 1U) { + rid = 1U; } + m_subscriber.setText(std::to_string(rid)); + + m_srcId = rid; redraw(); }); + m_subscriber.addCallback("changed", [&]() { + if (m_subscriber.getText().c_str() == "") { + m_srcId = 1U; + return; + } + + uint32_t rid = ::atoi(m_subscriber.getText().c_str()); + if (rid < 1U) { + rid = 1U; + } + + if (rid > 16777215U) { + rid = 16777215U; + } + + m_subscriber.setText(std::to_string(rid)); + + m_srcId = rid; + }); m_tgLabel.setGeometry(FPoint(2, 9), FSize(25, 1)); m_tgId.setGeometry(FPoint(28, 9), FSize(20, 1)); @@ -181,6 +214,11 @@ private: redraw(); }); m_tgId.addCallback("changed", [&]() { + if (m_tgId.getText().getLength() == 0) { + m_selectedTgId = 1U; + return; + } + uint32_t tgId = ::atoi(m_tgId.getText().c_str()); if (tgId < 1U) { tgId = 1U; @@ -217,16 +255,16 @@ private: using namespace p25::defines; if (lock) { - writeP25_Ext_Func(ExtendedFunctions::DYN_REGRP_LOCK, WUID_FNE, (uint32_t)m_subscriber.getValue()); + writeP25_Ext_Func(ExtendedFunctions::DYN_REGRP_LOCK, WUID_FNE, m_srcId); break; } if (unlock) { - writeP25_Ext_Func(ExtendedFunctions::DYN_REGRP_UNLOCK, WUID_FNE, (uint32_t)m_subscriber.getValue()); + writeP25_Ext_Func(ExtendedFunctions::DYN_REGRP_UNLOCK, WUID_FNE, m_srcId); break; } - writeP25_Ext_Func(ExtendedFunctions::DYN_REGRP_REQ, m_selectedTgId, (uint32_t)m_subscriber.getValue()); + writeP25_Ext_Func(ExtendedFunctions::DYN_REGRP_REQ, m_selectedTgId, m_srcId); } break; diff --git a/src/sysview/InhibitSubscriberWnd.h b/src/sysview/InhibitSubscriberWnd.h index 09243fae..bf0056f0 100644 --- a/src/sysview/InhibitSubscriberWnd.h +++ b/src/sysview/InhibitSubscriberWnd.h @@ -43,7 +43,9 @@ private: FLabel m_dialogLabel{"Inhibit Subscriber", this}; FLabel m_subscriberLabel{"Subscriber ID: ", this}; - FSpinBox m_subscriber{this}; + RIDLineEdit m_subscriber{this}; + + uint32_t m_srcId = 1U; /** * @brief Initializes the window layout. @@ -71,19 +73,51 @@ private: m_subscriberLabel.setGeometry(FPoint(2, 8), FSize(25, 1)); m_subscriber.setGeometry(FPoint(28, 8), FSize(20, 1)); - m_subscriber.setRange(0, 16777211); - m_subscriber.setValue(1); + m_subscriber.setText(std::to_string(m_srcId)); m_subscriber.setShadow(false); - m_subscriber.addCallback("changed", [&]() { - if (m_subscriber.getValue() >= 1 && m_subscriber.getValue() <= 16777211) { - m_txButton.setEnable(true); + m_subscriber.addCallback("up-pressed", [&]() { + uint32_t rid = ::atoi(m_subscriber.getText().c_str()); + rid++; + if (rid > 16777215U) { + rid = 16777215U; } - else { - m_txButton.setEnable(false); + + m_subscriber.setText(std::to_string(rid)); + + m_srcId = rid; + redraw(); + }); + m_subscriber.addCallback("down-pressed", [&]() { + uint32_t rid = ::atoi(m_subscriber.getText().c_str()); + rid--; + if (rid < 1U) { + rid = 1U; } + m_subscriber.setText(std::to_string(rid)); + + m_srcId = rid; redraw(); }); + m_subscriber.addCallback("changed", [&]() { + if (m_subscriber.getText().getLength() == 0) { + m_srcId = 1U; + return; + } + + uint32_t rid = ::atoi(m_subscriber.getText().c_str()); + if (rid < 1U) { + rid = 1U; + } + + if (rid > 16777215U) { + rid = 16777215U; + } + + m_subscriber.setText(std::to_string(rid)); + + m_srcId = rid; + }); } m_dialogLabel.redraw(); @@ -102,8 +136,7 @@ private: using namespace dmr; using namespace dmr::defines; - writeDMR_Ext_Func((uint8_t)m_dmrSlot.getValue(), ExtendedFunctions::INHIBIT, WUID_STUNI, - (uint32_t)m_subscriber.getValue()); + writeDMR_Ext_Func((uint8_t)m_dmrSlot.getValue(), ExtendedFunctions::INHIBIT, WUID_STUNI, m_srcId); } break; @@ -112,7 +145,7 @@ private: using namespace p25; using namespace p25::defines; - writeP25_Ext_Func(ExtendedFunctions::INHIBIT, WUID_FNE, (uint32_t)m_subscriber.getValue()); + writeP25_Ext_Func(ExtendedFunctions::INHIBIT, WUID_FNE, m_srcId); } break; diff --git a/src/sysview/PageSubscriberWnd.h b/src/sysview/PageSubscriberWnd.h index ea156cee..22f64a75 100644 --- a/src/sysview/PageSubscriberWnd.h +++ b/src/sysview/PageSubscriberWnd.h @@ -42,7 +42,9 @@ private: FLabel m_dialogLabel{"Page Subscriber", this}; FLabel m_subscriberLabel{"Subscriber ID: ", this}; - FSpinBox m_subscriber{this}; + RIDLineEdit m_subscriber{this}; + + uint32_t m_srcId = 1U; /** * @brief Initializes the window layout. @@ -70,19 +72,51 @@ private: m_subscriberLabel.setGeometry(FPoint(2, 8), FSize(25, 1)); m_subscriber.setGeometry(FPoint(28, 8), FSize(20, 1)); - m_subscriber.setRange(0, 16777211); - m_subscriber.setValue(1); + m_subscriber.setText(std::to_string(m_srcId)); m_subscriber.setShadow(false); - m_subscriber.addCallback("changed", [&]() { - if (m_subscriber.getValue() >= 1 && m_subscriber.getValue() <= 16777211) { - m_txButton.setEnable(true); + m_subscriber.addCallback("up-pressed", [&]() { + uint32_t rid = ::atoi(m_subscriber.getText().c_str()); + rid++; + if (rid > 16777215U) { + rid = 16777215U; } - else { - m_txButton.setEnable(false); + + m_subscriber.setText(std::to_string(rid)); + + m_srcId = rid; + redraw(); + }); + m_subscriber.addCallback("down-pressed", [&]() { + uint32_t rid = ::atoi(m_subscriber.getText().c_str()); + rid--; + if (rid < 1U) { + rid = 1U; } + m_subscriber.setText(std::to_string(rid)); + + m_srcId = rid; redraw(); }); + m_subscriber.addCallback("changed", [&]() { + if (m_subscriber.getText().getLength() == 0) { + m_srcId = 1U; + return; + } + + uint32_t rid = ::atoi(m_subscriber.getText().c_str()); + if (rid < 1U) { + rid = 1U; + } + + if (rid > 16777215U) { + rid = 16777215U; + } + + m_subscriber.setText(std::to_string(rid)); + + m_srcId = rid; + }); } m_dialogLabel.redraw(); @@ -104,7 +138,7 @@ private: std::unique_ptr csbk = std::make_unique(); csbk->setGI(false); csbk->setSrcId(DMRDEF::WUID_ALL); - csbk->setDstId((uint32_t)m_subscriber.getValue()); + csbk->setDstId(m_srcId); write_CSBK((uint8_t)m_dmrSlot.getValue(), csbk.get()); } @@ -117,7 +151,7 @@ private: std::unique_ptr iosp = std::make_unique(); iosp->setSrcId(P25DEF::WUID_FNE); - iosp->setDstId((uint32_t)m_subscriber.getValue()); + iosp->setDstId(m_srcId); write_TSDU(iosp.get()); } diff --git a/src/sysview/PeerListWnd.h b/src/sysview/PeerListWnd.h index 894f0af1..3eda99c4 100644 --- a/src/sysview/PeerListWnd.h +++ b/src/sysview/PeerListWnd.h @@ -210,7 +210,6 @@ public: } } - setFocusWidget(&m_listView); redraw(); } diff --git a/src/sysview/RadioCheckSubscriberWnd.h b/src/sysview/RadioCheckSubscriberWnd.h index 9b373c8a..fbc58d39 100644 --- a/src/sysview/RadioCheckSubscriberWnd.h +++ b/src/sysview/RadioCheckSubscriberWnd.h @@ -42,7 +42,9 @@ private: FLabel m_dialogLabel{"Radio Check Subscriber", this}; FLabel m_subscriberLabel{"Subscriber ID: ", this}; - FSpinBox m_subscriber{this}; + RIDLineEdit m_subscriber{this}; + + uint32_t m_srcId = 1U; /** * @brief Initializes the window layout. @@ -70,19 +72,51 @@ private: m_subscriberLabel.setGeometry(FPoint(2, 8), FSize(25, 1)); m_subscriber.setGeometry(FPoint(28, 8), FSize(20, 1)); - m_subscriber.setRange(0, 16777211); - m_subscriber.setValue(1); + m_subscriber.setText(std::to_string(m_srcId)); m_subscriber.setShadow(false); - m_subscriber.addCallback("changed", [&]() { - if (m_subscriber.getValue() >= 1 && m_subscriber.getValue() <= 16777211) { - m_txButton.setEnable(true); + m_subscriber.addCallback("up-pressed", [&]() { + uint32_t rid = ::atoi(m_subscriber.getText().c_str()); + rid++; + if (rid > 16777215U) { + rid = 16777215U; } - else { - m_txButton.setEnable(false); + + m_subscriber.setText(std::to_string(rid)); + + m_srcId = rid; + redraw(); + }); + m_subscriber.addCallback("down-pressed", [&]() { + uint32_t rid = ::atoi(m_subscriber.getText().c_str()); + rid--; + if (rid < 1U) { + rid = 1U; } + m_subscriber.setText(std::to_string(rid)); + + m_srcId = rid; redraw(); }); + m_subscriber.addCallback("changed", [&]() { + if (m_subscriber.getText().getLength() == 0) { + m_srcId = 1U; + return; + } + + uint32_t rid = ::atoi(m_subscriber.getText().c_str()); + if (rid < 1U) { + rid = 1U; + } + + if (rid > 16777215U) { + rid = 16777215U; + } + + m_subscriber.setText(std::to_string(rid)); + + m_srcId = rid; + }); } m_dialogLabel.redraw(); @@ -101,8 +135,7 @@ private: using namespace dmr; using namespace dmr::defines; - writeDMR_Ext_Func((uint8_t)m_dmrSlot.getValue(), ExtendedFunctions::CHECK, WUID_STUNI, - (uint32_t)m_subscriber.getValue()); + writeDMR_Ext_Func((uint8_t)m_dmrSlot.getValue(), ExtendedFunctions::CHECK, WUID_STUNI, m_srcId); } break; @@ -111,7 +144,7 @@ private: using namespace p25; using namespace p25::defines; - writeP25_Ext_Func(ExtendedFunctions::CHECK, WUID_FNE, (uint32_t)m_subscriber.getValue()); + writeP25_Ext_Func(ExtendedFunctions::CHECK, WUID_FNE, m_srcId); } break; diff --git a/src/sysview/TransmitWndBase.h b/src/sysview/TransmitWndBase.h index 62862563..48644a2f 100644 --- a/src/sysview/TransmitWndBase.h +++ b/src/sysview/TransmitWndBase.h @@ -35,6 +35,50 @@ using namespace finalcut; // Class Declaration // --------------------------------------------------------------------------- +/** + * @brief This class implements the line edit control for RIDs. + * @ingroup fneSysView + */ +class HOST_SW_API RIDLineEdit final : public FLineEdit { +public: + /** + * @brief Initializes a new instance of the RIDLineEdit class. + * @param widget + */ + explicit RIDLineEdit(FWidget* widget = nullptr) : FLineEdit{widget} + { + setInputFilter("[[:digit:]]"); + } + + /* + ** Event Handlers + */ + + /** + * @brief Event that occurs on keyboard key press. + * @param e Keyboard Event. + */ + void onKeyPress(finalcut::FKeyEvent* e) override + { + const auto key = e->key(); + if (key == FKey::Up) { + emitCallback("up-pressed"); + e->accept(); + return; + } else if (key == FKey::Down) { + emitCallback("down-pressed"); + e->accept(); + return; + } + + FLineEdit::onKeyPress(e); + } +}; + +// --------------------------------------------------------------------------- +// Class Declaration +// --------------------------------------------------------------------------- + /** * @brief This class implements the base class for transmit windows. * @ingroup fneSysView @@ -307,11 +351,13 @@ protected: // Set first busy bits to 1,1 P25Utils::setStatusBits(data, P25_SS0_START, true, true); - LogDebug(LOG_RF, P25_TSDU_STR ", lco = $%02X, mfId = $%02X, lastBlock = %u, AIV = %u, EX = %u, srcId = %u, dstId = %u, sysId = $%03X, netId = $%05X", - tsbk->getLCO(), tsbk->getMFId(), tsbk->getLastBlock(), tsbk->getAIV(), tsbk->getEX(), tsbk->getSrcId(), tsbk->getDstId(), - tsbk->getSysId(), tsbk->getNetId()); + if (g_debug) { + LogDebug(LOG_RF, P25_TSDU_STR ", lco = $%02X, mfId = $%02X, lastBlock = %u, AIV = %u, EX = %u, srcId = %u, dstId = %u, sysId = $%03X, netId = $%05X", + tsbk->getLCO(), tsbk->getMFId(), tsbk->getLastBlock(), tsbk->getAIV(), tsbk->getEX(), tsbk->getSrcId(), tsbk->getDstId(), + tsbk->getSysId(), tsbk->getNetId()); - Utils::dump(1U, "!!! *TSDU (SBF) TSBK Block Data", data + P25_PREAMBLE_LENGTH_BYTES, P25_TSBK_FEC_LENGTH_BYTES); + Utils::dump(1U, "!!! *TSDU (SBF) TSBK Block Data", data + P25_PREAMBLE_LENGTH_BYTES, P25_TSBK_FEC_LENGTH_BYTES); + } lc::LC lc = lc::LC(); lc.setLCO(tsbk->getLCO()); diff --git a/src/sysview/UninhibitSubscriberWnd.h b/src/sysview/UninhibitSubscriberWnd.h index 147c6d51..904889fb 100644 --- a/src/sysview/UninhibitSubscriberWnd.h +++ b/src/sysview/UninhibitSubscriberWnd.h @@ -43,7 +43,9 @@ private: FLabel m_dialogLabel{"Uninhibit Subscriber", this}; FLabel m_subscriberLabel{"Subscriber ID: ", this}; - FSpinBox m_subscriber{this}; + RIDLineEdit m_subscriber{this}; + + uint32_t m_srcId = 1U; /** * @brief Initializes the window layout. @@ -71,19 +73,51 @@ private: m_subscriberLabel.setGeometry(FPoint(2, 8), FSize(25, 1)); m_subscriber.setGeometry(FPoint(28, 8), FSize(20, 1)); - m_subscriber.setRange(0, 16777211); - m_subscriber.setValue(1); + m_subscriber.setText(std::to_string(m_srcId)); m_subscriber.setShadow(false); - m_subscriber.addCallback("changed", [&]() { - if (m_subscriber.getValue() >= 1 && m_subscriber.getValue() <= 16777211) { - m_txButton.setEnable(true); + m_subscriber.addCallback("up-pressed", [&]() { + uint32_t rid = ::atoi(m_subscriber.getText().c_str()); + rid++; + if (rid > 16777215U) { + rid = 16777215U; } - else { - m_txButton.setEnable(false); + + m_subscriber.setText(std::to_string(rid)); + + m_srcId = rid; + redraw(); + }); + m_subscriber.addCallback("down-pressed", [&]() { + uint32_t rid = ::atoi(m_subscriber.getText().c_str()); + rid--; + if (rid < 1U) { + rid = 1U; } + m_subscriber.setText(std::to_string(rid)); + + m_srcId = rid; redraw(); }); + m_subscriber.addCallback("changed", [&]() { + if (m_subscriber.getText().getLength() == 0) { + m_srcId = 1U; + return; + } + + uint32_t rid = ::atoi(m_subscriber.getText().c_str()); + if (rid < 1U) { + rid = 1U; + } + + if (rid > 16777215U) { + rid = 16777215U; + } + + m_subscriber.setText(std::to_string(rid)); + + m_srcId = rid; + }); } m_dialogLabel.redraw(); @@ -102,8 +136,7 @@ private: using namespace dmr; using namespace dmr::defines; - writeDMR_Ext_Func((uint8_t)m_dmrSlot.getValue(), ExtendedFunctions::UNINHIBIT, WUID_STUNI, - (uint32_t)m_subscriber.getValue()); + writeDMR_Ext_Func((uint8_t)m_dmrSlot.getValue(), ExtendedFunctions::UNINHIBIT, WUID_STUNI, m_srcId); } break; @@ -112,7 +145,7 @@ private: using namespace p25; using namespace p25::defines; - writeP25_Ext_Func(ExtendedFunctions::UNINHIBIT, WUID_FNE, (uint32_t)m_subscriber.getValue()); + writeP25_Ext_Func(ExtendedFunctions::UNINHIBIT, WUID_FNE, m_srcId); } break; diff --git a/src/tged/TGEditWnd.h b/src/tged/TGEditWnd.h index 096c615f..cafb3a3c 100644 --- a/src/tged/TGEditWnd.h +++ b/src/tged/TGEditWnd.h @@ -218,6 +218,13 @@ private: redraw(); }); m_tgId.addCallback("changed", [&]() { + if (m_tgId.getText().getLength() == 0) { + auto source = m_rule.source(); + source.tgId(1U); + m_rule.source(source); + return; + } + uint32_t tgId = ::atoi(m_tgId.getText().c_str()); if (tgId < 1U) { tgId = 1U;