File: dmr6x2uv2_codeplug.hh

package info (click to toggle)
qdmr 0.13.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 22,420 kB
  • sloc: cpp: 95,929; xml: 10,749; python: 1,108; makefile: 78; sh: 9
file content (399 lines) | stat: -rw-r--r-- 16,389 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
#ifndef DMR6X2UV2CODEPLUG_HH
#define DMR6X2UV2CODEPLUG_HH

#include "dmr6x2uv_codeplug.hh"
#include "d878uv_codeplug.hh"


/** Represents the device specific binary codeplug for BTECH DMR-6X2UV PRO radios.
 *
 * This codeplug implementation is compatible with firmware revision 1.21.
 *
 * For details, see https://dmr-tools.github.io/codeplugs
 *
 * @ingroup dmr6x2uv */
class DMR6X2UV2Codeplug : public DMR6X2UVCodeplug
{
  Q_OBJECT

protected:
public:
  /** General settings element for the DMR-6X2UV PRO.
   *
   * Extends the @c DMR6X2UVCodeplug::GeneralSettingsElement by the device specific settings for
   * the BTECH DMR-6X2UV PRO. */
  class GeneralSettingsElement: public DMR6X2UVCodeplug::GeneralSettingsElement
  {
  protected:
    /** Device specific encoding of the key functions. */
    struct KeyFunction {
    public:
      /** Encodes key function. */
      static uint8_t encode(AnytoneKeySettingsExtension::KeyFunction tone);
      /** Decodes key function. */
      static AnytoneKeySettingsExtension::KeyFunction decode(uint8_t code);

    protected:
      /** Device specific key functions. */
      typedef enum {
        Off = 0x00, Voltage = 0x01, Power = 0x02, Repeater = 0x03, Reverse = 0x04,
        Encryption = 0x05, Call = 0x06, VOX = 0x07, ToggleVFO = 0x08, SubPTT = 0x09,
        Scan = 0x0a, WFM = 0x0b, Alarm = 0x0c, RecordSwitch = 0x0d, Record = 0x0e, SMS = 0x0f,
        Dial = 0x10, GPSInformation = 0x11, Monitor = 0x12, ToggleMainChannel = 0x13, HotKey1 = 0x14,
        HotKey2 = 0x15, HotKey3 = 0x16, HotKey4 = 0x17, HotKey5 = 0x18, HotKey6 = 0x19,
        WorkAlone = 0x1a, SkipChannel = 0x1b, DMRMonitor = 0x1c, SubChannel = 0x1d,
        PriorityZone = 0x1e, VFOScan = 0x1f, MICSoundQuality = 0x20, LastCallReply = 0x21,
        ChannelType = 0x22, SimplexRepeater = 0x23, Ranging = 0x24, ChannelRanging = 0x25,
        MaxVolume = 0x26, Slot = 0x27, Squelch = 0x28, Roaming = 0x29, Zone = 0x2a, RoamingSet = 0x2b,
        Mute = 0x02c, CtcssDcsSet=0x2d, APRSType = 0x2e, APRSSet = 0x2f, TBSTSend = 0x30,
        BluetoothToggle = 0x31, GPSToggle = 0x32, ChannelName = 0x33, APRSSend = 0x34,
        APRSInfo = 0x35, GPSRoaming = 0x36, CTCSSScan = 0x37, DIMShut = 0x38, SatellitePredict = 0x39
      } KeyFunctionCode;
    };

  protected:
    /** Hidden Constructor. */
    GeneralSettingsElement(uint8_t *ptr, unsigned size);

  public:
    /** Constructor. */
    explicit GeneralSettingsElement(uint8_t *ptr);

    /** Returns the size of the element. */
    static constexpr unsigned int size() { return 0x00e0; }

