| 
									
										
										
										
											2018-02-08 21:28:33 -05:00
										 |  |  | #ifndef TRANSCEIVER_FACTORY_HPP__
 | 
					
						
							|  |  |  | #define TRANSCEIVER_FACTORY_HPP__
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <memory>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <QObject>
 | 
					
						
							|  |  |  | #include <QMap>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "Transceiver.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "qt_helpers.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class QString; | 
					
						
							|  |  |  | class QThread; | 
					
						
							|  |  |  | class QDir; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Transceiver Factory
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | class TransceiverFactory | 
					
						
							|  |  |  |   : public QObject | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Q_OBJECT | 
					
						
							|  |  |  |   Q_ENUMS (DataBits StopBits Handshake PTTMethod TXAudioSource SplitMode) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |   //
 | 
					
						
							|  |  |  |   // Capabilities of a Transceiver that can be determined without
 | 
					
						
							|  |  |  |   // actually instantiating one, these are for use in Configuration
 | 
					
						
							|  |  |  |   // GUI behaviour determination
 | 
					
						
							|  |  |  |   //
 | 
					
						
							|  |  |  |   struct Capabilities | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     enum PortType {none, serial, network, usb}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     explicit Capabilities (int model_number = 0 | 
					
						
							|  |  |  |                            , PortType port_type = none | 
					
						
							|  |  |  |                            , bool has_CAT_PTT = false | 
					
						
							|  |  |  |                            , bool has_CAT_PTT_mic_data = false | 
					
						
							|  |  |  |                            , bool has_CAT_indirect_serial_PTT = false | 
					
						
							|  |  |  |                            , bool asynchronous = false) | 
					
						
							|  |  |  |       : model_number_ {model_number} | 
					
						
							|  |  |  |       , port_type_ {port_type} | 
					
						
							|  |  |  |       , has_CAT_PTT_ {has_CAT_PTT} | 
					
						
							|  |  |  |       , has_CAT_PTT_mic_data_ {has_CAT_PTT_mic_data} | 
					
						
							|  |  |  |       , has_CAT_indirect_serial_PTT_ {has_CAT_indirect_serial_PTT} | 
					
						
							|  |  |  |       , asynchronous_ {asynchronous} | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int model_number_; | 
					
						
							|  |  |  |     PortType port_type_; | 
					
						
							|  |  |  |     bool has_CAT_PTT_; | 
					
						
							|  |  |  |     bool has_CAT_PTT_mic_data_; | 
					
						
							|  |  |  |     bool has_CAT_indirect_serial_PTT_; // OmniRig controls RTS/DTR via COM interface
 | 
					
						
							|  |  |  |     bool asynchronous_; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   //
 | 
					
						
							|  |  |  |   // Dictionary of Transceiver types Capabilities
 | 
					
						
							|  |  |  |   //
 | 
					
						
							|  |  |  |   typedef QMap<QString, Capabilities> Transceivers; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   //
 | 
					
						
							|  |  |  |   // various Transceiver parameters
 | 
					
						
							|  |  |  |   //
 | 
					
						
							| 
									
										
										
										
											2018-08-05 11:33:30 -04:00
										 |  |  |   enum DataBits {seven_data_bits = 7, eight_data_bits, default_data_bits}; | 
					
						
							| 
									
										
										
										
											2018-02-08 21:28:33 -05:00
										 |  |  |   Q_ENUM (DataBits) | 
					
						
							| 
									
										
										
										
											2018-08-05 11:33:30 -04:00
										 |  |  |   enum StopBits {one_stop_bit = 1, two_stop_bits, default_stop_bits}; | 
					
						
							| 
									
										
										
										
											2018-02-08 21:28:33 -05:00
										 |  |  |   Q_ENUM (StopBits) | 
					
						
							| 
									
										
										
										
											2018-08-05 11:33:30 -04:00
										 |  |  |   enum Handshake {handshake_default, handshake_none, handshake_XonXoff, handshake_hardware}; | 
					
						
							| 
									
										
										
										
											2018-02-08 21:28:33 -05:00
										 |  |  |   Q_ENUM (Handshake) | 
					
						
							|  |  |  |   enum PTTMethod {PTT_method_VOX, PTT_method_CAT, PTT_method_DTR, PTT_method_RTS}; | 
					
						
							|  |  |  |   Q_ENUM (PTTMethod) | 
					
						
							|  |  |  |   enum TXAudioSource {TX_audio_source_front, TX_audio_source_rear}; | 
					
						
							|  |  |  |   Q_ENUM (TXAudioSource) | 
					
						
							|  |  |  |   enum SplitMode {split_mode_none, split_mode_rig, split_mode_emulate}; | 
					
						
							|  |  |  |   Q_ENUM (SplitMode) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   TransceiverFactory (); | 
					
						
							|  |  |  |   ~TransceiverFactory (); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static char const * const basic_transceiver_name_; // dummy transceiver is basic model
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   //
 | 
					
						
							|  |  |  |   // fetch all supported rigs as a list of name and model id
 | 
					
						
							|  |  |  |   //
 | 
					
						
							|  |  |  |   Transceivers const& supported_transceivers () const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // supported model queries
 | 
					
						
							|  |  |  |   Capabilities::PortType CAT_port_type (QString const& name) const; // how to talk to CAT
 | 
					
						
							|  |  |  |   bool has_CAT_PTT (QString const& name) const;	// can be keyed via CAT
 | 
					
						
							|  |  |  |   bool has_CAT_PTT_mic_data (QString const& name) const; // Tx audio port is switchable via CAT
 | 
					
						
							|  |  |  |   bool has_CAT_indirect_serial_PTT (QString const& name) const; // Can PTT via CAT port use DTR or RTS (OmniRig for example)
 | 
					
						
							|  |  |  |   bool has_asynchronous_CAT (QString const& name) const; // CAT asynchronous rather than polled
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   struct ParameterPack | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     QString rig_name;           // from supported_transceivers () key
 | 
					
						
							|  |  |  |     QString serial_port;        // serial port device name or empty
 | 
					
						
							|  |  |  |     QString network_port;       // hostname:port or empty
 | 
					
						
							|  |  |  |     QString usb_port;           // [vid[:pid[:vendor[:product]]]]
 | 
					
						
							|  |  |  |     int baud; | 
					
						
							|  |  |  |     DataBits data_bits; | 
					
						
							|  |  |  |     StopBits stop_bits; | 
					
						
							|  |  |  |     Handshake handshake; | 
					
						
							|  |  |  |     bool force_dtr; | 
					
						
							|  |  |  |     bool dtr_high;              // to power interface
 | 
					
						
							|  |  |  |     bool force_rts; | 
					
						
							|  |  |  |     bool rts_high;              // to power interface
 | 
					
						
							|  |  |  |     PTTMethod ptt_type;         // "CAT" | "DTR" | "RTS" | "VOX"
 | 
					
						
							|  |  |  |     TXAudioSource audio_source; // some rigs allow audio routing
 | 
					
						
							|  |  |  |                                 // to Mic/Data connector
 | 
					
						
							|  |  |  |     SplitMode split_mode;       // how to support split TX mode
 | 
					
						
							|  |  |  |     QString ptt_port;           // serial port device name or special
 | 
					
						
							|  |  |  |                                 // value "CAT"
 | 
					
						
							|  |  |  |     int poll_interval;          // in seconds for interfaces that
 | 
					
						
							|  |  |  |                                 // require polling for state changes
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     bool operator == (ParameterPack const& rhs) const | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       return rhs.rig_name == rig_name | 
					
						
							|  |  |  |         && rhs.serial_port == serial_port | 
					
						
							|  |  |  |         && rhs.network_port == network_port | 
					
						
							|  |  |  |         && rhs.usb_port == usb_port | 
					
						
							|  |  |  |         && rhs.baud == baud | 
					
						
							|  |  |  |         && rhs.data_bits == data_bits | 
					
						
							|  |  |  |         && rhs.stop_bits == stop_bits | 
					
						
							|  |  |  |         && rhs.handshake == handshake | 
					
						
							|  |  |  |         && rhs.force_dtr == force_dtr | 
					
						
							|  |  |  |         && rhs.dtr_high == dtr_high | 
					
						
							|  |  |  |         && rhs.force_rts == force_rts | 
					
						
							|  |  |  |         && rhs.rts_high == rts_high | 
					
						
							|  |  |  |         && rhs.ptt_type == ptt_type | 
					
						
							|  |  |  |         && rhs.audio_source == audio_source | 
					
						
							|  |  |  |         && rhs.split_mode == split_mode | 
					
						
							|  |  |  |         && rhs.ptt_port == ptt_port | 
					
						
							|  |  |  |         && rhs.poll_interval == poll_interval | 
					
						
							|  |  |  |         ; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // make a new Transceiver instance
 | 
					
						
							|  |  |  |   //
 | 
					
						
							|  |  |  |   // cat_port, cat_baud, cat_data_bits, cat_stop_bits, cat_handshake,
 | 
					
						
							|  |  |  |   // cat_dtr_control, cat_rts_control are only relevant to interfaces
 | 
					
						
							|  |  |  |   // that are served by Hamlib
 | 
					
						
							|  |  |  |   //
 | 
					
						
							|  |  |  |   // PTT port and to some extent ptt_type are independent of interface
 | 
					
						
							|  |  |  |   // type
 | 
					
						
							|  |  |  |   //
 | 
					
						
							|  |  |  |   std::unique_ptr<Transceiver> create (ParameterPack const&, QThread * target_thread = nullptr); | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |   Transceivers transceivers_; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | inline | 
					
						
							|  |  |  | bool operator != (TransceiverFactory::ParameterPack const& lhs, TransceiverFactory::ParameterPack const& rhs) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   return !(lhs == rhs); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // boilerplate routines to make enum types useable and debuggable in
 | 
					
						
							|  |  |  | // Qt
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | #if QT_VERSION < 0x050500
 | 
					
						
							|  |  |  | Q_DECLARE_METATYPE (TransceiverFactory::DataBits); | 
					
						
							|  |  |  | Q_DECLARE_METATYPE (TransceiverFactory::StopBits); | 
					
						
							|  |  |  | Q_DECLARE_METATYPE (TransceiverFactory::Handshake); | 
					
						
							|  |  |  | Q_DECLARE_METATYPE (TransceiverFactory::PTTMethod); | 
					
						
							|  |  |  | Q_DECLARE_METATYPE (TransceiverFactory::TXAudioSource); | 
					
						
							|  |  |  | Q_DECLARE_METATYPE (TransceiverFactory::SplitMode); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if !defined (QT_NO_DEBUG_STREAM)
 | 
					
						
							|  |  |  | ENUM_QDEBUG_OPS_DECL (TransceiverFactory, DataBits); | 
					
						
							|  |  |  | ENUM_QDEBUG_OPS_DECL (TransceiverFactory, StopBits); | 
					
						
							|  |  |  | ENUM_QDEBUG_OPS_DECL (TransceiverFactory, Handshake); | 
					
						
							|  |  |  | ENUM_QDEBUG_OPS_DECL (TransceiverFactory, PTTMethod); | 
					
						
							|  |  |  | ENUM_QDEBUG_OPS_DECL (TransceiverFactory, TXAudioSource); | 
					
						
							|  |  |  | ENUM_QDEBUG_OPS_DECL (TransceiverFactory, SplitMode); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ENUM_QDATASTREAM_OPS_DECL (TransceiverFactory, DataBits); | 
					
						
							|  |  |  | ENUM_QDATASTREAM_OPS_DECL (TransceiverFactory, StopBits); | 
					
						
							|  |  |  | ENUM_QDATASTREAM_OPS_DECL (TransceiverFactory, Handshake); | 
					
						
							|  |  |  | ENUM_QDATASTREAM_OPS_DECL (TransceiverFactory, PTTMethod); | 
					
						
							|  |  |  | ENUM_QDATASTREAM_OPS_DECL (TransceiverFactory, TXAudioSource); | 
					
						
							|  |  |  | ENUM_QDATASTREAM_OPS_DECL (TransceiverFactory, SplitMode); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ENUM_CONVERSION_OPS_DECL (TransceiverFactory, DataBits); | 
					
						
							|  |  |  | ENUM_CONVERSION_OPS_DECL (TransceiverFactory, StopBits); | 
					
						
							|  |  |  | ENUM_CONVERSION_OPS_DECL (TransceiverFactory, Handshake); | 
					
						
							|  |  |  | ENUM_CONVERSION_OPS_DECL (TransceiverFactory, PTTMethod); | 
					
						
							|  |  |  | ENUM_CONVERSION_OPS_DECL (TransceiverFactory, TXAudioSource); | 
					
						
							|  |  |  | ENUM_CONVERSION_OPS_DECL (TransceiverFactory, SplitMode); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 |