~hmatuschek/+junk/qdmr-package

« back to all changes in this revision

Viewing changes to test/rd5rtest.cc

  • Committer: Hannes Matuschek
  • Date: 2020-07-07 14:34:22 UTC
  • mto: (17.1.1 qdmr-package)
  • mto: This revision was merged to the branch mainline in revision 10.
  • Revision ID: hmatuschek@gmail.com-20200707143422-1djcxrjkem3k5kb1
Tags: upstream-0.3.0
ImportĀ upstreamĀ versionĀ 0.3.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include "rd5rtest.hh"
 
2
#include "config.hh"
 
3
#include <QTest>
 
4
#include "utils.hh"
 
5
#include <QDebug>
 
6
 
 
7
RD5RTest::RD5RTest(QObject *parent) : QObject(parent)
 
8
{
 
9
  // pass...
 
10
}
 
11
 
 
12
void
 
13
RD5RTest::initTestCase() {
 
14
  // Read simple configuration file
 
15
  QString errMessage;
 
16
  QVERIFY(_config.readCSV("://testconfig.conf", errMessage));
 
17
  // Encode config as code-plug
 
18
  QVERIFY(_codeplug.encode(&_config));
 
19
}
 
20
 
 
21
void
 
22
RD5RTest::cleanupTestCase() {
 
23
  // clear codeplug
 
24
  _codeplug.clear();
 
25
}
 
26
 
 
27
void
 
28
RD5RTest::testRadioName() {
 
29
  QCOMPARE(decode_ascii(_codeplug.data(0x000e0+0x00), 8, 0xff), QString("DM3MAT"));
 
30
}
 
31
 
 
32
void
 
33
RD5RTest::testDMRID() {
 
34
  QCOMPARE(decode_dmr_id_bcd(_codeplug.data(0x000e0+0x08)), 1234567U);
 
35
}
 
36
 
 
37
void
 
38
RD5RTest::testIntroLines() {
 
39
  QCOMPARE(decode_ascii(_codeplug.data(0x07540+0x00), 16, 0xff), QString("ABC"));
 
40
  QCOMPARE(decode_ascii(_codeplug.data(0x07540+0x10), 16, 0xff), QString("DEF"));
 
41
}
 
42
 
 
43
void
 
44
RD5RTest::testGeneralDefaults() {
 
45
  // Unused 0x00
 
46
  QCOMPARE((int)*(uint32_t *)_codeplug.data(0x000e0+0x0c), 0);
 
47
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x000e0+0x10), 0);
 
48
  // TX preamble default=0x06
 
49
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x000e0+0x11), 6);
 
50
  // Monitor type 0=open SQ
 
51
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x000e0+0x12), 0);
 
52
  // VOX sensitivity default=3
 
53
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x000e0+0x13), 3);
 
54
  // low batt interval default=6
 
55
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x000e0+0x14), 6);
 
56
  // Call alert dur default=0x18
 
57
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x000e0+0x15), 0x18);
 
58
  // Lone worker response default=1
 
59
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x000e0+0x16), 1);
 
60
   // Lone worker reminder default=10
 
61
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x000e0+0x17), 10);
 
62
  // Group call hang time default=6
 
63
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x000e0+0x18), 6);
 
64
  // Private call hang time default=6
 
65
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x000e0+0x19), 6);
 
66
  // Up/Down-Ch mode, RST tone, unk. numb. tone, ARTS tone, default=0x40
 
67
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x000e0+0x1a), 0x40);
 
68
  // perm. tone analog/digi, self-test tone, CH freq. ind. tone, dis. all tones, save bat, default=0xc4
 
69
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x000e0+0x1b), 0xc4);
 
70
   // dis. LEDs, quick-key override, default=0x80
 
71
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x000e0+0x1c), 0x80);
 
72
  // TX exit tone, TX on act. CH, animation, scan mode, default=0x10
 
73
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x000e0+0x1d), 0x10);
 
74
  // repeat. delay & STE, default=0
 
75
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x000e0+0x1e), 0);
 
76
  // unused 0x00
 
77
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x000e0+0x1f), 0);
 
78
  // prog passwd., disabled=0xffffffffffffffff
 
79
  QCOMPARE(*(uint64_t *)_codeplug.data(0x000e0+0x20), 0xffffffffffffffffUL);
 
80
}
 
81
 
 
82
void
 
