342 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			342 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #ifndef CONFIGURATION_HPP_
 | |
| #define CONFIGURATION_HPP_
 | |
| 
 | |
| #include <QObject>
 | |
| #include <QFont>
 | |
| 
 | |
| #include "Radio.hpp"
 | |
| #include "IARURegions.hpp"
 | |
| #include "AudioDevice.hpp"
 | |
| #include "Transceiver.hpp"
 | |
| 
 | |
| #include "pimpl_h.hpp"
 | |
| 
 | |
| class QSettings;
 | |
| class QWidget;
 | |
| class QAudioDeviceInfo;
 | |
| class QString;
 | |
| class QDir;
 | |
| class Bands;
 | |
| class FrequencyList_v2;
 | |
| class StationList;
 | |
| class QStringListModel;
 | |
| class QHostAddress;
 | |
| 
 | |
| //
 | |
| // Class Configuration
 | |
| //
 | |
| //  Encapsulates the control, access  and, persistence of user defined
 | |
| //  settings for the wsjtx GUI.  Setting values are accessed through a
 | |
| //  QDialog window containing concept orientated tab windows.
 | |
| //
 | |
| // Responsibilities
 | |
| //
 | |
| //  Provides management of  the CAT and PTT  rig interfaces, providing
 | |
| //  control access  via a minimal generic  set of Qt slots  and status
 | |
| //  updates via Qt signals.  Internally  the rig control capability is
 | |
| //  farmed out  to a  separate thread  since many  of the  rig control
 | |
| //  functions are blocking.
 | |
| //
 | |
| //  All user  settings required by  the wsjtx GUI are  exposed through
 | |
| //  query methods.  Settings only become  visible once they  have been
 | |
| //  accepted by the user which is  done by clicking the "OK" button on
 | |
| //  the settings dialog.
 | |
| //
 | |
| //  The QSettings instance  passed to the constructor is  used to read
 | |
| //  and write user settings.
 | |
| //
 | |
| //  Pointers to three QAbstractItemModel  objects are provided to give
 | |
| //  access to amateur band  information, user working frequencies and,
 | |
| //  user operating  band information.  These porovide  consistent data
 | |
| //  models that can  be used in GUI lists or  tables or simply queried
 | |
| //  for user defined bands, default operating frequencies and, station
 | |
| //  descriptions.
 | |
| //
 | |
| class Configuration final
 | |
|   : public QObject
 | |
