mirror of
https://github.com/JS8Call-improved/JS8Call-improved
synced 2026-08-13 17:47:36 -04:00
up to modern 64-bit standards and supported by newer versions of Qt - Remove OmniRig from source tree
162 lines
5.6 KiB
C++
162 lines
5.6 KiB
C++
/**
|
|
* @file TransceiverFactory.cpp
|
|
* @brief Implementation of the TransceiverFactory class
|
|
*/
|
|
|
|
#include "TransceiverFactory.h"
|
|
#include "DXLabSuiteCommanderTransceiver.h"
|
|
#include "EmulateSplitTransceiver.h"
|
|
#include "HRDTransceiver.h"
|
|
#include "HamlibTransceiver.h"
|
|
|
|
#include <QMetaType>
|
|
|
|
#include "moc_TransceiverFactory.cpp"
|
|
|
|
// we use the hamlib "Hamlib Dummy" transceiver for non-CAT radios,
|
|
// this allows us to still use the hamlib PTT control features for a
|
|
// unified PTT control solution
|
|
|
|
char const *const TransceiverFactory::basic_transceiver_name_ = "None";
|
|
|
|
namespace {
|
|
enum // supported non-hamlib radio interfaces
|
|
{
|
|
NonHamlibBaseId = 9899,
|
|
CommanderId,
|
|
HRDId,
|
|
};
|
|
}
|
|
|
|
TransceiverFactory::TransceiverFactory() {
|
|
HamlibTransceiver::register_transceivers(&transceivers_);
|
|
DXLabSuiteCommanderTransceiver::register_transceivers(&transceivers_,
|
|
CommanderId);
|
|
HRDTransceiver::register_transceivers(&transceivers_, HRDId);
|
|
}
|
|
|
|
TransceiverFactory::~TransceiverFactory() {
|
|
HamlibTransceiver::unregister_transceivers();
|
|
}
|
|
|
|
auto TransceiverFactory::supported_transceivers() const
|
|
-> Transceivers const & {
|
|
return transceivers_;
|
|
}
|
|
|
|
auto TransceiverFactory::CAT_port_type(QString const &name) const
|
|
-> Capabilities::PortType {
|
|
return supported_transceivers()[name].port_type_;
|
|
}
|
|
|
|
bool TransceiverFactory::has_CAT_PTT(QString const &name) const {
|
|
return supported_transceivers()[name].has_CAT_PTT_ ||
|
|
supported_transceivers()[name].model_number_ > NonHamlibBaseId;
|
|
}
|
|
|
|
bool TransceiverFactory::has_CAT_PTT_mic_data(QString const &name) const {
|
|
return supported_transceivers()[name].has_CAT_PTT_mic_data_;
|
|
}
|
|
|
|
bool TransceiverFactory::has_CAT_indirect_serial_PTT(
|
|
QString const &name) const {
|
|
return supported_transceivers()[name].has_CAT_indirect_serial_PTT_;
|
|
}
|
|
|
|
bool TransceiverFactory::has_asynchronous_CAT(QString const &name) const {
|
|
return supported_transceivers()[name].asynchronous_;
|
|
}
|
|
|
|
std::unique_ptr<Transceiver>
|
|
TransceiverFactory::create(ParameterPack const ¶ms,
|
|
QThread *target_thread) {
|
|
std::unique_ptr<Transceiver> result;
|
|
switch (supported_transceivers()[params.rig_name].model_number_) {
|
|
case CommanderId: {
|
|
std::unique_ptr<TransceiverBase> basic_transceiver;
|
|
if (PTT_method_CAT != params.ptt_type) {
|
|
// we start with a dummy HamlibTransceiver object instance that can
|
|
// support direct PTT
|
|
basic_transceiver.reset(
|
|
new HamlibTransceiver{params.ptt_type, params.ptt_port});
|
|
if (target_thread) {
|
|
basic_transceiver.get()->moveToThread(target_thread);
|
|
}
|
|
}
|
|
|
|
// wrap the basic Transceiver object instance with a decorator object
|
|
// that talks to DX Lab Suite Commander
|
|
result.reset(new DXLabSuiteCommanderTransceiver{
|
|
std::move(basic_transceiver), params.network_port,
|
|
PTT_method_CAT == params.ptt_type, params.poll_interval});
|
|
if (target_thread) {
|
|
result->moveToThread(target_thread);
|
|
}
|
|
} break;
|
|
|
|
case HRDId: {
|
|
std::unique_ptr<TransceiverBase> basic_transceiver;
|
|
if (PTT_method_CAT != params.ptt_type) {
|
|
// we start with a dummy HamlibTransceiver object instance that can
|
|
// support direct PTT
|
|
basic_transceiver.reset(
|
|
new HamlibTransceiver{params.ptt_type, params.ptt_port});
|
|
if (target_thread) {
|
|
basic_transceiver.get()->moveToThread(target_thread);
|
|
}
|
|
}
|
|
|
|
// wrap the basic Transceiver object instance with a decorator object
|
|
// that talks to ham Radio Deluxe
|
|
result.reset(new HRDTransceiver{
|
|
std::move(basic_transceiver), params.network_port,
|
|
PTT_method_CAT == params.ptt_type, params.audio_source,
|
|
params.poll_interval});
|
|
if (target_thread) {
|
|
result->moveToThread(target_thread);
|
|
}
|
|
} break;
|
|
|
|
default:
|
|
result.reset(new HamlibTransceiver{
|
|
supported_transceivers()[params.rig_name].model_number_, params});
|
|
if (target_thread) {
|
|
result->moveToThread(target_thread);
|
|
}
|
|
break;
|
|
}
|
|
|
|
if (split_mode_emulate == params.split_mode) {
|
|
// wrap the Transceiver object instance with a decorator that emulates
|
|
// split mode
|
|
result.reset(new EmulateSplitTransceiver{std::move(result)});
|
|
if (target_thread) {
|
|
result->moveToThread(target_thread);
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
#if !defined(QT_NO_DEBUG_STREAM)
|
|
ENUM_QDEBUG_OPS_IMPL(TransceiverFactory, DataBits);
|
|
ENUM_QDEBUG_OPS_IMPL(TransceiverFactory, StopBits);
|
|
ENUM_QDEBUG_OPS_IMPL(TransceiverFactory, Handshake);
|
|
ENUM_QDEBUG_OPS_IMPL(TransceiverFactory, PTTMethod);
|
|
ENUM_QDEBUG_OPS_IMPL(TransceiverFactory, TXAudioSource);
|
|
ENUM_QDEBUG_OPS_IMPL(TransceiverFactory, SplitMode);
|
|
#endif
|
|
|
|
ENUM_QDATASTREAM_OPS_IMPL(TransceiverFactory, DataBits);
|
|
ENUM_QDATASTREAM_OPS_IMPL(TransceiverFactory, StopBits);
|
|
ENUM_QDATASTREAM_OPS_IMPL(TransceiverFactory, Handshake);
|
|
ENUM_QDATASTREAM_OPS_IMPL(TransceiverFactory, PTTMethod);
|
|
ENUM_QDATASTREAM_OPS_IMPL(TransceiverFactory, TXAudioSource);
|
|
ENUM_QDATASTREAM_OPS_IMPL(TransceiverFactory, SplitMode);
|
|
|
|
ENUM_CONVERSION_OPS_IMPL(TransceiverFactory, DataBits);
|
|
ENUM_CONVERSION_OPS_IMPL(TransceiverFactory, StopBits);
|
|
ENUM_CONVERSION_OPS_IMPL(TransceiverFactory, Handshake);
|
|
ENUM_CONVERSION_OPS_IMPL(TransceiverFactory, PTTMethod);
|
|
ENUM_CONVERSION_OPS_IMPL(TransceiverFactory, TXAudioSource);
|
|
ENUM_CONVERSION_OPS_IMPL(TransceiverFactory, SplitMode);
|