File: Configuration.h

package info (click to toggle)
js8call 2.5.1%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 24,720 kB
  • sloc: cpp: 562,655; sh: 898; python: 132; ansic: 102; makefile: 4
file content (426 lines) | stat: -rw-r--r-- 14,324 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
#ifndef CONFIGURATION_HPP_
#define CONFIGURATION_HPP_

#include <QAction>
#include <QFont>
#include <QLineEdit>
#include <QObject>

#include "JS8_Audio/AudioDevice.h"
#include "JS8_Main/IARURegions.h"
#include "JS8_Main/Radio.h"
#include "JS8_Main/StationList.h"
#include "JS8_Transceiver/Transceiver.h"

#include "JS8_Include/pimpl_h.h"

class QSettings;
class QWidget;
class QAudioDevice;
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 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  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)

  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)

    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 writeable_data_dir() const;

    QAudioDevice const &audio_input_device() const;
    AudioDevice::Channel audio_input_channel() const;
    QAudioDevice const &audio_output_device() const;
    AudioDevice::Channel audio_output_channel() const;
    QAudioDevice const &notification_audio_output_device() const;

    bool notifications_enabled() const;
    QString notification_path(const QString &key) const;
    Q_SIGNAL void test_notify(const QString &key);

    // 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 restart_notification_audio_output() const;

    bool use_dynamic_grid() const;
    QString my_callsign() const;
    QString my_grid() const;
    QSet<QString> my_groups() const;
    void addGroup(QString const &group);
    void removeGroup(QString const &group);
    QSet<QString> auto_whitelist() const;
    QSet<QString> auto_blacklist() const;
    QSet<QString> hb_blacklist() const;
    QSet<QString> spot_blacklist() const;
    QSet<QString> primary_highlight_words() const;
    QSet<QString> secondary_highlight_words() const;
    int activity_aging() const;
    int callsign_aging() const;
    QString eot() const;
    QString mfi() const;
    QString my_info() const;
    QString my_status() const;
    QString hb_message() 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;
    double txDelay() const;
    bool write_logs() const;
    bool reset_activity() const;
    bool check_for_updates() const;
    bool tx_qsy_allowed() const;
    bool spot_to_reporting_networks() const;
    void set_spot_to_reporting_networks(bool);
    bool spot_to_aprs() const;
    bool transmit_directed() const;
    bool autoreply_on_at_startup() const;
    bool autoreply_confirmation() const;
    bool heartbeat_anywhere() const;
    bool heartbeat_qso_pause() const;
    bool heartbeat_ack_snr() const;
    bool relay_off() const;
    bool psk_reporter_tcpip() const;
    bool monitor_off_at_startup() const;
    bool transmit_off_at_startup() const;
    bool monitor_last_used() const;
    bool insert_blank() const;
    bool DXCC() const;
    bool ppfx() const;
    bool miles() const;
    bool hold_ptt() const;
    bool avoid_forced_identify() const;
    bool avoid_allcall() const;
    void set_avoid_allcall(bool avoid);
    bool spellcheck() const;
    int heartbeat() const;
    int watchdog() const;
    bool TX_messages() const;
    bool split_mode() const;
    QString opCall() const;
    QString ptt_command() const;
    QString aprs_server_name() const;
    port_type aprs_server_port() const;
    QString udp_server_name() const;
    port_type udp_server_port() const;
    QString tcp_server_name() const;
    port_type tcp_server_port() const;
    QString n1mm_server_name() const;
    port_type n1mm_server_port() const;
    bool valid_n1mm_info() const;
    bool broadcast_to_n1mm() const;
    QString n3fjp_server_name() const;
    port_type n3fjp_server_port() const;
    bool valid_n3fjp_info() const;
    bool broadcast_to_n3fjp() const;
    bool accept_udp_requests() const;
    bool accept_tcp_requests() const;
    bool udpEnabled() const;
    bool tcpEnabled() const;
    // WSJT-X Protocol settings
    /**
     * @brief Check if WSJT-X protocol is enabled
     * @return true if WSJT-X protocol is enabled, false otherwise
     */
    bool wsjtx_protocol_enabled() const;

    /**
     * @brief Get WSJT-X server hostname or IP address
     * @return Server address (supports multicast addresses)
     */
    QString wsjtx_server_name() const;

    /**
     * @brief Get WSJT-X server UDP port
     * @return UDP port number
     */
    port_type wsjtx_server_port() const;

    /**
     * @brief Get WSJT-X multicast TTL
     * @return Time-to-live value for multicast packets
     */
    int wsjtx_TTL() const;

    /**
     * @brief Check if WSJT-X accepts incoming requests
     * @return true if accepting requests, false otherwise
     */
    bool wsjtx_accept_requests() const;

    /**
     * @brief Get selected network interface names for multicast
     * @return List of network interface names
     */
    QStringList wsjtx_interface_names() const;
    int tcp_max_connections() 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;
    QString rig_name() const;
    QColor color_table_background() const;
    QColor color_table_highlight() const;
    QColor color_table_foreground() const;
    QColor color_primary_highlight() const;
    QColor color_secondary_highlight() 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 station info message which is only used if configuration
    // setting is enabled.
    void set_dynamic_station_info(QString const &info);

    // Set the dynamic station status message which is only used if
    // configuration setting is enabled.
    void set_dynamic_station_status(QString const &status);

    // 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);

    Q_SLOT void invalidate_audio_input_device(QString error);
    Q_SLOT void invalidate_audio_output_device(QString error);
    Q_SLOT void invalidate_notification_audio_output_device(QString error);

    //
    // 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 & TCP server changes
    //
    Q_SIGNAL void udp_server_name_changed(QString const &name);
    Q_SIGNAL void udp_server_port_changed(port_type port);
    Q_SIGNAL void tcp_server_changed(QString const &host);
    Q_SIGNAL void tcp_server_port_changed(port_type port);
    Q_SIGNAL void tcp_max_connections_changed(int n);
    // WSJT-X Protocol signals
    /**
     * @brief Emitted when WSJT-X protocol enabled state changes
     * @param enabled New enabled state
     */
    Q_SIGNAL void wsjtx_protocol_enabled_changed(bool) const;

    /**
     * @brief Emitted when WSJT-X server address changes
     * @param server_name New server address
     */
    Q_SIGNAL void wsjtx_server_changed(QString const &) const;

    /**
     * @brief Emitted when WSJT-X server port changes
     * @param port New port number
     */
    Q_SIGNAL void wsjtx_server_port_changed(port_type) const;

    /**
     * @brief Emitted when WSJT-X TTL changes
     * @param ttl New TTL value
     */
    Q_SIGNAL void wsjtx_TTL_changed(int) const;

    /**
     * @brief Emitted when WSJT-X network interfaces selection changes
     * @param interfaces New list of selected interface names
     */
    Q_SIGNAL void wsjtx_interfaces_changed(QStringList const &) const;

    // This signal is emitted when the band schedule changes
    Q_SIGNAL void band_schedule_changed(StationList &stations);

    // This signal is emitted when the auto switch bands choice changes
    Q_SIGNAL void auto_switch_bands_changed(bool auto_switch_bands);

    // This signal is emitted when the user requests a manual station hop
    Q_SIGNAL void manual_band_hop_requested(StationList::Station const station);

    //
    // 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;

    // signal announces audio devices are being enumerated
    //
    // As this can take some time, particularly on Linux, consumers
    // might like to notify the user.
    Q_SIGNAL void enumerating_audio_devices();

  private:
    class impl;
    pimpl<impl> m_;
};

#if QT_VERSION < 0x050500
Q_DECLARE_METATYPE(Configuration::DataMode);
#endif

#if !defined(QT_NO_DEBUG_STREAM)
ENUM_QDEBUG_OPS_DECL(Configuration, DataMode);
#endif

ENUM_QDATASTREAM_OPS_DECL(Configuration, DataMode);

ENUM_CONVERSION_OPS_DECL(Configuration, DataMode);

#endif