mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-31 04:50:34 -04:00 
			
		
		
		
	Preparation for safe dynamic linking to Hamlib where minor Hamlib upgrades can be deployed just by replacing the DLL/SO.
		
			
				
	
	
		
			201 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			201 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #ifndef HRD_TRANSCEIVER_HPP__
 | |
| #define HRD_TRANSCEIVER_HPP__
 | |
| 
 | |
| #include <vector>
 | |
| #include <tuple>
 | |
| #include <memory>
 | |
| 
 | |
| #include <QScopedPointer>
 | |
| #include <QString>
 | |
| #include <QStringList>
 | |
| 
 | |
| #include "TransceiverFactory.hpp"
 | |
| #include "PollingTransceiver.hpp"
 | |
| 
 | |
| class QRegExp;
 | |
| class QTcpSocket;
 | |
| class QByteArray;
 | |
| 
 | |
| //
 | |
| // Ham Radio Deluxe Transceiver Interface
 | |
| //
 | |
| // Implemented as a Transceiver decorator  because we may want the PTT
 | |
| // services of another Transceiver  type such as the HamlibTransceiver
 | |
| // which can  be enabled by wrapping  a HamlibTransceiver instantiated
 | |
| // as a "Hamlib Dummy" transceiver in the Transceiver factory method.
 | |
| //
 | |
| class HRDTransceiver final
 | |
|   : public PollingTransceiver
 | |