83
RD5RTest::testDigitalContacts() {
 
84
  /*
 
85
   * Test Contact 01
 
86
   */
 
87
  QCOMPARE(decode_ascii(_codeplug.data(0x01788+0x00), 16, 0xff), QString("Lokal"));
 
88
  QCOMPARE(decode_dmr_id_bcd(_codeplug.data(0x01788+0x10)), 9U);
 
89
  QCOMPARE((int)*((uint8_t *)_codeplug.data(0x01788+0x14)), 0x00); // group call
 
90
  QCOMPARE((int)*((uint8_t *)_codeplug.data(0x01788+0x15)), 0x00); // receive tone (off)
 
91
  QCOMPARE((int)*((uint8_t *)_codeplug.data(0x01788+0x16)), 0x00); // ring style (off)
 
92
  QCOMPARE((int)*((uint8_t *)_codeplug.data(0x01788+0x17)), 0x00); // unused byte 0x00
 
93
 
 
94
  /*
 
95
   * Test Contact 02
 
96
   */
 
97
  QCOMPARE(decode_ascii(_codeplug.data(0x01788+0x18), 16, 0xff), QString("Bln/Brb"));
 
98
  QCOMPARE(decode_dmr_id_bcd(_codeplug.data(0x01788+0x28)), 2621U);
 
99
  QCOMPARE((int)*((uint8_t *)_codeplug.data(0x01788+0x2c)), 0x00); // group call
 
100
  QCOMPARE((int)*((uint8_t *)_codeplug.data(0x01788+0x2d)), 0x00); // receive tone (off)
 
101
  QCOMPARE((int)*((uint8_t *)_codeplug.data(0x01788+0x2e)), 0x00); // ring style (off)
 
102
  QCOMPARE((int)*((uint8_t *)_codeplug.data(0x01788+0x2f)), 0x00); // unused byte 0x00
 
103
 
 
104
  /*
 
105
   * Test Contact 03
 
106
   */
 
107
  QCOMPARE(decode_ascii(_codeplug.data(0x01788+0x30), 16, 0xff), QString("All Call"));
 
108
  QCOMPARE(decode_dmr_id_bcd(_codeplug.data(0x01788+0x40)), 16777215U);
 
109
  QCOMPARE((int)*((uint8_t *)_codeplug.data(0x01788+0x44)), 0x02); // all call
 
110
  QCOMPARE((int)*((uint8_t *)_codeplug.data(0x01788+0x45)), 0x00); // receive tone (off)
 
111
  QCOMPARE((int)*((uint8_t *)_codeplug.data(0x01788+0x46)), 0x00); // ring style (off)
 
112
  QCOMPARE((int)*((uint8_t *)_codeplug.data(0x01788+0x47)), 0x00); // unused byte 0x00
 
113
 
 
114
  /*
 
115
   * Test Contact 04
 
116
   */
 
117
  QCOMPARE(decode_ascii(_codeplug.data(0x01788+0x48), 16, 0xff), QString("BM APRS"));
 
118
  QCOMPARE(decode_dmr_id_bcd(_codeplug.data(0x01788+0x58)), 262999U);
 
119
  QCOMPARE((int)*((uint8_t *)_codeplug.data(0x01788+0x5c)), 0x01); // private call
 
120
  QCOMPARE((int)*((uint8_t *)_codeplug.data(0x01788+0x5d)), 0x00); // receive tone (off)
 
121
  QCOMPARE((int)*((uint8_t *)_codeplug.data(0x01788+0x5e)), 0x00); // ring style (off)
 
122
  QCOMPARE((int)*((uint8_t *)_codeplug.data(0x01788+0x5f)), 0x00); // unused byte 0x00
 
123
}
 
124
 
 
125
void
 
126
RD5RTest::testRXGroups() {
 
127
  /*
 
128
   * Test RX Group List table
 
129
   */
 
130
  QCOMPARE((int)*((uint8_t *)_codeplug.data(0x1d620+0x00)), 0x03); // Number of contacts in first list (+1)
 
131
  QCOMPARE((int)*((uint8_t *)_codeplug.data(0x1d620+0x01)), 0x00); // Second list disabled == 0.
 
132
 
 
133
  /*
 
134
   * Test RX Group List 01
 
135
   */
 
136
  QCOMPARE(decode_ascii(_codeplug.data(0x1d6a0+0x00), 16, 0xff), QString("Berlin/Brand")); // Check name
 
137
  QCOMPARE((int)*((uint16_t *)_codeplug.data(0x1d6a0+0x10)), 0x01); // 1st member index +1
 
138
  QCOMPARE((int)*((uint16_t *)_codeplug.data(0x1d6a0+0x12)), 0x02); // 2nd member index +1
 
139
  QCOMPARE((int)*((uint16_t *)_codeplug.data(0x1d6a0+0x14)), 0x00); // 3nd member index == 0 (EOL)
 
140
}
 
