Программный модуль для мультиварки RMC-M40S. Версия 1.9



ПО является неотъемлемой частью мультиварки RMC-M40S, отдельно потребителю не поставляется и эксплуатируется только в составе устройства.

Фрагмент исходного кода
/**
 *           RMC-M40S
 *    	@file  application.c
 *   	@brief  This file contains implementation of main state machine and functions to service that state machine.
 *				Also provide APPL_ functions to access to variables of state machine and cooking conditions.
*      Revision:  1.9
 *     Compiler:  armcc
*  
/
 
/********* HEADER FILE INCLUDES *************************************************/
#include <stdint.h>
#include <stdlib.h>
#include "std_def.h"
#include "nrf.h"
#include "nrf_delay.h"
#include "string.h"
#include "config.h"
#include "timers.h"
#include "keyb.h"
#include "ind.h"
#include "buz.h"
#include "cookprog.h"
#include "com.h"
#include "application.h"
#include "settings_manager.h"
#include "pof_manager.h"
#include "log_manager.h"
#include "test.h"
#include "temp.h"
#include "heat.h"
/********* DEFINES **************************************************************/
/********* MACROS ***************************************************************/
/********* GLOBAL VARIABLES *****************************************************/
/********* LOCAL VARIABLES ******************************************************/
//common variables
static app_state_t 	AppState  = APP_STAND_BY;	/* состояние SM */
static keyboard_data_t 		app_keyb_data;		/* состояние кнопок */
static app_sound_mode_t 	sound_mode = APP_SOUND_ON;			/* APP_SOUND_CTRL. */
static BOOL app_inactive_timeout_flag = 0;		/* флаг таймаута нажатых кнопок */
static BOOL app_simple_timeout_flag = 0;		/* флаг таймаута */
static BOOL app_param_adj_timer_flag = 0;		/* флаг таймаута - изменение параметра при зажатой кнопке*/
static time_blink_mode_t	app_time_blink = TIME_BLINK_NONE;	/* тип мигания : минуты, часыб нет мигания */
static error_type_t 	app_error = ERR_NO;			/* ошибка устройства */
static cooking_complexprog_t app_temp_cooking_prog __attribute__((aligned(4)));
static BOOL app_temp_was_changed_flag = 0;										/* температура была изменена во время работы программы */

static U32 app_reset_reason;													/* причина сборса контроллера */

//SM's states variables 
static bool 			unpairing_sound_flag = false;			/* APP_STAND-BY */
static bool 			unpairing_in_process = false;			/* APP_STAND-BY флаг unpairing */

static app_sound_mode_t 	sound_mode_temp = APP_SOUND_ON;		/* APP_SOUND_CTRL. */

static U16 				appPostPonementTime = 0;				/* APP_POSTMENT_TIME_SET. Внутренняя переменная для изменения отсрочки */

static U16 				appCookTime = 0;						/* APP_TIME_PRESET. Внутренняя переменная для изменения времени */

static app_state_t		AppReturnStateTimeSet  = APP_STAND_BY;	/* APP_TIME_SET. состояние sm для возврата из APP_TIME_SET */

static U16 				appCookTemp = 0;						/* APP_TEMP_PRESET. Внутренняя переменная для изменения температуры */

static app_state_t		AppReturnStateTempSet  = APP_STAND_BY;	/* APP_TEMP_SET. состояние sm для возврата из APP_TEMP_SET */

static U8				app_restore_context_beep_counter = 0;	/* APP_COOK_PROC_CONFIRM. кол-во звуковых сигналов/время для подтверждения после пропадания питания */

static U8				app_end_of_boost_beep_counter = 0;		/* APP_COOK_ENDOFBOOST_PROC. кол-во звуковых сигналов/время для продолжения готовки после разгона */

static U8 				temp_reached_setting_sound_flag = 0;				/* APP_COOK_PROC. Флаг выхода на заданную температуру */
static U8 				bread_cooking_time_reached_middle_sound_flag = 0;	/* APP_COOK_PROC. флаг сигнал половина времени выпекания */

static U8 				preheat_temp_reached_setting_sound_flag = 0;		/* APP_KEEPWARM_PROC. флаг выхода на заданную температуру в подогреве */

static U8 				error_sound_flag = 0;					/* APP_ERROR. флаг звуковой сигнал ошибки */

#ifdef CONFIG_COOK_DEBUG	
	static app_state_t		AppReturnStatePwmSet  = APP_STAND_BY;			/* APP_PWM_SET */
#endif

/********* FUNCTION PROTOTYPES **************************************************/
static void app_inactive_timeout_timer_handler(void);
static void app_simple_timeout_timer_handler(void);
static void app_inactive_timeout_timer_reset(void);
static void app_timeout_timers_restart(U8 timeout_s);
static void app_check_inaction(const keyboard_data_t* app_keyb_data_prew);
static void app_ind_cook_mode_led(cooking_mode_t cook_mode);
static U8 app_select_cook_mode(const keyboard_data_t* app_keyb_data);
static U8 app_temp_sub(U8 Temp, U8 MinTempValue, U8 MaxTempValue, U8 Step );
static U8 app_temp_add(U8 Temp, U8 MinTempValue, U8 MaxTempValue, U8 Step );
/********* FUNCTIONS IMPLEMENTATION *********************************************/
static void app_check_inaction(const keyboard_data_t* app_keyb_data){
	static keyboard_data_t 	app_keyb_data_prew;
	U8 i0;	
	if( memcmp( app_keyb_data, &app_keyb_data_prew, sizeof(keyboard_data_t)) != 0 )
	{
		app_inactive_timeout_timer_reset();
		memcpy( &app_keyb_data_prew, app_keyb_data,  sizeof(keyboard_data_t) );		
	}
	
	for(i0=0;i0<MAX_BUTTON_COUNT;i0++){
		if( app_keyb_data->key_trigger_mas[i0].key_trigger == KEY_LONG_PRES ){
			app_inactive_timeout_timer_reset();			
			return;
		}
	}
	return;
}
static void app_inactive_timeout_timer_handler(void){
	app_inactive_timeout_flag = 1;
	return;
}
static void app_simple_timeout_timer_handler(void){
	app_simple_timeout_flag = 1;
	return;
}
void app_param_adj_timer_handler(void){
	app_param_adj_timer_flag = 1;
	return;
}
static void app_inactive_timeout_timer_reset(void){
	app_inactive_timeout_flag = 0;
	timer_reset(TIMER_APP_INACTIVE_TIMEOUT);
}
static void app_timeout_timers_restart(U8 timeout_s){
	app_inactive_timeout_flag = 0;	
	timer_set(TIMER_APP_INACTIVE_TIMEOUT, TIMER_SECOND(timeout_s));
	timer_reset(TIMER_APP_INACTIVE_TIMEOUT);
	app_simple_timeout_flag = 0;	
	timer_set(TIMER_APP_SIMPLE_TIMEOUT, TIMER_SECOND(timeout_s));
	timer_reset(TIMER_APP_SIMPLE_TIMEOUT);	
}
static void app_ind_cook_mode_led(cooking_mode_t cook_mode){
	ind_turn_off_cook_mode_leds();
	switch( cook_mode )
	{
		case COOK_MODE_MASTER_CHIEF:
			ind_LED_On(MASTER_CHIEF_LED);
		break;
		case COOK_MODE_EXPRESS:
			
		break;
		case COOK_MODE_BREAD:
			ind_LED_On(BREAD_LED);
		break;
		case COOK_MODE_STEAM:
			ind_LED_On(STEAM_LED);
		break;				
		case COOK_MODE_BOIL:
			ind_LED_On(BOIL_LED);
		break;
		case COOK_MODE_PASTA:
			ind_LED_On(PASTA_LED);
		break;
		case COOK_MODE_ROAST:
			ind_LED_On(ROAST_LED);
		break;
		case COOK_MODE_BAKE:
			ind_LED_On(BAKE_LED);
		break;
		case COOK_MODE_BRAISE:
			ind_LED_On(BRAISE_LED);
		break;
		case COOK_MODE_SOUP:
			ind_LED_On(SOUP_LED);
		break;
		case COOK_MODE_YOGURT:
			ind_LED_On(YOGURT_LED);
		break;
		case COOK_MODE_RICE:
			ind_LED_On(RICE_LED);
		break;
		case COOK_MODE_PIZZA:
			ind_LED_On(PIZZA_LED);
		break;
		case COOK_MODE_PORRIDGE:
			ind_LED_On(PORRIDGE_LED);
		break;
		case COOK_MODE_PILAF:
			ind_LED_On(PILAF_LED);
		break;
		case COOK_MODE_STEW:
			ind_LED_On(STEW_LED);
		break;
		case COOK_MODE_VACUUM:
			ind_LED_On(VACUUM_LED);
		break;					
		default :
		break;
	}
	return;
}