| {
 | |
|   Q_OBJECT
 | |
|   Q_ENUMS (DataMode Type2MsgGen)
 | |
| 
 | |
| public:
 | |
|   using MODE = Transceiver::MODE;
 | |
|   using TransceiverState = Transceiver::TransceiverState;
 | |
|   using Frequency = Radio::Frequency;
 | |
|   using port_type = quint16;
 | |
| 
 | |
|   enum DataMode {data_mode_none, data_mode_USB, data_mode_data};
 | |
|   Q_ENUM (DataMode)
 | |
|   enum Type2MsgGen {type_2_msg_1_full, type_2_msg_3_full, type_2_msg_5_only};
 | |
|   Q_ENUM (Type2MsgGen)
 | |
| 
 | |
|   explicit Configuration (QDir const& temp_directory, QSettings * settings,
 | |
|                           QWidget * parent = nullptr);
 | |
|   ~Configuration ();
 | |
| 
 | |
|   void select_tab (int);
 | |
|   int exec ();
 | |
|   bool is_active () const;
 | |
| 
 | |
|   QDir temp_dir () const;
 | |
|   QDir doc_dir () const;
 | |
|   QDir data_dir () const;
 | |
|   QDir writeable_data_dir () const;
 | |
| 
 | |
|   QAudioDeviceInfo const& audio_input_device () const;
 | |
|   AudioDevice::Channel audio_input_channel () const;
 | |
|   QAudioDeviceInfo const& audio_output_device () const;
 | |
|   AudioDevice::Channel audio_output_channel () const;
 | |
| 
 | |
|   // These query methods should be used after a call to exec() to
 | |
|   // determine if either the audio input or audio output stream
 | |
|   // parameters have changed. The respective streams should be
 | |
|   // re-opened if they return true.
 | |
|   bool restart_audio_input () const;
 | |
|   bool restart_audio_output () const;
 | |
| 
 | |
|   bool use_dynamic_grid() const;
 | |
|   QString my_callsign () const;
 | |
|   QString my_grid () const;
 | |
|   QString my_station () const;
 | |
|   QSet<QString> my_groups() const;
 | |
|   int activity_aging() const;
 | |
|   int callsign_aging() const;
 | |
|   QString my_qth () const;
 | |
|   QString cq_message () const;
 | |
|   QString reply_message () const;
 | |
|   QFont table_font() const;
 | |
|   QFont text_font () const;
 | |
|   QFont rx_text_font () const;
 | |
|   QFont tx_text_font () const;
 | |
|   QFont compose_text_font () const;
 | |
|   qint32 id_interval () const;
 | |
|   qint32 ntrials() const;
 | |
|   qint32 aggressive() const;
 | |
|   qint32 RxBandwidth() const;
 | |
|   double degrade() const;
 | |
|   double txDelay() const;
 | |
|   bool id_after_73 () const;
 | |
|   bool tx_qsy_allowed () const;
 | |
|   bool spot_to_reporting_networks () const;
 | |
|   void set_spot_to_reporting_networks (bool);
 | |
|   bool transmit_directed() const;
 | |
|   bool autoreply_off_at_startup () const;
 | |
|   bool beacon_anywhere() const;
 | |
|   bool relay_off() const;
 | |
|   bool monitor_off_at_startup () const;
 | |
|   bool monitor_last_used () const;
 | |
|   bool log_as_DATA () const;
 | |
|   bool report_in_comments () const;
 | |
|   bool prompt_to_log () const;
 | |
|   bool insert_blank () const;
 | |
|   bool DXCC () const;
 | |
|   bool ppfx() const;
 | |
|   bool clear_DX () const;
 | |
|   bool miles () const;
 | |
|   bool quick_call () const;
 | |
|   bool disable_TX_on_73 () const;
 | |
|   int beacon () const;
 | |
|   int watchdog () const;
 | |
|   bool TX_messages () const;
 | |
|   bool split_mode () const;
 | |
|   bool enable_VHF_features () const;
 | |
|   bool decode_at_52s () const;
 | |
|   bool single_decode () const;
 | |
|   bool twoPass() const;
 | |
|   bool bFox() const;
 | |
|   bool bHound() const;
 | |
|   bool x2ToneSpacing() const;
 | |
|   bool x4ToneSpacing() const;
 | |
|   bool contestMode() const;
 | |
|   bool MyDx() const;
 | |
|   bool CQMyN() const;
 | |
|   bool NDxG() const;
 | |
|   bool NN() const;
 | |
|   bool EMEonly() const;
 | |
|   bool post_decodes () const;
 | |
|   QString opCall() const;
 | |
|   QString aprs_server_name () const;
 | |
|   port_type aprs_server_port () const;
 | |
|   QString aprs_passcode () const;
 | |
|   QString udp_server_name () const;
 | |
|   port_type udp_server_port () const;
 | |
|   QString n1mm_server_name () const;
 | |
|   port_type n1mm_server_port () const;
 | |
|   bool valid_n1mm_info () const;
 | |
|   bool broadcast_to_n1mm() const;
 | |
|   bool accept_udp_requests () const;
 | |
|   bool udpWindowToFront () const;
 | |
|   bool udpWindowRestore () const;
 | |
|   bool udpEnabled () const;
 | |
|   Bands * bands ();
 | |
|   Bands const * bands () const;
 | |
|   IARURegions::Region region () const;
 | |
|   FrequencyList_v2 * frequencies ();
 | |
|   FrequencyList_v2 const * frequencies () const;
 | |
|   StationList * stations ();
 | |
|   StationList const * stations () const;
 | |
|   bool auto_switch_bands() const;
 | |
|   QStringListModel * macros ();
 | |
|   QStringListModel const * macros () const;
 | |
|   QDir save_directory () const;
 | |
|   QDir azel_directory () const;
 | |
|   QString sound_dm_path() const;
 | |
|   QString sound_am_path() const;
 | |
|   QString rig_name () const;
 | |
|   Type2MsgGen type_2_msg_gen () const;
 | |
|   QColor color_table_background() const;
 | |
|   QColor color_table_highlight() const;
 | |
|   QColor color_table_foreground() const;
 | |
|   QColor color_CQ () const;
 | |
|   QColor color_MyCall () const;
 | |
|   QColor color_rx_background () const;
 | |
|   QColor color_rx_foreground () const;
 | |
|   QColor color_tx_foreground () const;
 | |
|   QColor color_compose_background () const;
 | |
|   QColor color_compose_foreground () const;
 | |
|   QColor color_DXCC () const;
 | |
|   QColor color_NewCall () const;
 | |
|   bool pwrBandTxMemory () const;
 | |
|   bool pwrBandTuneMemory () const;
 | |
| 
 | |
|   struct CalibrationParams
 | |
|   {
 | |
|     CalibrationParams ()
 | |
|       : intercept {0.}
 | |
|       , slope_ppm {0.}
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     CalibrationParams (double the_intercept, double the_slope_ppm)
 | |
|       : intercept {the_intercept}
 | |
|       , slope_ppm {the_slope_ppm}
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     double intercept;           // Hertz
 | |
|     double slope_ppm;           // Hertz
 | |
|   };
 | |
| 
 | |
|   // Temporarily enable or disable calibration adjustments.
 | |
|   void enable_calibration (bool = true);
 | |
| 
 | |
|   // Set the calibration parameters and enable calibration corrections.
 | |
|   void set_calibration (CalibrationParams);
 | |
| 
 | |
|   // Set the dynamic grid which is only used if configuration setting is enabled.
 | |
|   void set_dynamic_location (QString const&);
 | |
| 
 | |
|   // Set the dynamic statios message which is only used if configuration setting is enabled.
 | |
|   void set_dynamic_station_message(QString const& qtc);
 | |
| 
 | |
| 
 | |
|   // This method queries if a CAT and PTT connection is operational.
 | |
|   bool is_transceiver_online () const;
 | |
| 
 | |
|   // Start the rig connection, safe and normal to call when rig is
 | |
|   // already open.
 | |
|   bool transceiver_online ();
 | |
| 
 | |
|   // check if a real rig is configured
 | |
|   bool is_dummy_rig () const;
 | |
| 
 | |
|   // Frequency resolution of the rig
 | |
|   //
 | |
|   //  0 - 1Hz
 | |
|   //  1 - 10Hz rounded
 | |
|   // -1 - 10Hz truncated
 | |
|   //  2 - 100Hz rounded
 | |
|   // -2 - 100Hz truncated
 | |
|   int transceiver_resolution () const;
 | |
| 
 | |
|   // Close down connection to rig.
 | |
|   void transceiver_offline ();
 | |
| 
 | |
|   // Set transceiver frequency in Hertz.
 | |
|   Q_SLOT void transceiver_frequency (Frequency);
 | |
| 
 | |
|   // Setting a non zero TX frequency means split operation
 | |
|   // rationalise_mode means ensure TX uses same mode as RX.
 | |
|   Q_SLOT void transceiver_tx_frequency (Frequency = 0u);
 | |
| 
 | |
|   // Set transceiver mode.
 | |
|   //
 | |
|   // Rationalise means ensure TX uses same mode as RX.
 | |
|   Q_SLOT void transceiver_mode (MODE);
 | |
| 
 | |
|   // Set/unset PTT.
 | |
|   //
 | |
|   // Note that this must be called even if VOX PTT is selected since
 | |
|   // the "Emulate Split" mode requires PTT information to coordinate
 | |
|   // frequency changes.
 | |
|   Q_SLOT void transceiver_ptt (bool = true);
 | |
| 
 | |
|   // Attempt to (re-)synchronise transceiver state.
 | |
|   //
 | |
|   // Force signal guarantees either a transceiver_update or a
 | |
|   // transceiver_failure signal.
 | |
|   //
 | |
|   // The enforce_mode_and_split parameter ensures that future
 | |
|   // transceiver updates have the correct mode and split setting
 | |
|   // i.e. the transceiver is ready for use.
 | |
|   Q_SLOT void sync_transceiver (bool force_signal = false, bool enforce_mode_and_split = false);
 | |
| 
 | |
| 
 | |
|   //
 | |
|   // These signals indicate a font has been selected and accepted for
 | |
|   // the application text and decoded text respectively.
 | |
|   //
 | |
|   Q_SIGNAL void gui_text_font_changed (QFont);
 | |
|   Q_SIGNAL void tx_text_font_changed (QFont);
 | |
|   Q_SIGNAL void rx_text_font_changed (QFont);
 | |
|   Q_SIGNAL void compose_text_font_changed (QFont);
 | |
|   Q_SIGNAL void table_font_changed (QFont);
 | |
|   Q_SIGNAL void colors_changed ();
 | |
| 
 | |
|   //
 | |
|   // This signal is emitted when the UDP server changes
 | |
|   //
 | |
|   Q_SIGNAL void udp_server_changed (QString const& udp_server);
 | |
|   Q_SIGNAL void udp_server_port_changed (port_type server_port);
 | |
| 
 | |
|   // This signal is emitted when the band schedule changes
 | |
|   Q_SIGNAL void band_schedule_changed (StationList &stations);
 | |
| 
 | |
|   //
 | |
|   // These signals are emitted and reflect transceiver state changes
 | |
|   //
 | |
| 
 | |
|   // signals a change in one of the TransceiverState members
 | |
|   Q_SIGNAL void transceiver_update (Transceiver::TransceiverState const&) const;
 | |
| 
 | |
|   // Signals a failure of a control rig CAT or PTT connection.
 | |
|   //
 | |
|   // A failed rig CAT or PTT connection is fatal and the underlying
 | |
|   // connections are closed automatically. The connections can be
 | |
|   // re-established with a call to transceiver_online(true) assuming
 | |
|   // the fault condition has been rectified or is transient.
 | |
|   Q_SIGNAL void transceiver_failure (QString const& reason) const;
 | |
| 
 | |
| private:
 | |
|   class impl;
 | |
|   pimpl<impl> m_;
 | |
| };
 | |
| 
 | |
| #if QT_VERSION < 0x050500
 | |
| Q_DECLARE_METATYPE (Configuration::DataMode);
 | |
| Q_DECLARE_METATYPE (Configuration::Type2MsgGen);
 | |
| #endif
 | |
| 
 | |
| #if !defined (QT_NO_DEBUG_STREAM)
 | |
| ENUM_QDEBUG_OPS_DECL (Configuration, DataMode);
 | |
| ENUM_QDEBUG_OPS_DECL (Configuration, Type2MsgGen);
 | |
| #endif
 | |
| 
 | |
| ENUM_QDATASTREAM_OPS_DECL (Configuration, DataMode);
 | |
| ENUM_QDATASTREAM_OPS_DECL (Configuration, Type2MsgGen);
 | |
| 
 | |
| ENUM_CONVERSION_OPS_DECL (Configuration, DataMode);
 | |
| ENUM_CONVERSION_OPS_DECL (Configuration, Type2MsgGen);
 | |
| 
 | |
| #endif
 | 