141
 
 
142
void
 
143
RD5RTest::testDigitalChannels() {
 
144
  /*
 
145
   * Test Channel bank 0
 
146
   */
 
147
  QCOMPARE((int)*((uint8_t *)_codeplug.data(0x03780+0x00)), 0x1f); // First 5 channels enabled
 
148
  QCOMPARE((int)*((uint8_t *)_codeplug.data(0x03780+0x01)), 0x00); // rest is disabled
 
149
 
 
150
  /*
 
151
   * Test channel 01
 
152
   */
 
153
  QCOMPARE(decode_ascii(_codeplug.data(0x03790+0x00), 16, 0xff), QString("BB DB0LDS TS2")); // Check name
 
154
  QCOMPARE(decode_frequency(*(uint32_t *)_codeplug.data(0x03790+0x10)), 439.563); // check RX Frequency
 
155
  QCOMPARE(decode_frequency(*(uint32_t *)_codeplug.data(0x03790+0x14)), 431.963); // check TX Frequency
 
156
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03790+0x18), 1);       // check mode 1 == Digital
 
157
  QCOMPARE((int)*(uint16_t *)_codeplug.data(0x03790+0x19), 0);       // unused 0x00
 
158
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03790+0x1b), 3);       // tot 3 == 45s
 
159
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03790+0x1c), 0);       // tot re-key delay 0
 
160
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03790+0x1d), 2);       // admit color code
 
161
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03790+0x1e), 0x50);    // unused 0x50
 
162
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03790+0x1f), 0);       // scanlist index +1 (0=none)
 
163
  QCOMPARE((int)*(uint16_t *)_codeplug.data(0x03790+0x20), 0xffff);  // rx ctcss 0xffff = none
 
164
  QCOMPARE((int)*(uint16_t *)_codeplug.data(0x03790+0x22), 0xffff);  // tx ctcss 0xffff = none
 
165
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03790+0x24), 0);       // unused 0x00
 
166
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03790+0x25), 0);       // TX sig. 0=off
 
167
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03790+0x26), 0);       // unused 0x00
 
168
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03790+0x27), 0);       // RX sig. 0=off
 
169
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03790+0x28), 0x16);    // unused 0x16
 
170
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03790+0x29), 0);       // priv group 0=none
 
171
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03790+0x2a), 1);       // CC TX
 
172
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03790+0x2b), 1);       // GprListIdx +1
 
173
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03790+0x2c), 1);       // CC RX
 
174
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03790+0x2d), 0);       // Emergency Sys 0=None
 
175
  QCOMPARE((int)*(uint16_t *)_codeplug.data(0x03790+0x2e), 2);       // TX Contact idx +1
 
176
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03790+0x30), 0);       // Em ACK + DataCallConf.
 
177
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03790+0x31), 0x40);    // PrivateCallConf, Priv., TS2
 
178
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03790+0x32), 0);       // DCDM, ...
 
179
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03790+0x33), 0x80);    // Power, ...
 
180
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03790+0x34), 0);       // unused 0x00
 
181
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03790+0x35), 0);       // unused 0x00
 
182
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03790+0x36), 0);       // unused 0x00
 
183
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03790+0x37), 0);       // Squelch = 0
 
184
 
 
185
  /*
 
186
   * Test channel 02
 
187
   */
 
188
  QCOMPARE(decode_ascii(_codeplug.data(0x037c8+0x00), 16, 0xff), QString("BB DM0TT TS2")); // Check name
 
189
  QCOMPARE(decode_frequency(*(uint32_t *)_codeplug.data(0x037c8+0x10)), 439.087); // check RX Frequency
 
190
  QCOMPARE(decode_frequency(*(uint32_t *)_codeplug.data(0x037c8+0x14)), 431.487); // check TX Frequency
 
