text: /*!
   * \file      lpm-board.c
   *
   * \brief     Target board low power modes management
   *
   * \copyright Revised BSD License, see section \ref LICENSE.
   *
   * \code
   *                ______                              _
   *               / _____)             _              | |
   *              ( (____  _____ ____ _| |_ _____  ____| |__
   *               \____ \| ___ |    (_   _) ___ |/ ___)  _ \
   *               _____) ) ____| | | || |_| ____( (___| | | |
   *              (______/|_____)_|_|_| \__)_____)\____)_| |_|
   *              (C)2013-2017 Semtech - STMicroelectronics
   *
   * \endcode
   *
   * \author    Miguel Luis ( Semtech )
   *
   * \author    Gregory Cristian ( Semtech )
   *
   * \author    MCD Application Team (C)( STMicroelectronics International )
   */
  #include <stdint.h>
  #include "stm32l1xx.h"
  #include "utilities.h"
  #include "lpm-board.h"
  
  static uint32_t StopModeDisable = 0;
  static uint32_t OffModeDisable = 0;
  
  void LpmSetOffMode( LpmId_t id, LpmSetMode_t mode )
  {
      CRITICAL_SECTION_BEGIN( );
  
      switch( mode )
      {
          case LPM_DISABLE:
          {
              OffModeDisable |= ( uint32_t )id;
              break;
          }
          case LPM_ENABLE:
          {
              OffModeDisable &= ~( uint32_t )id;
              break;
          }
          default:
          {
              break;
          }
      }
  
      CRITICAL_SECTION_END( );
      return;
  }
  
  void LpmSetStopMode( LpmId_t id, LpmSetMode_t mode )
  {
      CRITICAL_SECTION_BEGIN( );
  
      switch( mode )
      {
          case LPM_DISABLE:
          {
              StopModeDisable |= ( uint32_t )id;
              break;
          }
          case LPM_ENABLE:
          {
              StopModeDisable &= ~( uint32_t )id;
              break;
          }
          default:
          {
              break;
          }
      }
  
      CRITICAL_SECTION_END( );
      return;
  }
  
  void LpmEnterLowPower( void )
  {
      if( StopModeDisable != 0 )
      {
          /*!
          * SLEEP mode is required
          */
          LpmEnterSleepMode( );
          LpmExitSleepMode( );
      }
      else
      { 
          if( OffModeDisable != 0 )
          {
              /*!
              * STOP mode is required
              */
              LpmEnterStopMode( );
              LpmExitStopMode( );
          }
          else
          {
              /*!
              * OFF mode is required
              */
              LpmEnterOffMode( );
              LpmExitOffMode( );
          }
      }
      return;
  }
  
  LpmGetMode_t LpmGetMode(void)
  {
      LpmGetMode_t mode;
  
      CRITICAL_SECTION_BEGIN( );
  
      if( StopModeDisable != 0 )
      {
          mode = LPM_SLEEP_MODE;
      }
      else
      {
          if( OffModeDisable != 0 )
          {
              mode = LPM_STOP_MODE;
          }
          else
          {
              mode = LPM_OFF_MODE;
          }
      }
  
      CRITICAL_SECTION_END( );
      return mode;
  }
  
  __weak void LpmEnterSleepMode( void )
  {
  }
  
  __weak void LpmExitSleepMode( void )
  {
  }
  
  __weak void LpmEnterStopMode( void )
  {
  }
  
  __weak void LpmExitStopMode( void )
  {
  }
  
  __weak void LpmEnterOffMode( void )
  {
  }
  
  __weak void LpmExitOffMode( void )
  {
  }
  