| {
 | |
|   Q_OBJECT
 | |
| 
 | |
| public:
 | |
|   static void register_transceivers (logger_type *, TransceiverFactory::Transceivers *, unsigned id);
 | |
| 
 | |
|   // takes ownership of wrapped Transceiver
 | |
|   explicit HRDTransceiver (logger_type *
 | |
|                            , std::unique_ptr<TransceiverBase> wrapped
 | |
|                            , QString const& server
 | |
|                            , bool use_for_ptt
 | |
|                            , TransceiverFactory::TXAudioSource
 | |
|                            , int poll_interval
 | |
|                            , QObject * parent = nullptr);
 | |
| 
 | |
| protected:
 | |
|   // Implement the TransceiverBase interface.
 | |
|   int do_start () override;
 | |
|   void do_stop () override;
 | |
|   void do_frequency (Frequency, MODE, bool no_ignore) override;
 | |
|   void do_tx_frequency (Frequency, MODE, bool no_ignore) override;
 | |
|   void do_mode (MODE) override;
 | |
|   void do_ptt (bool on) override;
 | |
| 
 | |
|   // Implement the PollingTransceiver interface.
 | |
|   void do_poll () override;
 | |
| 
 | |
| private:
 | |
|   QString send_command (QString const&, bool prepend_context = true, bool recurse = false);
 | |
|   QByteArray read_reply (QString const& command);
 | |
|   void send_simple_command (QString const&);
 | |
|   bool write_to_port (char const *, qint64 length);
 | |
|   int find_button (QRegExp const&) const;
 | |
|   int find_dropdown (QRegExp const&) const;
 | |
|   std::vector<int> find_dropdown_selection (int dropdown, QRegExp const&) const;
 | |
|   int get_dropdown (int);
 | |
|   void set_dropdown (int, int);
 | |
|   void set_button (int button_index, bool checked = true);
 | |
|   bool is_button_checked (int button_index);
 | |
| 
 | |
|   // This dictionary type maps Transceiver::MODE to a list of mode
 | |
|   // drop down selection indexes that equate to that mode.  It is used
 | |
|   // to map internal MODE values to HRD drop down selections and vice
 | |
|   // versa.
 | |
|   using ModeMap = std::vector<std::tuple<MODE, std::vector<int> > >;
 | |
| 
 | |
|   void map_modes (int dropdown, ModeMap *);
 | |
|   int lookup_mode (MODE, ModeMap const&) const;
 | |
|   MODE lookup_mode (int, ModeMap const&) const;
 | |
|   void set_data_mode (MODE);
 | |
|   MODE get_data_mode (MODE);
 | |
| 
 | |
|   // An alternate TransceiverBase instance that can be used to drive
 | |
|   // PTT if required.
 | |
|   std::unique_ptr<TransceiverBase> wrapped_; // may be null
 | |
| 
 | |
|   bool use_for_ptt_;            // Use HRD for PTT.
 | |
|   TransceiverFactory::TXAudioSource audio_source_; // Select rear/data
 | |
|                                                    // audio if available
 | |
| 
 | |
|   QString server_;              // The TCP/IP addrress and port for
 | |
|                                 // the HRD server.
 | |
| 
 | |
|   QTcpSocket * hrd_;            // The TCP/IP client that links to the
 | |
|                                 // HRD server.
 | |
| 
 | |
|   enum {none, v4, v5} protocol_; // The HRD protocol that has been
 | |
|                                  // detected.
 | |
| 
 | |
|   using RadioMap = std::vector<std::tuple<unsigned, QString> >;
 | |
| 
 | |
|   RadioMap radios_;             // Dictionary of available radios.
 | |
| 
 | |
|   unsigned current_radio_;      // The current addressed radio.
 | |
| 
 | |
|   unsigned vfo_count_;          // How many VFOs are supported.
 | |
| 
 | |
|   QStringList buttons_;         // The buttons available to click.
 | |
| 
 | |
|   QStringList dropdown_names_;  // The names of drop down selectors
 | |
|                                 // available.
 | |
| 
 | |
|   QMap<QString, QStringList> dropdowns_; // Dictionary of available
 | |
|                                          // drop down selections.
 | |
| 
 | |
|   QStringList slider_names_;    // The name of available sliders.
 | |
| 
 | |
|   QMap<QString, QStringList> sliders_; // Dictionary of available
 | |
|                                 // slider ranges.
 | |
| 
 | |
|   int vfo_A_button_;            // The button we use to select VFO
 | |
|                                 // A. May be -1 if none available.
 | |
| 
 | |
|   int vfo_B_button_;            // Index of button we use to select
 | |
|                                 // VFO B. May be -1 if none available.
 | |
| 
 | |
|   int vfo_toggle_button_;       // Index of button we use to toggle
 | |
|                                 // the VFOs. Use this if VFO A and VFO
 | |
|                                 // B selection are not available.
 | |
| 
 | |
|   int mode_A_dropdown_;         // Index of the mode drop down for VFO
 | |
|                                 // A.
 | |
| 
 | |
|   ModeMap mode_A_map_;          // The map of modes available for VFO
 | |
|                                 // A.
 | |
| 
 | |
|   int mode_B_dropdown_;         // The drop down index for VFO B mode
 | |
|                                 // setting. May be -1 if independent
 | |
|                                 // VFO mode setting not available.
 | |
| 
 | |
|   ModeMap mode_B_map_;          // The map of modes for VFO B.
 | |
| 
 | |
|   int data_mode_toggle_button_; // Button to toggle DATA mode
 | |
|   int data_mode_on_button_;     // Button to enable DATA mode
 | |
|   int data_mode_off_button_;    // Button to disable DATA mode
 | |
|   int data_mode_dropdown_;      // Index of data mode drop down, may
 | |
|                                 // be -1 if no such drop down exists
 | |
|   std::vector<int> data_mode_dropdown_selection_on_; // The drop down
 | |
|                                 // selection to turn on data mode.
 | |
| 
 | |
|   std::vector<int> data_mode_dropdown_selection_off_; // The drop
 | |
|                                 // down selection to disable data mode.
 | |
| 
 | |
|   int split_mode_button_;       // Button to use to select split
 | |
|                                 // operation. May be -1 if no button
 | |
|                                 // is available.
 | |
| 
 | |
|   int split_mode_dropdown_;     // The drop down index that allows
 | |
|                                 // split mode to be turned on and
 | |
|                                 // off. May be -1 if no such drop down
 | |
|                                 // exists.
 | |
| 
 | |
|   bool split_mode_dropdown_write_only_; // Some rigs cannot report
 | |
|                                         // split status.
 | |
| 
 | |
|   std::vector<int> split_mode_dropdown_selection_on_; // The drop down
 | |
|                                                       // selection to
 | |
|                                                       // turn on
 | |
|                                                       // split.
 | |
| 
 | |
|   std::vector<int> split_mode_dropdown_selection_off_; // The drop
 | |
|                                                        // down
 | |
|                                                        // selection to
 | |
|                                                        // disable
 | |
|                                                        // split.
 | |
| 
 | |
|   int split_off_button_;        // The button to turn off split mode.
 | |
| 
 | |
|   int tx_A_button_;             // The button to transmit on VFO A.
 | |
| 
 | |
|   int tx_B_button_;             // The button to transmit on VFO B.
 | |
| 
 | |
|   int rx_A_button_;             // The button to receive on VFO A
 | |
|                                 // A. May be -1 if none available.
 | |
| 
 | |
|   int rx_B_button_;             // The button to receive on VFO B
 | |
|                                 // May be -1 if none available.
 | |
| 
 | |
|   int receiver_dropdown_;       // Select receiver
 | |
| 
 | |
|   std::vector<int> rx_A_selection_;
 | |
| 
 | |
|   std::vector<int> rx_B_selection_;
 | |
| 
 | |
|   int ptt_button_;              // The button to toggle PTT.
 | |
|   int alt_ptt_button_;          // The alternative button to toggle
 | |
|                                 // PTT - used to select rear audio.
 | |
| 
 | |
|   bool reversed_;               // True if VFOs are reversed.
 | |
| };
 | |
| 
 | |
| #endif
 |