191
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x037c8+0x18), 1);       // check mode 1 == Digital
 
192
  QCOMPARE((int)*(uint16_t *)_codeplug.data(0x037c8+0x19), 0);       // unused 0x00
 
193
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x037c8+0x1b), 3);       // tot 3 == 45s
 
194
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x037c8+0x1c), 0);       // tot re-key delay 0
 
195
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x037c8+0x1d), 2);       // admit color code
 
196
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x037c8+0x1e), 0x50);    // unused 0x50
 
197
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x037c8+0x1f), 0);       // scanlist index +1 (0=none)
 
198
  QCOMPARE((int)*(uint16_t *)_codeplug.data(0x037c8+0x20), 0xffff);  // rx ctcss 0xffff = none
 
199
  QCOMPARE((int)*(uint16_t *)_codeplug.data(0x037c8+0x22), 0xffff);  // tx ctcss 0xffff = none
 
200
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x037c8+0x24), 0);       // unused 0x00
 
201
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x037c8+0x25), 0);       // TX sig. 0=off
 
202
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x037c8+0x26), 0);       // unused 0x00
 
203
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x037c8+0x27), 0);       // RX sig. 0=off
 
204
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x037c8+0x28), 0x16);    // unused 0x16
 
205
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x037c8+0x29), 0);       // priv group 0=none
 
206
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x037c8+0x2a), 1);       // CC TX
 
207
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x037c8+0x2b), 1);       // GprListIdx +1
 
208
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x037c8+0x2c), 1);       // CC RX
 
209
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x037c8+0x2d), 0);       // Emergency Sys 0=None
 
210
  QCOMPARE((int)*(uint16_t *)_codeplug.data(0x037c8+0x2e), 2);       // TX Contact idx +1
 
211
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x037c8+0x30), 0);       // Em ACK + DataCallConf.
 
212
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x037c8+0x31), 0x40);    // PrivateCallConf, Priv., TS2
 
213
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x037c8+0x32), 0);       // DCDM, ...
 
214
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x037c8+0x33), 0x80);    // Power, ...
 
215
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x037c8+0x34), 0);       // unused 0x00
 
216
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x037c8+0x35), 0);       // unused 0x00
 
217
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x037c8+0x36), 0);       // unused 0x00
 
218
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x037c8+0x37), 0);       // Squelch = 0
 
219
 
 
220
  /*
 
221
   * Test channel 03
 
222
   */
 
223
  QCOMPARE(decode_ascii(_codeplug.data(0x03800+0x00), 16, 0xff), QString("TG9 DB0KK TS1")); // Check name
 
224
  QCOMPARE(decode_frequency(*(uint32_t *)_codeplug.data(0x03800+0x10)), 439.538); // check RX Frequency
 
225
  QCOMPARE(decode_frequency(*(uint32_t *)_codeplug.data(0x03800+0x14)), 431.938); // check TX Frequency
 
226
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03800+0x18), 1);       // check mode 1 == Digital
 
227
  QCOMPARE((int)*(uint16_t *)_codeplug.data(0x03800+0x19), 0);       // unused 0x00
 
228
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03800+0x1b), 3);       // tot 3 == 45s
 
229
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03800+0x1c), 0);       // tot re-key delay 0
 
230
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03800+0x1d), 2);       // admit color code
 
231
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03800+0x1e), 0x50);    // unused 0x50
 
232
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03800+0x1f), 0);       // scanlist index +1 (0=none)
 
233
  QCOMPARE((int)*(uint16_t *)_codeplug.data(0x03800+0x20), 0xffff);  // rx ctcss 0xffff = none
 
234
  QCOMPARE((int)*(uint16_t *)_codeplug.data(0x03800+0x22), 0xffff);  // tx ctcss 0xffff = none
 
235
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03800+0x24), 0);       // unused 0x00
 
236
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03800+0x25), 0);       // TX sig. 0=off
 
237
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03800+0x26), 0);       // unused 0x00
 
238
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03800+0x27), 0);       // RX sig. 0=off
 
239
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03800+0x28), 0x16);    // unused 0x16
 
240
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03800+0x29), 0);       // priv group 0=none
 
241
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03800+0x2a), 1);       // CC TX
 
242
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03800+0x2b), 1);       // GprListIdx +1
 
243
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03800+0x2c), 1);       // CC RX
 
