lorawan: services: frag transport: prepare for pluggable decoder

by wrapping decoder implementation specific bits in #ifdefs

Signed-off-by: Lucas Romero <luqasn@gmail.com>
This commit is contained in:
Lucas Romero 2024-06-11 10:47:10 +02:00 committed by Johan Hedberg
parent ff906974b8
commit 69c5ef9665
3 changed files with 34 additions and 5 deletions

View file

@ -55,7 +55,7 @@ zephyr_library_sources_ifdef(CONFIG_HAS_SEMTECH_LORAMAC
${ZEPHYR_LORAMAC_NODE_MODULE_DIR}/src/mac/LoRaMacSerializer.c ${ZEPHYR_LORAMAC_NODE_MODULE_DIR}/src/mac/LoRaMacSerializer.c
) )
zephyr_library_sources_ifdef(CONFIG_LORAWAN_FRAG_TRANSPORT zephyr_library_sources_ifdef(CONFIG_LORAWAN_FRAG_TRANSPORT_DECODER_SEMTECH
${ZEPHYR_LORAMAC_NODE_MODULE_DIR}/src/apps/LoRaMac/common/LmHandler/packages/FragDecoder.c ${ZEPHYR_LORAMAC_NODE_MODULE_DIR}/src/apps/LoRaMac/common/LmHandler/packages/FragDecoder.c
) )

View file

@ -65,6 +65,18 @@ config LORAWAN_FRAG_TRANSPORT
The used default port for this service is 201. The used default port for this service is 201.
choice LORAWAN_FRAG_TRANSPORT_DECODER
bool "Fragmented Data Block Transport decoder implementation"
depends on LORAWAN_FRAG_TRANSPORT
default LORAWAN_FRAG_TRANSPORT_DECODER_SEMTECH
config LORAWAN_FRAG_TRANSPORT_DECODER_SEMTECH
bool "Semtech"
help
The default decoder implementation from LoRaMAC-node.
endchoice # LORAWAN_FRAG_TRANSPORT_DECODER
DT_CHOSEN_Z_CODE_PARTITION := zephyr,code-partition DT_CHOSEN_Z_CODE_PARTITION := zephyr,code-partition
config LORAWAN_FRAG_TRANSPORT_IMAGE_SIZE config LORAWAN_FRAG_TRANSPORT_IMAGE_SIZE

View file

@ -13,7 +13,10 @@
#include "lorawan_services.h" #include "lorawan_services.h"
#include <LoRaMac.h> #include <LoRaMac.h>
#ifdef CONFIG_LORAWAN_FRAG_TRANSPORT_DECODER_SEMTECH
#include <FragDecoder.h> #include <FragDecoder.h>
#endif
#include <zephyr/lorawan/lorawan.h> #include <zephyr/lorawan/lorawan.h>
#include <zephyr/logging/log.h> #include <zephyr/logging/log.h>
#include <zephyr/random/random.h> #include <zephyr/random/random.h>
@ -79,8 +82,10 @@ struct frag_transport_context {
/** Application-specific descriptor for the data block, e.g. firmware version */ /** Application-specific descriptor for the data block, e.g. firmware version */
uint32_t descriptor; uint32_t descriptor;
#ifdef CONFIG_LORAWAN_FRAG_TRANSPORT_DECODER_SEMTECH
/* variables required for FragDecoder.h */ /* variables required for FragDecoder.h */
FragDecoderCallbacks_t decoder_callbacks; FragDecoderCallbacks_t decoder_callbacks;
#endif
}; };
/* /*
@ -127,8 +132,11 @@ static void frag_transport_package_callback(uint8_t port, bool data_pending, int
uint8_t missing_frag = CLAMP(ctx.nb_frag - ctx.nb_frag_received, 0, 255); uint8_t missing_frag = CLAMP(ctx.nb_frag - ctx.nb_frag_received, 0, 255);
uint8_t memory_error = 0;
#ifdef CONFIG_LORAWAN_FRAG_TRANSPORT_DECODER_SEMTECH
FragDecoderStatus_t decoder_status = FragDecoderGetStatus(); FragDecoderStatus_t decoder_status = FragDecoderGetStatus();
uint8_t memory_error = decoder_status.MatrixError; memory_error = decoder_status.MatrixError;
#endif
if (participants == 1 || missing_frag > 0) { if (participants == 1 || missing_frag > 0) {
tx_buf[tx_pos++] = FRAG_TRANSPORT_CMD_FRAG_STATUS; tx_buf[tx_pos++] = FRAG_TRANSPORT_CMD_FRAG_STATUS;
@ -183,15 +191,22 @@ static void frag_transport_package_callback(uint8_t port, bool data_pending, int
status |= BIT(0); status |= BIT(0);
} }
if (ctx.nb_frag > FRAG_MAX_NB || ctx.frag_size > FRAG_MAX_SIZE || if (ctx.nb_frag > FRAG_MAX_NB || ctx.frag_size > FRAG_MAX_SIZE) {
ctx.nb_frag * ctx.frag_size > FragDecoderGetMaxFileSize()) {
/* Not enough memory */ /* Not enough memory */
status |= BIT(1); status |= BIT(1);
} }
#ifdef CONFIG_LORAWAN_FRAG_TRANSPORT_DECODER_SEMTECH
if (ctx.nb_frag * ctx.frag_size > FragDecoderGetMaxFileSize()) {
/* Not enough memory */
status |= BIT(1);
}
#endif
/* Descriptor not used: Ignore Wrong Descriptor error */ /* Descriptor not used: Ignore Wrong Descriptor error */
if ((status & 0x1F) == 0) { if ((status & 0x1F) == 0) {
#ifdef CONFIG_LORAWAN_FRAG_TRANSPORT_DECODER_SEMTECH
/* /*
* Assign callbacks after initialization to prevent the FragDecoder * Assign callbacks after initialization to prevent the FragDecoder
* from writing byte-wise 0xFF to the entire flash. Instead, erase * from writing byte-wise 0xFF to the entire flash. Instead, erase
@ -204,7 +219,7 @@ static void frag_transport_package_callback(uint8_t port, bool data_pending, int
ctx.decoder_callbacks.FragDecoderWrite = frag_flash_write; ctx.decoder_callbacks.FragDecoderWrite = frag_flash_write;
ctx.decoder_callbacks.FragDecoderRead = frag_flash_read; ctx.decoder_callbacks.FragDecoderRead = frag_flash_read;
#endif
frag_flash_init(ctx.frag_size); frag_flash_init(ctx.frag_size);
ctx.is_active = true; ctx.is_active = true;
} }
@ -251,8 +266,10 @@ static void frag_transport_package_callback(uint8_t port, bool data_pending, int
frag_flash_use_cache(); frag_flash_use_cache();
} }
#ifdef CONFIG_LORAWAN_FRAG_TRANSPORT_DECODER_SEMTECH
decoder_process_status = FragDecoderProcess( decoder_process_status = FragDecoderProcess(
frag_counter, (uint8_t *)&rx_buf[rx_pos]); frag_counter, (uint8_t *)&rx_buf[rx_pos]);
#endif
LOG_INF("DataFragment %u of %u (%u lost), session: %u, decoder result: %d", LOG_INF("DataFragment %u of %u (%u lost), session: %u, decoder result: %d",
frag_counter, ctx.nb_frag, frag_counter - ctx.nb_frag_received, frag_counter, ctx.nb_frag, frag_counter - ctx.nb_frag_received,