static BOOL app_param_adj_timer_expired(const key_data_t* key_data){
	if(key_data->key_trigger == KEY_SHORT_PRES){
			timer_set( TIMER_APP_PARAM_ADJ, TIMER_MILISECOND(APP_PARAM_ADJ_SPEED_SLOW_MS) );	
			timer_stop( TIMER_APP_PARAM_ADJ );	
			return TRUE;
	}
			
	if( key_data->key_timer < KEY_POLLING_TIMER_MS( APP_PARAM_ADJ_CHANGE_SPEED_TIME_MS )){
		timer_set(TIMER_APP_PARAM_ADJ, TIMER_MILISECOND(APP_PARAM_ADJ_SPEED_SLOW_MS));	
	}else{
		timer_set(TIMER_APP_PARAM_ADJ, TIMER_MILISECOND(APP_PARAM_ADJ_SPEED_FAST_MS));	
	}
	timer_start(TIMER_APP_PARAM_ADJ);
		
	if( app_param_adj_timer_flag == 1 ){
		app_param_adj_timer_flag = 0;
		return TRUE;
	}
	return false;
}
static U16 app_time_add_hour(U16 Time, U16 MinTimeValue, U16 MaxTimeValue ){
	if( Time >= MaxTimeValue ){
		//if time reach its max value set min value
		Time = MinTimeValue;							
	}else{
		if( ( Time + 60 ) < MaxTimeValue ){
			Time += 60;
		}else{
			Time = MaxTimeValue;
		}
	}
	return Time;
}
static U16 app_time_add_minutes(U16 Time, U16 MinTimeValue, U16 MaxTimeValue, U16 Step ){
	if( Time >= MaxTimeValue ){
		//if time reach its max value set min value
		Time = MinTimeValue;
	}else{
		if( Time + Step < MaxTimeValue ){
			//simple addition
			if( ( Time%60 + Step ) >= 60 ){
				//reset minutes
				if( ( Time + Step - 60 ) >= MinTimeValue ){										
					Time = Time + Step - 60;
				}else{
					Time = MinTimeValue;
				}
			}else{
				Time += Step;
			}
		}else{
			//if after addition time exceed max value, set max value
			Time = MaxTimeValue;
		}
	}
	return Time;
}
static U16 app_time_sub_hour(U16 Time, U16 MinTimeValue, U16 MaxTimeValue ){
	if( Time <= MinTimeValue ){
		//if time reach its min value set max value
		Time = MaxTimeValue;							
	}else{
		if( Time > MinTimeValue + 60 ){
			//simple subtraction
			Time -= 60;
		}else{
			Time = MinTimeValue;
		}
	}
	return Time;
}
static U16 app_time_sub_minutes(U16 Time, U16 MinTimeValue, U16 MaxTimeValue, U16 Step ){
	if( Time <= MinTimeValue ){
		//if time reach its min value set max value
		Time = MaxTimeValue;
	}else{
		if( Time > MinTimeValue + Step ){
			//simple substraction
			if( Time%60  >= Step ){									
				Time -= Step;																	
			}else{
				//reset minutes									
				if( Time - Step + 60 >= MaxTimeValue ){
					Time -= Step;
				}else{
					Time = Time - Step + 60;																
				}
			}
		}else{
			//if after substraction time exceed min value, set min value
			Time = MinTimeValue;
		}
	}	
	return Time;
}
static U8 app_temp_sub(U8 Temp, U8 MinTempValue, U8 MaxTempValue, U8 Step ){
	if( Temp <= MinTempValue ){
		//if temp reach its min value set max value
		Temp = MaxTempValue;
	}else{
		if( Temp > MinTempValue + Step ){
			//simple substraction
			Temp -= Step;																	
		}else{
			//if after substraction temp exceed min value, set min value
			Temp = MinTempValue;
		}
	}	
	return Temp;
}
static U8 app_temp_add(U8 Temp, U8 MinTempValue, U8 MaxTempValue, U8 Step ){
	if( Temp >= MaxTempValue ){
		//if temp reach its max value set min value
		Temp = MinTempValue;
	}else{
		if( Temp + Step < MaxTempValue ){
			//simple addition
			Temp += Step;
		}else{
			//if after addition temp exceed max value, set max value
			Temp = MaxTempValue;
		}
	}
	return Temp;
}
static U8 app_select_cook_mode(const keyboard_data_t* app_keyb_data){
			if( app_keyb_data->keys_value.maseter_chief_key.key_trigger == KEY_SHORT_PRES ){ 
				if( cooking_set_main_program_num(COOK_MODE_MASTER_CHIEF) == 1 ){ 
					return 1;
				}
			}
			if( app_keyb_data->keys_value.vacuum_key.key_trigger == KEY_SHORT_PRES ){ 
				if( cooking_set_main_program_num(COOK_MODE_VACUUM) == 1 ){
					return 1;					
				}
			}
			if( app_keyb_data->keys_value.bread_key.key_trigger == KEY_SHORT_PRES ){ 
				if( cooking_set_main_program_num(COOK_MODE_BREAD) == 1 ){
					return 1;					
				}
			}
			if( app_keyb_data->keys_value.steam_key.key_trigger == KEY_SHORT_PRES ){ 
				if( cooking_set_main_program_num(COOK_MODE_STEAM) == 1 ){
					return 1;					
				}
			}
			if( app_keyb_data->keys_value.boil_key.key_trigger == KEY_SHORT_PRES ){ 
				if( cooking_set_main_program_num(COOK_MODE_BOIL) == 1 ){
					return 1;					
				}
			}
			if( app_keyb_data->keys_value.pasta_key.key_trigger == KEY_SHORT_PRES ){ 
				if( cooking_set_main_program_num(COOK_MODE_PASTA) == 1 ){
					return 1;					
				}
			}	
			if( app_keyb_data->keys_value.roast_key.key_trigger == KEY_SHORT_PRES ){ 
				if( cooking_set_main_program_num(COOK_MODE_ROAST) == 1 ){
					return 1;					
				}
			}	
			if( app_keyb_data->keys_value.bake_key.key_trigger == KEY_SHORT_PRES ){ 
				if( cooking_set_main_program_num(COOK_MODE_BAKE) == 1 ){
					return 1;					
				}
			}	
			if( app_keyb_data->keys_value.braise_key.key_trigger == KEY_SHORT_PRES ){ 
				if( cooking_set_main_program_num(COOK_MODE_BRAISE) == 1 ){
					return 1;					
				}
			}	
			if( app_keyb_data->keys_value.soup_key.key_trigger == KEY_SHORT_PRES ){ 
				if( cooking_set_main_program_num(COOK_MODE_SOUP) == 1 ){
					return 1;					
				}
			}
			if( app_keyb_data->keys_value.yogurt_key.key_trigger == KEY_SHORT_PRES ){ 
				if( cooking_set_main_program_num(COOK_MODE_YOGURT) == 1 ){
					return 1;					
				}
			}
			if( app_keyb_data->keys_value.rice_key.key_trigger == KEY_SHORT_PRES ){ 
				if( cooking_set_main_program_num(COOK_MODE_RICE) == 1 ){
					return 1;					
				}
			}
			if( app_keyb_data->keys_value.pizza_key.key_trigger == KEY_SHORT_PRES ){ 
				if( cooking_set_main_program_num(COOK_MODE_PIZZA) == 1 ){
					return 1;					
				}
			}
			if( app_keyb_data->keys_value.porridge_key.key_trigger == KEY_SHORT_PRES ){ 
				if( cooking_set_main_program_num(COOK_MODE_PORRIDGE) == 1 ){
					return 1;					
				}
			}
			if( app_keyb_data->keys_value.pilaf_key.key_trigger == KEY_SHORT_PRES ){ 
				if( cooking_set_main_program_num(COOK_MODE_PILAF) == 1 ){
					return 1;					
				}
			}
			if( app_keyb_data->keys_value.stew_key.key_trigger == KEY_SHORT_PRES ){ 
				if( cooking_set_main_program_num(COOK_MODE_STEW) == 1 ){
					return 1;					
				}
			}
		return 0;
}
U8 app_debug_temp_show(void){
	static app_ind_sensor_temp_mode_t app_ind_sensor_temp_mode = IND_SENSOR_BOT;
	switch(app_ind_sensor_temp_mode)
	{
		case IND_SENSOR_ALL:
			return Temp_GetBotTemp();
		case IND_SENSOR_BOT:
			return Temp_GetBotTemp();
		case IND_SENSOR_TOP:
			return Temp_GetTopTemp();
		case IND_SENSOR_TEST:
			return Temp_GetTestTemp();
		default:
			return Temp_GetBotTemp();
	}
}
void application_init(void){	
	//init application timers
	timer_init(TIMER_APP_INACTIVE_TIMEOUT, 0, (callback_t)app_inactive_timeout_timer_handler );
	timer_start(TIMER_APP_INACTIVE_TIMEOUT);
	timer_init(TIMER_APP_PARAM_ADJ, 0, (callback_t)app_param_adj_timer_handler );
	timer_stop(TIMER_APP_PARAM_ADJ);	
	timer_init(TIMER_APP_SIMPLE_TIMEOUT, 0, (callback_t)app_simple_timeout_timer_handler );
	timer_start(TIMER_APP_SIMPLE_TIMEOUT);	

	sound_mode = settings_manager_get_sound_mode();
	sound_mode_temp = sound_mode;
	if( sound_mode == APP_SOUND_ON ){
		ind_LED_Off(SOUND_LED);
	}else{
		ind_LED_On(SOUND_LED);				
	}
	
	if( pof_manager_context_crc_valid() ){
		pof_inc_pof_event_count();
		pof_manager_get_prog( &app_temp_cooking_prog );
		cooking_set_complex_prog( &app_temp_cooking_prog );		
		if( ( Temp_GetBotTemp() + APP_GET_COLD_TEMP ) >= app_temp_cooking_prog.iTermBot ){			
			if( ( cooking_get_main_program_postponement_enable() )
					&& ( cooking_get_main_program_postponement_time() > 0 ))
			{
				AppState = APP_COOK_POSTPONEMENT_PROC;
			}else if( cooking_get_main_program_boost_enable() ){
				AppState = APP_COOK_BOOST_PROC;
			}else if( cooking_get_main_program_cook_remain_time() > 0 ){
				AppState = APP_COOK_PROC;			
			}else if( cooking_get_keepwarm_state() ){
				AppState = APP_KEEPWARM_PROC;					
			}
			pof_clear_context();
		}else{		
			AppState = APP_COOK_PROC_CONFIRM;
		}
	}else{
		if( pof_manager_get_manual_restore_disable_flag() )
		{
			pof_inc_pof_event_count();
			AppState = APP_CONTEXT_RESTORE_CANCEL_STATE;
		}
	}
	
	app_reset_reason = NRF_POWER->RESETREAS;
	NRF_POWER->RESETREAS = 0xFFFFFFFF;
	return;
}

/**@brief 	Функция выполняет работу при изменении состояния state mashine.
 *
 * @param	none
 *
 * @return 	none
 */
void app_sm_transition( app_state_t app_new_state ){
	static app_state_t app_prew_state = APP_STAND_BY;
	
	if( app_prew_state == app_new_state )return;
	
	/*		
		Общая работа выполняется при любом переходе( во всех состояниях state mashine )
	*/	
	ind_reset_dynamic_ind_timer();	
	/* Общая работа - КОНЕЦ */

	/*
		Работа при входе в новое состояние
	*/
	switch( app_new_state )
	{
		case APP_OFF:
		{
			break;
		}
		case APP_STAND_BY:
		{
			app_temp_was_changed_flag = 0;
			pof_clear_all();
			cooking_set_main_program_num( COOK_MODE_EXPRESS );	//установим программу по умолчанию
		}
		
		case APP_CONTEXT_RESTORE_CANCEL_STATE:
		{
			break;
		}
		case APP_SOUND_CTRL:
		{
			//скопируем настройки звука во временную переменную
			sound_mode_temp = sound_mode;
			app_timeout_timers_restart(APP_SOUND_INACTIVE_TIMEOUT_S);
			break;
		}		
		case APP_VERSION_IND:
		{
			break;
		}		
		case APP_PAIRING:
		{
			app_timeout_timers_restart(APP_PAIRING_INACTIVE_TIMEOUT_S);
			break;
		}		
		case APP_COOK_MODE:
		{
			app_timeout_timers_restart(APP_COOK_MODE_INACTIVE_TIMEOUT_S);
			break;
		}		
		case APP_POSTMENT_TIME_SET:
		{
			appPostPonementTime = cooking_get_main_program_postponement_time();			
			app_time_blink = TIME_BLINK_HOUR;			
			app_timeout_timers_restart(APP_POSTPONEMENT_INACTIVE_TIMEOUT_S);			
			break;
		}		
		case APP_TIME_PRESET:
		case APP_TIME_SET:
		{										
			appCookTime = cooking_get_main_program_cook_remain_time();			
			if( cooking_get_main_program_max_cook_time() == 60 )
			{
				app_time_blink = TIME_BLINK_MIN;
			}else{
				app_time_blink = TIME_BLINK_HOUR;				
			}
			app_timeout_timers_restart(APP_TIME_INACTIVE_TIMEOUT_S);
			break;
		}		
		
		case APP_TEMP_PRESET:
		case APP_TEMP_SET:
		{
			appCookTime = cooking_get_main_program_cook_remain_time();
			appCookTemp = cooking_get_main_program_cook_temp();
			app_timeout_timers_restart(APP_TEMP_INACTIVE_TIMEOUT_S);			
			break;
		}		
		
		case APP_COOK_PROC_CONFIRM:
		{
			app_timeout_timers_restart(APP_RESTORE_CONTEXT_BEEP_TIME_S);
			break;
		}		
		case APP_COOK_POSTPONEMENT_PROC:
		{
			cooking_timer_restart();						
			app_simple_timeout_timer_handler();	//set simple timeout flag
			break;
		}		
		case APP_COOK_BOOST_PROC:
		{
			break;
		}		
		case APP_COOK_ENDOFBOOST_PROC:
		{
			break;
		}		
		case APP_COOK_PROC:
		{
			cooking_timer_restart();						
			temp_reached_setting_sound_flag = 0;
			bread_cooking_time_reached_middle_sound_flag = 0;	
			break;
		}		
		case APP_KEEPWARM_PROC:
		{
			cooking_timer_restart();						
			preheat_temp_reached_setting_sound_flag = 0;
			break;
		}		
		case APP_END_COOKING_PROC:
		{
			break;
		}		
		case APP_ERROR:
		{
			error_sound_flag = 0;
			break;
		}		
		case APP_TEST:
		{
			test_init();
			app_timeout_timers_restart(APP_TEST_INACTIVE_TIMEOUT_S);
			break;
		}		
		case APP_PWM_SET:
		{
			//не используется
			AppState  = APP_STAND_BY;
			break;
		}				
		default:
		{
			break;
		}
	}	
	/* Работа при входе - КОНЕЦ */	
			
	/*
		Работа выполняется при выходе из текущего состояния
	*/
	switch( app_prew_state )
	{
		case APP_OFF:
		{
			break;
		}
		case APP_STAND_BY:
		{			
			break;
		}	
		
		case APP_CONTEXT_RESTORE_CANCEL_STATE:
		{		
			pof_clear_all();
			break;
		}
		case APP_SOUND_CTRL:
		{			
			//сохраним изменения звука в энергонезависимую память если были изменения
			if( sound_mode_temp != sound_mode )
			{
				sound_mode = sound_mode_temp;	
				settings_manager_set_sound_mode(sound_mode);				
			}
			//установим индикатор 
			if( sound_mode == APP_SOUND_ON ){
				ind_LED_Off(SOUND_LED);
			}else{
				ind_LED_On(SOUND_LED);
			}			
			break;
		}		
		case APP_VERSION_IND:
		{
			break;
		}		
		case APP_PAIRING:
		{			
			break;
		}		
		case APP_COOK_MODE:
		{				
			break;
		}		
		case APP_POSTMENT_TIME_SET:
		{			
			break;
		}		
		case APP_TIME_PRESET:
		{
			break;
		}		
		case APP_TIME_SET:
		{			
			break;
		}		
		case APP_TEMP_PRESET:		
		case APP_TEMP_SET:
		{
			if( cooking_get_main_program_cook_temp() < COOK_TEMP_PREHEAT_ENABLE ){
				cooking_set_keepwarm_state(false);
			}			
			break;
		}				
		case APP_COOK_PROC_CONFIRM:
		{
			pof_clear_context();
			break;
		}		
		case APP_COOK_POSTPONEMENT_PROC:
		{
			break;
		}		
		case APP_COOK_BOOST_PROC:
		{
			break;
		}		
		case APP_COOK_ENDOFBOOST_PROC:
		{						
			break;
		}		
		case APP_COOK_PROC:
		{
		
			break;
		}		
		case APP_KEEPWARM_PROC:
		{			
			break;
		}		
		case APP_END_COOKING_PROC:
		{
			break;
		}		
		case APP_ERROR:
		{
			break;
		}		
		case APP_TEST:
		{
			test_stop();
			break;
		}		
		case APP_PWM_SET:
		{
			break;
		}				
		default:
		{
			break;
		}
	}
	/* Работа при выходе - КОНЕЦ */
	
	app_prew_state = app_new_state;
	
	return;
}

