LCOV - code coverage report
Current view: top level - extras/test/unit/tests - TestCalculateTimeOnAir.cpp (source / functions) Hit Total Coverage
Test: lcov.info Lines: 21 21 100.0 %
Date: 2025-10-24 15:14:50 Functions: 2 2 100.0 %

          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()

Generated by: LCOV version 1.14