/*!
 * \file      NvmDataMgmt.c
 *
 * \brief     NVM context management implementation
 *
 * \copyright Revised BSD License, see section \ref LICENSE.
 *
 * \code
 *                ______                              _
 *               / _____)             _              | |
 *              ( (____  _____ ____ _| |_ _____  ____| |__
 *               \____ \| ___ |    (_   _) ___ |/ ___)  _ \
 *               _____) ) ____| | | || |_| ____( (___| | | |
 *              (______/|_____)_|_|_| \__)_____)\____)_| |_|
 *              (C)2013-2017 Semtech
 *
 *               ___ _____ _   ___ _  _____ ___  ___  ___ ___
 *              / __|_   _/_\ / __| |/ / __/ _ \| _ \/ __| __|
 *              \__ \ | |/ _ \ (__| ' <| _| (_) |   / (__| _|
 *              |___/ |_/_/ \_\___|_|\_\_| \___/|_|_\\___|___|
 *              embedded.connectivity.solutions===============
 *
 * \endcode
 *
 * \author    Miguel Luis ( Semtech )
 *
 * \author    Gregory Cristian ( Semtech )
 *
 * \author    Daniel Jaeckle ( STACKFORCE )
 *
 * \author    Johannes Bruder ( STACKFORCE )
 */
/**
  ******************************************************************************
  *
  *          Portions COPYRIGHT 2020 STMicroelectronics
  *
  * @file    NvmDataMgmt.c
  * @author  MCD Application Team
  * @brief   NVM context management implementation
  ******************************************************************************
  */
#include "utilities.h"
#include "LoRaMac.h"
#include "NvmDataMgmt.h"
/*!
 * Enables/Disables the context storage management storage.
 * Must be enabled for LoRaWAN 1.0.4 or later.
 */
#ifndef CONTEXT_MANAGEMENT_ENABLED
#define CONTEXT_MANAGEMENT_ENABLED         0
#endif /* CONTEXT_MANAGEMENT_ENABLED */

#if ( CONTEXT_MANAGEMENT_ENABLED == 1 )
static uint16_t NvmNotifyFlags = 0;
#endif /* CONTEXT_MANAGEMENT_ENABLED == 1 */

void NvmDataMgmtEvent( uint16_t notifyFlags )
{
#if ( CONTEXT_MANAGEMENT_ENABLED == 1 )
    NvmNotifyFlags |= notifyFlags;
#endif /* CONTEXT_MANAGEMENT_ENABLED == 1 */
}

int32_t NvmDataMgmtStoreBegin( void )
{
#if ( CONTEXT_MANAGEMENT_ENABLED == 1 )
    /* Input checks */
    if( NvmNotifyFlags == LORAMAC_NVM_NOTIFY_FLAG_NONE )
    {
        /* There was no update. */
        return NVM_DATA_NO_UPDATED_DATA;
    }
    if( LoRaMacStop( ) != LORAMAC_STATUS_OK )
    {
        return NVM_DATA_NOT_AVAILABLE;
    }
    return NVM_DATA_OK;
#else
    return NVM_DATA_DISABLED;
#endif /* CONTEXT_MANAGEMENT_ENABLED */
}

int32_t NvmDataMgmtStoreEnd( void )
{
#if ( CONTEXT_MANAGEMENT_ENABLED == 1 )
    /* Reset notification flags */
    NvmNotifyFlags = LORAMAC_NVM_NOTIFY_FLAG_NONE;

    /* Resume LoRaMac */
    LoRaMacStart( );
    return NVM_DATA_OK;
#else
    return NVM_DATA_DISABLED;
#endif /* CONTEXT_MANAGEMENT_ENABLED */
}