void app_sm_proc( void ){
	switch(AppState)
	{
		case APP_OFF:
		{
			//indication
			ind_show_off();
			ind_LED_Off(TIME_COOKING_LED);			
			ind_LED_Off(SOUND_LED);	
			ind_LED_Off(POSTPONEMENT_LED);					
			ind_LED_Off(PREHEATING_LED);				
			cooking_pause();			
			//transitions						
			if( app_keyb_data.keys_value.power_key.key_trigger == KEY_SHORT_PRES ){ 
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}
				AppState = APP_STAND_BY; 
				break;
			}
			break;
		}
		case APP_STAND_BY:
		case APP_CONTEXT_RESTORE_CANCEL_STATE:
			//indication
			ind_LED_Off(POSTPONEMENT_LED);					
			ind_postponement_cooking_led_blinking(IND_LED_BLINK_NO);			
			ind_LED_Off(PREHEATING_LED);	
			if( AppState == APP_CONTEXT_RESTORE_CANCEL_STATE ){
				ind_LED_On(TIME_COOKING_LED);
				ind_time_cooking_led_blinking(IND_LED_BLINK_YES);				
			}else{
				ind_LED_Off(TIME_COOKING_LED);
				ind_time_cooking_led_blinking(IND_LED_BLINK_NO);
			}		
			if( sound_mode == APP_SOUND_ON ){
				ind_LED_Off(SOUND_LED);
			}else{
				ind_LED_On(SOUND_LED);				
			}
			ind_show_stand_by();			 
			#ifdef CONFIG_IND_SENSOR_TEMP
				ind_show_temp( app_debug_temp_show(), TEMP_COOKING_TEMP_BLINK_NO );
			#endif
			//work			
			cooking_pause();
			//controll
			if(	( app_keyb_data.keys_value.minus_key.state == KEY_CONDITION_PRESSED )
				&& (app_keyb_data.keys_value.minus_key.key_timer > KEY_POLLING_TIMER_S( APP_UNPAIRING_STATE_TRANSITION_TIME_S )) )
			{				
				if( false == unpairing_sound_flag )
				{
					unpairing_in_process = true;
					unpairing_sound_flag = true;
					if(sound_mode == APP_SOUND_ON){
						add_beep(APP_LONG_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
					}
				}
				break;				
			}else{
				unpairing_sound_flag = false;
			}
			//transitions
			if( app_keyb_data.keys_value.power_key.key_trigger == KEY_SHORT_PRES ){ 
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}				
				AppState = APP_OFF; 
				break;
			}
			if( app_keyb_data.keys_value.time_key.key_trigger == KEY_LONG_PRES ){ 
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}
				AppState = APP_SOUND_CTRL; 				
			}			
			if( app_keyb_data.keys_value.cancel_preheating_key.key_trigger == KEY_SHORT_PRES )
			{			
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}
				if( AppState == APP_STAND_BY ){
					//если нет флага пропадания питания
					if( cooking_set_main_program_num(COOK_MODE_PREHEAT) == 1 ){
						AppState = APP_KEEPWARM_PROC;					
						break;				
					}
				}else{
					//если флаг таймаута после пропадания питания - снимем флаг
					AppState = APP_STAND_BY;
				}
			}
			if( app_keyb_data.keys_value.start_autoheating_key.key_trigger == KEY_SHORT_PRES )		
			{				
				if( cooking_set_main_program_num(COOK_MODE_EXPRESS) == 1 ){ 					
					app_temp_was_changed_flag = 0;
					if(sound_mode == APP_SOUND_ON){
						add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
					}									
					AppState = APP_COOK_PROC;	
				}				
				break;				
			}
			if( app_select_cook_mode( &app_keyb_data ) == 1 ) 
			{	
				app_temp_was_changed_flag = 0;
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}				
				AppState = APP_COOK_MODE;
				break;				
			}
			if(	( app_keyb_data.keys_value.plus_key.state == KEY_CONDITION_PRESSED )
				&& (app_keyb_data.keys_value.plus_key.key_timer > KEY_POLLING_TIMER_S( APP_PAIRING_STATE_TRANSITION_TIME_S )) )
			{				
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}
				AppState = APP_PAIRING;
				break;				
			}
			if( ( app_keyb_data.keys_value.postponement_key.state == KEY_CONDITION_PRESSED )
				&& ( app_keyb_data.keys_value.postponement_key.key_timer > KEY_POLLING_TIMER_S(APP_VERSION_TRANSITION_TIME_S) ) )			
			{
				AppState = APP_VERSION_IND;
				break;									
			}
		break;
		
		case APP_SOUND_CTRL:
			//indication
			ind_LED_Off(POSTPONEMENT_LED);
			ind_postponement_cooking_led_blinking(IND_LED_BLINK_NO);		
