Line data Source code
1 : #include <boost/test/unit_test.hpp>
2 : #include "modules/SX126x/SX126x.h"
3 : #include "modules/SX127x/SX127x.h"
4 : #include "modules/SX128x/SX128x.h"
5 : #include "modules/LR11x0/LR11x0.h"
6 :
7 : // --- Config structure ---
8 : struct RadioConfig {
9 : std::string name; // Radio name
10 : ModemType_t modem;
11 : DataRate_t dr;
12 : PacketConfig_t pc;
13 : std::vector<size_t> payload_len;
14 : std::vector<RadioLibTime_t> expected_toa; // Expected time on air in microseconds from Semtech calculators
15 : };
16 :
17 : // --- Test configurations with golden values ---
18 : static std::vector<RadioConfig> allConfigs = {
19 : { "SX126x", RADIOLIB_MODEM_LORA, {.lora={7,125,5}}, {.lora={8,false,true,true}}, {1,10,50,255}, {30976,46336,128256,548096} }, // 30.97, 46.33, 128.25, 548.09
20 : { "SX126x", RADIOLIB_MODEM_LORA, {.lora={11,250,8}}, {.lora={16,true,false,false}}, {5,15,100,200}, {296960,362496,1411072,2590720} }, // 296.96, 362.49, 1410, 2590
21 : { "SX126x", RADIOLIB_MODEM_FSK, {.fsk={100,10}}, {.fsk={16,16,2}}, {1,16,64,200}, {560,1760,5600,16480} },
22 : { "SX126x", RADIOLIB_MODEM_LRFHSS,{.lrFhss={RADIOLIB_SX126X_LR_FHSS_BW_386_72,RADIOLIB_SX126X_LR_FHSS_CR_2_3,false}}, {.lrFhss={2}}, {1,20,100}, {3784697,4259832,6324212} },
23 :
24 : { "SX127x", RADIOLIB_MODEM_LORA, {.lora={6,125,6}}, {.lora={8,false,true,false}}, {7,23,98,156}, {23000,39000,115000,174000} }, // 20.61, 39.04, 115.84, 174.21
25 : { "SX127x", RADIOLIB_MODEM_LORA, {.lora={8,250,8}}, {.lora={32,true,true,false}}, {10,20,80,160}, {70000,87000,210000,373000} }, // 69.89, 86.27, 209.15, 372.99
26 : { "SX127x", RADIOLIB_MODEM_FSK, {.fsk={100,5}}, {.fsk={16,16,3}}, {1,16,32,61}, {640,1840,3120,5440} },
27 :
28 : { "SX128x", RADIOLIB_MODEM_LORA, {.lora={5,400,5}}, {.lora={8,false,true,false}}, {1,50,200}, {2580,10179,34180} }, // 2.54, 10.02, 33.65
29 : { "SX128x", RADIOLIB_MODEM_LORA, {.lora={12,800,7}}, {.lora={16,false,true,true}}, {10,100,250}, {216319,861440,1936640} }, // 212.99, 848.19, 1910
30 : { "SX128x", RADIOLIB_MODEM_FSK, {.fsk={250,100}}, {.fsk={16,16,2}}, {1,32,64,128}, {224,1216,2240,4288} },
31 :
32 : // also covers LR2021 as the calculation is shared in the LRxxxx base class
33 : { "LR11x0", RADIOLIB_MODEM_LORA, {.lora={10,250,5}}, {.lora={8,false,true,true}}, {1,20,100}, {103424,205824,615424} }, // 103.42, 205.82, 615.42
34 : { "LR11x0", RADIOLIB_MODEM_LORA, {.lora={11,500,6}}, {.lora={32,true,false,false}}, {10,25,200}, {205824,279552,1065984} }, // 205.82, 279.55, 1070
35 : { "LR11x0", RADIOLIB_MODEM_FSK, {.fsk={200,50}}, {.fsk={16,32,2}}, {1,32,64,200}, {360,1600,2880,8320} },
36 : { "LR11x0", RADIOLIB_MODEM_LRFHSS,{.lrFhss={RADIOLIB_LRXXXX_LR_FHSS_BW_136_72,RADIOLIB_LRXXXX_LR_FHSS_CR_1_3,true}}, {.lrFhss={1}}, {1,10,50}, {1949692,2392059,4456440} },
37 : };
38 :
39 : BOOST_AUTO_TEST_SUITE(suite_TimeOnAir)
40 :
41 2 : BOOST_AUTO_TEST_CASE(TimeOnAir_AllRadios) {
42 15 : for (const auto& cfg : allConfigs) {
43 14 : BOOST_TEST_MESSAGE("--- Test calculateTimeOnAir " << cfg.name << ", modem=" << cfg.modem << " ---");
44 :
45 64 : for (size_t i = 0; i < cfg.payload_len.size(); i++) {
46 50 : auto len = cfg.payload_len[i];
47 50 : RadioLibTime_t toa = 0;
48 :
49 : // create a dummy module class instance that the derived classes may reference
50 50 : Module mod(nullptr, RADIOLIB_NC, RADIOLIB_NC, RADIOLIB_NC, RADIOLIB_NC);
51 :
52 50 : if (cfg.name == "SX126x") {
53 15 : SX126x dummy(&mod);
54 15 : toa = dummy.calculateTimeOnAir(cfg.modem, cfg.dr, cfg.pc, len);
55 50 : } else if (cfg.name == "SX127x") {
56 12 : SX127x dummy(&mod);
57 12 : toa = dummy.calculateTimeOnAir(cfg.modem, cfg.dr, cfg.pc, len);
58 35 : } else if (cfg.name == "SX128x") {
59 10 : SX128x dummy(&mod);
60 10 : toa = dummy.calculateTimeOnAir(cfg.modem, cfg.dr, cfg.pc, len);
61 23 : } else if (cfg.name == "LR11x0") {
62 13 : LR11x0 dummy(&mod);
63 13 : toa = dummy.calculateTimeOnAir(cfg.modem, cfg.dr, cfg.pc, len);
64 13 : }
65 :
66 50 : BOOST_CHECK_EQUAL(toa, cfg.expected_toa[i]);
67 : }
68 : }
69 1 : }
70 :
71 : BOOST_AUTO_TEST_SUITE_END()
|