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 : 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_LR11X0_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 : { "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
33 : { "LR11x0", RADIOLIB_MODEM_LORA, {.lora={11,500,6}}, {.lora={32,true,false,false}}, {10,25,200}, {205824,279552,1065984} }, // 205.82, 279.55, 1070
34 : { "LR11x0", RADIOLIB_MODEM_FSK, {.fsk={200,50}}, {.fsk={16,32,2}}, {1,32,64,200}, {360,1600,2880,8320} },
35 : { "LR11x0", RADIOLIB_MODEM_LRFHSS,{.lrFhss={RADIOLIB_LR11X0_LR_FHSS_BW_136_72,RADIOLIB_LR11X0_LR_FHSS_CR_1_3,true}}, {.lrFhss={1}}, {1,10,50}, {1949692,2392059,4456440} },
36 : };
37 :
38 : BOOST_AUTO_TEST_SUITE(suite_TimeOnAir)
39 :
40 2 : BOOST_AUTO_TEST_CASE(TimeOnAir_AllRadios) {
41 15 : for (const auto& cfg : allConfigs) {
42 14 : BOOST_TEST_MESSAGE("--- Test calculateTimeOnAir " << cfg.name << ", modem=" << cfg.modem << " ---");
43 :
44 64 : for (size_t i = 0; i < cfg.payload_len.size(); i++) {
45 50 : auto len = cfg.payload_len[i];
46 50 : RadioLibTime_t toa = 0;
47 :
48 50 : if (cfg.name == "SX126x") {
49 15 : SX126x dummy(nullptr);
50 15 : toa = dummy.calculateTimeOnAir(cfg.modem, cfg.dr, cfg.pc, len);
51 50 : } else if (cfg.name == "SX127x") {
52 12 : SX127x dummy(nullptr);
53 12 : toa = dummy.calculateTimeOnAir(cfg.modem, cfg.dr, cfg.pc, len);
54 35 : } else if (cfg.name == "SX128x") {
55 10 : SX128x dummy(nullptr);
56 10 : toa = dummy.calculateTimeOnAir(cfg.modem, cfg.dr, cfg.pc, len);
57 23 : } else if (cfg.name == "LR11x0") {
58 13 : LR11x0 dummy(nullptr);
59 13 : toa = dummy.calculateTimeOnAir(cfg.modem, cfg.dr, cfg.pc, len);
60 13 : }
61 :
62 50 : BOOST_CHECK_EQUAL(toa, cfg.expected_toa[i]);
63 : }
64 : }
65 1 : }
66 :
67 : BOOST_AUTO_TEST_SUITE_END()
|