#ifndef HRD_TRANSCEIVER_HPP__ #define HRD_TRANSCEIVER_HPP__ #include #include #include #include #include #include #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 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 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 > >; 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 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 >; 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 dropdowns_; // Dictionary of available // drop down selections. QStringList slider_names_; // The name of available sliders. QMap 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 data_mode_dropdown_selection_on_; // The drop down // selection to turn on data mode. std::vector 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 split_mode_dropdown_selection_on_; // The drop down // selection to // turn on // split. std::vector 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 rx_A_selection_; std::vector 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