fix(llcc68): apply full radio profile before tx and rx
Reapply packet type, sync word, RF frequency, modulation, packet, CRC, and whitening settings on async TX/RX entry points. This lets callers switch between preconfigured profiles immediately before a send or listen operation instead of relying on modem-init state.
This commit is contained in:
@@ -1369,6 +1369,11 @@ LLCC68::hal_async_flush(lora_parameters_t params) {
|
||||
return ue(Errc::InvalidState);
|
||||
}
|
||||
APP_RADIO_RETURN_ERR_CTX(set_standby(), "tx::standby");
|
||||
APP_RADIO_RETURN_ERR_CTX(set_packet_type_lora(), "tx::set_packet_type");
|
||||
APP_RADIO_RETURN_ERR_CTX(set_lora_sync_word(params.sync_word),
|
||||
"tx::set_lora_sync_word");
|
||||
APP_RADIO_RETURN_ERR_CTX(set_rf_frequency(params.frequency_mhz),
|
||||
"tx::set_rf_frequency");
|
||||
APP_RADIO_RETURN_ERR_CTX(
|
||||
set_modulation_params(params.mod_params.sf, params.mod_params.bw,
|
||||
params.mod_params.cr,
|
||||
@@ -1430,10 +1435,35 @@ LLCC68::hal_gfsk_async_flush(gfsk_parameters_t params) {
|
||||
if (data().tx_xfer_size == 0 || data().tx_xfer_size > MAX_BUFFER_PAYLOAD) {
|
||||
return ue(-EINVAL);
|
||||
}
|
||||
if (params.sync_word_length > params.sync_word.size() ||
|
||||
params.packet_params.sync_length_bits > params.sync_word.size() * 8) {
|
||||
return ue(-EINVAL);
|
||||
}
|
||||
|
||||
APP_RADIO_RETURN_ERR_CTX(set_standby(), "gfsk_tx::standby");
|
||||
APP_RADIO_RETURN_ERR_CTX(set_packet_type_gfsk(),
|
||||
"gfsk_tx::set_packet_type");
|
||||
APP_RADIO_RETURN_ERR_CTX(set_rf_frequency(params.frequency_mhz),
|
||||
"gfsk_tx::set_rf_frequency");
|
||||
APP_RADIO_RETURN_ERR_CTX(set_gfsk_modulation_params(params.mod_params),
|
||||
"gfsk_tx::set_modulation_params");
|
||||
APP_RADIO_RETURN_ERR_CTX(
|
||||
set_gfsk_sync_word(std::span<const uint8_t>{params.sync_word.data(),
|
||||
params.sync_word_length}),
|
||||
"gfsk_tx::set_sync_word");
|
||||
APP_RADIO_RETURN_ERR_CTX(set_gfsk_crc_seed(params.crc_seed),
|
||||
"gfsk_tx::set_crc_seed");
|
||||
APP_RADIO_RETURN_ERR_CTX(set_gfsk_crc_polynomial(params.crc_polynomial),
|
||||
"gfsk_tx::set_crc_polynomial");
|
||||
APP_RADIO_RETURN_ERR_CTX(set_gfsk_whitening_seed(params.whitening_seed),
|
||||
"gfsk_tx::set_whitening_seed");
|
||||
if (params.packet_params.address_filtering !=
|
||||
GfskAddressFiltering::Disabled) {
|
||||
APP_RADIO_RETURN_ERR_CTX(
|
||||
set_gfsk_address_filtering(params.node_address.value_or(0),
|
||||
params.broadcast_address.value_or(0)),
|
||||
"gfsk_tx::set_address_filtering");
|
||||
}
|
||||
auto packet_params = params.packet_params;
|
||||
packet_params.payload_length = static_cast<uint8_t>(data().tx_xfer_size);
|
||||
APP_RADIO_RETURN_ERR_CTX(set_gfsk_packet_params(packet_params),
|
||||
@@ -1477,6 +1507,11 @@ LLCC68::hal_gfsk_async_transmit(std::span<const uint8_t> data,
|
||||
|
||||
expected<unit, error_code> LLCC68::hal_async_rx(lora_parameters_t params) {
|
||||
APP_RADIO_RETURN_ERR_CTX(set_standby(), "rx::standby");
|
||||
APP_RADIO_RETURN_ERR_CTX(set_packet_type_lora(), "rx::set_packet_type");
|
||||
APP_RADIO_RETURN_ERR_CTX(set_lora_sync_word(params.sync_word),
|
||||
"rx::set_lora_sync_word");
|
||||
APP_RADIO_RETURN_ERR_CTX(set_rf_frequency(params.frequency_mhz),
|
||||
"rx::set_rf_frequency");
|
||||
APP_RADIO_RETURN_ERR_CTX(set_buffer_base_address(),
|
||||
"rx::set_buffer_base_address");
|
||||
|
||||
@@ -1511,11 +1546,37 @@ expected<unit, error_code> LLCC68::hal_async_rx(lora_parameters_t params) {
|
||||
}
|
||||
|
||||
expected<unit, error_code> LLCC68::hal_gfsk_async_rx(gfsk_parameters_t params) {
|
||||
if (params.sync_word_length > params.sync_word.size() ||
|
||||
params.packet_params.sync_length_bits > params.sync_word.size() * 8) {
|
||||
return ue(-EINVAL);
|
||||
}
|
||||
|
||||
APP_RADIO_RETURN_ERR_CTX(set_standby(), "gfsk_rx::standby");
|
||||
APP_RADIO_RETURN_ERR_CTX(set_packet_type_gfsk(),
|
||||
"gfsk_rx::set_packet_type");
|
||||
APP_RADIO_RETURN_ERR_CTX(set_rf_frequency(params.frequency_mhz),
|
||||
"gfsk_rx::set_rf_frequency");
|
||||
APP_RADIO_RETURN_ERR_CTX(set_buffer_base_address(),
|
||||
"gfsk_rx::set_buffer_base_address");
|
||||
APP_RADIO_RETURN_ERR_CTX(set_gfsk_modulation_params(params.mod_params),
|
||||
"gfsk_rx::set_modulation_params");
|
||||
APP_RADIO_RETURN_ERR_CTX(
|
||||
set_gfsk_sync_word(std::span<const uint8_t>{params.sync_word.data(),
|
||||
params.sync_word_length}),
|
||||
"gfsk_rx::set_sync_word");
|
||||
APP_RADIO_RETURN_ERR_CTX(set_gfsk_crc_seed(params.crc_seed),
|
||||
"gfsk_rx::set_crc_seed");
|
||||
APP_RADIO_RETURN_ERR_CTX(set_gfsk_crc_polynomial(params.crc_polynomial),
|
||||
"gfsk_rx::set_crc_polynomial");
|
||||
APP_RADIO_RETURN_ERR_CTX(set_gfsk_whitening_seed(params.whitening_seed),
|
||||
"gfsk_rx::set_whitening_seed");
|
||||
if (params.packet_params.address_filtering !=
|
||||
GfskAddressFiltering::Disabled) {
|
||||
APP_RADIO_RETURN_ERR_CTX(
|
||||
set_gfsk_address_filtering(params.node_address.value_or(0),
|
||||
params.broadcast_address.value_or(0)),
|
||||
"gfsk_rx::set_address_filtering");
|
||||
}
|
||||
APP_RADIO_RETURN_ERR_CTX(set_gfsk_packet_params(params.packet_params),
|
||||
"gfsk_rx::set_packet_params");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user