244
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03800+0x2d), 0);       // Emergency Sys 0=None
 
245
  QCOMPARE((int)*(uint16_t *)_codeplug.data(0x03800+0x2e), 1);       // TX Contact idx +1
 
246
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03800+0x30), 0);       // Em ACK + DataCallConf.
 
247
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03800+0x31), 0x00);    // PrivateCallConf, Priv., TS2
 
248
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03800+0x32), 0);       // DCDM, ...
 
249
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03800+0x33), 0x80);    // Power, ...
 
250
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03800+0x34), 0);       // unused 0x00
 
251
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03800+0x35), 0);       // unused 0x00
 
252
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03800+0x36), 0);       // unused 0x00
 
253
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x03800+0x37), 0);       // Squelch = 0
 
254
}
 
255
 
 
256
 
 
257
void
 
258
RD5RTest::testAnalogChannels() {
 
259
  /*
 
260
   * Test Channel bank 0
 
261
   */
 
262
  QCOMPARE((int)*((uint8_t *)_codeplug.data(0x03780+0x00)), 0x1f); // First 5 channels enabled
 
263
  QCOMPARE((int)*((uint8_t *)_codeplug.data(0x03780+0x01)), 0x00); // rest is disabled
 
264
 
 
265
  /*
 
266
   * Test channel 04
 
267
   */
 
268
  QCOMPARE(decode_ascii(_codeplug.data(0x3838+0x00), 16, 0xff), QString("DB0LDS")); // Check name
 
269
  QCOMPARE(decode_frequency(*(uint32_t *)_codeplug.data(0x3838+0x10)), 439.5625); // check RX Frequency
 
270
  QCOMPARE(decode_frequency(*(uint32_t *)_codeplug.data(0x3838+0x14)), 431.9625); // check TX Frequency
 
271
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3838+0x18), 0);       // check mode 0 == Analog
 
272
  QCOMPARE((int)*(uint16_t *)_codeplug.data(0x3838+0x19), 0);       // unused 0x00
 
273
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3838+0x1b), 3);       // tot 3 == 45s
 
274
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3838+0x1c), 0);       // tot re-key delay 0
 
275
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3838+0x1d), 1);       // admit 1 = free
 
276
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3838+0x1e), 0x50);    // unused 0x50
 
277
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3838+0x1f), 0);       // scanlist index +1 (0=none)
 
278
  QCOMPARE((uint16_t)*(uint16_t *)_codeplug.data(0x3838+0x20), encode_ctcss_tone_table(67.0));  // rx ctcss 0xffff = none
 
279
  QCOMPARE((uint16_t)*(uint16_t *)_codeplug.data(0x3838+0x22), encode_ctcss_tone_table(67.0));  // tx ctcss 0xffff = none
 
280
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3838+0x24), 0);       // unused 0x00
 
281
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3838+0x25), 0);       // TX sig. 0=off
 
282
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3838+0x26), 0);       // unused 0x00
 
283
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3838+0x27), 0);       // RX sig. 0=off
 
284
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3838+0x28), 0x16);    // unused 0x16
 
285
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3838+0x29), 0);       // priv group 0=none
 
286
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3838+0x2a), 0);       // CC TX
 
287
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3838+0x2b), 0);       // GprListIdx +1
 
288
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3838+0x2c), 0);       // CC RX
 
289
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3838+0x2d), 0);       // Emergency Sys 0=None
 
290
  QCOMPARE((int)*(uint16_t *)_codeplug.data(0x3838+0x2e), 0);       // TX Contact idx +1
 
291
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3838+0x30), 0);       // Em ACK + DataCallConf.
 
292
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3838+0x31), 0);       // PrivateCallConf, Priv., TS2
 
293
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3838+0x32), 0);       // DCDM, ...
 
294
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3838+0x33), 0x80);    // Power, ...
 
295
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3838+0x34), 0);       // unused 0x00
 
296
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3838+0x35), 0);       // unused 0x00
 
297
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3838+0x36), 0);       // unused 0x00
 
298
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3838+0x37), 1);       // Squelch = 1
 
299
 
 
300
  /*
 
301
   * Test channel 05
 
302
   */
 
303
  QCOMPARE(decode_ascii(_codeplug.data(0x3870+0x00), 16, 0xff), QString("DB0SP-2")); // Check name
 
