198 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			198 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | #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 |