ind_LED_Off(PREHEATING_LED);
			ind_LED_Off(TIME_COOKING_LED);
			ind_time_cooking_led_blinking(IND_LED_BLINK_NO);												
			if((app_keyb_data.keys_value.plus_key.state == KEY_CONDITION_PRESSED) || (app_keyb_data.keys_value.minus_key.state == KEY_CONDITION_PRESSED) ){
				ind_sound_ctrl(sound_mode_temp, SOUND_BLINK_NO);
			}else{ 
				ind_sound_ctrl(sound_mode_temp, SOUND_BLINK_YES);
			}
			//work
			cooking_stop();
			//controll
			if( ( app_keyb_data.keys_value.plus_key.key_trigger == KEY_SHORT_PRES ) 
					|| ( app_keyb_data.keys_value.minus_key.key_trigger == KEY_SHORT_PRES ) )
			{ 
				ind_reset_dynamic_ind_timer();
				if( sound_mode_temp == APP_SOUND_OFF ){
					sound_mode_temp = APP_SOUND_ON; 
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);				
					ind_LED_Off(SOUND_LED);
				}else{
					sound_mode_temp = APP_SOUND_OFF; 
					ind_LED_On(SOUND_LED);
				}				
				break; 				
			}			
			//transitions						
			if( app_keyb_data.keys_value.cancel_preheating_key.key_trigger == KEY_SHORT_PRES ){ 
				if( sound_mode_temp == APP_SOUND_ON ){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);								
				}
				AppState = APP_STAND_BY; 
				break; 
			}
			if( app_inactive_timeout_flag ){				
				AppState = APP_STAND_BY; 
				break; 
			}
			if( app_keyb_data.keys_value.power_key.key_trigger == KEY_SHORT_PRES ){ 
				if(sound_mode_temp == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}				
				AppState = APP_OFF; 
				break;
			}
		break;
		
		case APP_VERSION_IND:
			//indication
			ind_LED_Off(POSTPONEMENT_LED);
			ind_postponement_cooking_led_blinking(IND_LED_BLINK_NO);		
			ind_LED_Off(PREHEATING_LED);
			ind_LED_Off(TIME_COOKING_LED);
			ind_time_cooking_led_blinking(IND_LED_BLINK_NO);												
			ind_show_version();
			//work 
			cooking_stop();
			//transition
			if( ( app_keyb_data.keys_value.postponement_key.state == KEY_CONDITION_RELEASED )
					&& ( app_keyb_data.keys_value.minus_key.state != KEY_CONDITION_PRESSED ) )
			{
					if( sound_mode == APP_SOUND_ON ){
						add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);								
					}
					AppState = APP_STAND_BY; 
					break;
			}
			if( ( app_keyb_data.keys_value.postponement_key.state == KEY_CONDITION_RELEASED )
					&& ( app_keyb_data.keys_value.minus_key.state == KEY_CONDITION_PRESSED ) )
			{					
					AppState = APP_TEST; 
					break;
			}
			if( app_keyb_data.keys_value.power_key.key_trigger == KEY_SHORT_PRES ){ 
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}				
				AppState = APP_OFF; 
				break;
			}			
		break;
			
		case APP_PAIRING:
			//indication
			ind_LED_Off(POSTPONEMENT_LED);	
			ind_postponement_cooking_led_blinking(IND_LED_BLINK_NO);		
			ind_LED_Off(PREHEATING_LED);
			ind_LED_Off(TIME_COOKING_LED);
			ind_time_cooking_led_blinking(IND_LED_BLINK_NO);				
			ind_show_paring();
			//work
			cooking_stop();
			//transition			
			if( app_simple_timeout_flag ){

				if( sound_mode == APP_SOUND_ON ){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);								
				}								
				AppState = APP_STAND_BY;
				break;
			}
			if( app_keyb_data.keys_value.power_key.key_trigger == KEY_SHORT_PRES ){ 
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}
				AppState = APP_OFF; 
				break;
			}			
		break;			
			
		case APP_ERROR:
			//indication
			ind_show_error( app_error );
			ind_LED_Off(POSTPONEMENT_LED);
			ind_postponement_cooking_led_blinking(IND_LED_BLINK_NO);
			ind_LED_Off(PREHEATING_LED);
			ind_LED_Off(TIME_COOKING_LED);
			ind_LED_Off(SOUND_LED);		
			//work
			cooking_stop();
			if( error_sound_flag == 0 ){
				error_sound_flag = 1;
				add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_MULTI);								
				add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_MULTI);								
				add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_MULTI);								
				add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_MULTI);								
				add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_MULTI);								
				add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_MULTI);								
			}
			//transition
			//no transition
		break;
		
		case APP_TEST:
			//incdication
			//work			
			//transition
			if( ( app_inactive_timeout_flag )
					|| (!Test(&app_keyb_data)) )
			{					
				if( sound_mode == APP_SOUND_ON ){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);								
				}
				AppState = APP_STAND_BY;
				break;
			}			
		break;
						
		case APP_COOK_MODE:
			//indication
			ind_LED_Off(POSTPONEMENT_LED);
			ind_postponement_cooking_led_blinking(IND_LED_BLINK_NO);		
			if( cooking_get_keepwarm_state() ){
				ind_LED_On(PREHEATING_LED);
			}else{
				ind_LED_Off(PREHEATING_LED);				
			}		
			ind_LED_On(TIME_COOKING_LED);		
			ind_time_cooking_led_blinking(IND_LED_BLINK_NO);		
			app_ind_cook_mode_led(cooking_get_main_program_num());				
			ind_programm_cooking_led_blinking(IND_LED_BLINK_NO);
			if( cooking_get_main_program_num() != COOK_MODE_EXPRESS ){
				ind_show_time( cooking_get_main_program_cook_time(),TIME_BLINK_NONE );
			}else{
				ind_show_express_mode(TIME_BLINK_NONE);				
			}			
			#ifndef CONFIG_IND_SENSOR_TEMP
			if( cooking_get_main_program_num() == COOK_MODE_MASTER_CHIEF ){
				ind_show_temp( cooking_get_main_program_cook_temp(), TEMP_COOKING_TEMP_BLINK_NO );								
			}else{
				ind_hide_temp();
			}
			#else
				ind_show_temp( app_debug_temp_show(), TEMP_COOKING_TEMP_BLINK_NO );
			#endif
			//work
			cooking_stop();			
			//controll
			if( app_select_cook_mode(&app_keyb_data) == 1)
			{
				app_temp_was_changed_flag = 0;
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}
			}
			//transitions				
			if( app_keyb_data.keys_value.cancel_preheating_key.key_trigger == KEY_SHORT_PRES )
			{ 
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}				
				AppState = APP_STAND_BY; 
				break; 
			}
			if( app_inactive_timeout_flag ){ 
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}
				AppState = APP_STAND_BY; 
				break; 
			}
			if(( cooking_get_main_program_num() == COOK_MODE_MASTER_CHIEF ) && ( app_keyb_data.keys_value.temperature_key.key_trigger == KEY_SHORT_PRES )){
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}								
				AppState = APP_TEMP_PRESET; 			
				break;
			}
			if( ( app_keyb_data.keys_value.time_key.key_trigger == KEY_SHORT_PRES )
					&& ( cooking_get_main_program_num() != COOK_MODE_EXPRESS ))
			{ 
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}				
				AppState = APP_TIME_PRESET; 			
				break; 
			}
			if( app_keyb_data.keys_value.postponement_key.key_trigger == KEY_SHORT_PRES ){ 
				if( ( cooking_get_main_program_postponement_enable() )
						&& ( cooking_get_main_program_num() != COOK_MODE_EXPRESS ) )
				{				
					if(sound_mode == APP_SOUND_ON){
						add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
					}					
					AppState = APP_POSTMENT_TIME_SET; 				
				}
				break; 
			}
			if( app_keyb_data.keys_value.start_autoheating_key.key_trigger == KEY_SHORT_PRES )
			{ 
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}															
				if( cooking_get_main_program_postponement_time() == 0 )
				{
					if( cooking_get_main_program_boost_enable() ){
						AppState = APP_COOK_BOOST_PROC;
					}else{								
						AppState = APP_COOK_PROC;
					}
				}else{						
					AppState = APP_COOK_POSTPONEMENT_PROC;				
				}
				break; 				
			}
			if( app_keyb_data.keys_value.power_key.key_trigger == KEY_SHORT_PRES ){ 
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}				
				AppState = APP_OFF; 
				break;
			}					
		break;
		
		case APP_POSTMENT_TIME_SET:
			//indication
			ind_LED_On(POSTPONEMENT_LED);
			ind_postponement_cooking_led_blinking(IND_LED_BLINK_NO);		
			if( cooking_get_keepwarm_state() ){
				ind_LED_On(PREHEATING_LED);
			}else{
				ind_LED_Off(PREHEATING_LED);				
			}			
			ind_LED_Off(TIME_COOKING_LED);
			ind_time_cooking_led_blinking(IND_LED_BLINK_YES);	
			if( cooking_get_main_program_num() == COOK_MODE_MASTER_CHIEF ){
				ind_show_temp( cooking_get_main_program_cook_temp(), TEMP_COOKING_TEMP_BLINK_NO );								
			}else{
				ind_hide_temp();
			}		
			if( (app_keyb_data.keys_value.plus_key.state == KEY_CONDITION_PRESSED) || (app_keyb_data.keys_value.minus_key.state == KEY_CONDITION_PRESSED) ){				
				ind_show_time( appPostPonementTime,TIME_BLINK_NONE );				
			}else{ 
				if( app_time_blink == TIME_BLINK_HOUR ){
					ind_show_time( appPostPonementTime,TIME_BLINK_HOUR );
				}else if( app_time_blink == TIME_BLINK_MIN ){
					ind_show_time( appPostPonementTime,TIME_BLINK_MIN );				
				}
			}
			//work
			cooking_stop();			
			//controll							
			if( app_keyb_data.keys_value.time_key.key_trigger == KEY_SHORT_PRES || app_keyb_data.keys_value.time_key.key_trigger == KEY_LONG_PRES ){
				ind_reset_dynamic_ind_timer();
				if( sound_mode == APP_SOUND_ON ){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);								
				}				
				if( app_time_blink == TIME_BLINK_HOUR ){
					app_time_blink = TIME_BLINK_MIN;
				}else if( app_time_blink == TIME_BLINK_MIN ){
					app_time_blink = TIME_BLINK_HOUR;					
				}
				break; 						
			}	
			if( app_keyb_data.keys_value.plus_key.key_trigger == KEY_SHORT_PRES || app_keyb_data.keys_value.plus_key.key_trigger == KEY_LONG_PRES ){ 
				ind_reset_dynamic_ind_timer();
				if( app_keyb_data.keys_value.plus_key.key_trigger == KEY_SHORT_PRES ){
					if(sound_mode == APP_SOUND_ON){
						add_beep(APP_PARAM_SET_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
					}	
				}
				if( app_time_blink == TIME_BLINK_HOUR ){			
					if( app_param_adj_timer_expired(&app_keyb_data.keys_value.plus_key) ){
						appPostPonementTime = app_time_add_hour( appPostPonementTime, 0 , 24*60 );
					}
				}else if( app_time_blink == TIME_BLINK_MIN ){								
					if( app_param_adj_timer_expired(&app_keyb_data.keys_value.plus_key) ){
						appPostPonementTime = app_time_add_minutes( appPostPonementTime, 0 , 24*60, APP_POSTPONEMENT_TIME_ADJ_STEP );						
					}										
				}				
			}
			if( app_keyb_data.keys_value.minus_key.key_trigger == KEY_SHORT_PRES || app_keyb_data.keys_value.minus_key.key_trigger == KEY_LONG_PRES ){ 
				ind_reset_dynamic_ind_timer();
				if( app_keyb_data.keys_value.minus_key.key_trigger == KEY_SHORT_PRES ){
					if(sound_mode == APP_SOUND_ON){
						add_beep(APP_PARAM_SET_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
					}	
				}					
				if( app_param_adj_timer_expired(&app_keyb_data.keys_value.minus_key)){
					if( app_time_blink == TIME_BLINK_HOUR ){					
						appPostPonementTime = app_time_sub_hour( appPostPonementTime, 0 , 24*60 );
					}else if( app_time_blink == TIME_BLINK_MIN ){
						appPostPonementTime = app_time_sub_minutes( appPostPonementTime, 0 , 24*60, APP_POSTPONEMENT_TIME_ADJ_STEP );						
					}
				}				
			}					
			//transitions							
			if(( cooking_get_main_program_num() == COOK_MODE_MASTER_CHIEF ) && ( app_keyb_data.keys_value.temperature_key.key_trigger == KEY_SHORT_PRES )){
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}								
				cooking_set_main_program_postponement_time( appPostPonementTime );			
				AppState = APP_TEMP_PRESET; 			
				break;
			}
			if( app_keyb_data.keys_value.start_autoheating_key.key_trigger == KEY_SHORT_PRES )
			{ 
				cooking_set_main_program_postponement_time( appPostPonementTime );					
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}				
				if( cooking_get_main_program_postponement_time() == 0 )
				{
					if( cooking_get_main_program_boost_enable() ){
						AppState = APP_COOK_BOOST_PROC;
					}else{		
						ind_reset_dynamic_ind_timer();						
						AppState = APP_COOK_PROC;
					}
				}else{					
					AppState = APP_COOK_POSTPONEMENT_PROC;				
				}
				break; 				
			}
			if( app_inactive_timeout_flag ){ 			
				cooking_set_main_program_postponement_time( appPostPonementTime );									
				AppState = APP_COOK_MODE; 
				break; 
			}
			if( app_keyb_data.keys_value.cancel_preheating_key.key_trigger == KEY_SHORT_PRES )
			{ 
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}				
				AppState = APP_COOK_MODE;
				break; 
			}
			if( app_select_cook_mode( &app_keyb_data ) == 1 )
			{
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}				
				AppState = APP_COOK_MODE;
				break;				
			}
			if( app_keyb_data.keys_value.power_key.key_trigger == KEY_SHORT_PRES ){ 
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}				
				AppState = APP_OFF; 
				break;
			}					
		break;
		
		case APP_TEMP_PRESET:
			//indication
			ind_LED_Off(POSTPONEMENT_LED);
			ind_postponement_cooking_led_blinking(IND_LED_BLINK_NO);
			if( appCookTemp < COOK_TEMP_PREHEAT_ENABLE )
			{
				ind_LED_Off(PREHEATING_LED);				
			}else{
				if( cooking_get_keepwarm_state() ){
					ind_LED_On(PREHEATING_LED);				
				}else{
					ind_LED_Off(PREHEATING_LED);
				}				
			}		
			ind_LED_On(TIME_COOKING_LED);
			ind_time_cooking_led_blinking(IND_LED_BLINK_NO);				
			ind_show_time( appCookTime, TIME_BLINK_NONE );		
			if( appCookTemp > COOK_TEMP_TIME_MAX_2HOUR ){
				if( appCookTime > 2*60){					
					appCookTime = 2*60;
				}
			}else{
				appCookTime = cooking_get_main_program_cook_remain_time();
			}
			if( (app_keyb_data.keys_value.plus_key.state == KEY_CONDITION_PRESSED) || (app_keyb_data.keys_value.minus_key.state == KEY_CONDITION_PRESSED) ){				
				ind_show_temp( appCookTemp, TEMP_COOKING_TEMP_BLINK_NO );				
			}else{ 
				ind_show_temp( appCookTemp, TEMP_COOKING_TEMP_BLINK_YES );				
			}
			//work
			cooking_pause();				
			//controll
			if( app_keyb_data.keys_value.plus_key.key_trigger == KEY_SHORT_PRES || app_keyb_data.keys_value.plus_key.key_trigger == KEY_LONG_PRES ){ 				
				if( app_keyb_data.keys_value.plus_key.key_trigger == KEY_SHORT_PRES ){
					if(sound_mode == APP_SOUND_ON){
						add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
					}	
				}
				ind_reset_dynamic_ind_timer();			
				if( app_param_adj_timer_expired(&app_keyb_data.keys_value.plus_key) ){
					appCookTemp =  app_temp_add( appCookTemp, cooking_get_main_program_min_cook_temp(), cooking_get_main_program_max_cook_temp(), COOK_MULTICOOK_ADJ_TEMP );
				}				
			}
			if( app_keyb_data.keys_value.minus_key.key_trigger == KEY_SHORT_PRES || app_keyb_data.keys_value.minus_key.key_trigger == KEY_LONG_PRES ){ 
				if( app_keyb_data.keys_value.minus_key.key_trigger == KEY_SHORT_PRES ){
					if(sound_mode == APP_SOUND_ON){
						add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
					}	
				}
				ind_reset_dynamic_ind_timer();
				if( app_param_adj_timer_expired(&app_keyb_data.keys_value.minus_key) ){
					appCookTemp = app_temp_sub( appCookTemp, cooking_get_main_program_min_cook_temp(), cooking_get_main_program_max_cook_temp(), COOK_MULTICOOK_ADJ_TEMP );			
				}
			}		
			//transition
			if( ( app_keyb_data.keys_value.time_key.key_trigger == KEY_SHORT_PRES )
					&& ( cooking_get_main_program_num() != COOK_MODE_EXPRESS ))
			{ 
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}								
				cooking_set_main_program_cook_time( appCookTime );
				cooking_set_main_program_cook_temp( appCookTemp );
				app_temp_was_changed_flag = 1;				
				AppState = APP_TIME_PRESET; 			
				break; 
			}
			if( app_keyb_data.keys_value.postponement_key.key_trigger == KEY_SHORT_PRES ){ 
				if( cooking_get_main_program_postponement_enable() ){					
					if(sound_mode == APP_SOUND_ON){
						add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
					}
					cooking_set_main_program_cook_time( appCookTime );
					cooking_set_main_program_cook_temp( appCookTemp );
					app_temp_was_changed_flag = 1;					
					AppState = APP_POSTMENT_TIME_SET; 				
				}
				break; 
			}
			if( app_keyb_data.keys_value.start_autoheating_key.key_trigger == KEY_SHORT_PRES )
			{ 
				cooking_set_main_program_cook_time( appCookTime );
				cooking_set_main_program_cook_temp( appCookTemp );
				app_temp_was_changed_flag = 1;
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}				
				if( cooking_get_main_program_postponement_time() == 0 )
				{
					if( cooking_get_main_program_boost_enable() ){
						AppState = APP_COOK_BOOST_PROC;
					}else{		
						ind_reset_dynamic_ind_timer();						
						AppState = APP_COOK_PROC;
					}
				}else{						
					AppState = APP_COOK_POSTPONEMENT_PROC;				
				}
				break; 				
			}
			if( app_inactive_timeout_flag )
			{ 							
				cooking_set_main_program_cook_time( appCookTime );
				cooking_set_main_program_cook_temp( appCookTemp );
				app_temp_was_changed_flag = 1;											
				AppState = APP_COOK_MODE; 
				break; 
			}
			if( app_keyb_data.keys_value.cancel_preheating_key.key_trigger == KEY_SHORT_PRES )
			{ 
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}				
				AppState = APP_COOK_MODE;
				break; 
			}
			if( app_select_cook_mode( &app_keyb_data ) == 1 )
			{
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}		
				AppState = APP_COOK_MODE;
				break;				
			}
			if( app_keyb_data.keys_value.power_key.key_trigger == KEY_SHORT_PRES )
			{ 
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}				
				AppState = APP_OFF; 
				break;
			}					
		break;			
			
		case APP_TEMP_SET:
			//indication
			ind_LED_Off(POSTPONEMENT_LED);
			ind_postponement_cooking_led_blinking(IND_LED_BLINK_NO);
			if( appCookTemp < COOK_TEMP_PREHEAT_ENABLE )
			{
				ind_LED_Off(PREHEATING_LED);				
			}else{
				if( cooking_get_keepwarm_state() ){
					ind_LED_On(PREHEATING_LED);				
				}else{
					ind_LED_Off(PREHEATING_LED);
				}
			}		
			ind_LED_On(TIME_COOKING_LED);
			ind_time_cooking_led_blinking(IND_LED_BLINK_NO);				
			ind_show_time( appCookTime, TIME_BLINK_NONE );		
			if( appCookTemp > COOK_TEMP_TIME_MAX_2HOUR ){
				if( appCookTime > 2*60){					
					appCookTime = 2*60;
				}
			}else{
				appCookTime = cooking_get_main_program_cook_remain_time();
			}
			if( (app_keyb_data.keys_value.plus_key.state == KEY_CONDITION_PRESSED) || (app_keyb_data.keys_value.minus_key.state == KEY_CONDITION_PRESSED) ){				
				ind_show_temp( appCookTemp, TEMP_COOKING_TEMP_BLINK_NO );				
			}else{ 
				ind_show_temp( appCookTemp, TEMP_COOKING_TEMP_BLINK_YES );				
			}
			//work
			cooking_pause();				
			//controll
			if( app_keyb_data.keys_value.plus_key.key_trigger == KEY_SHORT_PRES || app_keyb_data.keys_value.plus_key.key_trigger == KEY_LONG_PRES )
			{
				ind_reset_dynamic_ind_timer();
				if( app_keyb_data.keys_value.plus_key.key_trigger == KEY_SHORT_PRES ){
					if(sound_mode == APP_SOUND_ON){
						add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
					}	
				}							
				if( app_param_adj_timer_expired(&app_keyb_data.keys_value.plus_key) ){
					appCookTemp = app_temp_add( appCookTemp, cooking_get_main_program_min_cook_temp(), cooking_get_main_program_max_cook_temp(), COOK_MASTER_CHIEF_LITE_ADJ_TEMP	 );
				}				
			}
			if( app_keyb_data.keys_value.minus_key.key_trigger == KEY_SHORT_PRES || app_keyb_data.keys_value.minus_key.key_trigger == KEY_LONG_PRES ){ 
				ind_reset_dynamic_ind_timer();
				if( app_keyb_data.keys_value.minus_key.key_trigger == KEY_SHORT_PRES ){
					if(sound_mode == APP_SOUND_ON){
						add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
					}	
				}				
				if( app_param_adj_timer_expired(&app_keyb_data.keys_value.minus_key) ){
					appCookTemp = app_temp_sub( appCookTemp, cooking_get_main_program_min_cook_temp(), cooking_get_main_program_max_cook_temp(), COOK_MASTER_CHIEF_LITE_ADJ_TEMP	 );				
				}
			}		
			//transition
			if( app_inactive_timeout_flag ){ 					
					cooking_set_main_program_cook_remain_time( appCookTime );
					cooking_set_main_program_cook_temp( appCookTemp );
					app_temp_was_changed_flag = 1;					
					if( AppReturnStateTempSet == APP_COOK_BOOST_PROC )
					{
						AppState = APP_COOK_ENDOFBOOST_PROC;
					}else{
						AppState = AppReturnStateTempSet; 
					}
					break; 
			}
			if( app_keyb_data.keys_value.time_key.key_trigger == KEY_SHORT_PRES ){ 
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}					
					cooking_set_main_program_cook_remain_time( appCookTime );
					cooking_set_main_program_cook_temp( appCookTemp );
					app_temp_was_changed_flag = 1;
					if( AppReturnStateTempSet == APP_COOK_BOOST_PROC )
					{
						AppReturnStateTempSet = APP_COOK_ENDOFBOOST_PROC;
					}
					AppReturnStateTimeSet = AppReturnStateTempSet;
					AppState = APP_TIME_SET;					
					break; 
			}
			if( app_keyb_data.keys_value.cancel_preheating_key.key_trigger == KEY_SHORT_PRES )
			{ 
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}				
				AppState = AppReturnStateTempSet;
				break; 
			}
			if( app_keyb_data.keys_value.power_key.key_trigger == KEY_SHORT_PRES ){ 
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}				
				AppState = APP_OFF; 
				break;
			}			
		break;
			
		case APP_TIME_PRESET:
			//indication				
			ind_LED_Off(POSTPONEMENT_LED);
			ind_postponement_cooking_led_blinking(IND_LED_BLINK_NO);		
			if( cooking_get_keepwarm_state() ){
				ind_LED_On(PREHEATING_LED);
			}else{
				ind_LED_Off(PREHEATING_LED);				
			}			
			ind_LED_On(TIME_COOKING_LED);
			ind_time_cooking_led_blinking(IND_LED_BLINK_NO);
			if( cooking_get_main_program_num() == COOK_MODE_MASTER_CHIEF ){
				ind_show_temp( cooking_get_main_program_cook_temp(), TEMP_COOKING_TEMP_BLINK_NO );								
			}else{
				ind_hide_temp();
			}					
			if( (app_keyb_data.keys_value.plus_key.state == KEY_CONDITION_PRESSED) || (app_keyb_data.keys_value.minus_key.state == KEY_CONDITION_PRESSED) ){
				ind_show_time( appCookTime,TIME_BLINK_NONE );				
			}else{ 
				if( app_time_blink == TIME_BLINK_HOUR ){
					ind_show_time( appCookTime,TIME_BLINK_HOUR );
				}else if( app_time_blink == TIME_BLINK_MIN ){
					ind_show_time( appCookTime,TIME_BLINK_MIN );				
				} 
			}
			//work
			cooking_stop();							
			//controll
			if( app_keyb_data.keys_value.plus_key.key_trigger == KEY_SHORT_PRES || app_keyb_data.keys_value.plus_key.key_trigger == KEY_LONG_PRES ){ 
				ind_reset_dynamic_ind_timer();
				if( app_keyb_data.keys_value.plus_key.key_trigger == KEY_SHORT_PRES ){
					if(sound_mode == APP_SOUND_ON){
						add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
					}	
				}				
				if( app_param_adj_timer_expired(&app_keyb_data.keys_value.plus_key) ){
					if( app_time_blink == TIME_BLINK_HOUR ){					
						appCookTime = app_time_add_hour( appCookTime, cooking_get_main_program_min_cook_time(), ( cooking_get_main_program_cook_temp() > COOK_TEMP_TIME_MAX_2HOUR ) ? 2*60 : cooking_get_main_program_max_cook_time() );
					}else if( app_time_blink == TIME_BLINK_MIN ){
						appCookTime = app_time_add_minutes( appCookTime, cooking_get_main_program_min_cook_time(), ( cooking_get_main_program_cook_temp() > COOK_TEMP_TIME_MAX_2HOUR ) ? 2*60 : cooking_get_main_program_max_cook_time(), cooking_get_main_program_adj_time_step() );						
					}
				}
				if( appCookTime > COOK_BREAD_PREHEAT_TIME ){
					cooking_set_main_program_bread_preheat_time(COOK_BREAD_PREHEAT_TIME);
				}else{
					cooking_set_main_program_bread_preheat_time(0);
				}
			}
			if( app_keyb_data.keys_value.minus_key.key_trigger == KEY_SHORT_PRES || app_keyb_data.keys_value.minus_key.key_trigger == KEY_LONG_PRES ){ 
				ind_reset_dynamic_ind_timer();
				if( app_keyb_data.keys_value.minus_key.key_trigger == KEY_SHORT_PRES ){
					if(sound_mode == APP_SOUND_ON){
						add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
					}	
				}				
				if( app_param_adj_timer_expired(&app_keyb_data.keys_value.minus_key) ){
					if( app_time_blink == TIME_BLINK_HOUR ){
						appCookTime = app_time_sub_hour( appCookTime, cooking_get_main_program_min_cook_time(), ( cooking_get_main_program_cook_temp() > COOK_TEMP_TIME_MAX_2HOUR ) ? 2*60 : cooking_get_main_program_max_cook_time() );
					}else if( app_time_blink == TIME_BLINK_MIN ){
						appCookTime = app_time_sub_minutes( appCookTime, cooking_get_main_program_min_cook_time(), ( cooking_get_main_program_cook_temp() > COOK_TEMP_TIME_MAX_2HOUR ) ? 2*60 : cooking_get_main_program_max_cook_time(), cooking_get_main_program_adj_time_step() );						
					}
				}
				if( appCookTime > COOK_BREAD_PREHEAT_TIME ){
					cooking_set_main_program_bread_preheat_time(COOK_BREAD_PREHEAT_TIME);
				}else{
					cooking_set_main_program_bread_preheat_time(0);
				}
			}	
			if( app_keyb_data.keys_value.time_key.key_trigger == KEY_SHORT_PRES || app_keyb_data.keys_value.time_key.key_trigger == KEY_LONG_PRES ){ 
				ind_reset_dynamic_ind_timer();
				if( sound_mode == APP_SOUND_ON ){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);								
				}								
				if( app_time_blink == TIME_BLINK_HOUR ){
					app_time_blink = TIME_BLINK_MIN;
					
				}else if( app_time_blink == TIME_BLINK_MIN ){
					app_time_blink = TIME_BLINK_HOUR;					
				}
				break; 						
			}			
			//transitions
			if(( cooking_get_main_program_num() == COOK_MODE_MASTER_CHIEF ) && ( app_keyb_data.keys_value.temperature_key.key_trigger == KEY_SHORT_PRES )){
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}								
				cooking_set_main_program_cook_time( appCookTime );				
				AppState = APP_TEMP_PRESET;		
				break;
			}
			if( app_keyb_data.keys_value.postponement_key.key_trigger == KEY_SHORT_PRES ){ 
				if( cooking_get_main_program_postponement_enable() ){				
					if(sound_mode == APP_SOUND_ON){
						add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
					}
					cooking_set_main_program_cook_time( appCookTime );
					AppState = APP_POSTMENT_TIME_SET; 				
				}
				break; 
			}
			if( app_keyb_data.keys_value.start_autoheating_key.key_trigger == KEY_SHORT_PRES )
			{ 
				cooking_set_main_program_cook_time( appCookTime );
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}				
				if( cooking_get_main_program_postponement_time() == 0 )
				{
					if( cooking_get_main_program_boost_enable() ){
						AppState = APP_COOK_BOOST_PROC;
					}else{								
						AppState = APP_COOK_PROC;
					}
				}else{							
					AppState = APP_COOK_POSTPONEMENT_PROC;				
				}
				break; 				
			}
			if( app_inactive_timeout_flag ){							
					cooking_set_main_program_cook_time( appCookTime );
					AppState = APP_COOK_MODE; 
					break; 
			}
			if( app_keyb_data.keys_value.cancel_preheating_key.key_trigger == KEY_SHORT_PRES )
			{ 
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}				
				AppState = APP_COOK_MODE;
				break; 
			}
			if( app_select_cook_mode( &app_keyb_data ) == 1 )
			{
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}				
				AppState = APP_COOK_MODE;
				break;				
			}
			if( app_keyb_data.keys_value.power_key.key_trigger == KEY_SHORT_PRES ){ 
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}				
				AppState = APP_OFF; 
				break;
			}					
		break;
			
		case APP_TIME_SET:			
			//indication				
			ind_LED_Off(POSTPONEMENT_LED);
			ind_postponement_cooking_led_blinking(IND_LED_BLINK_NO);		
			if( cooking_get_keepwarm_state() ){
				ind_LED_On(PREHEATING_LED);
			}else{
				ind_LED_Off(PREHEATING_LED);				
			}				
			ind_LED_On(TIME_COOKING_LED);
			ind_time_cooking_led_blinking(IND_LED_BLINK_NO);				
			if( (app_keyb_data.keys_value.plus_key.state == KEY_CONDITION_PRESSED) || (app_keyb_data.keys_value.minus_key.state == KEY_CONDITION_PRESSED) ){
				ind_show_time( appCookTime,TIME_BLINK_NONE );				
			}else{ 
				if( app_time_blink == TIME_BLINK_HOUR ){
					ind_show_time( appCookTime,TIME_BLINK_HOUR );
				}else if( app_time_blink == TIME_BLINK_MIN ){
					ind_show_time( appCookTime,TIME_BLINK_MIN );				
				} 
			}
			if( app_temp_was_changed_flag || ( cooking_get_main_program_num() == COOK_MODE_MASTER_CHIEF) ){
				ind_show_temp( cooking_get_main_program_cook_temp(), TEMP_COOKING_TEMP_BLINK_NO );								
			}else{
				ind_hide_temp();
			}	
			//work
			cooking_stop();							
			//controll
			if( app_keyb_data.keys_value.plus_key.key_trigger == KEY_SHORT_PRES || app_keyb_data.keys_value.plus_key.key_trigger == KEY_LONG_PRES ){ 
				ind_reset_dynamic_ind_timer();
				if( app_keyb_data.keys_value.plus_key.key_trigger == KEY_SHORT_PRES ){
					if(sound_mode == APP_SOUND_ON){
						add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
					}	
				}				
				if( app_param_adj_timer_expired(&app_keyb_data.keys_value.plus_key) ){
					if( app_time_blink == TIME_BLINK_HOUR ){					
						appCookTime = app_time_add_hour( appCookTime, 0, ( cooking_get_main_program_cook_temp() > COOK_TEMP_TIME_MAX_2HOUR ) ? 2*60 : cooking_get_main_program_max_cook_time() );
					}else if( app_time_blink == TIME_BLINK_MIN ){
						appCookTime = app_time_add_minutes( appCookTime, 0, ( cooking_get_main_program_cook_temp() > COOK_TEMP_TIME_MAX_2HOUR ) ? 2*60 : cooking_get_main_program_max_cook_time(), COOK_MASTER_CHIEF_LITE_ADJ_TIME );						
					}
				}
			}
			if( app_keyb_data.keys_value.minus_key.key_trigger == KEY_SHORT_PRES || app_keyb_data.keys_value.minus_key.key_trigger == KEY_LONG_PRES ){ 
				if( app_keyb_data.keys_value.minus_key.key_trigger == KEY_SHORT_PRES ){
					if(sound_mode == APP_SOUND_ON){
						add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
					}	
				}
				ind_reset_dynamic_ind_timer();
				if( app_param_adj_timer_expired(&app_keyb_data.keys_value.minus_key) ){
					if( app_time_blink == TIME_BLINK_HOUR ){
						appCookTime = app_time_sub_hour( appCookTime, 0, ( cooking_get_main_program_cook_temp() > COOK_TEMP_TIME_MAX_2HOUR ) ? 2*60 : cooking_get_main_program_max_cook_time() );
					}else if( app_time_blink == TIME_BLINK_MIN ){
						appCookTime = app_time_sub_minutes( appCookTime, 0, ( cooking_get_main_program_cook_temp() > COOK_TEMP_TIME_MAX_2HOUR ) ? 2*60 : cooking_get_main_program_max_cook_time(), COOK_MASTER_CHIEF_LITE_ADJ_TIME );						
					}					
				}
			}	
			if( app_keyb_data.keys_value.time_key.key_trigger == KEY_SHORT_PRES || app_keyb_data.keys_value.time_key.key_trigger == KEY_LONG_PRES ){ 
				if( sound_mode == APP_SOUND_ON ){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);								
				}								
				if( app_time_blink == TIME_BLINK_HOUR ){
					app_time_blink = TIME_BLINK_MIN;
					ind_reset_dynamic_ind_timer();
				}else if( app_time_blink == TIME_BLINK_MIN ){
					app_time_blink = TIME_BLINK_HOUR;					
					ind_reset_dynamic_ind_timer();
				}
				break; 						
			}			
			//transitions
			if( app_inactive_timeout_flag ){
					cooking_set_main_program_cook_remain_time( appCookTime );
					AppState = AppReturnStateTimeSet; 
					break; 
			}
			if( app_keyb_data.keys_value.temperature_key.key_trigger == KEY_SHORT_PRES )
			{						
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}					
				cooking_set_main_program_cook_remain_time( appCookTime );
				AppReturnStateTempSet = AppReturnStateTimeSet; 
				AppState = APP_TEMP_SET;
				break; 
			}
			if( app_keyb_data.keys_value.cancel_preheating_key.key_trigger == KEY_SHORT_PRES )
			{ 
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}
				AppState = AppReturnStateTimeSet; 
				break; 
			}
			if( app_keyb_data.keys_value.power_key.key_trigger == KEY_SHORT_PRES ){ 
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}				
				AppState = APP_OFF; 
				break;
			}			
		break;							
		
		case APP_COOK_PROC_CONFIRM:
		{
			//indication				
			ind_LED_Off(POSTPONEMENT_LED);
			ind_postponement_cooking_led_blinking(IND_LED_BLINK_NO);			
			#ifndef CONFIG_IND_SENSOR_TEMP		
			if( app_temp_was_changed_flag || ( cooking_get_main_program_num() == COOK_MODE_MASTER_CHIEF) ){
				ind_show_temp( cooking_get_main_program_cook_temp(), TEMP_COOKING_TEMP_BLINK_NO );								
			}else{
				ind_hide_temp();
			}
			#else
				ind_show_temp( app_debug_temp_show(), TEMP_COOKING_TEMP_BLINK_NO );
			#endif
			
			if( cooking_get_keepwarm_state() ){
				ind_LED_On(PREHEATING_LED);
			}else{
				ind_LED_Off(PREHEATING_LED);				
			}
			ind_LED_On(TIME_COOKING_LED);	
			ind_time_cooking_led_blinking(IND_LED_BLINK_YES);						
			if( COOK_MODE_EXPRESS != cooking_get_main_program_num() ){
				ind_show_time( cooking_get_main_program_cook_remain_time(),TIME_BLINK_HOUR_MIN );								
			}else{
				ind_show_express_mode(TIME_BLINK_HOUR_MIN);
			}
			app_ind_cook_mode_led(cooking_get_main_program_num());
			ind_programm_cooking_led_blinking(IND_LED_BLINK_YES);			
			
			//transition			
			if( ( app_simple_timeout_flag ) 
					|| ( app_restore_context_beep_counter == 0 ) )
			{
					app_timeout_timers_restart(APP_RESTORE_CONTEXT_BEEP_TIME_S);	
					if(sound_mode == APP_SOUND_ON){
						add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
					}
					if( ++app_restore_context_beep_counter == APP_RESTORE_CONTEXT_BEEP_COUNT ){
						pof_manager_set_manual_restore_disable_flag();
						pof_clear_context();						
						AppState = APP_CONTEXT_RESTORE_CANCEL_STATE;
					}
					break; 
			}
			if( app_keyb_data.keys_value.start_autoheating_key.key_trigger == KEY_SHORT_PRES )
			{
				pof_clear_all();
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}
				if( ( cooking_get_main_program_postponement_enable() )
						&& ( cooking_get_main_program_postponement_time() > 0 ))
				{				
						AppState = APP_COOK_POSTPONEMENT_PROC;
				}else if( cooking_get_main_program_boost_enable() ){
					AppState = APP_COOK_BOOST_PROC;
				}else if( cooking_get_main_program_cook_remain_time() > 0 ){
					AppState = APP_COOK_PROC;			
				}else if( cooking_get_keepwarm_state() ){
					AppState = APP_KEEPWARM_PROC;					
				}
				break; 
			}
			if( app_keyb_data.keys_value.cancel_preheating_key.key_trigger == KEY_SHORT_PRES )
			{ 
				pof_clear_all();
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}				
				AppState = APP_STAND_BY;
				break; 
			}
			if( app_keyb_data.keys_value.power_key.key_trigger == KEY_SHORT_PRES ){ 
				pof_clear_all();
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}				
				AppState = APP_OFF; 
				break;
			}
			break;
		}
			
		case APP_COOK_POSTPONEMENT_PROC:
			//indication				
			ind_LED_On(POSTPONEMENT_LED);	
			ind_postponement_cooking_led_blinking(IND_LED_BLINK_NO);		
			#ifndef CONFIG_IND_SENSOR_TEMP		
			if( app_temp_was_changed_flag || ( cooking_get_main_program_num() == COOK_MODE_MASTER_CHIEF) ){
				ind_show_temp( cooking_get_main_program_cook_temp(), TEMP_COOKING_TEMP_BLINK_NO );								
			}else{
				ind_hide_temp();
			}
			#else
				ind_show_temp( app_debug_temp_show(), TEMP_COOKING_TEMP_BLINK_NO );
			#endif
			
			if( cooking_get_keepwarm_state() ){
				ind_LED_On(PREHEATING_LED);
			}else{
				ind_LED_Off(PREHEATING_LED);				
			}
			ind_LED_Off(TIME_COOKING_LED);	
			ind_time_cooking_led_blinking(IND_LED_BLINK_NO);						
			if( TRUE == app_simple_timeout_flag ){
				ind_show_time( cooking_get_main_program_postponement_time(),TIME_BLINK_MP );								
			}else{
				ind_show_time( cooking_get_main_program_cook_time(),TIME_BLINK_NONE );								
			}
			app_ind_cook_mode_led(cooking_get_main_program_num());
			ind_programm_cooking_led_blinking(IND_LED_BLINK_NO);			
			//work
			cooking_pause();										
			//controll
			if( app_keyb_data.keys_value.start_autoheating_key.key_trigger == KEY_SHORT_PRES ){
				if( cooking_set_keepwarm_state( 1 - cooking_get_keepwarm_state() ) ){
					if(sound_mode == APP_SOUND_ON){
						add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
					}
				}
				break; 
			}
			if( app_keyb_data.keys_value.postponement_key.key_trigger == KEY_SHORT_PRES ){
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}	
				app_timeout_timers_restart(APP_POSTPONEMENT_PROC_SHOW_COOK_TIME_S);
				break;
			}