304
  QCOMPARE(decode_frequency(*(uint32_t *)_codeplug.data(0x3870+0x10)), 145.6); // check RX Frequency
 
305
  QCOMPARE(decode_frequency(*(uint32_t *)_codeplug.data(0x3870+0x14)), 145.0); // check TX Frequency
 
306
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3870+0x18), 0);       // check mode 0 == Analog
 
307
  QCOMPARE((int)*(uint16_t *)_codeplug.data(0x3870+0x19), 0);       // unused 0x00
 
308
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3870+0x1b), 3);       // tot 3 == 45s
 
309
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3870+0x1c), 0);       // tot re-key delay 0
 
310
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3870+0x1d), 1);       // admit free
 
311
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3870+0x1e), 0x50);    // unused 0x50
 
312
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3870+0x1f), 0);       // scanlist index +1 (0=none)
 
313
  QCOMPARE((int)*(uint16_t *)_codeplug.data(0x3870+0x20), 0xffff);  // rx ctcss 0xffff = none
 
314
  QCOMPARE((int)*(uint16_t *)_codeplug.data(0x3870+0x22), 0xffff);  // tx ctcss 0xffff = none
 
315
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3870+0x24), 0);       // unused 0x00
 
316
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3870+0x25), 0);       // TX sig. 0=off
 
317
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3870+0x26), 0);       // unused 0x00
 
318
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3870+0x27), 0);       // RX sig. 0=off
 
319
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3870+0x28), 0x16);    // unused 0x16
 
320
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3870+0x29), 0);       // priv group 0=none
 
321
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3870+0x2a), 0);       // CC TX
 
322
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3870+0x2b), 0);       // GprListIdx +1
 
323
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3870+0x2c), 0);       // CC RX
 
324
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3870+0x2d), 0);       // Emergency Sys 0=None
 
325
  QCOMPARE((int)*(uint16_t *)_codeplug.data(0x3870+0x2e), 0);       // TX Contact idx +1
 
326
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3870+0x30), 0);       // Em ACK + DataCallConf.
 
327
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3870+0x31), 0);    // PrivateCallConf, Priv., TS2
 
328
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3870+0x32), 0);       // DCDM, ...
 
329
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3870+0x33), 0x80);    // Power, ...
 
330
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3870+0x34), 0);       // unused 0x00
 
331
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3870+0x35), 0);       // unused 0x00
 
332
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3870+0x36), 0);       // unused 0x00
 
333
  QCOMPARE((int)*(uint8_t  *)_codeplug.data(0x3870+0x37), 1);       // Squelch = 0
 
334
}
 
335
 
 
336
void
 
337
RD5RTest::testZones() {
 
338
  /*
 
339
   * Test zone bank
 
340
   */
 
341
  QCOMPARE((int)*((uint8_t *)_codeplug.data(0x08010+0x00)), 0x03); // First 2 zones enabled
 
342
  QCOMPARE((int)*((uint8_t *)_codeplug.data(0x08010+0x01)), 0x00); // rest is disabled
 
343
 
 
344
  /*
 
345
   * Test zone 01
 
346
   */
 
347
  QCOMPARE(decode_ascii(_codeplug.data(0x08030+0x00), 16, 0xff), QString("KW A")); // Check name
 
348
  QCOMPARE((int)*(uint16_t *)_codeplug.data(0x08030+0x10), 1); // channel 1
 
349
  QCOMPARE((int)*(uint16_t *)_codeplug.data(0x08030+0x12), 3); // channel 3
 
350
  QCOMPARE((int)*(uint16_t *)_codeplug.data(0x08030+0x14), 5); // channel 5
 
351
  QCOMPARE((int)*(uint16_t *)_codeplug.data(0x08030+0x16), 0); // not set
 
352
  /*
 
353
   * Test zone 02
 
354
   */
 
355
  QCOMPARE(decode_ascii(_codeplug.data(0x08060+0x00), 16, 0xff), QString("KW B")); // Check name
 
356
  QCOMPARE((int)*(uint16_t *)_codeplug.data(0x08060+0x10), 2); // channel 2
 
357
  QCOMPARE((int)*(uint16_t *)_codeplug.data(0x08060+0x12), 4); // channel 4
 
358
  QCOMPARE((int)*(uint16_t *)_codeplug.data(0x08060+0x14), 0); // not set
 
359
}
 
360
 
 
361
void
 
