Программный модуль для утюга RI-C254S. Версия 1.0
ПО является неотъемлемой частью утюга RI-C254S, отдельно потребителю не поставляется и эксплуатируется только в составе устройства.
////////////////////////////////////////////////////////////////
//RI-C254S
//v1.0
//application.c
////////////////////////////////////////////////////////////////
/********* HEADER FILE INCLUDES *******************************************/
#include <stdint.h>
#include <stdlib.h>
#include "math.h"
#include "nrf.h"
#include "nrf_delay.h"
#include "nrf_gpio.h"
#include "app_error.h"
#include "nrf_soc.h"
#include "app_util_platform.h"
#include "r4s.h"
#include "r4s_app_flash.h"
#include "led.h"
#include "led_config.h"
#include "buz.h"
#include "buz_config.h"
#include "timers.h"
#include "timers_config.h"
#include "sw200d.h"
#include "sw200d_config.h"
#include "indication.h"
#include "hal.h"
#include "config.h"
#include "application.h"
#include "application_api.h"
/********* DEFINES ********************************************************/
#define FLAGS_OFFSET 0
#define BLOCK_FLAG_PAGE R4S_APP_PAGE_0
#define MAN_UNBLOCK_FLAG_PAGE R4S_APP_PAGE_1
/********* MACROS *********************************************************/
/********* GLOBAL VARIABLES ***********************************************/
/********* LOCAL VARIABLES ************************************************/
/***************************************************************************
* System variables
**************************************************************************/
/*static*/ app_state_t app_state = APP_START; /* текущее состояние */
static app_state_t app_prew_state = APP_START; /* предыдущее состояние */
/*static*/ app_orient_t app_orient = APP_ORIENT_HORIZONTAL; /* ориентация устройства*/
static sw200d_data_t sen_1 = {}; /* состояние первого датчика */
static sw200d_data_t sen_2 = {}; /* состояние второго датчика */
static uint32_t err_code = NRF_SUCCESS; /* код ошибки */
static uint8_t app_pairing_cnt = 0; /* счетчик пэйринга; по нему происходит выход из состояния пэйринга */
static uint8_t beep_count = 0; /* количество сигналов бузера в очереди на выполнение */
static uint8_t app_block_state_ind_cnt = 0;/* счетчик индикации состояния блокировки */
/***************************************************************************
* FLAGS
**************************************************************************/
static bool app_orientation_changed_flag; /* флаг изменения ориентации устройства */
static bool app_timeout_flag; /* флаг таймаута, используется для перехода между состояниями или индикации внутри состояния */
static bool app_pairing_flag; /* флаг пэйринга */
static bool app_unpairing_flag; /* флаг анпэйринга */
static bool app_block_flag; /* флаг блокировки, если установлен - запрещен переход в состояние APP_WORK (временный флаг приложения) */
static bool app_man_unblock_flag; /* флаг ручного отключения блокировки */
/********* FUNCTION PROTOTYPES ********************************************/
/********* FUNCTIONS IMPLEMENTATION ***************************************/
/***************************************************************************
* System callbacks
**************************************************************************/
/**
* @brief По нему происходит переход между состониями или работа внутри
* состояний. Устанавливается флаг app_timeout_flag. Время
* вызова зависит от состояния.
*
* @param none
* @return none
*/
static void app_timeout_callback(void)
{
app_timeout_flag = true;
err_code = timer_stop(TIMERS_APP_TIMEOUT);
APP_ERROR_CHECK(err_code);
}
/**
* @brief По нему устанавливается флаг перехода в состояния пэйринга.
* Вызов происходит если продержать утюг в положении
* "APP_ORIENT_VERTICAL_DOWN" втечение 5 секунд.
*
* @param none
* @return none
*/
static void app_pairing_callback(void)
{
app_pairing_flag = true;
err_code = timer_stop(TIMERS_APP_PAIRING);
APP_ERROR_CHECK(err_code);
}
/**
* @brief По нему происходит анпэйринг. Вызывается если продержать
* утюг в положение "APP_ORIENT_UNSIDE_DOWN" втечение 10 секунд
*
* @param none
* @return none
*/
static void app_unpairing_callback(void)
{
app_unpairing_flag = true;
err_code = timer_stop(TIMERS_APP_UNPAIRING);
APP_ERROR_CHECK(err_code);
}
/**
* @brief По нему устанавливается флаг о снятии блокировки. По этому
* флагу в память записывается байт, который будет прочитан при
* включении утюга.
*
* @param none
* @return none
*/
static void app_man_unblock_callback(void)
{
app_man_unblock_flag = true;
err_code = timer_stop(TIMERS_APP_MAN_UNBLOCK);
APP_ERROR_CHECK(err_code);
}
/***************************************************************************
* Applivation init
**************************************************************************/
/**
* @brief Инициализация приложения. Инициализируется железо,
* создаются необходимые таймеры, проверяется флаг о ручном снятии
* блокировки.
*
* @param none
* @return none
*/
void application_init( void )
{
/* Инициазация железа */
err_code = hal_hw_init();
APP_ERROR_CHECK(err_code);
/* Инициализация модуля индикации */
err_code = indication_init();
APP_ERROR_CHECK(err_code);
/* Таймер таймаута */
err_code = timer_create(TIMERS_APP_TIMEOUT,
TIMERS_MILLISECOND(10),
(callback_t)app_timeout_callback);
APP_ERROR_CHECK(err_code);
/* Таймер пэйринга */
err_code = timer_create(TIMERS_APP_PAIRING,
TIMERS_SECOND(5),
(callback_t)app_pairing_callback);
APP_ERROR_CHECK(err_code);
/* Таймер анпэйринга */
err_code = timer_create(TIMERS_APP_UNPAIRING,
TIMERS_SECOND(10),
(callback_t)app_unpairing_callback);
APP_ERROR_CHECK(err_code);
/* Таймер ручного отключени блокировки */
err_code = timer_create(TIMERS_APP_MAN_UNBLOCK,
TIMERS_SECOND(5),
(callback_t)app_man_unblock_callback);
APP_ERROR_CHECK(err_code);
/* Считываем из памяти флаг ручного снятия блокировки */
uint32_t unblock_flag_value;
err_code = r4s_app_flash_read( MAN_UNBLOCK_FLAG_PAGE,
FLAGS_OFFSET,
(uint8_t *)&unblock_flag_value,
sizeof(unblock_flag_value));
APP_ERROR_CHECK(err_code);
/* Если Флаг установлен */
if( unblock_flag_value == 1)
{
/* Стираем флаг блокировки */
err_code = r4s_app_flash_erase(BLOCK_FLAG_PAGE);
APP_ERROR_CHECK(err_code);
/* Стираем флаг ручного отключения блокировки */
err_code = r4s_app_flash_erase(MAN_UNBLOCK_FLAG_PAGE);
APP_ERROR_CHECK(err_code);
/* снимаем флаг блокировки (временный флаг приложения) */
app_block_flag = false;
}
else /* Если флаг ручного отключения не установлен */
{
/* Считываем флаг блокировки из памяти */
uint32_t block_flag;
err_code = r4s_app_flash_read( BLOCK_FLAG_PAGE,
FLAGS_OFFSET,
(uint8_t *)&block_flag,
sizeof(block_flag));
APP_ERROR_CHECK(err_code);
/* Устанавливаем временный флаг приложения */
(block_flag == 1 ) ? (app_block_flag = true) : (app_block_flag = false);
}
/* Пищим один раз */
err_code = buz_add_beep(500,1,BUZ_BEEP_MULTI);
APP_ERROR_CHECK(err_code);
/* Моргаем светодиодом один раз */
indication_led_blink(1000, 1);
/* считываем показания датчиков положения */
err_code = sw200d_read_data(SW200D_S1, &sen_1);
APP_ERROR_CHECK(err_code);
err_code = sw200d_read_data(SW200D_S2, &sen_2);
APP_ERROR_CHECK(err_code);
/* Считываем показания датчиков для определения текущего положения */
app_orient = (app_orient_t)(( sen_1.state << 1 ) | ( sen_2.state ));
}
/***************************************************************************
* Функ
**************************************************************************/
/**@brief Функция выполняет работу при входе в новое состояние
*
* @param none
*
* @return none
*/
void application_init_new_state( app_state_t app_new_state )
{
/* если перехода не было выходим из функции */
if( app_prew_state == app_new_state )return;
switch( app_new_state )
{
case APP_START:
break;
case APP_STAND_BY:
{
/* При переходе в состони APP_STAND_BY перезапускаем таймер таймаута
* TIMERS_APP_TIMEOUT с временем срабатывания 1 сек. По нему будет
* отображаться индикация состояния ( моргать 1 раз в сек ) */
err_code = timer_write_period(TIMERS_APP_TIMEOUT,
TIMERS_SECOND(1));
APP_ERROR_CHECK(err_code);
err_code = timer_reset(TIMERS_APP_TIMEOUT);
APP_ERROR_CHECK(err_code);
err_code = timer_start(TIMERS_APP_TIMEOUT);
APP_ERROR_CHECK(err_code);
/* Отключаем нагреватель */
relay_off();
break;
}
case APP_WORK:
{
/* При переходе в состояние работы APP_WORK останавливаем любую
* световую индикацию. */
indication_led_blink_stop();
led_write_data(LED_INDEX_1, 0);
timer_stop(TIMERS_APP_TIMEOUT);
/* Включаем нагреватель */
relay_on();
app_orientation_changed_flag = true;
}
break;
case APP_PAIRING_STATE:
{
/* При переходе в состояние пэйринга APP_PAIRING_STATE
* выключаем нагреватель */
relay_off();
/* Перезапускаем таймер таймаута. По нему отображается индикация
* состояния пэйринга (моргать 1 раз в секунду ) */
err_code = timer_write_period(TIMERS_APP_TIMEOUT,
TIMERS_SECOND(1));
APP_ERROR_CHECK(err_code);
err_code = timer_reset(TIMERS_APP_TIMEOUT);
APP_ERROR_CHECK(err_code);
/* Сбрасываем счетчик пэйринга. Когда счетчик станет равным 10
* произойдет выход из состояния пэйринга. */
app_pairing_cnt = 0;
break;
}
default:
{
break;
}
}
app_prew_state = app_new_state;
return;
}
/**@brief Функция выполняет работу при выходе из соответствующего состояния
*
* @param none
*
* @return none
*/
void application_deinit_prew_state( app_state_t app_new_state )
{
if( app_prew_state == app_new_state )return;
switch( app_prew_state )
{
case APP_START:
break;
case APP_STAND_BY:
{
break;
}
case APP_WORK: // при выходе из APP_WORK
{
}
break;
default:
{
break;
}
}
return;
}
/***************************************************************************
* Application process.
**************************************************************************/
/**
* @brief Функция выполняется основную работу приложения.
*
* @param none
* @return none
*/
void application_process( void )
{
application_init_new_state( app_state );
/* Считываем количество писков в очереди */
err_code = buz_get_beep_count(&beep_count);
APP_ERROR_CHECK(err_code);
/* если очередь писков не пуста запрещаем опрос датчиков положения */
if( beep_count != 0 )
{
err_code = sw200d_lock_set(SW200D_LOCK);
APP_ERROR_CHECK(err_code);
}
else
{ /* Если пуста разрешаем опрос датчиков положения */
err_code = sw200d_lock_set(SW200D_UNLOCK);
APP_ERROR_CHECK(err_code);
}
/* считываем показания датчиков положения */
err_code = sw200d_read_data(SW200D_S1, &sen_1);
APP_ERROR_CHECK(err_code);
err_code = sw200d_read_data(SW200D_S2, &sen_2);
APP_ERROR_CHECK(err_code);
/* Если на датчиках было зафиксировано событие */
if( sen_1.event_close == SW200D_EVENT_CAPTURED ||
sen_1.event_open == SW200D_EVENT_CAPTURED ||
sen_2.event_close == SW200D_EVENT_CAPTURED ||
sen_2.event_open == SW200D_EVENT_CAPTURED )
{
/* Считываем показания датчиков */
app_orient = (app_orient_t)(( sen_1.state << 1 ) | ( sen_2.state ));
/* устанавливаем флаг, извещающий приложение о изменении положения */
app_orientation_changed_flag = true;
/* останавливаем таймеры пэйринга, анпэйринга и ручного
* отключения блокировки */
err_code = timer_stop(TIMERS_APP_PAIRING);
APP_ERROR_CHECK(err_code);
err_code = timer_stop(TIMERS_APP_UNPAIRING);
APP_ERROR_CHECK(err_code);
err_code = timer_stop(TIMERS_APP_MAN_UNBLOCK);
APP_ERROR_CHECK(err_code);
}
/* Если установлен флаг ручного отключения блокировки */
if( app_man_unblock_flag )
{
uint32_t set_flag = 1;
/* Издаем короткий писк */
indication_buz_multi(1000, 1);
/* Записываем флаг в память */
err_code = r4s_app_flash_write( MAN_UNBLOCK_FLAG_PAGE,
FLAGS_OFFSET,
(uint8_t *)&set_flag,
sizeof(set_flag));
/* Стираем временный флаг приложения */
app_man_unblock_flag = false;
}
/* Если был установле флаг пэйринга */
if( app_pairing_flag )
{
app_pairing_flag = false; /* стираем флаг */
indication_buz_multi(200,3); /* пищим коротко 3 раза */
app_state = APP_PAIRING_STATE; /* переходим в состояние пэйринга */
}
/* Машина состояний */
switch(app_state)
{
case APP_START:
{
app_state = APP_STAND_BY;
}
break;
/* состояние выкл */
case APP_STAND_BY:
{
/* Т.к. после переворота утюга в положение "APP_ORIENT_UPSIDE_DOWN"
* через секунду утсройство должно перейти в состояние выкл, то
* и проверка флага анпэйриннга происходит здесь, в то время
* как таймер, устанавливающий флаг, запускается в состоянии
* APP_WORk */
if( app_unpairing_flag )
{
}
/* По таймауту запускаем индикацию состояния */
if( app_timeout_flag )
{
/* если включена блокировка моргаем 2 раза с
* интервалом 3 секунды */
if( app_block_flag)
{
if( ++app_block_state_ind_cnt > 3)
{
app_block_state_ind_cnt = 0;
indication_led_blink(500,2);
}
err_code = timer_start(TIMERS_APP_TIMEOUT);
APP_ERROR_CHECK(err_code);
}
else
{
/* Если нет блокировки моргаем 1 раз в секунду */
indication_led_blink(1000,1);
err_code = timer_start(TIMERS_APP_TIMEOUT);
APP_ERROR_CHECK(err_code);
}
app_timeout_flag = false;
}
/* если не было изменения состояния выходим из машины состояний */
if( !app_orientation_changed_flag )break;
/* Если было изменеие состояния запускаем таймеры пэйринга,
* анпэйринга и ручного отключения блокировки */
switch( app_orient )
{
case APP_ORIENT_VERTICAL_DOWN:
{
err_code = timer_reset(TIMERS_APP_PAIRING);
APP_ERROR_CHECK(err_code);
err_code = timer_start(TIMERS_APP_PAIRING);
APP_ERROR_CHECK(err_code);
}
break;
case APP_ORIENT_UPSIDE_DOWN:
{
err_code = timer_reset(TIMERS_APP_UNPAIRING);
APP_ERROR_CHECK(err_code);
err_code = timer_start(TIMERS_APP_UNPAIRING);
APP_ERROR_CHECK(err_code);
err_code = timer_reset(TIMERS_APP_MAN_UNBLOCK);
APP_ERROR_CHECK(err_code);
err_code = timer_start(TIMERS_APP_MAN_UNBLOCK);
APP_ERROR_CHECK(err_code);
}
break;
default:
break;
}
/* Если устройство не заблокировано, переходим в режим работы */
if( !app_block_flag ) app_state = APP_WORK;
}
break;
/* Состояние вкл */
case APP_WORK:
{
/* Если сработал таймаут ( автоотключение ) - переходим
* в режим выкл */
if( app_timeout_flag )
{
app_state = APP_STAND_BY;
app_timeout_flag = false;
/* Не пищим если автоотключение произошло в положении
* APP_ORIENT_UPSIDE_DOWN */
if( app_orient != APP_ORIENT_UPSIDE_DOWN )
{
err_code = buz_add_beep(500,1,BUZ_BEEP_MULTI);
APP_ERROR_CHECK(err_code);
}
}
/* Если не было инзменения положения выходим из машины состояний */
if( !app_orientation_changed_flag )break;
/* Включаем реле, т.к. оно могло быть выключено при переходе
* в состояние APP_ORIENT_UPSIDE_DOWN */
relay_on();
/* Если было инзменение положения, запускаем таймеры автоотключения,
* пэйринга, анпэйринга и ручного отключения блокировки
* соответсвенно */
switch( app_orient )
{
case APP_ORIENT_HORIZONTAL:
{
err_code = timer_write_period(TIMERS_APP_TIMEOUT,
TIMERS_SECOND(30));
APP_ERROR_CHECK(err_code);
err_code = timer_reset(TIMERS_APP_TIMEOUT);
APP_ERROR_CHECK(err_code);
err_code = timer_start(TIMERS_APP_TIMEOUT);
APP_ERROR_CHECK(err_code);
}
break;
case APP_ORIENT_VERTICAL_UP:
{
err_code = timer_write_period(TIMERS_APP_TIMEOUT,
TIMERS_MINUTE(8));
APP_ERROR_CHECK(err_code);
err_code = timer_reset(TIMERS_APP_TIMEOUT);
APP_ERROR_CHECK(err_code);
err_code = timer_start(TIMERS_APP_TIMEOUT);
APP_ERROR_CHECK(err_code);
}
break;
case APP_ORIENT_VERTICAL_DOWN:
{
err_code = timer_write_period(TIMERS_APP_TIMEOUT,
TIMERS_SECOND(30));
APP_ERROR_CHECK(err_code);
err_code = timer_reset(TIMERS_APP_TIMEOUT);
APP_ERROR_CHECK(err_code);
err_code = timer_start(TIMERS_APP_TIMEOUT);
APP_ERROR_CHECK(err_code);
err_code = timer_reset(TIMERS_APP_PAIRING);
APP_ERROR_CHECK(err_code);
err_code = timer_start(TIMERS_APP_PAIRING);
APP_ERROR_CHECK(err_code);
}
break;
case APP_ORIENT_UPSIDE_DOWN:
{
err_code = timer_write_period(TIMERS_APP_TIMEOUT,
TIMERS_SECOND(1));
APP_ERROR_CHECK(err_code);
err_code = timer_reset(TIMERS_APP_TIMEOUT);
APP_ERROR_CHECK(err_code);
err_code = timer_start(TIMERS_APP_TIMEOUT);
APP_ERROR_CHECK(err_code);
err_code = timer_reset(TIMERS_APP_UNPAIRING);
APP_ERROR_CHECK(err_code);
err_code = timer_start(TIMERS_APP_UNPAIRING);
APP_ERROR_CHECK(err_code);
err_code = timer_reset(TIMERS_APP_MAN_UNBLOCK);
APP_ERROR_CHECK(err_code);
err_code = timer_start(TIMERS_APP_MAN_UNBLOCK);
APP_ERROR_CHECK(err_code);
}
break;
default:
break;
}
break;
}
/* Состояние пэйринга */
case APP_PAIRING_STATE:
{
/* По таймауту индицируем состояние - моргаем 1 раз
* в секунду как в режиме APP_STAND_BY */
if( app_timeout_flag )
{
indication_led_blink(1000,1);
err_code = timer_start(TIMERS_APP_TIMEOUT);
APP_ERROR_CHECK(err_code);
app_timeout_flag = false;
/* Заходя сюда раз в секунду увелививаем счетчик на 1. когда
* он станет равным 10 выходим из состояния пэйринга, т.к.
* длительность пэйринга 10 сек */
if( ++app_pairing_cnt > 10 ) app_state = APP_STAND_BY;
}
break;
}
default:
{
app_state = APP_STAND_BY;
break;
}
}
application_deinit_prew_state( app_state );
app_orientation_changed_flag = false;
return;
}
/***************************************************************************
* API функции используемые для усправления устройством со смартфона
**************************************************************************/
/**
* @brief Получить ориентацию утюга.
*
* @param none
* @return uint8_t положение:
* 0 - горизонтальное
* 1 - носиком вверх
* 2 - носиком вниз
* 3 - перевернутое
*/
uint8_t api_get_orientation(void)
{
uint8_t ret_val = 0;
switch( app_orient )
{
case APP_ORIENT_HORIZONTAL:
ret_val = 0;
break;
case APP_ORIENT_VERTICAL_UP:
ret_val = 1;
break;
case APP_ORIENT_VERTICAL_DOWN:
ret_val = 2;
break;
case APP_ORIENT_UPSIDE_DOWN:
ret_val = 3;
break;
default:
ret_val = 0;
break;
}
return ret_val;
}
/**
* @brief Выключить утюг
*
* @param none
* @return true всегда
*/
bool api_stop(void)
{
app_state = APP_STAND_BY;
err_code = buz_add_beep(500,1,BUZ_BEEP_MULTI);
APP_ERROR_CHECK(err_code);
return true;
}
/**
* @brief Получить блокировку
*
* @param none
* @return uint8_t 0 - выкл
* 1 - вкл.
*/
uint8_t api_get_block(void)
{
uint32_t block_en;
uint8_t ret_val = 0;
err_code = r4s_app_flash_read( R4S_APP_PAGE_0,
FLAGS_OFFSET,
(uint8_t *)&block_en,
sizeof(block_en));
APP_ERROR_CHECK(err_code);
(block_en == 1) ? (ret_val = 1) : (ret_val = 0);
return ret_val;
}
/**
* @brief Вкл/выкл блокировку.
*
* @param uint8_t 0 - выкл
* 1 - вкл
* @return false - если block_en != [0,1]
* true - во всех остальных случаях
*/
bool api_set_block(uint8_t block_en)
{
uint8_t block_flag = api_get_block();
if( block_en == 0 )
{
if( block_flag == 0 ) return true;
err_code = r4s_app_flash_erase(BLOCK_FLAG_PAGE);
APP_ERROR_CHECK(err_code);
}
else if( block_en == 1)
{
if( block_flag == 1 ) return true;
uint32_t set_flag = 1;
err_code = r4s_app_flash_write( BLOCK_FLAG_PAGE,
FLAGS_OFFSET,
(uint8_t *)&set_flag,
sizeof(set_flag));
APP_ERROR_CHECK(err_code);
}
else
return false;
return true;
}
/***************************************************************************
* Сервисный API функции
**************************************************************************/
/**
* @brief Получить версию ПО
*
* @param none
*
* @return версия ПО. Формат HH.LL. HH - страший байт значениея 0-9, LL - младщий байт значениея 0-9.
*/
uint16_t api_get_version(void)
{
return FIRMWARE_VER;
}
/**
* @brief Получить состояние.
*
* @param none
*
* @return @ref app_orient_t
*/
uint8_t api_get_state(void)
{
return app_state;
}
/**
* @brief Получить флаг unpairing -а.
*
* @param none
*
* @return:: true - произвести unpairing
* false - не производить unpairing
*
*/
bool api_is_unpairing(void)
{
return app_unpairing_flag;
}
/**
* @brief Сбросить флаг unpairing -а. Т.к. эта функция вызывается
* библиотекой r4s_enc, то проверка флага внутри приложения
* (для выполнения действий) не целесообразна. Действия, выполняемые
* при анпэйринге перенесены сюда - стираение флага ручного
* отключения блокировки и звуковой сигнал
*
* @param none
*
* @return none
*
*/
void api_clr_unpairing(void)
{
/* Стираем из памяти флаг о ручном отключении блокировки,
* т.к. он устанавливается раньше, через 5 секунд нахождения
* в состоянии APP_ORIENT_UPSIDE_DOWN */
err_code = r4s_app_flash_erase(MAN_UNBLOCK_FLAG_PAGE);
APP_ERROR_CHECK(err_code);
/* Издаем длинный писк */
err_code = buz_add_beep(1000,1,BUZ_BEEP_MULTI);
APP_ERROR_CHECK(err_code);
app_unpairing_flag = 0;
return;
}
/**
* @brief Перевести устройство в режим APP_STAND_BY
*
* @param none
*
* @return none
*
*/
uint8_t api_go_to_stand_by(void)
{
app_state = APP_STAND_BY;
return 1;
}
/**
* @brief Получить ошибку
*
* @param none
*
* @return:: APP_API_NO_ERROR - нет ошибок
* APP_API_EXCEED_MAX_WEIGHT - превышен максимально допустимый вес
*/
uint8_t api_get_error(void)
{
return 0;
}
/***************************************************************************
*
***************************************************************************/
/**
* @brief Обработчик события установки соединения ( для приложения )
*
* @param none
* @return none
*/
void api_connect_handler(void)
{
app_block_flag = false;
}
/**
* @brief Обработчик события разрыва соединеня ( для приложения )
*
* @param none
* @return none
*/
void api_disconnect_handler(void)
{
uint8_t block_en = api_get_block();
if( block_en == 1 )
{
app_state = APP_STAND_BY;
app_block_flag = true;
}
}
/********* END OF FILE ****************************************************/