198 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			198 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 | ||
|  | { | ||
|  | public: | ||
|  |   static void register_transceivers (TransceiverFactory::Transceivers *, int id); | ||
|  | 
 | ||
|  |   // takes ownership of wrapped Transceiver
 | ||
|  |   explicit HRDTransceiver (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 poll () override; | ||
|  | 
 | ||
|  | private: | ||
|  |   QString send_command (QString const&, bool no_debug = false, bool prepend_context = true, bool recurse = false); | ||
|  |   QByteArray read_reply (QString const& command); | ||
|  |   void send_simple_command (QString const&, bool no_debug = false); | ||
|  |   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, bool no_debug = false); | ||
|  |   void set_dropdown (int, int); | ||
|  |   void set_button (int button_index, bool checked = true); | ||
|  |   bool is_button_checked (int button_index, bool no_debug = false); | ||
|  | 
 | ||
|  |   // 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, bool no_debug = false); | ||
|  | 
 | ||
|  |   // 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
 |