362
RD5RTest::testScanLists() {
 
363
  /*
 
364
   * Test scan list bank
 
365
   */
 
366
  QCOMPARE((int)*((uint8_t *)_codeplug.data(0x17620+0x00)), 0x00); // No scanlist enabled.
 
367
  QCOMPARE((int)*((uint8_t *)_codeplug.data(0x17620+0x01)), 0x00); // No scanlist enabled.
 
368
}
 
369
 
 
370
void
 
371
RD5RTest::testDecode() {
 
372
  /* Decode config */
 
373
  Config decoded;
 
374
  QVERIFY(_codeplug.decode(&decoded));
 
375
 
 
376
  // Compare basic config
 
377
  QCOMPARE(decoded.name(), _config.name());
 
378
  QCOMPARE(decoded.id(), _config.id());
 
379
  QCOMPARE(decoded.introLine1(), _config.introLine1());
 
380
  QCOMPARE(decoded.introLine2(), _config.introLine2());
 
381
  // Do not compare MIC level, RD5R has not MIC level settings
 
382
  // Do not compare speech settings, RD5R has no speech synthesis
 
383
 
 
384
  // Compare contacts
 
385
  QCOMPARE(decoded.contacts()->count(), _config.contacts()->count());
 
386
  for (int i=0; i<_config.contacts()->count(); i++) {
 
387
    // Compare name
 
388
    QCOMPARE(decoded.contacts()->contact(i)->name(), _config.contacts()->contact(i)->name());
 
389
    // Compare number
 
390
    QCOMPARE(decoded.contacts()->contact(i)->as<DigitalContact>()->number(),
 
391
             _config.contacts()->contact(i)->as<DigitalContact>()->number());
 
392
    // Compare type
 
393
    QCOMPARE(decoded.contacts()->contact(i)->as<DigitalContact>()->type(),
 
394
             _config.contacts()->contact(i)->as<DigitalContact>()->type());
 
395
    // Compare tone
 
396
    QCOMPARE(decoded.contacts()->contact(i)->rxTone(),
 
397
             _config.contacts()->contact(i)->rxTone());
 
398
  }
 
399
 
 
400
  // Compare RX Groups
 
401
  QCOMPARE(decoded.rxGroupLists()->count(), _config.rxGroupLists()->count());
 
402
  for (int i=0; i<_config.rxGroupLists()->count(); i++) {
 
403
    // Compare name
 
404
    QCOMPARE(decoded.rxGroupLists()->list(i)->name(), _config.rxGroupLists()->list(i)->name());
 
405
    // Compare number of entries
 
406
    QCOMPARE(decoded.rxGroupLists()->list(i)->count(), _config.rxGroupLists()->list(i)->count());
 
407
    // Compare entries
 
408
    for (int j=0; j<_config.rxGroupLists()->list(i)->count(); j++) {
 
409
      QCOMPARE(decoded.contacts()->indexOf(decoded.rxGroupLists()->list(i)->contact(j)),
 
410
               _config.contacts()->indexOf(_config.rxGroupLists()->list(i)->contact(j)));
 
411
    }
 
412
  }
 
413
 
 
414
  // Compare Channels
 
415
  QCOMPARE(decoded.channelList()->count(), _config.channelList()->count());
 
416
  for (int i=0; i<_config.channelList()->count(); i++) {
 
417
    // Compare name
 
418
    QCOMPARE(decoded.channelList()->channel(i)->name(), _config.channelList()->channel(i)->name());
 
419
    // RX Frequency
 
420
    QCOMPARE(decoded.channelList()->channel(i)->rxFrequency(), _config.channelList()->channel(i)->rxFrequency());
 
421
    // TX Frequency
 
422
    QCOMPARE(decoded.channelList()->channel(i)->txFrequency(), _config.channelList()->channel(i)->txFrequency());
 
423
    // Power
 
424
    QCOMPARE(decoded.channelList()->channel(i)->power(), _config.channelList()->channel(i)->power());
 
425
    // TOT
 
426
    QCOMPARE(decoded.channelList()->channel(i)->txTimeout(), _config.channelList()->channel(i)->txTimeout());
 
427
    // RX only flag
 
428
    QCOMPARE(decoded.channelList()->channel(i)->rxOnly(), _config.channelList()->channel(i)->rxOnly());
 
429
    // Scanlist
 
430
    QCOMPARE(decoded.scanlists()->indexOf(decoded.channelList()->channel(i)->scanList()),
 
431
             _config.scanlists()->indexOf(_config.channelList()->channel(i)->scanList()));
 
432
    // Check type
 
433
    QCOMPARE(decoded.channelList()->channel(i)->is<DigitalChannel>(),
 
434
             _config.channelList()->channel(i)->is<DigitalChannel>());
 
435
    // Dispatch by type
 
436
    if (_config.channelList()->channel(i)->is<DigitalChannel>()) {
 
437
      DigitalChannel *dec = decoded.channelList()->channel(i)->as<DigitalChannel>();
 
438
      DigitalChannel *ori = _config.channelList()->channel(i)->as<DigitalChannel>();
 
439
      // Compare admit criterion
 
440
      QCOMPARE(dec->admit(), ori->admit());
 
441
      // color code
 
442
      QCOMPARE(dec->colorCode(), ori->colorCode());
 
443
      // time slot
 
444
      QCOMPARE(dec->timeslot(), ori->timeslot());
 
445
      // RX group list
 
446
      QCOMPARE(decoded.rxGroupLists()->indexOf(dec->rxGroupList()),
 
447
               _config.rxGroupLists()->indexOf(ori->rxGroupList()));
 
448
      // TX contact
 
449
      QCOMPARE(decoded.contacts()->indexOf(dec->txContact()),
 
450
               _config.contacts()->indexOf(ori->txContact()));
 
451
      // do not check GSP system (RD5R has no GPS).
 
452
      QCOMPARE(dec->gpsSystem(), nullptr);
 
453
    } else {
 
454
      AnalogChannel *dec = decoded.channelList()->channel(i)->as<AnalogChannel>();
 
455
      AnalogChannel *ori = _config.channelList()->channel(i)->as<AnalogChannel>();
 
456
      // Do not compare admit criterion, RD5R does not support Admit: CTCSS, mapped -> CH FREE
 
457
      QCOMPARE(dec->admit(), AnalogChannel::AdmitFree);
 
458
      // squelch
 
459
      QCOMPARE(dec->squelch(), ori->squelch());
 
460
      // RX Tone
 
461
      QCOMPARE(dec->rxTone(), ori->rxTone());
 
462
      // TX Tone
 
463
      QCOMPARE(dec->txTone(), ori->txTone());
 
464
      // Bandwidth
 
465
      QCOMPARE(dec->bandwidth(), ori->bandwidth());
 
466
    }
 
467
  }
 
468
 
 
469
  // Compare Zones. Note Zones with VFO A/B are split into individual zones for RD5R
 
470
  QCOMPARE(decoded.zones()->count(), 2*_config.zones()->count());
 
471
  QCOMPARE(decoded.zones()->zone(0)->name(), _config.zones()->zone(0)->name()+" A");
 
472
  QCOMPARE(decoded.zones()->zone(0)->A()->count(), _config.zones()->zone(0)->A()->count());
 
473
  for (int i=0; i<_config.zones()->zone(0)->A()->count(); i++) {
 
474
    QCOMPARE(decoded.channelList()->indexOf(decoded.zones()->zone(0)->A()->channel(i)),
 
475
             _config.channelList()->indexOf(_config.zones()->zone(0)->A()->channel(i)));
 
476
  }
 
477
  QCOMPARE(decoded.zones()->zone(1)->name(), _config.zones()->zone(0)->name()+" B");
 
478
  QCOMPARE(decoded.zones()->zone(1)->A()->count(), _config.zones()->zone(0)->B()->count());
 
479
  for (int i=0; i<_config.zones()->zone(0)->B()->count(); i++) {
 
480
    QCOMPARE(decoded.channelList()->indexOf(decoded.zones()->zone(1)->A()->channel(i)),
 
481
             _config.channelList()->indexOf(_config.zones()->zone(0)->B()->channel(i)));
 
482
  }
 
483
 
 
484
  // Compare scanlist
 
485
  QCOMPARE(decoded.scanlists()->count(), _config.scanlists()->count());
 
486
 
 
487
  // Do not compare GPS systems (RD5R has no GPS).
 
488
  QCOMPARE(decoded.gpsSystems()->count(), 0);
 
489
}
 
490
 
 
491
QTEST_GUILESS_MAIN(RD5RTest)