    AnytoneKeySettingsExtension::KeyFunction funcKeyAShort() const;
    void setFuncKeyAShort(AnytoneKeySettingsExtension::KeyFunction func);
    AnytoneKeySettingsExtension::KeyFunction funcKeyBShort() const;
    void setFuncKeyBShort(AnytoneKeySettingsExtension::KeyFunction func);
    AnytoneKeySettingsExtension::KeyFunction funcKeyCShort() const;
    void setFuncKeyCShort(AnytoneKeySettingsExtension::KeyFunction func);
    AnytoneKeySettingsExtension::KeyFunction funcKey1Short() const;
    void setFuncKey1Short(AnytoneKeySettingsExtension::KeyFunction func);
    AnytoneKeySettingsExtension::KeyFunction funcKey2Short() const;
    void setFuncKey2Short(AnytoneKeySettingsExtension::KeyFunction func);
    AnytoneKeySettingsExtension::KeyFunction funcKeyALong() const;
    void setFuncKeyALong(AnytoneKeySettingsExtension::KeyFunction func);
    AnytoneKeySettingsExtension::KeyFunction funcKeyBLong() const;
    void setFuncKeyBLong(AnytoneKeySettingsExtension::KeyFunction func);
    AnytoneKeySettingsExtension::KeyFunction funcKeyCLong() const;
    void setFuncKeyCLong(AnytoneKeySettingsExtension::KeyFunction func);
    AnytoneKeySettingsExtension::KeyFunction funcKey1Long() const;
    void setFuncKey1Long(AnytoneKeySettingsExtension::KeyFunction func);
    AnytoneKeySettingsExtension::KeyFunction funcKey2Long() const;
    void setFuncKey2Long(AnytoneKeySettingsExtension::KeyFunction func);

    bool fromConfig(const Flags &flags, Context &ctx);
    bool updateConfig(Context &ctx);

  protected:
    /** Some internal used offsets within the element. */
    struct Offset: public D868UVCodeplug::GeneralSettingsElement::Offset {
      /// @cond DO_NOT_DOCUMENT
      /// @endcond
    };

  };


  /** Implements some settings extension for the BTECH DMR-6X2UV PRO. */
  class ExtendedSettingsElement: public DMR6X2UVCodeplug::ExtendedSettingsElement
  {
  public:
    enum class GNSS {
      GPS=0, BeiDou=1, Both=2
    };

    enum class ChannelIndexDisplay {
      GlobalIndex = 0, IndexWithinZone = 1
    };

    enum class Power {
      Low = 0, Medium = 1, High = 2, Turbo = 3
    };

  protected:
    /** Hidden Constructor. */
    ExtendedSettingsElement(uint8_t *ptr, unsigned size);

  public:
    /** Constructor. */
    explicit ExtendedSettingsElement(uint8_t *ptr);

    /** Returns the size of the element. */
    static constexpr unsigned int size() { return 0x0030; }

    /** Returns @c true, if bluetooth is enabled. */
    virtual bool bluetoothEnabled() const;
    /** Enables/disables bluetooth. */
    virtual void enableBluetooth(bool enable);

    /** Returns @c true, if the internal mic is enabled additionally to the bluetooth input. */
    virtual bool internalMicEnabled() const;
    /** Enables/disables the internal mic additionally to the bluetooth input. */
    virtual void enableInternalMic(bool enable);

    /** Returns @c true, if the internal speaker is enabled additionally to the bluetooth output. */
    virtual bool internalSpeakerEnabled() const;
    /** Enables/disables the internal speaker additionally to the bluetooth output. */
    virtual void enableInternalSpeaker(bool enable);

    /** Returns the bluetooth mic gain. Valid values are 0,...,4. */
    virtual unsigned int bluetoothMicGain() const;
    /** Sets the bluetooth mic gain. Valid values are 0,...,4. */
    virtual void setBluetoothMicGain(unsigned int gain);

    /** Returns the bluetooth speaker gain. Valid values are 0,...,4. */
    virtual unsigned int bluetoothSpeakerGain() const;
    /** Sets the bluetooth speaker gain. Valid values are 0,...,4. */
    virtual void setBluetoothSpeakerGain(unsigned int gain);

    /** Returns the hold duration. */
    virtual Interval bluetoothHoldDuration() const;
    /** Sets the hold duration. */
    virtual void setBluetoothHoldDuration(const Interval &dur);

    /** Returns the hold delay. */
    virtual Interval bluetoothHoldDelay() const;
    /** Sets the hold duration. */
    virtual void setBluetoothHoldDelay(const Interval &dur);

    /** Returns @c true, if PTT latches. */
    virtual bool bluetoothPTTLatchEnabled() const;
    /** Enable/disable bluetooth PTT latch. */
    virtual void enableBluetoothPTTLatch(bool enable);

    /** Returns the bluetooth PTT sleep timeout. */
    virtual Interval bluetoothPTTSleepTimeout() const;
    /** Sets the bluetooth PTT sleep timeout. */
    virtual void setBluetoothPTTSleepTimeout(const Interval &dur);

    /** Returns @c true if the FM channel idle tone is enabled. */
    virtual bool fmIdleToneEnabled() const;
    /** Enables/disables FM channel idle tone. */
    virtual void enableFMIdleTone(bool enable);

    /** Returns the FM mic gain [1-10]. */
    virtual unsigned int fmMicGain() const;
    /** Sets the FM mic gain [1-10]. */
    virtual void setFMMicGain(unsigned int gain);

