WSJT-X/EmulateSplitTransceiver.hpp

53 lines
1.6 KiB
C++

#ifndef EMULATE_SPLIT_TRANSCEIVER_HPP__
#define EMULATE_SPLIT_TRANSCEIVER_HPP__
#include <memory>
#include "Transceiver.hpp"
//
// Emulate Split Transceiver
//
// Helper decorator class that encapsulates the emulation of split TX
// operation.
//
// Responsibilities
//
// Delegates all but setting of other (split) frequency to the
// wrapped Transceiver instance. Also routes failure signals from the
// wrapped Transceiver instance to this instances failure signal.
//
// Intercepts status updates from the wrapped Transceiver instance
// and re-signals it with the emulated status.
//
// Generates a status update signal if the other (split) frequency is
// changed, this is necessary since the wrapped transceiver instance
// never receives other frequency changes.
//
class EmulateSplitTransceiver final
: public Transceiver
{
public:
// takes ownership of wrapped Transceiver
explicit EmulateSplitTransceiver (std::unique_ptr<Transceiver> wrapped);
void start () noexcept override;
void frequency (Frequency) noexcept override;
void tx_frequency (Frequency, bool rationalise_mode) noexcept override;
void ptt (bool on) noexcept override;
// forward everything else to wrapped Transceiver
void stop () noexcept override {wrapped_->stop (); Q_EMIT finished ();}
void mode (MODE m, bool /* rationalise */) noexcept override {wrapped_->mode (m, false);}
void sync (bool force_signal) noexcept override {wrapped_->sync (force_signal);}
private:
void handle_update (TransceiverState);
std::unique_ptr<Transceiver> wrapped_;
Frequency frequency_[2]; // [0] <- RX, [1] <- other
bool tx_;
};
#endif