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
							 |