    /** Returns @c true, if transmit timeout warning tone is enabled. */
    virtual bool totWarningToneEnabled() const;
    /** Enables/disables transmit timeout warning tone. */
    virtual void enableTOTWarningTone(bool enable);

    /** Returns @c true, if ATPC is enabled. */
    virtual bool atpcEnabled() const;
    /** Enables/disables ATPC. */
    virtual void enableATPC(bool enable);

    /** Returns enabled GNSSs */
    virtual AnytoneGPSSettingsExtension::GPSMode gnss() const;
    /** Sets enabled GNSSs */
    virtual void setGNSS(AnytoneGPSSettingsExtension::GPSMode gnss);

    /** Returns the channel index display mode. */
    virtual ChannelIndexDisplay channelIndexDisplay() const;
    /** Sets the channel index display mode. */
    virtual void setChannelIndexDisplay(ChannelIndexDisplay mode);

    /** Returns @c true if the weather alarm is enabled. */
    virtual bool wxAlarmEnabled() const;
    /** Enables/disables the weather alarm. */
    virtual void enableWXAlarm(bool enable);

    /** Returns @c true if the location is taken from GNSS, otherwise a fixed location is used. */
    virtual bool locationSourceGNSS() const;
    /** Returns the fixed location index. */
    virtual unsigned int fixedLocationIndex() const;
    /** Sets the fixed location index. */
    virtual void setFixedLocationIndex(unsigned int idx);
    /** Sets the location source to GNSS. */
    virtual void setLocationSourceGNSS();

    /** Returns the power setting for satellite mode. */
    virtual Channel::Power satPower() const;
    /** Sets the power level for satellite mode. */
    virtual void setSatPower(Channel::Power power);

    /** Returns the squelch level for satellite mode [0,1-10], 0=open.*/
    virtual unsigned int satSquelchLevel() const;
    /** Sets the squelch level for satellite mode [0,1-10], 0=open. */
    virtual void setSatSquelchLevel(unsigned int level);

    bool fromConfig(const Flags &flags, Context &ctx, const ErrorStack &err=ErrorStack());
    bool updateConfig(Context &ctx, const ErrorStack &err=ErrorStack());
    bool linkConfig(Context &ctx, const ErrorStack &err=ErrorStack());

  protected:
    /** Some internal offset within the codeplug element. */
    struct Offset {
      /// @cond DO_NOT_DOCUEMNT
      static constexpr unsigned int bluetoothEnable()            { return 0x0016; }
      static constexpr unsigned int internalMicEnable()          { return 0x0017; }
      static constexpr unsigned int internalSpeakerEnable()      { return 0x0018; }
      static constexpr unsigned int bluetoothMicGain()           { return 0x0019; }
      static constexpr unsigned int bluetoothSpeakerGain()       { return 0x001a; }
      static constexpr unsigned int bluetoothHoldDuration()      { return 0x001b; }
      static constexpr unsigned int bluetoothHoldDelay()         { return 0x001c; }
      static constexpr unsigned int bluetoothPTTLatch()          { return 0x001d; }
      static constexpr unsigned int bluetoothPTTSleepTimeout()   { return 0x001e; }
      static constexpr unsigned int fmIdleTone()                 { return 0x001f; }
      static constexpr unsigned int fmMicGain()                  { return 0x0020; }
      static constexpr unsigned int totWarningTone()             { return 0x0021; }
      static constexpr unsigned int atpc()                       { return 0x0022; }
      static constexpr unsigned int gnss()                       { return 0x0023; }
      static constexpr unsigned int displayChannelIndex()        { return 0x0024; }
      static constexpr unsigned int wxAlarm()                    { return 0x0026; }
      static constexpr unsigned int fixedLocationIndex()         { return 0x0027; }
      static constexpr unsigned int satPower()                   { return 0x0028; }
      static constexpr unsigned int satSquelch()                 { return 0x0029; }
      /// @endcond
    };
  };


  /** Implements a single APRS RX filter. */
  class APRSFilterElement: public Element
  {
  protected:
    /** Hidden constructor. */
    APRSFilterElement(uint8_t *ptr, size_t size);

  public:
    /** Constructor. */
    APRSFilterElement(uint8_t *ptr);

    void clear() override;
    bool isValid() const override;

    /** The size of the element. */
    static constexpr unsigned int size() { return 0x08; }

    /** Returns the call. */
    virtual QString call() const;
    /** Sets the callsign. */
    virtual void setCall(const QString &call);