//work			
			cooking_postponement_proc();
			//transition					
			if( app_keyb_data.keys_value.cancel_preheating_key.key_trigger == KEY_SHORT_PRES )
			{ 
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}					
				AppState = APP_STAND_BY; 
				break; 
			}			
			if( cooking_get_main_program_postponement_time() == 0 ){
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_MULTI);
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_MULTI);
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_MULTI);
				}					
				if( cooking_get_main_program_boost_enable() ){										
					AppState = APP_COOK_BOOST_PROC; 
					break; 					
				}else{
					AppState = APP_COOK_PROC; 
					break; 										
				}
			}
			if( app_keyb_data.keys_value.power_key.key_trigger == KEY_SHORT_PRES ){ 
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}				
				AppState = APP_OFF; 
				break;
			}			
		break;
			
		case APP_COOK_BOOST_PROC:			
			//indication					
			ind_LED_Off(POSTPONEMENT_LED);
			ind_postponement_cooking_led_blinking(IND_LED_BLINK_NO);		
			#ifndef CONFIG_IND_SENSOR_TEMP
			if( app_temp_was_changed_flag || ( cooking_get_main_program_num() == COOK_MODE_MASTER_CHIEF) ){
				ind_show_temp( cooking_get_main_program_cook_temp(), TEMP_COOKING_TEMP_BLINK_NO );								
			}else{
				ind_hide_temp();
			}			
			#else
				ind_show_temp( app_debug_temp_show(), TEMP_COOKING_TEMP_BLINK_NO );
			#endif
			if( cooking_get_keepwarm_state() ){
				ind_LED_On(PREHEATING_LED);
			}else{
				ind_LED_Off(PREHEATING_LED);				
			}		
			
			ind_time_cooking_led_blinking(IND_LED_BLINK_YES);											
			if( cooking_get_main_program_num() != COOK_MODE_EXPRESS ){		
				ind_show_time( cooking_get_main_program_cook_remain_time(),TIME_BLINK_NONE );
				ind_LED_On(TIME_COOKING_LED);
			}else{
				ind_show_express_proc();
				ind_LED_Off(TIME_COOKING_LED);
			}
			app_ind_cook_mode_led(cooking_get_main_program_num());
			ind_programm_cooking_led_blinking(IND_LED_BLINK_NO);			
			//controll			
			if( app_keyb_data.keys_value.start_autoheating_key.key_trigger == KEY_SHORT_PRES ){
				if( cooking_set_keepwarm_state( 1 - cooking_get_keepwarm_state() ) ){
					if(sound_mode == APP_SOUND_ON){
						add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
					}	
				}
				break; 
			}
			//work						
			if( cooking_boost() ){	
				AppState = APP_COOK_ENDOFBOOST_PROC;				
				break;
			}			
			//transition
			if(( app_keyb_data.keys_value.time_key.key_trigger == KEY_SHORT_PRES )
				&& ( COOK_MODE_EXPRESS != cooking_get_main_program_num() )){ 
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}								
				AppReturnStateTimeSet = AppState;
				AppState = APP_TIME_SET; 			
				break; 
			}
			if(( app_keyb_data.keys_value.temperature_key.key_trigger == KEY_SHORT_PRES )
				&& ( COOK_MODE_EXPRESS != cooking_get_main_program_num() )){ 
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}				
				appCookTime = cooking_get_main_program_cook_remain_time();				
				appCookTemp = cooking_get_main_program_cook_temp();
				AppReturnStateTempSet = AppState;
				AppState = APP_TEMP_SET; 			
				break; 				
			}
			if( app_keyb_data.keys_value.cancel_preheating_key.key_trigger == KEY_SHORT_PRES )
			{
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}								
				AppState = APP_STAND_BY;				
				break;
			}
			if( cooking_get_main_program_cook_remain_time() == 0 ){
				AppState = APP_STAND_BY;
			}
			if( app_keyb_data.keys_value.power_key.key_trigger == KEY_SHORT_PRES ){ 
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}	
				AppState = APP_OFF; 
				break;
			}
			if(	( app_temp_was_changed_flag == 1 )
				&& ( cooking_get_main_program_num() != COOK_MODE_MASTER_CHIEF ) )
			{
				AppState = APP_COOK_ENDOFBOOST_PROC;
			}
		break;
			
		case APP_COOK_ENDOFBOOST_PROC:
			ind_LED_Off(POSTPONEMENT_LED);
			ind_postponement_cooking_led_blinking(IND_LED_BLINK_NO);		
			if( cooking_get_keepwarm_state()){
				ind_LED_On(PREHEATING_LED);
			}else{
				ind_LED_Off(PREHEATING_LED);				
			}
			ind_LED_On(TIME_COOKING_LED);
			if( cooking_get_main_program_num() != COOK_MODE_EXPRESS ){
				ind_show_time( cooking_get_main_program_cook_remain_time(),TIME_BLINK_NONE );
			}
			ind_time_cooking_led_blinking(IND_LED_BLINK_YES);		
			app_ind_cook_mode_led(cooking_get_main_program_num());	
			ind_programm_cooking_led_blinking(IND_LED_BLINK_NO);			
			#ifndef CONFIG_IND_SENSOR_TEMP
				ind_hide_temp();			
			#else
				ind_show_temp( app_debug_temp_show(), TEMP_COOKING_TEMP_BLINK_NO );
			#endif
			//work
			cooking_pause();													
			//transition		
			if( cooking_get_main_program_num() == COOK_MODE_PASTA ){
				if( app_simple_timeout_flag || ( app_end_of_boost_beep_counter == 0 ) ){
					if( ++app_end_of_boost_beep_counter == APP_END_OF_BOOST_BEEP_COUNT ){
						if( sound_mode == APP_SOUND_ON ){
							add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
						}										
						AppState = APP_STAND_BY;
						break;
					}
					add_beep(APP_SHORT_BEEP_MS, APP_PASTA_BEEP_PAUSE_MS, BEEP_MULTI);
					add_beep(APP_SHORT_BEEP_MS, APP_PASTA_BEEP_PAUSE_MS, BEEP_MULTI);							
					add_beep(APP_SHORT_BEEP_MS, APP_PASTA_BEEP_PAUSE_MS, BEEP_MULTI);
					app_timeout_timers_restart(APP_END_OF_BOOST_BEEP_TIME_S);
				}
			}else{
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}												
				AppState = APP_COOK_PROC;				
				break;	
			}
			if( app_keyb_data.keys_value.start_autoheating_key.key_trigger == KEY_SHORT_PRES )
			{
				beep_clear_buff();
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}													
				AppState = APP_COOK_PROC;				
				break;
			}
			if( app_keyb_data.keys_value.cancel_preheating_key.key_trigger == KEY_SHORT_PRES )
			{
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}
				AppState = APP_STAND_BY;				
				break;
			}
			if( app_keyb_data.keys_value.power_key.key_trigger == KEY_SHORT_PRES ){ 
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}				
				AppState = APP_OFF; 
				break;
			}			
		break;
		
		case APP_COOK_PROC:
			//indication
			ind_LED_Off(POSTPONEMENT_LED);
			ind_postponement_cooking_led_blinking(IND_LED_BLINK_NO);		
			#ifndef CONFIG_IND_SENSOR_TEMP
			if( app_temp_was_changed_flag || ( cooking_get_main_program_num() == COOK_MODE_MASTER_CHIEF) ){
				ind_show_temp( cooking_get_main_program_cook_temp(), TEMP_COOKING_TEMP_BLINK_NO );								
			}else{
				ind_hide_temp();
			}
			#else
				ind_show_temp( app_debug_temp_show(), TEMP_COOKING_TEMP_BLINK_NO );
			#endif
			if( cooking_get_keepwarm_state() ){
				ind_LED_On(PREHEATING_LED);
			}else{
				ind_LED_Off(PREHEATING_LED);				
			}
			
			ind_time_cooking_led_blinking(IND_LED_BLINK_NO);
			if( cooking_get_main_program_num() != COOK_MODE_EXPRESS ){			
				ind_show_time( cooking_get_main_program_cook_remain_time(),TIME_BLINK_MP );	
				ind_LED_On(TIME_COOKING_LED);
			}else{
				ind_show_express_proc();
				ind_LED_Off(TIME_COOKING_LED);
			}
			app_ind_cook_mode_led(cooking_get_main_program_num());
			ind_programm_cooking_led_blinking(IND_LED_BLINK_NO);			
			//controll
			if( app_keyb_data.keys_value.start_autoheating_key.key_trigger == KEY_SHORT_PRES ){
				if( cooking_set_keepwarm_state( 1 - cooking_get_keepwarm_state() ) ){
					if(sound_mode == APP_SOUND_ON){
						add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
					}			
				}
				break; 
			}
			//work	
			if( abs( Temp_GetBotTemp() - cooking_get_main_program_cook_temp() ) < 5 )
			{
				if( ( COOK_MODE_BOIL == cooking_get_main_program_num() 		)
					|| ( COOK_MODE_ROAST == cooking_get_main_program_num() 	)
					|| ( COOK_MODE_SOUP == cooking_get_main_program_num() 	)
					|| ( COOK_MODE_STEAM == cooking_get_main_program_num() 	))
				{
					if( !temp_reached_setting_sound_flag	){
						temp_reached_setting_sound_flag = 1;
						if(sound_mode == APP_SOUND_ON){
							add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_MULTI);
							add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_MULTI);
						}				
					}
				}
			}
			if( bread_cooking_time_reached_middle_sound_flag == 0 ){
				if( COOK_MODE_BREAD == cooking_get_main_program_num() ){
					if( cooking_get_main_program_cook_time() > cooking_get_main_program_bread_preheat_time() ){
						if( cooking_get_main_program_cook_remain_time() < ( ( cooking_get_main_program_cook_time() - cooking_get_main_program_bread_preheat_time() ) / 2 ) )
						{
							//half of baking time
							bread_cooking_time_reached_middle_sound_flag = 1;
							add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_MULTI);
							add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_MULTI);						
						}
					}
				}
			}
			//transition
			if( ( app_keyb_data.keys_value.time_key.key_trigger == KEY_SHORT_PRES )
				&& ( COOK_MODE_EXPRESS != cooking_get_main_program_num() ) ){ 
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}				
				ind_reset_dynamic_ind_timer();
				app_timeout_timers_restart(APP_TIME_INACTIVE_TIMEOUT_S);				
				app_time_blink = TIME_BLINK_HOUR;
				appCookTime = cooking_get_main_program_cook_remain_time();
				AppReturnStateTimeSet = AppState;
				AppState = APP_TIME_SET; 			
				break; 
			}			
			if( cooking_proc() ){

				if( cooking_get_keepwarm_state() == 1 ){								
					//cooking_timer_restart();
					if(sound_mode == APP_SOUND_ON){
						add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
					}
					AppState = APP_KEEPWARM_PROC;
				}else{
					app_timeout_timers_restart(APP_END_OF_COOK_TIMEOUT_S);
					if(sound_mode == APP_SOUND_ON){
						add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_MULTI);
						add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_MULTI);
						add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_MULTI);
					}					
					AppState = APP_END_COOKING_PROC;  				
				}
				break;
			}
			if( app_keyb_data.keys_value.cancel_preheating_key.key_trigger == KEY_SHORT_PRES )
			{ 
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}									
				AppState = APP_STAND_BY; 
				break; 
			}
			if(( app_keyb_data.keys_value.temperature_key.key_trigger == KEY_SHORT_PRES )
				&& ( COOK_MODE_EXPRESS != cooking_get_main_program_num() ))
			{ 
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}	
				app_timeout_timers_restart(APP_TEMP_INACTIVE_TIMEOUT_S);
				appCookTime = cooking_get_main_program_cook_remain_time();
				appCookTemp = cooking_get_main_program_cook_temp();				
				AppReturnStateTempSet = AppState;
				AppState = APP_TEMP_SET;								
				break; 
			}
			#ifdef CONFIG_COOK_DEBUG
			if( app_keyb_data.keys_value.maseter_chief_key.key_trigger == KEY_SHORT_PRES ){
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}											
				AppReturnStatePwmSet = AppState;
				AppState = APP_PWM_SET; 
				break; 								
			}
			#endif
			if( app_keyb_data.keys_value.power_key.key_trigger == KEY_SHORT_PRES ){ 
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}				
				AppState = APP_OFF; 
				break;
			}			
		break;
		
		case APP_KEEPWARM_PROC:
			//indication
			ind_LED_Off(TIME_COOKING_LED);
			ind_postponement_cooking_led_blinking(IND_LED_BLINK_NO);		
			ind_LED_On(PREHEATING_LED);		
			ind_LED_Off(POSTPONEMENT_LED);					
			ind_time_cooking_led_blinking(IND_LED_BLINK_NO);							
			ind_show_time( cooking_get_keep_warm_time(),TIME_BLINK_MP );
			app_ind_cook_mode_led(cooking_get_main_program_num());
			ind_programm_cooking_led_blinking(IND_LED_BLINK_NO);		
			#ifndef CONFIG_IND_SENSOR_TEMP
				ind_hide_temp();			
			#else
				ind_show_temp( app_debug_temp_show(), TEMP_COOKING_TEMP_BLINK_NO );
			#endif
			//work
			cooking_keepwarm_proc();
			if( abs( Temp_GetBotTemp() - APP_PREHEAR_TEMP_MAKE_SOUND ) < 5 )
			{
				if( !preheat_temp_reached_setting_sound_flag	){
					preheat_temp_reached_setting_sound_flag = 1;
					if(sound_mode == APP_SOUND_ON){
						add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_MULTI);
						add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_MULTI);
					}				
				}
			}		
			//transition		
			if( app_keyb_data.keys_value.cancel_preheating_key.key_trigger == KEY_SHORT_PRES )
			{ 
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}							
				AppState = APP_STAND_BY; 
				break; 
			}
			if( cooking_get_keep_warm_time() == cooking_get_main_program_keepwarm_time() * 60 ){
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_MULTI);
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_MULTI);
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_MULTI);
				}				
				AppState = APP_END_COOKING_PROC; 
				break; 
			}
			if( app_keyb_data.keys_value.power_key.key_trigger == KEY_SHORT_PRES ){ 
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}				
				AppState = APP_OFF; 
				break;
			}			
		break;						
		
		case APP_END_COOKING_PROC:
			//indication
			ind_LED_Off(POSTPONEMENT_LED);					
			ind_postponement_cooking_led_blinking(IND_LED_BLINK_NO);
			ind_LED_Off(PREHEATING_LED);	
			ind_LED_Off(TIME_COOKING_LED);
			ind_time_cooking_led_blinking(IND_LED_BLINK_NO);		
			ind_end_cooking();
			#ifndef CONFIG_IND_SENSOR_TEMP
				ind_hide_temp();
			#else
				ind_show_temp( app_debug_temp_show(), TEMP_COOKING_TEMP_BLINK_NO );
			#endif		
			//work
			cooking_stop();												
			//transition
			if( app_keyb_data.keys_value.cancel_preheating_key.key_trigger == KEY_SHORT_PRES ){ 			
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}					
				AppState = APP_STAND_BY; 
				break; 
			}
			if( app_simple_timeout_flag ){				
				AppState = APP_STAND_BY; 				
				break;
			}
			if( app_keyb_data.keys_value.power_key.key_trigger == KEY_SHORT_PRES ){ 
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}				
				AppState = APP_OFF; 
				break;
			}			
		break;
			
		#ifdef CONFIG_COOK_DEBUG
		case APP_PWM_SET:			
		{
			U8 pwm;
			pwm = cooking_get_pwm_boiling();
			#ifndef CONFIG_IND_SENSOR_TEMP
				ind_hide_temp();
			#else
				ind_show_temp( pwm, TEMP_COOKING_TEMP_BLINK_NO );
			#endif			
			//controll
			if( app_keyb_data.keys_value.plus_key.key_trigger == KEY_SHORT_PRES || app_keyb_data.keys_value.plus_key.key_trigger == KEY_LONG_PRES ){ 				
				if( app_keyb_data.keys_value.plus_key.key_trigger == KEY_SHORT_PRES ){
					if(sound_mode == APP_SOUND_ON){
						add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
					}	
				}
				
				if( (++pwm) >= (HEATER_MAX_PWM_DUTY_CICLE) ){
					cooking_set_pwm_boiling(0);
				}else{
					cooking_set_pwm_boiling(pwm);
				}
			}
			if( app_keyb_data.keys_value.minus_key.key_trigger == KEY_SHORT_PRES || app_keyb_data.keys_value.minus_key.key_trigger == KEY_LONG_PRES ){ 
				if( app_keyb_data.keys_value.minus_key.key_trigger == KEY_SHORT_PRES ){
					if(sound_mode == APP_SOUND_ON){
						add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
					}	
				}
				if( (pwm) == 0 ){
					cooking_set_pwm_boiling(HEATER_MAX_PWM_DUTY_CICLE);
				}else{
					cooking_set_pwm_boiling(--pwm);
				}
			}
			//transition
			if( app_keyb_data.keys_value.start_autoheating_key.key_trigger == KEY_SHORT_PRES ){ 			
				if(sound_mode == APP_SOUND_ON){
					add_beep(APP_SHORT_BEEP_MS, APP_BEEP_PAUSE_MS, BEEP_SINGLE);
				}											
				AppState = AppReturnStatePwmSet; 
				break; 
			}
			break;
		}
		#endif
			
		default:
			AppState = APP_STAND_BY;
		break;
	}
}

