From 42e6c4d213bb687b51e444834362d62298b6bca1 Mon Sep 17 00:00:00 2001 From: crosstyan Date: Thu, 14 Aug 2025 18:20:19 +0800 Subject: [PATCH] feat: add tx_params_t structure and related functions for transmission parameter management --- inc/llcc68.hpp | 41 +++++++++++--- inc/llcc68_definitions.hpp | 107 +++++++++++++++++++++++++++++++++++++ 2 files changed, 141 insertions(+), 7 deletions(-) diff --git a/inc/llcc68.hpp b/inc/llcc68.hpp index 2f33fc2..d57729c 100644 --- a/inc/llcc68.hpp +++ b/inc/llcc68.hpp @@ -876,9 +876,26 @@ set_modulation_params(const uint8_t sf, return spi::write_stream(RADIOLIB_SX126X_CMD_SET_MODULATION_PARAMS, data); } +/** + * @brief Set the tx params object + * + * @param pwr + * @param ramp_time + * @note + * + * The output power is defined as power in dBm in a range of + * + - 17 (0xEF) to +14 (0x0E) dBm by step of 1 dB if low power PA is selected + - 9 (0xF7) to +22 (0x16) dBm by step of 1 dB if high power PA is selected + + for LLCC68: The output power is defined as power in dBm in a range of - 9 (0xF7) to +22 (0x16)dBm by steps of 1dB. + + Selection between high power PA and low power PA is done with the command SetPaConfig and the parameter deviceSel. + By default low power PA and +14 dBm are set. + */ inline Result -set_tx_params(const uint8_t pwr, const uint8_t ramp_time = RADIOLIB_SX126X_PA_RAMP_200U) { - const uint8_t data[] = {pwr, ramp_time}; +set_tx_params(tx_params_t params) { + const uint8_t data[] = {static_cast(params.power), static_cast(params.ramp_time)}; return spi::write_stream(RADIOLIB_SX126X_CMD_SET_TX_PARAMS, data); } @@ -909,17 +926,18 @@ set_packet_type(const PacketType packet_type) { inline Result -set_output_power(const int8_t power) { - if (not in_range(power, -9, 22)) { +set_output_power(tx_params_t params) { + if (not in_range(params.power, -9, 22)) { return ue_t{error_t{error::RADIO_INVALID_OUTPUT_POWER}}; } uint8_t ocp = 0; auto res = read_register(RADIOLIB_SX126X_REG_OCP_CONFIGURATION, std::span{&ocp, 1}); APP_RADIO_RETURN_ERR(res); + // TODO: optimal setting table: for now it was applied with +22dBm best setting res = set_pa_config(0x04); APP_RADIO_RETURN_ERR(res); - res = set_tx_params(power); + res = set_tx_params(params); APP_RADIO_RETURN_ERR(res); // restore OCP configuration return write_register(RADIOLIB_SX126X_REG_OCP_CONFIGURATION, std::span{&ocp, 1}); @@ -948,7 +966,7 @@ set_current_limit() { return write_register(RADIOLIB_SX126X_REG_OCP_CONFIGURATION, std::span{&raw, 1}); } -inline int chip_type_to_max_tx_power(const ChipType &chip) { +inline int8_t chip_type_to_max_tx_power(const ChipType &chip) { switch (chip) { case ChipType::LLCC68: return 22; @@ -1367,7 +1385,16 @@ static constexpr auto begin = [](const lora_parameters_t ¶ms) -> Result= -9 && power <= 22) { + return true; + } + + if (power >= -17 && power <= 14) { + return true; + } + + return false; +} + +constexpr bool valid_ramp_time(const llcc68::TxRampTime ramp_time) { + switch (ramp_time) { + case llcc68::SET_RAMP_10U: + case llcc68::SET_RAMP_20U: + case llcc68::SET_RAMP_40U: + case llcc68::SET_RAMP_80U: + case llcc68::SET_RAMP_200U: + case llcc68::SET_RAMP_800U: + case llcc68::SET_RAMP_1700U: + case llcc68::SET_RAMP_3400U: + return true; + default: + return false; + } +} + constexpr bool valid_freq(const freq_t freq) { return in_range(freq, freq_t{150.0}, freq_t{960.0}); }