126 lines
4.1 KiB
C
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__ */
|