void application_proc(void){
	//state machine variables	
		
	keybord_data_read(&app_keyb_data);	
	app_check_inaction(&app_keyb_data);	

	app_sm_transition( AppState );
	app_sm_proc();
	return;
}
uint16_t Appl_GetVersion(void){
	//appl_blth_cmd_received_flag = 1;
	return SOFTWARE_VERSION;
}

//Start
bool Appl_Start(void){		
	switch(AppState)
	{
		case APP_OFF:
		{
			return false;
		}
		
		case APP_STAND_BY:
		case APP_SOUND_CTRL:
		case APP_CONTEXT_RESTORE_CANCEL_STATE:
		case APP_COOK_MODE:
		case APP_POSTMENT_TIME_SET:
		case APP_TIME_PRESET:
		case APP_TEMP_PRESET:		
		{
			if( cooking_get_main_program_postponement_time() == 0 )
			{
				if( cooking_get_main_program_boost_enable() ){
					AppState = APP_COOK_BOOST_PROC;
				}else{								
					AppState = APP_COOK_PROC;
				}
			}else{						
				AppState = APP_COOK_POSTPONEMENT_PROC;				
			}		
			return true;		
		}
		
		case APP_COOK_PROC_CONFIRM:
		{
			pof_clear_all();
			if( cooking_get_main_program_postponement_time() == 0 )
			{
				if( cooking_get_main_program_boost_enable() ){
					AppState = APP_COOK_BOOST_PROC;
				}else{								
					AppState = APP_COOK_PROC;
				}
			}else{						
				AppState = APP_COOK_POSTPONEMENT_PROC;				
			}		
			return true;
		}		
	
		case APP_TIME_SET:
		case APP_TEMP_SET:
		case APP_COOK_POSTPONEMENT_PROC:
		case APP_COOK_BOOST_PROC:
		case APP_COOK_PROC:
		case APP_KEEPWARM_PROC:
		case APP_END_COOKING_PROC:
		{
			return true;
		}
		
		case APP_COOK_ENDOFBOOST_PROC:
		{
			AppState = APP_COOK_PROC;
			return true;		
		}
		
		default:
		{
			return false;
		}
	}
}
//Stop
bool Appl_Stop(void){
	if( AppState == APP_OFF )return false;
	if( AppState == APP_TEST )return false;
	if( AppState == APP_VERSION_IND )return false;
	if( AppState == APP_ERROR )return false;	
	
	if( AppState == APP_COOK_PROC_CONFIRM )
	{
		pof_clear_all();
	}
	AppState = APP_STAND_BY;
		
	return true;
}

