STM32CubeWL/Middlewares/Third_Party/LoRaWAN/LmHandler/Packages/FragDecoder.h

126 lines
4.1 KiB
C

/*!
* \file FragDecoder.h
*
* \brief Implements the LoRa-Alliance fragmentation decoder
* Specification V1.0.0: https://resources.lora-alliance.org/technical-specifications/lorawan-fragmented-data-block-transport-specification-v1-0-0
* Specification V2.0.0: https://resources.lora-alliance.org/technical-specifications/ts004-2-0-0-fragmented-data-block-transport
*
* \copyright Revised BSD License, see section \ref LICENSE.
*
* \code
* ______ _
* / _____) _ | |
* ( (____ _____ ____ _| |_ _____ ____| |__
* \____ \| ___ | (_ _) ___ |/ ___) _ \
* _____) ) ____| | | || |_| ____( (___| | | |
* (______/|_____)_|_|_| \__)_____)\____)_| |_|
* (C)2013-2018 Semtech
*
* \endcode
*
* \author Fabien Holin ( Semtech )
* \author Miguel Luis ( Semtech )
*/
/**
******************************************************************************
*
* Portions COPYRIGHT 2020 STMicroelectronics
*
* @file FragDecoder.h
* @author MCD Application Team
* @brief Header for Fragmentation Decoder module
******************************************************************************
*/
#ifndef __FRAG_DECODER_H__
#define __FRAG_DECODER_H__
#ifdef __cplusplus
extern "C"
{
#endif
#define FRAG_SESSION_FINISHED ( int32_t )0
#define FRAG_SESSION_NOT_STARTED ( int32_t )-2
#define FRAG_SESSION_ONGOING ( int32_t )-1
typedef struct sFragDecoderStatus
{
uint16_t FragNbRx;
uint16_t FragNbLost;
uint16_t FragNbLastRx;
uint8_t MatrixError;
} FragDecoderStatus_t;
typedef struct sFragDecoderCallbacks
{
/*!
* Initialize final uncoded data buffer
*
* \retval status Write operation status [0: Success, -1 Fail]
*/
int32_t ( *FragDecoderErase )( void );
/*!
* Writes `data` buffer of `size` starting at address `addr`
*
* \param [in] addr Address start index to write to.
* \param [in] data Data buffer to be written.
* \param [in] size Size of data buffer to be written.
*
* \retval status Write operation status [0: Success, -1 Fail]
*/
int32_t ( *FragDecoderWrite )( uint32_t addr, uint8_t *data, uint32_t size );
/*!
* Reads `data` buffer of `size` starting at address `addr`
*
* \param [in] addr Address start index to read from.
* \param [in] data Data buffer to be read.
* \param [in] size Size of data buffer to be read.
*
* \retval status Read operation status [0: Success, -1 Fail]
*/
int32_t ( *FragDecoderRead )( uint32_t addr, uint8_t *data, uint32_t size );
} FragDecoderCallbacks_t;
/*!
* \brief Initializes the fragmentation decoder
*
* \param [in] fragNb Number of expected fragments (without redundancy packets)
* \param [in] fragSize Size of a fragment
* \param [in] callbacks Pointer to the Write/Read functions.
* \param [in] fragPVer Fragmentation Package version to adapt the LDPC matrix usage
*/
void FragDecoderInit( uint16_t fragNb, uint8_t fragSize, FragDecoderCallbacks_t *callbacks, uint8_t fragPVer );
/*!
* \brief Gets the maximum file size that can be received
*
* \retval size FileSize
*/
uint32_t FragDecoderGetMaxFileSize( void );
/*!
* \brief Function to decode and reconstruct the binary file
* Called for each receive frame
*
* \param [in] fragCounter Fragment counter [1..(FragDecoder.FragNb + FragDecoder.Redundancy)]
* \param [in] rawData Pointer to the fragment to be processed (length = FragDecoder.FragSize)
*
* \retval status Process status. [FRAG_SESSION_ONGOING,
* FRAG_SESSION_FINISHED or
* FragDecoder.Status.FragNbLost]
*/
int32_t FragDecoderProcess( uint16_t fragCounter, uint8_t *rawData );
/*!
* \brief Gets the current fragmentation status
*
* \retval status Fragmentation decoder status
*/
FragDecoderStatus_t FragDecoderGetStatus( void );
#ifdef __cplusplus
}
#endif
#endif /* __FRAG_DECODER_H__ */