7
RD5RTest::RD5RTest(QObject *parent) : QObject(parent)
13
RD5RTest::initTestCase() {
14
// Read simple configuration file
16
QVERIFY(_config.readCSV("://testconfig.conf", errMessage));
17
// Encode config as code-plug
18
QVERIFY(_codeplug.encode(&_config));
22
RD5RTest::cleanupTestCase() {
28
RD5RTest::testRadioName() {
29
QCOMPARE(decode_ascii(_codeplug.data(0x000e0+0x00), 8, 0xff), QString("DM3MAT"));
33
RD5RTest::testDMRID() {
34
QCOMPARE(decode_dmr_id_bcd(_codeplug.data(0x000e0+0x08)), 1234567U);
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"));
44
RD5RTest::testGeneralDefaults() {
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);
77
QCOMPARE((int)*(uint8_t *)_codeplug.data(0x000e0+0x1f), 0);
78
// prog passwd., disabled=0xffffffffffffffff
79
QCOMPARE(*(uint64_t *)_codeplug.data(0x000e0+0x20), 0xffffffffffffffffUL);
83
RD5RTest::testDigitalContacts() {
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
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
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
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
126
RD5RTest::testRXGroups() {
128
* Test RX Group List table
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.
134
* Test RX Group List 01
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)
143
RD5RTest::testDigitalChannels() {
145
* Test Channel bank 0
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
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
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
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
258
RD5RTest::testAnalogChannels() {
260
* Test Channel bank 0
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
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
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
337
RD5RTest::testZones() {
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
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
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
362
RD5RTest::testScanLists() {
364
* Test scan list bank
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.
371
RD5RTest::testDecode() {
374
QVERIFY(_codeplug.decode(&decoded));
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
385
QCOMPARE(decoded.contacts()->count(), _config.contacts()->count());
386
for (int i=0; i<_config.contacts()->count(); i++) {
388
QCOMPARE(decoded.contacts()->contact(i)->name(), _config.contacts()->contact(i)->name());
390
QCOMPARE(decoded.contacts()->contact(i)->as<DigitalContact>()->number(),
391
_config.contacts()->contact(i)->as<DigitalContact>()->number());
393
QCOMPARE(decoded.contacts()->contact(i)->as<DigitalContact>()->type(),
394
_config.contacts()->contact(i)->as<DigitalContact>()->type());
396
QCOMPARE(decoded.contacts()->contact(i)->rxTone(),
397
_config.contacts()->contact(i)->rxTone());
401
QCOMPARE(decoded.rxGroupLists()->count(), _config.rxGroupLists()->count());
402
for (int i=0; i<_config.rxGroupLists()->count(); i++) {
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());
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)));
415
QCOMPARE(decoded.channelList()->count(), _config.channelList()->count());
416
for (int i=0; i<_config.channelList()->count(); i++) {
418
QCOMPARE(decoded.channelList()->channel(i)->name(), _config.channelList()->channel(i)->name());
420
QCOMPARE(decoded.channelList()->channel(i)->rxFrequency(), _config.channelList()->channel(i)->rxFrequency());
422
QCOMPARE(decoded.channelList()->channel(i)->txFrequency(), _config.channelList()->channel(i)->txFrequency());
424
QCOMPARE(decoded.channelList()->channel(i)->power(), _config.channelList()->channel(i)->power());
426
QCOMPARE(decoded.channelList()->channel(i)->txTimeout(), _config.channelList()->channel(i)->txTimeout());
428
QCOMPARE(decoded.channelList()->channel(i)->rxOnly(), _config.channelList()->channel(i)->rxOnly());
430
QCOMPARE(decoded.scanlists()->indexOf(decoded.channelList()->channel(i)->scanList()),
431
_config.scanlists()->indexOf(_config.channelList()->channel(i)->scanList()));
433
QCOMPARE(decoded.channelList()->channel(i)->is<DigitalChannel>(),
434
_config.channelList()->channel(i)->is<DigitalChannel>());
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());
442
QCOMPARE(dec->colorCode(), ori->colorCode());
444
QCOMPARE(dec->timeslot(), ori->timeslot());
446
QCOMPARE(decoded.rxGroupLists()->indexOf(dec->rxGroupList()),
447
_config.rxGroupLists()->indexOf(ori->rxGroupList()));
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);
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);
459
QCOMPARE(dec->squelch(), ori->squelch());
461
QCOMPARE(dec->rxTone(), ori->rxTone());
463
QCOMPARE(dec->txTone(), ori->txTone());
465
QCOMPARE(dec->bandwidth(), ori->bandwidth());
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)));
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)));
485
QCOMPARE(decoded.scanlists()->count(), _config.scanlists()->count());
487
// Do not compare GPS systems (RD5R has no GPS).
488
QCOMPARE(decoded.gpsSystems()->count(), 0);
491
QTEST_GUILESS_MAIN(RD5RTest)