//Get device state
uint8_t Appl_GetState(void){
	switch( AppState ){
		case APP_OFF:
		{
			return APPL_OFF_STATE;
		}
		
		case APP_STAND_BY:
		case APP_SOUND_CTRL:
		{
			return APPL_BEGIN_STATE;
		}
		
		case APP_CONTEXT_RESTORE_CANCEL_STATE:
		{
			return APPL_CONTEXT_RESTORE_CANCEL_STATE;
		}
					
		case APP_COOK_MODE:
		case 	APP_POSTMENT_TIME_SET:
		case 	APP_TIME_PRESET:
		case 	APP_TEMP_PRESET:			
		{
			return APPL_PROGRAM_STATE;
		}
		
		case APP_TIME_SET:
		{
			switch(AppReturnStateTimeSet)
			{
				case APP_COOK_POSTPONEMENT_PROC:
				{
					return APPL_START_DELAY_STATE;
				}
				case APP_COOK_BOOST_PROC:
				{
					return APPL_BOOST_STATE;
				}				
				case APP_COOK_ENDOFBOOST_PROC:
				{
					return APPL_WAIT_STATE;
				}
				case APP_COOK_PROC:
				{
					return APPL_COOKING_STATE;
				}
				default:
				{
					return 0xff;
				}
			}
		}
		case 	APP_TEMP_SET:
		{			
			switch( AppReturnStateTempSet )
			{
				case APP_COOK_POSTPONEMENT_PROC:
				{
					return APPL_START_DELAY_STATE;
				}
				case APP_COOK_BOOST_PROC:
				{
					return APPL_BOOST_STATE;
				}				
				case APP_COOK_ENDOFBOOST_PROC:
				{
					return APPL_WAIT_STATE;
				}
				case APP_COOK_PROC:
				{
					return APPL_COOKING_STATE;
				}
				default :
				{
					return 0xff;
				}
			}
		}
		
		case APP_COOK_POSTPONEMENT_PROC:
		{
			return APPL_START_DELAY_STATE;
		}
		
		case APP_COOK_BOOST_PROC:
		{
			return APPL_BOOST_STATE;			
		}
		
		case APP_COOK_ENDOFBOOST_PROC:
		{
			return APPL_WAIT_STATE;	
		}
		
		case APP_COOK_PROC:
		{
			return APPL_COOKING_STATE;
		}
		
		case APP_KEEPWARM_PROC:
		{
			return APPL_REHEAT_STATE;			
		}
		
		case APP_ERROR:
		{
			return APPL_ERROR_STATE;
		}
		
		case APP_PAIRING:
		{
			return APPL_PAIRING_STATE;
		}
		
		case APP_TEST:
		{
			return APPL_TEST_STATE;	
		}
										
		case 	APP_COOK_PROC_CONFIRM:
		{
			return APPL_CONTEXT_RESTORE_CONFIRM_STATE;
		}
		
		default:
			return 0xFF;
	}
}

