/** * @file DXLabSuiteCommanderTransceiver.cpp * @brief Implementation of the DXLabSuiteCommanderTransceiver class * Helper decorator class that encapsulates the emulation of split TX * operation. */ #include "EmulateSplitTransceiver.h" #include Q_DECLARE_LOGGING_CATEGORY(emulatesplittransceiver_js8) EmulateSplitTransceiver::EmulateSplitTransceiver( std::unique_ptr wrapped, QObject *parent) : Transceiver{parent}, wrapped_{std::move(wrapped)}, rx_frequency_{0}, tx_frequency_{0}, split_{false} { // Connect update signal of wrapped Transceiver object instance to ours. connect(wrapped_.get(), &Transceiver::update, this, &EmulateSplitTransceiver::handle_update); // Connect other signals of wrapped Transceiver object to our // parent matching signals. connect(wrapped_.get(), &Transceiver::resolution, this, &Transceiver::resolution); connect(wrapped_.get(), &Transceiver::finished, this, &Transceiver::finished); connect(wrapped_.get(), &Transceiver::failure, this, &Transceiver::failure); } void EmulateSplitTransceiver::set(TransceiverState const &s, unsigned sequence_number) noexcept { qCDebug(emulatesplittransceiver_js8) << "EmulateSplitTransceiver::set: state:" << s << "#:" << sequence_number; // save for use in updates rx_frequency_ = s.frequency(); tx_frequency_ = s.tx_frequency(); split_ = s.split(); TransceiverState emulated_state{s}; if (s.ptt() && split_) emulated_state.frequency(s.tx_frequency()); emulated_state.split(false); emulated_state.tx_frequency(0); wrapped_->set(emulated_state, sequence_number); } void EmulateSplitTransceiver::handle_update(TransceiverState const &state, unsigned sequence_number) { qCDebug(emulatesplittransceiver_js8) << "EmulateSplitTransceiver::handle_update: from wrapped:" << state; if (state.split()) { Q_EMIT failure( tr("Emulated split mode requires rig to be in simplex mode")); } else { TransceiverState new_state{state}; // Follow the rig if in RX mode. if (state.ptt()) new_state.frequency(rx_frequency_); // These are always what was requested in prior set state operation new_state.tx_frequency(tx_frequency_); new_state.split(split_); qCDebug(emulatesplittransceiver_js8) << "EmulateSplitTransceiver::handle_update: signalling:" << state; // signal emulated state Q_EMIT update(new_state, sequence_number); } } Q_LOGGING_CATEGORY(emulatesplittransceiver_js8, "emulatesplittransceiver.js8", QtWarningMsg)