57 lines
1.7 KiB
C
57 lines
1.7 KiB
C
|
/*
|
||
|
* Copyright (c) 2024 A Labs GmbH
|
||
|
* Copyright (c) 2024 tado GmbH
|
||
|
* Copyright (c) 2022 Jiapeng Li
|
||
|
*
|
||
|
* Based on: https://github.com/JiapengLi/LoRaWANFragmentedDataBlockTransportAlgorithm
|
||
|
* Original algorithm: http://www.inference.org.uk/mackay/gallager/papers/ldpc.pdf
|
||
|
*
|
||
|
* SPDX-License-Identifier: Apache-2.0
|
||
|
*/
|
||
|
|
||
|
#ifndef FRAG_DEC_H_
|
||
|
#define FRAG_DEC_H_
|
||
|
|
||
|
#include <stdint.h>
|
||
|
#include <stddef.h>
|
||
|
|
||
|
#define FRAG_MAX_NB \
|
||
|
(CONFIG_LORAWAN_FRAG_TRANSPORT_IMAGE_SIZE / CONFIG_LORAWAN_FRAG_TRANSPORT_MIN_FRAG_SIZE + \
|
||
|
1U)
|
||
|
#define FRAG_MAX_SIZE (CONFIG_LORAWAN_FRAG_TRANSPORT_MAX_FRAG_SIZE)
|
||
|
#define FRAG_TOLERANCE (FRAG_MAX_NB * CONFIG_LORAWAN_FRAG_TRANSPORT_MAX_REDUNDANCY / 100U)
|
||
|
|
||
|
#define FRAG_DEC_ONGOING (-1)
|
||
|
#define FRAG_DEC_ERR_INVALID_FRAME (-2)
|
||
|
#define FRAG_DEC_ERR_TOO_MANY_FRAMES_LOST (-3)
|
||
|
#define FRAG_DEC_ERR (-4)
|
||
|
|
||
|
enum frag_decoder_status {
|
||
|
/** Processing uncoded fragments */
|
||
|
FRAG_DEC_STA_UNCODED,
|
||
|
/** Processing coded fragments and restoring data with the help of other fragments */
|
||
|
FRAG_DEC_STA_CODED,
|
||
|
/** All fragments received and/or restored */
|
||
|
FRAG_DEC_STA_DONE,
|
||
|
};
|
||
|
|
||
|
struct frag_decoder {
|
||
|
/** Current decoder status */
|
||
|
enum frag_decoder_status status;
|
||
|
|
||
|
/** Number of fragments */
|
||
|
uint16_t nb_frag;
|
||
|
/** Size of individual fragment */
|
||
|
uint8_t frag_size;
|
||
|
|
||
|
/** Number of frames lost in this session */
|
||
|
uint16_t lost_frame_count;
|
||
|
/** Number of frames recovered in this session */
|
||
|
uint16_t filled_lost_frame_count;
|
||
|
};
|
||
|
|
||
|
void frag_dec_init(struct frag_decoder *decoder, size_t nb_frag, size_t frag_size);
|
||
|
int frag_dec(struct frag_decoder *decoder, uint16_t frag_counter, const uint8_t *buf, size_t len);
|
||
|
|
||
|
#endif /* FRAG_DEC_H_ */
|