WSJT-X/EmulateSplitTransceiver.cpp
Bill Somerville 9b9749aaab Correct ordering of commands sent to HRD when emulating split mode.
Frequency changes must be made while the rig is in RX mode otherwise
they can end up getting ignored on some rigs.

git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@4137 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
2014-05-14 12:00:31 +00:00

111 lines
2.7 KiB
C++

#include "EmulateSplitTransceiver.hpp"
EmulateSplitTransceiver::EmulateSplitTransceiver (std::unique_ptr<Transceiver> wrapped)
: wrapped_ {std::move (wrapped)}
, frequency_ {0, 0}
, tx_ {false}
{
// Connect update signal of wrapped Transceiver object instance to ours.
connect (wrapped_.get (), &Transceiver::update, this, &EmulateSplitTransceiver::handle_update);
// Connect failure signal of wrapped Transceiver object to our
// parent failure signal.
connect (wrapped_.get (), &Transceiver::failure, this, &Transceiver::failure);
}
void EmulateSplitTransceiver::start () noexcept
{
wrapped_->start ();
wrapped_->tx_frequency (0, false);
}
void EmulateSplitTransceiver::frequency (Frequency rx) noexcept
{
#if WSJT_TRACE_CAT
qDebug () << "EmulateSplitTransceiver::frequency:" << rx;
#endif
// Save frequency parameters.
frequency_[0] = rx;
// Set active frequency.
wrapped_->frequency (rx);
}
void EmulateSplitTransceiver::tx_frequency (Frequency tx, bool /* rationalise_mode */) noexcept
{
#if WSJT_TRACE_CAT
qDebug () << "EmulateSplitTransceiver::tx_frequency:" << tx;
#endif
// Save frequency parameter.
frequency_[1] = tx;
// Set active frequency.
wrapped_->frequency (frequency_[(tx_ && frequency_[1]) ? 1 : 0]);
}
void EmulateSplitTransceiver::ptt (bool on) noexcept
{
#if WSJT_TRACE_CAT
qDebug () << "EmulateSplitTransceiver::ptt:" << on;
#endif
// Save TX state for future frequency change requests.
if ((tx_ = on))
{
// Switch to other frequency if we have one i.e. client wants
// split operation).
wrapped_->frequency (frequency_[frequency_[1] ? 1 : 0]);
// Change TX state.
wrapped_->ptt (true);
}
else
{
// Change TX state.
wrapped_->ptt (false);
// Switch to RX frequency.
wrapped_->frequency (frequency_[0]);
}
}
void EmulateSplitTransceiver::handle_update (TransceiverState state)
{
#if WSJT_TRACE_CAT
qDebug () << "EmulateSplitTransceiver::handle_update: from wrapped:" << state;
#endif
// Change to reflect emulated state, we don't want to report the
// shifted frequency when transmitting.
if (tx_)
{
state.frequency (frequency_[0]);
}
else
{
// Follow the rig if in RX mode.
frequency_[0] = state.frequency ();
}
// Always report the other frequency as the Tx frequency we will use.
state.tx_frequency (frequency_[1]);
if (state.split ())
{
Q_EMIT failure (tr ("Emulated split mode requires rig to in simplex mode"));
}
else
{
state.split (true); // override rig state
#if WSJT_TRACE_CAT
qDebug () << "EmulateSplitTransceiver::handle_update: signalling:" << state;
#endif
// signal emulated state
Q_EMIT update (state);
}
}