//Set program
bool Appl_SetProgram(uint8_t prog){
	cooking_mode_t State;
	if( ( AppState != APP_STAND_BY )
		&& ( AppState != APPL_CONTEXT_RESTORE_CANCEL_STATE )
		&& ( AppState != APP_COOK_MODE ) )
	{
		return false;
	}	
	switch( prog ){
		case APPL_MULTICOOKER_PROG:
			State = COOK_MODE_MASTER_CHIEF;
		break;
		case APPL_QUICK_COOK_PROG:
			State = COOK_MODE_EXPRESS;			
		break;			
		case APPL_BREAD_PROG:
			State = COOK_MODE_BREAD;
		break;			
		case APPL_STEAM_PROG:
			State = COOK_MODE_STEAM;
		break;			
		case APPL_BOIL_PROG:
			State = COOK_MODE_BOIL;
		break;			
		case APPL_PASTA_PROG:
			State = COOK_MODE_PASTA;
		break;			
		case APPL_FRY_PROG:
			State = COOK_MODE_ROAST;
		break;			
		case APPL_BAKE_PROG:
			State = COOK_MODE_BAKE;
		break;			
		case APPL_STEW_PROG:
			State = COOK_MODE_BRAISE;
		break;			
		case APPL_SOUP_PROG:
			State = COOK_MODE_SOUP;
		break;			
		case APPL_YOGURT_PROG:
			State = COOK_MODE_YOGURT;
		break;			
		case APPL_GRAIN_PROG:
			State = COOK_MODE_RICE;
		break;			
		case APPL_PIZZA_PROG:
			State = COOK_MODE_PIZZA;
		break;			
		case APPL_PORRIDGE_PROG:
			State = COOK_MODE_PORRIDGE;
		break;			
		case APPL_PILAF_PROG:
			State = COOK_MODE_PILAF;
		break;			
		case APPL_SLOW_COOK_PROG:
			State = COOK_MODE_STEW;
		break;
		case APPL_VACUUM_PROG:
			State = COOK_MODE_VACUUM;
		break;
		case APPL_PREHEAT_PROG:
			State = COOK_MODE_PREHEAT;
		break;		
		default:
			return false;
	}
	if( cooking_set_main_program_num( State ) ){
		app_temp_was_changed_flag = 0;
		if( ( State != COOK_MODE_PREHEAT )
			&& ( State != COOK_MODE_EXPRESS ) )
		{
			AppState = APP_COOK_MODE;
		}else{
			AppState = APP_STAND_BY;
		}
		return true;
	}
	return false;
}

//Get program
uint8_t Appl_GetProgram(void){	
	switch( cooking_get_main_program_num() ){
		case COOK_MODE_MASTER_CHIEF:
			return APPL_MULTICOOKER_PROG;
		case COOK_MODE_EXPRESS:
			return APPL_QUICK_COOK_PROG;					
		case COOK_MODE_BREAD:
			return APPL_BREAD_PROG;
		case COOK_MODE_STEAM:
			return APPL_STEAM_PROG;
		case COOK_MODE_BOIL:
			return APPL_BOIL_PROG;			
		case COOK_MODE_PASTA:
			return APPL_PASTA_PROG;			
		case COOK_MODE_ROAST:
			return APPL_FRY_PROG;
		case COOK_MODE_BAKE:
			return APPL_BAKE_PROG;
		case COOK_MODE_BRAISE:
			return APPL_STEW_PROG;			
		case COOK_MODE_SOUP:
			return APPL_SOUP_PROG;			
		case COOK_MODE_YOGURT:
			return APPL_YOGURT_PROG;				
		case COOK_MODE_RICE:
			return APPL_GRAIN_PROG;				
		case COOK_MODE_PIZZA:
			return APPL_PIZZA_PROG;					
		case COOK_MODE_PORRIDGE:
			return APPL_PORRIDGE_PROG;					
		case COOK_MODE_PILAF:
			return APPL_PILAF_PROG;				
		case COOK_MODE_STEW:
			return APPL_SLOW_COOK_PROG;
		case COOK_MODE_VACUUM:
			return APPL_VACUUM_PROG;
		case COOK_MODE_PREHEAT:
			return APPL_PREHEAT_PROG;
		default:
			return 0xFF;
	}
}

//Set cooking temperature
bool Appl_SetCookTemp(uint8_t temp){
			
	const cooking_prog_t* prog_p;	//указатель на структуру параметров	
	cooking_mode_t prog_num;
	
	prog_num = cooking_get_main_program_num();
	
	
	if( cooking_get_default_program_param( prog_num , &prog_p ) == 0 )
	{
		return false;	//ошибка неверно задана текущая программа
	}	
	
	if( cooking_get_main_program_num() != COOK_MODE_MASTER_CHIEF )
	{		
		if( prog_p->cCookTemp != temp )		//пытаемся задать отличную от default-ной температуру
		{
			if( ( AppState != APP_COOK_BOOST_PROC )					//состояния в которых разрешено изменение температуры( кроме мультиповара )
				&&	( AppState != APP_COOK_POSTPONEMENT_PROC )
				&& ( AppState != APP_COOK_ENDOFBOOST_PROC )
				&& ( AppState != APP_COOK_PROC )
				&& ( AppState != APP_TEMP_SET )
				&& ( AppState != APP_TIME_SET ) )
			{
				return false;
			}
			if( cooking_get_main_program_num() == COOK_MODE_EXPRESS )return false;
			if( cooking_get_main_program_num() == COOK_MODE_PREHEAT )return false;			
		}
	}
	
			
	if( ( temp <= cooking_get_main_program_max_cook_temp() )
		&& ( temp >= cooking_get_main_program_min_cook_temp() ) )
	{						
			if( prog_p->cCookTemp != temp )	//если задана не default тепмература отменим разгон
			{
				app_temp_was_changed_flag = 1;
			}		
	
			cooking_set_main_program_cook_temp(temp);
			
			if( temp > COOK_TEMP_TIME_MAX_2HOUR )
			{
				if( cooking_get_main_program_cook_remain_time() > 2*60 )
				{
					cooking_set_main_program_cook_remain_time(2*60);
				}
			}
			if( temp < COOK_TEMP_PREHEAT_ENABLE )
			{
				cooking_set_keepwarm_state(0);	//отключим разогрев
			}
			return true;
	}
	return false;
}

//Get cooking temperature
uint8_t Appl_GetCookTemp(void){		
	return cooking_get_main_program_cook_temp();
}
//Set cooking time in minutes
bool Appl_SetCookTime(uint16_t time){
	if(	time <= cooking_get_main_program_max_cook_time() ){
		if(	( cooking_get_main_program_cook_temp() > COOK_TEMP_TIME_MAX_2HOUR )
				&& ( time > 2*60 ))
		{
			return false;	
		}else{
			cooking_set_main_program_cook_remain_time(time);
			return true;
		}
	}else{
		return false;
	}
}

//Get cooking time in minutes
uint16_t Appl_GetCookTime(void){
	return cooking_get_main_program_cook_time();
}

//Set defered start time in minutes, 0 if disable
bool Appl_SetDeferedStart(uint16_t time){
	if( time > 24*60 ){
		return false;
	}else{
		return cooking_set_main_program_postponement_time(time);
	}
}

//Get defered start time in minutes, 0 if disable
uint16_t Appl_GetDeferedStart(void){
	return cooking_get_main_program_postponement_time();
}
//Get time to end of cooking in minutes
uint16_t Appl_GetEndTime(void){	
	if( cooking_get_main_program_num() == COOK_MODE_EXPRESS ){
		return 0;
	}else{
		return cooking_get_main_program_cook_remain_time();
	}
}

//Set reheat state
bool Appl_SetReheat(uint8_t state){
	return cooking_set_keepwarm_state(state);
}

//Get reheat state
uint8_t Appl_GetReheat(void){
	return cooking_get_keepwarm_state();
}

//Get current time of reheat in minutes
uint16_t Appl_GetReheatTime(void){
	return cooking_get_keep_warm_time();
}

//Get error
uint8_t Appl_GetError(void){
	switch( app_error ){
		case ERR_NO:
			return APPL_NO_ERR;
		
		case ERR_BOT_SENSOR:
			return APPL_BOT_SENSOR_ERR;
		
		case ERR_TOP_SENSOR:
			return APPL_TOP_SENSOR_ERR;
		
		case ERR_OVERHEAT:
			return APPL_OVERHEAT_ERR;
		
		case ERR_EMPTY_POT:
			return APPL_EMPTY_POT_ERR;
		
		default:
			return APPL_NO_ERR;			
	}
}

//Return a state of the unpairing flag
bool Appl_IsUnpairing(void){
	return unpairing_in_process;
}

//Clear unpairing flag
void Appl_ClrUnpairing(void){
	unpairing_in_process = false;
	return;
}

void Appl_ClrPairing(void){	
	AppState = APP_STAND_BY;
	return;
}
void Appl_ErrorHandler(error_type_t Err){
	app_error	= Err;
	AppState = APP_ERROR;
	return;
}
U32 Appl_GetResetReason(void){	
	return app_reset_reason;
}
U8 Appl_GetPofEventCount(void){	
	return pof_get_pof_event_count();
}
bool Appl_TempWasChangedFlag(void){
	return app_temp_was_changed_flag;
}
bool Appl_GetCookingProcessFlag(void){
	switch (AppState)
	{
		case 	APP_STAND_BY:
		case 	APP_SOUND_CTRL:
		case 	APP_VERSION_IND:	
		case 	APP_PAIRING:
		case 	APP_COOK_MODE:
		case 	APP_POSTMENT_TIME_SET:
		case 	APP_TIME_PRESET:
		case 	APP_TEMP_PRESET:
		case 	APP_END_COOKING_PROC:		
		case 	APP_PWM_SET:		
		case 	APP_ERROR:
		case 	APP_TEST:		
		case	APP_KEEPWARM_PROC:			
		case 	APP_COOK_PROC_CONFIRM:			
				return false;
		
		case 	APP_TIME_SET:
		case 	APP_TEMP_SET:
		case	APP_COOK_POSTPONEMENT_PROC:
		case	APP_COOK_BOOST_PROC:
		case	APP_COOK_ENDOFBOOST_PROC:
		case	APP_COOK_PROC:
			return true;

		default:
			return false;
	}
}
Made on
Tilda