    /** Returns the SSID. */
    virtual unsigned int ssid() const;
    /** Sets the SSID. */
    virtual void setSSID(unsigned int ssid);

  public:
    /** Some limits for the element. */
    struct Limit: public Element::Limit {
      /** Maximum call sign length. */
      static constexpr unsigned int call() { return 6; }
    };

  protected:
    /** Internal Offsets. */
    struct Offset: public Element::Offset {
      /// @cond DO_NOT_DOCUMENT
      static constexpr unsigned int valid() { return 0x0000; }
      static constexpr unsigned int call()  { return 0x0001; }
      static constexpr unsigned int ssid()  { return 0x0007; }
      /// @endcond
    };
  };


  /** Implements a GPS roaming zone. */
  class GPSRoamingZoneElement: public Element
  {
  protected:
    /** Hidden constructor. */
    GPSRoamingZoneElement(uint8_t *ptr, size_t size);

  public:
    /** Constructor. */
    GPSRoamingZoneElement(uint8_t *ptr);

    /** Size of the element. */
    static constexpr unsigned int size() { return 0x0020; }

    void clear() override;
    bool isValid() const override;

    /** Returns @c true, if a roaming zone is set. */
    virtual bool hasRoamingZoneIndex() const;
    /** Returns the roaming zone index. */
    virtual unsigned int roamingZoneIndex() const;
    /** Sets the roaming zone index. */
    virtual void setRoamingZoneIndex(unsigned int idx);
    /** Clears the roaming zone index. */
    virtual void clearRoamingZoneIndex();

    /** Returns the center of the roaming zone. */
    virtual QGeoCoordinate coordinate() const;
    /** Sets the center of the roaming zone. */
    virtual void setCoordinate(const QGeoCoordinate &coor);

    /** Returns the radius in unknown units. */
    virtual unsigned int radius() const;
    /** Sets the radius in unknown units. */
    virtual void setRadius(unsigned int radius);

  protected:
    /** Internal offsets. */
    struct Offset: Element::Offset {
      /// @cond DO_NOT_DOCUMENT
      static constexpr unsigned int valid()                             { return 0x0000; }
      static constexpr unsigned int zoneIndex()                         { return 0x0001; }
      static constexpr unsigned int latDegrees()                        { return 0x0002; }
      static constexpr unsigned int latMinutes()                        { return 0x0003; }
      static constexpr unsigned int latSeconds()                        { return 0x0004; }
      static constexpr unsigned int latHemisphere()                     { return 0x0005; }
      static constexpr unsigned int lonDegrees()                        { return 0x0006; }
      static constexpr unsigned int lonMinutes()                        { return 0x0007; }
      static constexpr unsigned int lonSeconds()                        { return 0x0008; }
      static constexpr unsigned int lonHemisphere()                     { return 0x0009; }
      static constexpr unsigned int radius()                            { return 0x000c; }
      /// @endcond
    };
  };


public:
  /** Hidden constructor. */
  explicit DMR6X2UV2Codeplug(const QString &label, QObject *parent=nullptr);

public:
  /** Empty constructor. */
  explicit DMR6X2UV2Codeplug(QObject *parent=nullptr);

public:
  /** Some limits for the codeplug. */
  struct Limit: public DMR6X2UVCodeplug::Limit {
    /** Maximum number of APRS receive filters. */
    static constexpr unsigned int aprsFilter() { return 32; }
    /** Maximum number of GPS roaming zones. */
    static constexpr unsigned int gpsRoamingZones() { return 32; }
  };

protected:
  void allocateUpdated() override;
  void allocateForEncoding() override;
  void allocateForDecoding() override;

  bool encodeElements(const Flags &flags, Context &ctx, const ErrorStack &err=ErrorStack()) override;
  bool createElements(Context &ctx, const ErrorStack &err=ErrorStack()) override;

  void allocateGeneralSettings() override;
  bool encodeGeneralSettings(const Flags &flags, Context &ctx, const ErrorStack &err=ErrorStack()) override;
  bool decodeGeneralSettings(Context &ctx, const ErrorStack &err=ErrorStack()) override;
  bool linkGeneralSettings(Context &ctx, const ErrorStack &err=ErrorStack()) override;

protected:
  /** Some offsets within the codeplug. */
  struct Offset: public DMR6X2UVCodeplug::Offset {
    /// @cond DO_NOT_DOCUMENT
    static constexpr unsigned int aprsFilterBank()      { return 0x02501800; }
    static constexpr unsigned int gpsRoamingZones()     { return 0x02504000; }
    /// @endcond
  };
};

#endif // DMR6X2UV2CODEPLUG_HH