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



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

Фрагмент исходного кода
////////////////////////////////////////////////////////////////
// RMC-M92S
//v1.5

////////////////////////////////////////////////////////////////

/*==============================================================
                          include
==============================================================*/

#include "common.h"
#include "r4s.h"
#include "application.h"
#include "appl_api.h"

#include "clk.h"
#include "temp.h"
#include "heat.h"
#include "buz.h"
#include "ind.h"
#include "keyb.h"
#include "timer.h"
#include "err.h"
#include "power_down.h"
/*==============================================================
                          Define
==============================================================*/
/*
 * Включение пищалки
 */
#ifdef  BEEP_ON
#define BEEP_BIG_LONG()         {timer_init(TIMER_BEEP,35,cb_beep_off);timer_start(TIMER_BEEP);Buz_On();}
#define BEEP_LONG()             {timer_init(TIMER_BEEP,25,cb_beep_off);timer_start(TIMER_BEEP);Buz_On();}
#define BEEP()                  {timer_init(TIMER_BEEP,10,cb_beep_off);timer_start(TIMER_BEEP);Buz_On();}
#else
#define BEEP_BIG_LONG()         {}
#define BEEP_LONG()             {}
#define BEEP()                  {}
#endif
		
/*==============================================================
                      static functions
==============================================================*/

static void application_timers_handler(void);
static void application_power_down(void);
static void cb_beep_off(uint32_t timer);
static void logic_led_start_bl(uint8_t stat);
	
static void logic_commands(void);

static void logic_mode_standby(uint8_t beep);
static void logic_mode_menu(uint8_t beep);
static void logic_mode_cooking(uint8_t beep);
static void logic_cooking_express(uint8_t beep);
static void logic_go_time_pasta(uint8_t beep);

static void logic_go_keepwarm(uint8_t beep);
static void logic_on_off_keepwarm(uint8_t beep);

static void logic_go_delay_start(void);
static void logic_go_start(void);

static void logic_load_menu_prog(cookcomplexprog *adr_prog);
static void logic_time_plas(uint8_t min_clok, uint8_t beep);
static void logic_delay_taim_key(uint8_t st_flag, uint8_t beep);
static void logic_temp_plas(uint8_t beep);

static void logic_paring(void);
static void logic_unparing(void);

static void logic_tim_1min(void);
static inline void logic_4sec_pwm(void);
static inline void blank_menu(void);
static inline void logic_beep_5(void);
static inline void logic_beep_3(void);	
static inline void logic_prog_on_of(uint8_t n_prog, uint8_t state);
static inline void logic_pwm_regulator(uint8_t k_t, int16_t t_reg);
static void logic_heat_off(void);	
static void logic_heat_on(uint8_t heat_state);

static void application_power_mode(void);
static void application_power_mode_go(uint8_t beep);

static void test_heat(uint8_t key);
static void logic_vesion(void);
/*==============================================================
                         static 
==============================================================*/
	
static logic_state_mode state_mode = STANDBY_MODE, // Настоящее состояние мультиварки
	                power_state_mode = STANDBY_MODE;
static cookcomplexprog lg_cook_complex;            // Параметры установленной программы готовки
static uint8_t led_blank_state     = 0,            // Параметр мигания индикации
	             blank_faze          = 0,            // Общий флаг периода мигания индикации
               blank_faze_time     = 0,            // Флаг периода мигания времени
               blank_faze_temp     = 0,	           // Флаг периода мигания температуры
               fl_load_delay_taim  = 0,	           // Флаг установки времени отложенного старта
               state_cooking       = STAGE_NONE,   // Cостояние процесса готовки
               error               = 0,            // Ошибка
               power_taim          = 0,            // Время нахождения в режиме сбоя питания
               power_down          = 0,            // Флаг пропадения питания
               power_state_cooking = STAGE_NONE,
               test_ind_on         = 0;

static uint16_t keep_warm_time = 0;                // Время подогрева	
static uint8_t temp_bot = 0, temp_top = 0, temp_pwm = 0;

static const cookprog cook_program[18] =
	{
		{ 				              // 0 - "МУЛЬТИПОВАР"
		 100,					          // Рабочая температура
		 35, 170, 		          // min, max диапазон изменения температуры
		 HEAT_TOP | HEAT_SIDE | HEAT_MAIN, // разрешенные тены	
		 255, 94,
		 0, 99,
		 1,                     // Коэф. плавности закипания
		 8,                     // ШИМ доводки до кипения	
     4,                     // Коэф. усиления			
		 FALSE,				          // Отсчет времени начать после закипания
		 5, 12*60, 1,	5,        // диапазон ввода и шаг изменения в минутах
		 30, 		                // время готовки в минутах 
		 12,					          // подогрев в часах
		 TRUE					          // возможность отложенного старта
		},
		{ 									    // 1 - "МОЛОЧНАЯ КАША"
		 97,	
		 35, 170, 		          // min, max диапазон изменения температуры
		 HEAT_SIDE | HEAT_MAIN, 		 
		 255, 60, 
		 60, 95,
		 5,                     // Коэф. плавности закипания
		 4,                     // ШИМ доводки до кипения
     0,                     // Коэф. усиления				
		 FALSE,			
		 5, 90, 1, 1,
		 10,
		 12,
		 TRUE
		},
		{ 								      // 2 - "ТУШЕНИЕ"
		 100,
		 35, 170, 		          // min, max диапазон изменения температуры
		 HEAT_SIDE | HEAT_MAIN, 		 
		 255, 94, 
		 70, 99,
		 8,                     // Коэф. плавности закипания
		 4,                     // ШИМ доводки до кипения
     0,                     // Коэф. усиления				
		 FALSE,			
		 10, 12*60, 5, 5,
		 60,
		 12,
		 TRUE
		},
		{ 									    // 3 - "ЖАРКА"
		 170,
		 35, 170, 		          // min, max диапазон изменения температуры
		 HEAT_SIDE | HEAT_MAIN,	 
		 255, 160, 
		 0, 168,
		 8,                     // Коэф. плавности закипания
		 2,                     // ШИМ доводки до кипения
     0,                     // Коэф. усиления	ok			
		 FALSE,			
		 5, 90, 1, 1,
		 15,
		 12,
		 FALSE
		},
		{ 									    // 4 - "СУП"
		 99,	                  // ash
		 35, 170, 		          // min, max диапазон изменения температуры
		 HEAT_SIDE | HEAT_MAIN, 		 
		 255, 93,	              // ash
		 75,98,//70, 98,	              // ash
		 8,                     // Коэф. плавности закипания
		 4,                     // ШИМ доводки до кипения
     0,                     // Коэф. усиления				
		 FALSE,			
		 10, 8*60, 5, 5,
		 60,
		 12,
		 TRUE
		},
		{ 								      // 5 - "ПАР"
		 100,
		 35, 170, 		          // min, max диапазон изменения температуры
		 HEAT_SIDE | HEAT_MAIN,
		 255, 94, 
		 70, 99,
		 8,                     // Коэф. плавности закипания
		 4,                     // ШИМ доводки до кипения
     0,                     // Коэф. усиления				
		 TRUE,			
		 5, 2*60, 5, 5,
		 20,
		 12,
		 TRUE
		},
		{ 								      // 6 - "МАКАРОНЫ"
		 100,
		 35, 170, 		          // min, max диапазон изменения температуры
		 HEAT_SIDE | HEAT_MAIN,		 
		 255, 94, 
		 70, 99,
		 8,                     // Коэф. плавности закипания
		 8,                     // ШИМ доводки до кипения	
     1,                     // Коэф. усиления	ok			
		 TRUE,			
		 2, 1*60, 1, 1,
		 8,
		 0,
		 FALSE
		},		
		{ 									    // 7 - "ТОМЛЕНИЕ"
		 97,
		 35, 170, 		          // min, max диапазон изменения температуры
		 HEAT_SIDE | HEAT_MAIN, 		 
		 255, 91,
		 0, 96,		              // ash
		 1,                     // Коэф. плавности закипания
		 8,                     // ШИМ доводки до кипения	
     0,                     // Коэф. усиления				
		 FALSE,			
		 30, 12*60, 10, 10,
		 300,
		 12,
		 TRUE
		},		
		{ 									    // 8 - "ВАРКА"
		 100,
		 35, 170, 		          // min, max диапазон изменения температуры
		 HEAT_SIDE | HEAT_MAIN,
		 255, 94, 
		 70, 99,
		 8,                     // Коэф. плавности закипания
		 4,                     // ШИМ доводки до кипения
     0,                     // Коэф. усиления				
		 FALSE,			
		 10, 12*60, 5, 5,
		 40,
		 12,
		 TRUE
		},		
		{ 							        // 9 - "ВЫПЕЧКА"
		 145,//135	                  // ash
		 35, 170, 		          // min, max диапазон изменения температуры
		 HEAT_TOP | HEAT_SIDE | HEAT_MAIN,
		 255, 110, //100
		 0, 144,//134
		 8,                     // Коэф. плавности закипания
		 2,                     // ШИМ доводки до кипения
     2,                     // Коэф. усиления	ok
		 FALSE,
		 10, 8*60, 5, 5,
		 60,
		 4,
		 TRUE
		},
		{ 					            // 10 - "КРУПЫ"
		 100,
		 35, 170, 		          // min, max диапазон изменения температуры
		 HEAT_SIDE | HEAT_MAIN, 		 
		 255, 90, 
		 70, 94,
		 8,                     // Коэф. плавности закипания
		 4,                     // ШИМ доводки до кипения
     0,                     // Коэф. усиления				
		 FALSE,			
		 5, 4*60, 5, 5,
		 35,
		 12,
		 TRUE
		},		
		{ 									    // 11 - "ПЛОВ"
		 110,	                  // ash
		 35, 170, 		          // min, max диапазон изменения температуры
		 HEAT_TOP | HEAT_SIDE | HEAT_MAIN,
		 255, 94, 
		 70, 99,
		 8,                     // Коэф. плавности закипания
		 4,                     // ШИМ доводки до кипения
     0,                     // Коэф. усиления				
		 FALSE,			
		 10, 90, 10, 10,
		 60,
		 12,
		 TRUE
		},
		{ 								      // 12 - "ЙОГУРТ"
		 38,	                  // ash
		 35, 170,
		 HEAT_MAIN, 		 
		 255, 28, 
		 0, 30,
		 1,                     // Коэф. плавности закипания
		 2,                     // ШИМ доводки до кипения	
     3,                     // Коэф. усиления	ok			
		 FALSE,			
		 10, 12*60, 10, 10,
		 480,
		 0,
		 TRUE
		},
		{ 							        // 13 - "ПИЦА"
		 150,	                  // ash
		 35, 170, 		          // min, max диапазон изменения температуры
		 HEAT_TOP | HEAT_SIDE | HEAT_MAIN,
		 255, 120, 
		 0, 140,
		 8,                     // Коэф. плавности закипания
		 4,                     // ШИМ доводки до кипения	
     0,                     // Коэф. усиления				
		 FALSE,			
		 10, 1*60, 5, 5,
		 25,
		 4,
		 TRUE
		},		
		{ 							        // 14 - "ХЛЕБ"
		 150,	                  // ash
		 35, 170, 		          // min, max диапазон изменения температуры
		 HEAT_TOP | HEAT_SIDE | HEAT_MAIN,
		 255, 120, 
		 0, 148,
		 8,                     // Коэф. плавности закипания
		 2,                     // ШИМ доводки до кипения
     2,                     // Коэф. усиления	ok			
		 FALSE,			
		 60, 6*60, 10, 10,
		 180,
		 3,
		 TRUE
		},
		{ 									    // 15 - "ДЕСЕРТЫ"
		 98,
		 35, 170, 		          // min, max диапазон изменения температуры
		 HEAT_SIDE | HEAT_MAIN, 		 
		 255, 91,
		 0, 97,		              // ash
		 1,                     // Коэф. плавности закипания
		 8,                     // ШИМ доводки до кипения
     0,                     // Коэф. усиления				
		 FALSE,			
		 5, 2*60, 5, 5,
		 20,
		 12,
		 TRUE
		},		
		{ 									    // 16 - "ЭКСПРЕСС"
		 100,
		 35, 170, 		          // min, max диапазон изменения температуры
		 HEAT_MAIN,
		 255, 94, 
		 70, 99,
		 8,                     // Коэф. плавности закипания
		 4,                     // ШИМ доводки до кипения	
     0,                     // Коэф. усиления	ok		
		 FALSE,			
		 5, 8*60, 5, 5,
		 0,
		 0,
		 FALSE
		},
		{ 									    // 17 - "ПОДОГРЕВ"
		 100,
		 35, 170, 		          // min, max диапазон изменения температуры
		 HEAT_MAIN,
		 255, 94, 
		 70, 99,
		 8,                     // Коэф. плавности закипания
		 4,                     // ШИМ доводки до кипения
     0,                     // Коэф. усиления	ok			
		 FALSE,			
		 5, 8*60, 5, 5,
		 30,
		 12,
		 TRUE
		}		
	};
	
/*==============================================================
                     init functions 
==============================================================*/	
/*
 * Инит перефирии
 */	
void Application_Init(void)
{
	power_state state_power;
	Clk_Init();
	Temp_Init();
	Heat_Init();
	Buz_Init();
	Ind_Init();
	Keyb_Init();
	
/*
 * Инит таймеров
 */		
  timer_init(TIMER_LEDS_HANDLE,2,0);                       // 20ms Обновление led дисплея
  timer_start(TIMER_LEDS_HANDLE);
	timer_init(TIMER_LEDS_BLANK,50,0);                       // 500ms Blank led
	timer_init(TIMER_PARING_TIMER,TIMER_SECOND(10),0);       // 10 sec Paring	
	timer_init(TIMER_UNPARING_TIMER,TIMER_SECOND(2),0);      // 5 sec Unparing
  timer_init(TIMER_30SEK,TIMER_SECOND(30),0);              // 30s	TIMER_CLER_PROGRAM menu
  timer_init(TIMER_1MIN_START,TIMER_MINUTE(1),0);          // 1m Отсчет больших интервалов времени
	timer_init(TIMER_4SEC_PWM,TIMER_SECOND(2),0);            // 4s PWM
	timer_start(TIMER_4SEC_PWM);
  timer_init(TIMER_150MS_IND,15,0);                        // 150ms Для змейки Экспресс
  timer_init(TIMER_TEST_MODE,TIMER_MINUTE(2),0);	         // Время работы тестового режима
	timer_init(TIMER_POWER_1_MIN,TIMER_MINUTE(1),0);	       // Время для режима перебоя питания
	timer_init(TIMER_ERROR, TIMER_MINUTE(5),0);	             
	
	BEEP_LONG();                                             // Длинный сигнал
	for(uint8_t i=0;i<8;i++) Ind_LED_On(i, 0xFFFF);          // Включение всего дисплея
	Ind_LED_Off(LED_START);                                  // Кроме светодиодов
	Ind_LED_Off(LED_ESC);
	Ind_LED_Off(LED_DEF_START);
	Ind_Release();                                           // Обновление дисплея
	Clk_Delay(50);	
	logic_mode_standby(0);                                   // Переходим в режим ожидания
/**
 * Power
 */
	state_power = power_state_mem(Temp_GetBotTemp());
  if(state_power != STATE_OK)                              // Если был перебой питания в режиме работы
	{
		if(lg_cook_complex.cPower_cnt < 250) lg_cook_complex.cPower_cnt ++; // Увеличиваем счетчик продадения питания
		if(state_power == STATE_DOWN)                          // Smol перебой
		{
			power_read_params(&lg_cook_complex, &state_mode, &state_cooking, &keep_warm_time);
			switch(state_cooking)
			{
				case STAGE_BOOST:
				case STAGE_ENDOFBOOST:
				case STAGE_WARM:
				case STAGE_STAT:
				case STAGE_BREAD_LOAD:
				{
					if(lg_cook_complex.cProgramNumber == (uint8_t)EXPRESS_PROGRAM) logic_cooking_express(0);
					else logic_mode_cooking(0);                      // Запускаем готовку
					break; 
				}
				case STAGE_POSTPONEMENT: logic_go_delay_start(); logic_led_start_bl(39);break; // Запуск отложенного старта
			}		
		}
		else if(state_power == STATE_DOWN_LONG)                // Long перебой индикация паузы программы
		{
			power_read_params(&lg_cook_complex, &state_mode, &state_cooking, &keep_warm_time);
			power_state_mode = state_mode;
			power_state_cooking = state_cooking;
			state_mode = POWER_MODE;
			state_cooking = STATE_POWER;
			if(lg_cook_complex.cPower_flag != 1){
				application_power_mode();
				power_down = 1;
				power_taim = 0;
				timer_start(TIMER_POWER_1_MIN);
			}
			else{
				power_down = 2;
				switch(power_state_cooking)
				{
					case STAGE_BOOST:
					case STAGE_ENDOFBOOST:
					case STAGE_WARM:
					case STAGE_STAT:
					case STAGE_BREAD_LOAD: logic_led_start_bl(38); break;
				}
			}
			BEEP();
		}
	}
	if(Temp_GetBotTemp() < 5) Err_Stop(BOT_TEMP_SENSOR_ERR); // Ошибка датчика BOT
  if(Temp_GetTopTemp() < 5) Err_Stop(TOP_TEMP_SENSOR_ERR); // Ошибка датчика TOP	
}

////////////////////////////////////////////////////////////////
static void application_power_mode(void)
{
	switch(power_state_cooking)
	{
		case STAGE_BOOST:
		case STAGE_ENDOFBOOST:				
		case STAGE_WARM:
		case STAGE_STAT:
		case STAGE_BREAD_LOAD:
		{
			if(lg_cook_complex.cProgramNumber == (uint8_t)MULTICOOK_PROGRAM)   // Если программа "Мультиповар"
			{
				Ind_LED_On(LED_IMG_TEMP);                                        // Индикация температуры
				Ind_LED_On(LED_IMG_GRAD);
				ind_temperature(lg_cook_complex.cCookTemp, 1);
			}	                                           
			if(lg_cook_complex.bKeepWarmEnabled == TRUE) Ind_LED_On(LED_ESC);  // Если возможен подогрев led_подогрев
			Ind_LED_On(LED_START);                                             // Led_start
			Ind_LED_On(LED_IMG_ML);                                            // Мультиварка
			Ind_LED_On(LED_IMG_K_ML);
			
			if(lg_cook_complex.cProgramNumber == (uint8_t)EXPRESS_PROGRAM)// Если программа Экспресс
			{
				logic_led_start_bl(36);                                          // Blank змейка
			}
			else                                                               /* Если рабочая программа */
			{
				Ind_LED_On(LED_TIME_LOAD);			                                 // Время приготовления
				logic_led_start_bl(33);                                          // Blank время приготовления
			}			
			break; 				
		}
	}	
}
static void application_power_mode_go(uint8_t beep)
{
	if(beep == 1) BEEP();
	power_taim = 0;		
	timer_stop(TIMER_POWER_1_MIN); 
	state_mode = power_state_mode;
	state_cooking = power_state_cooking;	
	switch(state_cooking)
	{
		case STAGE_BOOST:
		case STAGE_ENDOFBOOST:
		case STAGE_WARM:
		case STAGE_STAT:
		case STAGE_BREAD_LOAD:
	  {
			if(lg_cook_complex.cProgramNumber == (uint8_t)EXPRESS_PROGRAM) logic_cooking_express(0);
			else logic_mode_cooking(0); break;                    // Запускаем готовку
		}
	}	
}
////////////////////////////////////////////////////////////////
void Application(void)
{
	R4S();                                                   // Обработка радиокоманд
	application_timers_handler();                            // Обработка таймеров
	logic_commands();		                                     // Обработка пользовательских команд
	application_power_down();                                // Обработка пропадания питания
}
/*
 * Обработка пропадения питания
 */ 
static void application_power_down(void)
{
	if(power_read_down() != STATE_OK){                       // Если питание ниже 2V7
		if(state_mode == COOKING_MODE){                        // И состояние работы
			power_seve_params(&lg_cook_complex, state_mode, state_cooking, keep_warm_time, Temp_GetBotTemp());  // Сохраняем текущие параметры			
		}
    else if(state_mode == POWER_MODE){
	    state_mode = power_state_mode;
			state_cooking = power_state_cooking;			
      power_seve_params(&lg_cook_complex, state_mode, state_cooking, keep_warm_time, 255);                // Сохраняем текущие параметры
		}			
	}
}

////////////////////////////////////////////////////////////////

/*
 * Код обработчика таймеров
 */
static void application_timers_handler(void)
{
  if(timer_ready(TIMER_LEDS_HANDLE))                       // Таймер вывода индикации
	{
		timer_ready_clr(TIMER_LEDS_HANDLE);
		Ind_Release();                       
	}	
  if(timer_ready(TIMER_BUTTONS_HANDLE))                    // Таймеры обработки нажатых кнопок
	{
		timer_ready_clr(TIMER_BUTTONS_HANDLE);
		timer_stop(TIMER_BUTTONS_HANDLE); 
	}		
  if(timer_ready(TIMER_BUTTONS_CLR_HANDLE)) 
	{
    timer_ready_clr(TIMER_BUTTONS_CLR_HANDLE);		
		timer_stop(TIMER_BUTTONS_CLR_HANDLE);
		keyb_clear(); 		
	}		
  if(timer_ready(TIMER_LEDS_BLANK))                        // Таймер BLANK индикации
	{
		timer_ready_clr(TIMER_LEDS_BLANK);
		blank_menu();		    
	}			
  if(timer_ready(TIMER_30SEK))                             // Таймер выхода из пользовательского меню установок
	{
		timer_ready_clr(TIMER_30SEK);
		timer_stop(TIMER_30SEK);
		logic_mode_standby(0);
	}	
  if(timer_ready(TIMER_1MIN_START))	                       // Таймер 1 минуты для отсчета времени отложенного старта, готовки и подогрева 
	{
		timer_ready_clr(TIMER_1MIN_START);
		logic_tim_1min();
	}			
  if(timer_ready(TIMER_4SEC_PWM)) 
	{
		timer_ready_clr(TIMER_4SEC_PWM);
		logic_4sec_pwm();	                                     // Таймер для работы ШИМ (управление нагревателями)
	}			
  if(timer_ready(TIMER_BEEP_5))                            // Сигнал завершения готовки
	{
		timer_ready_clr(TIMER_BEEP_5);
		logic_beep_5();
	}			
	if(timer_ready(TIMER_BEEP_3))                            // Сигнал закладки "макарон"
	{
		timer_ready_clr(TIMER_BEEP_3);
		logic_beep_3();
	}		
	if(timer_ready(TIMER_PARING_TIMER)) {
	  timer_ready_clr(TIMER_PARING_TIMER);		
		timer_stop(TIMER_PARING_TIMER);
		logic_mode_standby(0);
	}
	if(timer_ready(TIMER_UNPARING_TIMER)){
	  timer_ready_clr(TIMER_UNPARING_TIMER);
		timer_stop(TIMER_UNPARING_TIMER);
		logic_mode_standby(0);
	}	
	if(timer_ready(TIMER_150MS_IND)) {
	  timer_ready_clr(TIMER_150MS_IND);
		ind_express();
	}	
	if(timer_ready(TIMER_TEST_MODE)) {
	  timer_ready_clr(TIMER_TEST_MODE);
		timer_stop(TIMER_TEST_MODE);
		logic_mode_standby(0);
	}	
	if(timer_active(TIMER_TEST_MODE)){
		if(heat_get() != 0){
			if(timer_read_taim(TIMER_TEST_MODE) >= TIMER_SECOND(10)){
				heat_on_off(HEAT_OFF);
		    ind_taim(0, 2);	
			}				
		}
		if(test_ind_on == 1){
			if(timer_read_taim(TIMER_TEST_MODE) >= TIMER_SECOND(10)){			
				test_ind_on = 0;
				logic_led_start_bl(20);
				Ind_LED_On(LED_IMG_TEMP);
				Ind_LED_On(LED_IMG_GRAD);
				ind_taim(0, 2);	
			}
		}			
	}	
	if(timer_ready(TIMER_ERROR)) {
	  timer_ready_clr(TIMER_ERROR);
		timer_stop(TIMER_ERROR);
		if(state_mode == COOKING_MODE){
			if(temp_bot > lg_cook_complex.cCookTemp + 45) Err_Stop(EMPTY_POT_ERR);
		}
	}		
	if(timer_ready(TIMER_POWER_1_MIN)) {
	  timer_ready_clr(TIMER_POWER_1_MIN);
		power_taim ++;		
    if(power_taim >= 30){ 
			timer_stop(TIMER_POWER_1_MIN);
      lg_cook_complex.cPower_flag = 1;                     // Устанавливаем флаг ожидание подтверждения > 30 мин.		
			logic_led_start_bl(20);
			switch(power_state_cooking)
			{
				case STAGE_BOOST:
				case STAGE_ENDOFBOOST:				
				case STAGE_WARM:
				case STAGE_STAT:
				case STAGE_BREAD_LOAD:
				{ /* Если готовка */
					logic_led_start_bl(38);
					break;
				}
			}
		}else BEEP();                                          // Если прошло 30 минут		
	}	
}

void logic_mode_error(uint8_t err)
{
	logic_mode_standby(0);
	state_mode = ERROR_MODE;
	state_cooking = STAGE_ERROR;
	error = err;
}
/*======================================================================================================================

 * Основные функции работы логики мультиварки

======================================================================================================================*/
/*
 * Функция логики мультиварки
 */
static void logic_commands(void)
{
	static uint8_t state_key = 0;
	state_key = Keyb_GetKey();                                      // Считываем значение кнопок
	if(state_key != NOT_KEY || state_mode == TEST_MODE){             // Если нажата кнопка обрабатываем ее
		switch(state_mode)
		{
/* Обработка кнопок в режиме ожидания */			
			case STANDBY_MODE:
			{
				switch(state_key)
				{
					case MENU_KEY:         logic_mode_menu(1);       break; // Вход в меню установок
					case LONG_EXPRESS_KEY: logic_cooking_express(1); break; // Включение программа экспресс
					case LONG_REHEAT_KEY:  logic_go_keepwarm(1);     break;	// Включение режима подогрева
					case PARING_KEY:       logic_paring();           break;	// Пэринг
					case UNPARING_KEY:     logic_unparing();         break;	// Унпэринг	
          case LONG_TEMP_KEY:    logic_vesion();           break;	// Вывод номера версии прошивки						
				}
				break;
			}
/* Обработка кнопок в режиме меню (выбора параметров) */			
			case MENU_MODE:
			{
				switch(state_key)
				{
					case REHEAT_KEY:     logic_mode_standby(1); break;      // Выход в состояние ожидания
					case LONG_START_KEY: logic_mode_cooking(1); break;      // Запуск готовки
					case MENU_KEY:                                          // Выбор программы
					{
						if(lg_cook_complex.cProgramNumber<15)lg_cook_complex.cProgramNumber++;
						else lg_cook_complex.cProgramNumber = 0;
						logic_mode_menu(1);
						break;
					}	
					case LONG_MENU_KEY:                                     // Выбор программы
					{
						if(lg_cook_complex.cProgramNumber<15)lg_cook_complex.cProgramNumber++;
						else lg_cook_complex.cProgramNumber = 0;
						logic_mode_menu(0);
						break;
					}
					case MIN_KEY:       logic_time_plas(0,1);      break;	  // Установка времени
					case HOUR_KEY:      logic_time_plas(1,1);      break;
					case UNPARING_KEY: 
					case LONG_MIN_KEY:  logic_time_plas(0,0);      break;
					case PARING_KEY:    					
					case LONG_HOUR_KEY: logic_time_plas(1,0);      break;
					case TEMP_KEY:      logic_temp_plas(1);        break;	  // Устанока температуры с шагом 1 град
					case LONG_TEMP_KEY: logic_temp_plas(0);        break;	  // Установка температуры с шагом 5 град    
					case DELAY_KEY:     logic_delay_taim_key(1,1); break;   // Выбор отложенного старта
				}				
				break;
			}
/* Обработка кнопок в режиме приготовления */			
			case COOKING_MODE:   
			{
				switch(state_key)
				{
					case LONG_START_KEY:  logic_go_time_pasta(1);   break;  // Запуск времени варки макарон 
					case LONG_MENU_KEY:   logic_on_off_keepwarm(1); break;  // Откл/вкл автоподогрева
					case LONG_REHEAT_KEY: logic_mode_standby(1);    break;  // Выход в состояние ожидания			
				}
				break;
			}
/* Обработка кнопок в режиме подогрева */				
			case KEEP_MODE: 
			{
        if(state_key == LONG_REHEAT_KEY) logic_mode_standby(1);   // Выход в состояние ожидания
				break;   
			}
/* Обработка кнопок в режиме продолжительного перебоя питания */			
      case POWER_MODE:
			{
				switch(state_key)
				{
					case LONG_START_KEY:                                    // Продолжение работы программы готовки	
					{
						if(lg_cook_complex.cPower_flag != 1) application_power_mode_go(1);
						break;
					}
		      case LONG_REHEAT_KEY: logic_mode_standby(1); break;     // Выход в состояние ожидания
				}
				break;
			}	
/* Обработка кнопок в тестовом режиме */			
      case TEST_MODE:
			{
				switch(state_key)
				{ 
					case LONG_REHEAT_KEY:  state_key = REHEAT_KEY;  break;  // Включаем верхний нагреватель
					case LONG_DELAY_KEY:   state_key = DELAY_KEY;   break;  // Включаем боковой нагреватель	
					case PARING_KEY:
					case LONG_TEMP_KEY:    state_key = TEMP_KEY;    break;  // Включаем нижний нагреватель
					case LONG_HOUR_KEY:    state_key = HOUR_KEY;    break;  // BEEP	
					case LONG_MIN_KEY:     state_key = MIN_KEY;     break;  // BEEP	
					case LONG_EXPRESS_KEY: state_key = EXPRESS_KEY; break;  // BEEP	
					case LONG_MENU_KEY:    state_key = MENU_KEY;    break;  // BEEP						
				}
				test_heat(state_key); /* Обработка нажатых копок для режима тестирования */
				break;
			}				
/* End parametrs */	
      default: break;			
		}
	}
}
/*=======================================================================================
 * Function test mode and image version hex
=======================================================================================*/
static void logic_vesion(void){
	uint8_t key_test = LONG_TEMP_KEY;
	BEEP(); logic_led_start_bl(20);
	while(key_test == LONG_TEMP_KEY || key_test == TEMP_KEY){
		ind_taim(FIRMWARE_VER, 3);
		Ind_Release();
		keyb_clear();
		Clk_Delay(50);
		key_test = Keyb_GetKey();
	}
	if(key_test == MIN_KEY){
		BEEP_LONG();
		test_ind_on = 0;
		Ind_LED_On(LED_IMG_TEMP);
		Ind_LED_On(LED_IMG_GRAD);
	  state_mode = TEST_MODE;
	  state_cooking = STAGE_TEST;
		timer_start(TIMER_TEST_MODE);
		ind_taim(0, 2);
	}else logic_mode_standby(0);	
}
static void test_heat(uint8_t key){
	static uint8_t f_key = NOT_KEY;
	if(f_key != key){
		f_key = key;
		if(f_key != NOT_KEY){
			BEEP(); 
			if(test_ind_on == 1){
				if(f_key == MENU_KEY) f_key = NOT_KEY;
				test_ind_on = 0;
				logic_led_start_bl(20);
				Ind_LED_On(LED_IMG_TEMP);
				Ind_LED_On(LED_IMG_GRAD);
				ind_taim(0, 2);							
			}
			timer_reset(TIMER_TEST_MODE); 
			if(f_key == REHEAT_KEY){
				heat_on_off(HEAT_TOP);
				ind_taim(1, 1);
			}else if(f_key == DELAY_KEY){
				heat_on_off(HEAT_SIDE);
				ind_taim(2, 1);
			}else if(f_key == TEMP_KEY){
				heat_on_off(HEAT_MAIN);
				ind_taim(3, 1);				
			}else if(f_key == LONG_START_KEY) logic_mode_standby(1);
			else if(f_key == MENU_KEY){
				heat_on_off(HEAT_OFF);
        test_ind_on	= 1;
        for(uint8_t i=0;i<8;i++) Ind_LED_On(i, 0xFFFF);				
			}else{
				heat_on_off(HEAT_OFF);
		    ind_taim(0, 2);				
			}
		}
	}
}
/*=======================================================================================
 * Функции основной работы мультиварки
=======================================================================================*/
/**
 * Режим полного останова мультиварки
 */
static void logic_mode_standby(uint8_t beep)
{	
	if(beep == 1) BEEP();
	power_down = 0;
  lg_cook_complex.cPower_cnt = 0;
	lg_cook_complex.cPower_flag = 0;
	state_mode = STANDBY_MODE;                                                             // Сброс статуса мультиварки
	state_cooking = STAGE_NONE;                                                            // Сброс статуса готовки мультиварки
	heat_on_off(HEAT_OFF);                                                                 // Выключаем ТЕНы
	timer_stop(TIMER_1MIN_START);                                                          // Останавливаем таймер отсчета времени	
	timer_stop(TIMER_30SEK);                                                               // Останавливаем таймер выхода из режима установок меню
	timer_stop(TIMER_PARING_TIMER);                                                        // Останавливаем таймер пэринга
	timer_stop(TIMER_BEEP_3);
	//timer_ready_clr(TIMER_BEEP_3); // 20_07_2015 V1_2
	timer_stop(TIMER_150MS_IND);
	timer_stop(TIMER_TEST_MODE);
	timer_stop(TIMER_POWER_1_MIN);
	lg_cook_complex.cProgramNumber = (uint8_t)MULTICOOK_PROGRAM;
	logic_led_start_bl(20); logic_led_start_bl(21);                                        // Сбрасываем индикацию
	fl_load_delay_taim = 0;                                                                // Сбрасываем флаг отложенного старта
}

/**
 * Режим меню (установка параметров приготовления)
 */
static void logic_mode_menu(uint8_t beep)
{
	if(beep == 1) BEEP();
	state_mode = MENU_MODE;
	state_cooking = STAGE_PROGRAM;
	logic_led_start_bl(20);                                                                // Сброс blank
	logic_load_menu_prog(&lg_cook_complex);                                                // Заполнение структуры нужной программой
  logic_led_start_bl(lg_cook_complex.cProgramNumber);                                    // Устанвка
	fl_load_delay_taim = 0;                                                                // Сброс флага установки отложенного таймера
	timer_reset(TIMER_30SEK);
	if(timer_active(TIMER_30SEK) == 0) timer_start(TIMER_30SEK);
}
/**
 * Режим приготовления
 */
static void logic_mode_cooking(uint8_t beep)
{
	if(beep == 1) BEEP();
	state_mode = COOKING_MODE;
	if(fl_load_delay_taim == 1){                                                           // Если включен таймер отложенного старта
		fl_load_delay_taim = 0;
		logic_go_delay_start();                                                              // Запуск отложенного старта
	}else logic_go_start();                                                                // Запускаем программу приготовления		
	timer_stop(TIMER_30SEK);
}
/**
 * Подогрев
 */
static void logic_go_keepwarm(uint8_t beep)
{
	if(beep == 1){                                                                         // Если мы пришли из режима ожидания
		BEEP();
		lg_cook_complex.cProgramNumber = (uint8_t)KEEP_PROGRAM;
		logic_load_menu_prog(&lg_cook_complex);                                              // Заполнение структуры нужной программой
	}
	if(lg_cook_complex.cCookTemp > 95){                                                    // Если температура варки больше 95 градусов
		lg_cook_complex.cKeepWarmTemp = 70;                                                  // Температура подогрева 70 градусов
	}else lg_cook_complex.cKeepWarmTemp = lg_cook_complex.cCookTemp*2/3;                   // Иначе 2/3 температуры готовки
	timer_reset(TIMER_1MIN_START); timer_start(TIMER_1MIN_START);
	state_mode = KEEP_MODE;                                                                // Режим подогрева
	state_cooking = STAGE_KEEPWARM;                                                        // Статус варки подогрев
	logic_led_start_bl(20); logic_led_start_bl(30);                                        // Blank точек MP	
	if(beep != 2) keep_warm_time = 0;
	ind_taim(keep_warm_time, 1);
	Ind_LED_On(LED_ESC); Ind_LED_On(LED_IMG_ML); Ind_LED_On(LED_IMG_K_ML);
}
/**
 * Включение выключение подогрева
 */
static void logic_on_off_keepwarm(uint8_t beep)
{
	timer_reset(TIMER_BUTTONS_HANDLE);                                                     // Для отмены при удержание
	timer_stop(TIMER_BUTTONS_HANDLE);
  if(lg_cook_complex.bKeepWarmEnabled == TRUE){                                          // Если включен выключаем
		if(beep == 1) BEEP();
		lg_cook_complex.bKeepWarmEnabled = FALSE;
		Ind_LED_Off(LED_ESC);
	}else{                                                                                 // Включаем
		if(lg_cook_complex.cKeepWarmTime > 0){                                               // Если разрешен подогрев
			if(beep == 1) BEEP();
			lg_cook_complex.bKeepWarmEnabled = TRUE;
			Ind_LED_On(LED_ESC);
		}
	}		
}
/**
 * Запуск программы экспресс
 */
static void logic_cooking_express(uint8_t beep)
{
	if(beep == 1) BEEP();
	state_mode = COOKING_MODE;	
	fl_load_delay_taim = 0;                                                                // Сбрасываем флаг отложенного старта
	lg_cook_complex.cProgramNumber = (uint8_t)EXPRESS_PROGRAM;
	logic_load_menu_prog(&lg_cook_complex);                                                // Заполнение структуры нужной программой	
	logic_go_start();                                                                      // Запускаем программу приготовления
	logic_led_start_bl(34);
	timer_start(TIMER_150MS_IND);                                                          // Запускаем змейку
}
/**
 * Отложенный старт
 */
static void logic_go_delay_start(void)
{
	if(lg_cook_complex.iPostPonementTime > lg_cook_complex.iCookTime){                     // Если отложенное время старта больше времени готовки
		state_cooking = STAGE_POSTPONEMENT;                                                  // Отложенный старт
		logic_led_start_bl(20); logic_led_start_bl(30);                                      // Blank точек MP
		timer_reset(TIMER_1MIN_START); timer_start(TIMER_1MIN_START);
		if(lg_cook_complex.cProgramNumber == (uint8_t)MULTICOOK_PROGRAM){
			Ind_LED_On(LED_IMG_TEMP); Ind_LED_On(LED_IMG_GRAD);
			ind_temperature(lg_cook_complex.cCookTemp, 1);
		  if(lg_cook_complex.cCookTemp < 80) lg_cook_complex.bKeepWarmEnabled = FALSE;
		}
		if(lg_cook_complex.bKeepWarmEnabled == TRUE) Ind_LED_On(LED_ESC);                    // Если возможен подогрев
		Ind_LED_On(LED_START); Ind_LED_On(LED_DEF_START);
		Ind_LED_On(LED_LOAD_START_1); Ind_LED_On(LED_LOAD_START_2);
		Ind_LED_On(LED_IMG_ML); Ind_LED_On(LED_IMG_K_ML);		
		ind_taim(lg_cook_complex.iPostPonementTime, 1);
		logic_prog_on_of(lg_cook_complex.cProgramNumber, 1);
  }else logic_go_start();                                                                // Иначе сразу включаем готовку
}
/**
 * Запуск времени готовки "МАКАРОН" 
 */
static void logic_go_time_pasta(uint8_t beep){
	if(state_cooking == STAGE_ENDOFBOOST){                                                 // Если вода закипела и нажата кнопка старт
	  if(beep == 1) BEEP();
	  state_cooking = STAGE_STAT; 
		timer_stop(TIMER_BEEP_3); 
		//timer_ready_clr(TIMER_BEEP_3); // 20_07_2015 V1_2
		ind_etp(3);                    // Поддержание температуры варки					
	}
}
/**
 * Процесс приготовления
 */
static void logic_go_start(void)
{
	logic_led_start_bl(20);                                                                // Сброс blank
	if(lg_cook_complex.cProgramNumber == (uint8_t)PASTA_PROGRAM){                          // Если программа "МАКАРОНЫ"
		if(power_down == 0) state_cooking = STAGE_BOOST;                                     // Нагрев до кипения перед закладкой продуктов		
	}
	else if(lg_cook_complex.cProgramNumber == (uint8_t)BREAD_PROGRAM){                     // Если программа "ХЛЕБ" 
		if(power_down == 0){
			state_cooking = STAGE_BREAD_LOAD;                                                  // Иначе включаем закваску хлеба на 1 час.
			lg_cook_complex.cHeatEnable = HEAT_MAIN;                                           // Используем только нижний тен
		}
	}else if(lg_cook_complex.cProgramNumber == (uint8_t)MULTICOOK_PROGRAM){                // Если программа "Мультиповар"
		Ind_LED_On(LED_IMG_TEMP);
		Ind_LED_On(LED_IMG_GRAD);
		ind_temperature(lg_cook_complex.cCookTemp, 1);
		if(lg_cook_complex.cCookTemp < 81) lg_cook_complex.cHeatEnable = HEAT_MAIN;
    else if(lg_cook_complex.cCookTemp < 116 || lg_cook_complex.cCookTemp > 140)	lg_cook_complex.cHeatEnable = (HEAT_SIDE | HEAT_MAIN);
		else lg_cook_complex.cHeatEnable = (HEAT_TOP | HEAT_SIDE | HEAT_MAIN);
		if(lg_cook_complex.cCookTemp < 80) lg_cook_complex.bKeepWarmEnabled = FALSE;
		state_cooking = STAGE_WARM;
	}else state_cooking = STAGE_WARM;                                                      // Нагрев с продуктами до рабочей температуры
	timer_reset(TIMER_1MIN_START);
	timer_start(TIMER_1MIN_START);	
	if(lg_cook_complex.cProgramNumber != (uint8_t)EXPRESS_PROGRAM) {
		logic_led_start_bl(32);                                                              // Blank пар и MP
		ind_taim(lg_cook_complex.iCookTime, 1);
	  Ind_LED_On(LED_TIME_LOAD);		
	}	                                           
	if(lg_cook_complex.bKeepWarmEnabled == TRUE) Ind_LED_On(LED_ESC);                      // Если возможен подогрев
	Ind_LED_On(LED_START);
	ind_etp(1);
	Ind_LED_On(LED_IMG_ML); 
	Ind_LED_On(LED_IMG_K_ML);	
  logic_prog_on_of(lg_cook_complex.cProgramNumber, 1);
}
/**
 * Обработка таймеров отложенного старта, работы, подогрев.
 */
static void logic_tim_1min(void)
{
	switch(state_cooking) 
	{
		case STAGE_POSTPONEMENT:                                                             // Отложенный старт
		{
			if(--lg_cook_complex.iPostPonementTime > lg_cook_complex.iCookTime) ind_taim(lg_cook_complex.iPostPonementTime, 1);
			else logic_go_start();
			break;
		}
		case STAGE_WARM: case STAGE_STAT: case STAGE_BREAD_LOAD:                             // Процесс приготовления
		{
			if(state_cooking == STAGE_STAT || lg_cook_complex.bBoost == FALSE){                // Если отсчет времени начинается после закипания
				if(lg_cook_complex.cProgramNumber != (uint8_t)EXPRESS_PROGRAM){
					lg_cook_complex.iCookTime--;
					if(lg_cook_complex.iCookTime > 0) ind_taim(lg_cook_complex.iCookTime, 1);
				  else{                                                                          // Если вышло время приготовления
					  logic_beep_5();
						if(lg_cook_complex.bKeepWarmEnabled == TRUE) logic_go_keepwarm(0);           // Если включен подогрев
						else logic_mode_standby(0);
				  }
			  }
			}
			break;
		}	
		case STAGE_KEEPWARM:			                                                           // Подогрев
		{
			if(++keep_warm_time < (uint16_t)(lg_cook_complex.cKeepWarmTime * 60)) ind_taim(keep_warm_time, 1);
			else logic_mode_standby(0);
			break;
		}
	}
}
/**
 * BEEP 5 раз по завершению готовки
 */
static inline void logic_beep_5(void)
{
	static uint8_t beep_5 = 4;	
	beep_5 ++;
	if(beep_5 > 4){
		beep_5 = 0;
	  timer_init(TIMER_BEEP_5,40,0);
	  timer_start(TIMER_BEEP_5);
	}else if(beep_5 == 4) timer_stop(TIMER_BEEP_5);
	BEEP();
}
/**
 * BEEP 3 раз при закладки "МАКАРОН"
 */
static inline void logic_beep_3(void)
{
	static uint8_t beep_3 = 0;	
	if(timer_active(TIMER_BEEP_3) == 0){  // Если таймер не включен
		beep_3 = 0;
	  timer_init(TIMER_BEEP_3,40,0);
	  timer_start(TIMER_BEEP_3);
	}
	if(beep_3 < 3) BEEP();	
	if(beep_3 <6) beep_3 ++;
	else beep_3 = 0;
}
/**
 * Работа ШИМ для нагрева и проверка на ошибки температурного датчика
 */
static inline void logic_4sec_pwm(void)
{
	static uint8_t temp_top_2min[60];
	if(temp_pwm < 11) temp_pwm ++; else temp_pwm = 0;
	Temp();                                                                                // Считываем показанаия термодатчиков
	temp_top = Temp_GetTopTemp();                                                          // Считываем температуру
	temp_bot = Temp_GetBotTemp();	
	
  for(uint8_t it=0;it<59;it++) temp_top_2min[it] = temp_top_2min[(it+1)];
	temp_top_2min[59] = temp_top;	
	if(state_cooking != STAGE_ERROR){
		if(temp_bot >= 230 || temp_top >= 180) Err_Stop(OVERHEAT_ERR);
	}
  switch(state_cooking)
	{
		case STAGE_ERROR:
		case STAGE_NONE: 
		case STAGE_PROGRAM:
		case STAGE_POSTPONEMENT:                                                             /* Если готовка отключена, установка программы или идет отложенный старт */
		{	
		  lg_cook_complex.cExpress = 0;
			lg_cook_complex.iBredTaim = 0;
			heat_on_off(HEAT_OFF);                                                             // Выключаем ТЕНы		
			break; 
		}
		case STAGE_BOOST:                                                                    /* Нагрев до кипения перед закладкой продуктов "МАКАРОНЫ" */
		{ 
//			if(temp_bot < lg_cook_complex.cBotTempWarm){                                       // Если текущая температура меньше температуры нагрева
//				logic_heat_on(lg_cook_complex.cHeatEnable); break;                               // Включаем разрешенные нагреватели	
//			}else if(((temp_top_2min[59] - temp_top_2min[0]) < lg_cook_complex.cTopDelta || \
//				                             (temp_top_2min[59] - temp_top_2min[0]) > 127) && \
//				                                        temp_top < lg_cook_complex.cTopTempStat){
//				logic_heat_on(lg_cook_complex.cHeatEnable); break;
//			}else if(temp_bot < lg_cook_complex.cBotTempStat || temp_top < lg_cook_complex.cTopTempStat){
//				if(temp_pwm < (lg_cook_complex.cPWMstat)) logic_heat_on(lg_cook_complex.cHeatEnable);   // Включаем разрешенные нагреватели
//				else logic_heat_off();                                                           // Выключаем ТЕНы
//				break;					
//			}
			/* error 04 29_07_2015 V1_3 */
			if(temp_bot < lg_cook_complex.cBotTempWarm){                                       // Если текущая температура меньше температуры нагрева
				logic_heat_on(lg_cook_complex.cHeatEnable); break;                               // Включаем разрешенные нагреватели 100% 
			}else if(lg_cook_complex.cCookTemp >= 95 && lg_cook_complex.cCookTemp <= 115){     // Если температура готовки от 95 до 115
				if(((temp_top_2min[59] - temp_top_2min[0]) < lg_cook_complex.cTopDelta || \
					(temp_top_2min[59] - temp_top_2min[0]) > 127) &&  \
					temp_top < lg_cook_complex.cTopTempStat){
					logic_heat_on(lg_cook_complex.cHeatEnable); break;
				}else if(temp_bot < lg_cook_complex.cBotTempStat || temp_top < lg_cook_complex.cTopTempStat){
					if(temp_pwm < (lg_cook_complex.cPWMstat)) logic_heat_on(lg_cook_complex.cHeatEnable);   // Включаем разрешенные нагреватели
					else logic_heat_off();                                                         // Выключаем ТЕНы
					break;					
				}
			}else if(lg_cook_complex.cCookTemp > 115){                                         // При температуре больше 115 градусов
				if(temp_bot < lg_cook_complex.cBotTempStat){
					if(temp_pwm < (lg_cook_complex.cPWMstat)) logic_heat_on(lg_cook_complex.cHeatEnable);   // Включаем разрешенные нагреватели
					else logic_heat_off();                                                         // Выключаем ТЕНы
					break;					
				}
			}
			/* end error 04 */
			state_cooking = STAGE_ENDOFBOOST;
			logic_beep_3();
			ind_etp(2);
			break;
		}
		case STAGE_ENDOFBOOST:                                                               /* Ожидание закладки продуктов */
		{
			lg_cook_complex.iBredTaim ++;
			if(lg_cook_complex.cCookTemp >= 95){ // 29_07_2015 error 04 V1_3
				if(temp_pwm < 8) logic_heat_on(HEAT_MAIN);                                         // Включаем 
				else heat_on_off(HEAT_OFF);                                                        // Выключаем ТЕНы
			}
			if(lg_cook_complex.iBredTaim >= 150) logic_mode_standby(0);                        // Если прошло 5 минут выкл " МАКАРОНЫ" 			
			break;
		}	
		case STAGE_WARM:                                                                     /* Нагрев с продуктами до рабочей температуры */
		{ 
			if(temp_bot < lg_cook_complex.cBotTempWarm){                                       // Если текущая температура меньше температуры нагрева
				logic_heat_on(lg_cook_complex.cHeatEnable); break;                               // Включаем разрешенные нагреватели 100% 
			}else if(lg_cook_complex.cCookTemp >= 95 && lg_cook_complex.cCookTemp <= 115){     // Если температура готовки от 95 до 115
				if(((temp_top_2min[59] - temp_top_2min[0]) < lg_cook_complex.cTopDelta || \
					(temp_top_2min[59] - temp_top_2min[0]) > 127) &&  \
					temp_top < lg_cook_complex.cTopTempStat){
					logic_heat_on(lg_cook_complex.cHeatEnable); break;
				}else if(temp_bot < lg_cook_complex.cBotTempStat || temp_top < lg_cook_complex.cTopTempStat){
					if(temp_pwm < (lg_cook_complex.cPWMstat)) logic_heat_on(lg_cook_complex.cHeatEnable);   // Включаем разрешенные нагреватели
					else logic_heat_off();                                                         // Выключаем ТЕНы
					break;					
				}
			}else if(lg_cook_complex.cCookTemp > 115){                                         // При температуре больше 115 градусов
				if(temp_bot < lg_cook_complex.cBotTempStat){
					if(temp_pwm < (lg_cook_complex.cPWMstat)) logic_heat_on(lg_cook_complex.cHeatEnable);   // Включаем разрешенные нагреватели
					else logic_heat_off();                                                         // Выключаем ТЕНы
					break;					
				}
			}
			state_cooking = STAGE_STAT;
			if(lg_cook_complex.bBoost == TRUE) timer_reset(TIMER_1MIN_START);
			ind_etp(2);
			break;
		}
		case STAGE_STAT:                                                                     /* Поддержание заданной температуры */
		{ 
			if(lg_cook_complex.cProgramNumber == (uint8_t)PASTA_PROGRAM){                      // Если программа "МАКАРОНЫ" Проверяем открытие крышки
				if(lg_cook_complex.cCookTemp >= 95 && lg_cook_complex.cCookTemp <= 115) // 29_07_2015 V1_3
				{
					if(temp_top < 75){                                                               // Если top температура меньше 70 - крышка открыта
						if(temp_pwm < 8) logic_heat_on(lg_cook_complex.cHeatEnable);                   // Включаем разрешенные нагреватели
						else logic_heat_off();                                                         // Выключаем ТЕНы
						break;
					}	
				}				
			}else if(lg_cook_complex.cProgramNumber == (uint8_t)EXPRESS_PROGRAM){              // Если программа "ЭКСПРЕСС"				
				lg_cook_complex.iBredTaim ++;
        if(lg_cook_complex.cExpress == 0 && temp_bot < lg_cook_complex.cCookTemp) lg_cook_complex.cExpress = 1;
				else if((lg_cook_complex.cExpress == 1 && temp_bot > (lg_cook_complex.cCookTemp + 1)) || lg_cook_complex.iBredTaim >= 1800) {
					lg_cook_complex.cExpress = 2;
					logic_beep_5();
				  logic_mode_standby(0);					
				}
			}						
      logic_pwm_regulator(lg_cook_complex.cPWM_kp, (int16_t)lg_cook_complex.cCookTemp);			
      break;			
		}	
		case STAGE_KEEPWARM:                                                                 /* Подогрев */
		{ 
			logic_pwm_regulator(0, (int16_t)lg_cook_complex.cKeepWarmTemp);
			break;	
		}
		case STAGE_BREAD_LOAD:                                                               /* Поддержание "ХЛЕБ" 1 час 40С */
		{
			lg_cook_complex.iBredTaim ++;
			if(lg_cook_complex.iBredTaim >= 1800){                                             // Если прошел час
				state_cooking = STAGE_WARM;
				lg_cook_complex.cHeatEnable = (HEAT_TOP | HEAT_SIDE | HEAT_MAIN);                // Включаем все тены
				break;
			}
      logic_pwm_regulator(3, 40);			
			break;
		}
		case STAGE_TEST:                                                                     // TEST TEMPER
		{
			static uint8_t tst = 0;
			if(temp_bot >= 60 || temp_top >= 60) heat_on_off(HEAT_OFF);                        // Выключаем нагреватели
			if(test_ind_on != 1){
				if(tst == 0) {
					tst = 1;
					Ind_LED_On(LED_IMG_ML);
					Ind_LED_Off(LED_IMG_K_ML);
					ind_temperature(temp_bot, 1);
				}else{
					tst = 0;
					Ind_LED_On(LED_IMG_K_ML);
					Ind_LED_Off(LED_IMG_ML);
					ind_temperature(temp_top, 1);
				}
		  }	
			break;
		}
	}
}

/**
 * PWM регулятор поддержания температуры
 */
static inline void logic_pwm_regulator(uint8_t k_t, int16_t t_reg)
{
	static const int16_t step_pwm[5][10] = {
		{-1,-1,1,1,2,2,3,3,20,20},    /* 0 - standart         */
		{-30,-30,1,1,2,2,3,3,20,20},  /* 1 - pasta            */ /* -50,-50   29_07_2015 V1_3 */
		{-1,1,2,3,4,5,6,6,20,20},     /* 2 - выпечка, хлеб    */
		{2,4,6,12,20,20,20,20,20,20}, /* 3 - йогурт, растойка */
		{2,4,6,7,8,8,9,9,10,12}};	    /* 4 - мультиповат      */	
	// PWM 0% /
	if(temp_bot > (uint8_t)(t_reg - step_pwm[k_t][0])){                                    // Если измеренная температура на градус выше рабочей температуры
		logic_heat_off(); return;                                                            // Выключаем ТЕНы		
	}
	// PWM 8% /
	else if(temp_bot > (uint8_t)(t_reg - step_pwm[k_t][1])){                               // Если измеренная температура на градус ниже рабочей температуры
		if(temp_pwm < 1) logic_heat_on(lg_cook_complex.cHeatEnable);                         // Включаем разрешенные нагреватели
		else logic_heat_off();                                                               // Выключаем ТЕНы
		return;
	}
	// PWM 16% /
	else if(temp_bot > (uint8_t)(t_reg - step_pwm[k_t][2])){                               // Если измеренная температура на 2 градусa ниже рабочей температуры
		if(temp_pwm < 2) logic_heat_on(lg_cook_complex.cHeatEnable);                         // Включаем разрешенные нагреватели
		else logic_heat_off();                                                               // Выключаем ТЕНы
		return;
	}	
	// PWM 25% /
	else if(temp_bot > (uint8_t)(t_reg - step_pwm[k_t][3])){                               // Если измеренная температура на 3 градусa ниже рабочей температуры
		if(temp_pwm < 3) logic_heat_on(lg_cook_complex.cHeatEnable);                         // Включаем разрешенные нагреватели
		else logic_heat_off();                                                               // Выключаем ТЕНы
		return;
	} 
	// PWM 33% /
	else if(temp_bot > (uint8_t)(t_reg - step_pwm[k_t][4])){                               // Если измеренная температура на градус ниже рабочей температуры
		if(temp_pwm < 4) logic_heat_on(lg_cook_complex.cHeatEnable);                         // Включаем разрешенные нагреватели
		else logic_heat_off();                                                               // Выключаем ТЕНы
		return;
	}
	// PWM 41% /
	else if(temp_bot > (uint8_t)(t_reg - step_pwm[k_t][5])){                               // Если измеренная температура на 2 градусa ниже рабочей температуры
		if(temp_pwm < 5) logic_heat_on(lg_cook_complex.cHeatEnable);                         // Включаем разрешенные нагреватели
		else logic_heat_off();                                                               // Выключаем ТЕНы
		return;
	}	
	// PWM 50% /
	else if(temp_bot > (uint8_t)(t_reg - step_pwm[k_t][6])){                               // Если измеренная температура на 3 градусa ниже рабочей температуры
		if(temp_pwm < 6) logic_heat_on(lg_cook_complex.cHeatEnable);                         // Включаем разрешенные нагреватели
		else logic_heat_off();                                                               // Выключаем ТЕНы
		return;
	}
	// PWM 58% /
	else if(temp_bot > (uint8_t)(t_reg - step_pwm[k_t][7])){                               // Если измеренная температура на 3 градусa ниже рабочей температуры
		if(temp_pwm < 7) logic_heat_on(lg_cook_complex.cHeatEnable);                         // Включаем разрешенные нагреватели
		else logic_heat_off();                                                               // Выключаем ТЕНы
		return;
	}	
	// PWM 66% / 
	else if(temp_bot > (uint8_t)(t_reg - step_pwm[k_t][8])){                               // Если измеренная температура на 3 градусa ниже рабочей температуры
		if(temp_pwm < 8) logic_heat_on(lg_cook_complex.cHeatEnable);                         // Включаем разрешенные нагреватели
		else logic_heat_off();                                                               // Выключаем ТЕНы
		return;
	}
	// PWM 83% / 
	else if(temp_bot > (uint8_t)(t_reg - step_pwm[k_t][9])){                               // Если измеренная температура на 3 градусa ниже рабочей температуры
		if(temp_pwm < 10) logic_heat_on(lg_cook_complex.cHeatEnable);                        // Включаем разрешенные нагреватели
		else logic_heat_off();                                                               // Выключаем ТЕНы
		return;
	}	
	// PWM 100% /	
	else logic_heat_on(lg_cook_complex.cHeatEnable); return;                               // Включаем разрешенные нагреватели
}
/**
 * Включаем необходимые тены и проверяем допустимую температуру
 */
static void logic_heat_on(uint8_t heat_state){
	if(temp_bot > lg_cook_complex.cCookTemp + 45) Err_Stop(EMPTY_POT_ERR);
	else heat_on_off(heat_state);
}
/**
 * Выключаем необходимые тены
 */
static void logic_heat_off(void){
	if(lg_cook_complex.cProgramNumber != (uint8_t)PASTRY_PROGRAM ||\
 		 lg_cook_complex.cProgramNumber != (uint8_t)BREAD_PROGRAM  ||\
	   temp_top > 180) heat_on_off(HEAT_OFF);
	else heat_on_off((lg_cook_complex.cHeatEnable & 0x06));	
}
/**
 * Загрузка параметров выбранной программы готовки
 */
static void logic_load_menu_prog(cookcomplexprog *adr_prog)
{
	uint8_t i = adr_prog->cProgramNumber;
	adr_prog->cCookTemp = cook_program[i].cCookTemp;
	adr_prog->cMinValueTemp = cook_program[i].cMinValueTemp;
	adr_prog->cMaxValueTemp = cook_program[i].cMaxValueTemp;
	adr_prog->cHeatEnable = cook_program[i].cHeatEnable;
	adr_prog->cTopTempWarm = cook_program[i].cTopTempWarm;
	adr_prog->cBotTempWarm = cook_program[i].cBotTempWarm;
	adr_prog->cTopTempStat = cook_program[i].cTopTempStat;
	adr_prog->cBotTempStat = cook_program[i].cBotTempStat;
	
	adr_prog->cTopDelta = cook_program[i].cTopDelta;
	adr_prog->cPWMstat = cook_program[i].cPWMstat;
	adr_prog->cPWM_kp = cook_program[i].cPWM_kp;
	
	adr_prog->bBoost = cook_program[i].bBoost;
	adr_prog->iMinTime = cook_program[i].iMinTime;
	adr_prog->iMaxTime = cook_program[i].iMaxTime;
	adr_prog->cStepTime[0] = cook_program[i].cStepTime[0];
	adr_prog->cStepTime[1] = cook_program[i].cStepTime[1];

	adr_prog->iCookTime = cook_program[i].iCookProductsTime;                               // Время приготовления
	adr_prog->cKeepWarmTime = cook_program[i].cKeepWarmTime;                               // Время подогрева в часах
	if(cook_program[i].cKeepWarmTime > 0)adr_prog->bKeepWarmEnabled = TRUE;
	else adr_prog->bKeepWarmEnabled = FALSE;
	adr_prog->iPostPonementTime = 60;
  adr_prog->bPostPonementEnabled = cook_program[i].bPostPonement;
}
/**
 * Ввод времени в меню выбора программы
 */
static void logic_time_plas(uint8_t min_clok, uint8_t beep){
	if(beep == 1) BEEP();
  if(min_clok == 0){                                                                     // Если прибавляем минуты
		if(fl_load_delay_taim == 0){                                                         // Если время готовки
			if(lg_cook_complex.iCookTime < lg_cook_complex.iMaxTime){                          // Если время готовки меньше максимального времени
				if(lg_cook_complex.iCookTime < 60){ 
          if(lg_cook_complex.iCookTime%lg_cook_complex.cStepTime[0] == 0){				
					  lg_cook_complex.iCookTime +=lg_cook_complex.cStepTime[0];
					}else lg_cook_complex.iCookTime +=(lg_cook_complex.cStepTime[0]-\
						(lg_cook_complex.iCookTime%lg_cook_complex.cStepTime[0]));					
				}else{		
          if(lg_cook_complex.iCookTime%lg_cook_complex.cStepTime[1] == 0){				
					  lg_cook_complex.iCookTime +=lg_cook_complex.cStepTime[1];
					}else lg_cook_complex.iCookTime +=(lg_cook_complex.cStepTime[1]-\
						(lg_cook_complex.iCookTime%lg_cook_complex.cStepTime[1])); 
				}
			}else lg_cook_complex.iCookTime = lg_cook_complex.iMinTime;                        // Если время готовки максимальное сбрасываем в минимальное
		}else{                                                                               // Если время отложенного старта
			if(lg_cook_complex.iPostPonementTime < (24*60)) lg_cook_complex.iPostPonementTime += 10;  // Если время отложенного старта меньше максимального
			else lg_cook_complex.iPostPonementTime = 10;                                      // Если время максимально сбрасывем в минимальное	
		}
	}else{                                                                                 // Если прибавляем часы
		if(fl_load_delay_taim == 0){                                                         // Если время готовки
			if(lg_cook_complex.iCookTime < lg_cook_complex.iMaxTime){                          // Если время готовки меньше максимального времени
				if((lg_cook_complex.iCookTime + 60) < lg_cook_complex.iMaxTime) lg_cook_complex.iCookTime += 60;
				else lg_cook_complex.iCookTime = lg_cook_complex.iMaxTime;
			}else lg_cook_complex.iCookTime = lg_cook_complex.iMinTime;                        // Если время готовки максимальное сбрасываем в минимальное
		}else{                                                                               // Если время отложенного старта
			if(lg_cook_complex.iPostPonementTime < (24*60)){                                   // Если время отложенного старта меньше максимального
				if((lg_cook_complex.iPostPonementTime + 60) < (24*60)) lg_cook_complex.iPostPonementTime += 60;
				else lg_cook_complex.iPostPonementTime = (24*60);
			}else lg_cook_complex.iPostPonementTime = 10;                                      // Если время максимально сбрасывем в минимальное			
		}
	}			
  blank_faze_time = 0;	
	if(fl_load_delay_taim == 0) ind_taim(lg_cook_complex.iCookTime, 1);
	else ind_taim(lg_cook_complex.iPostPonementTime, 1);	
	timer_reset(TIMER_30SEK);
	if(timer_active(TIMER_30SEK) == 0) timer_start(TIMER_30SEK);	
}
/**
 * Установка флага ввода времени отложенного старта
 */
static void logic_delay_taim_key(uint8_t st_flag, uint8_t beep){
	if(lg_cook_complex.bPostPonementEnabled == TRUE){                                      // Если возможна устанока отложенного старта
		if(st_flag != fl_load_delay_taim){                                                   // Если флаг изменился
			fl_load_delay_taim = st_flag;
			if(beep == 1) BEEP();
			if(fl_load_delay_taim == 1){
				Ind_LED_On(LED_DEF_START);
				Ind_LED_On(LED_LOAD_START_1);
				Ind_LED_On(LED_LOAD_START_2);			
				Ind_LED_Off(LED_TIME_LOAD);
				ind_taim(lg_cook_complex.iPostPonementTime, 1);
				timer_reset(TIMER_30SEK);
	      if(timer_active(TIMER_30SEK) == 0) timer_start(TIMER_30SEK);
			}
			blank_faze_time = 0;
		}		
  }
}
/**
 * Ввод температуры в режиме меню для "мультиповар"
 */
static void logic_temp_plas(uint8_t beep){
	if(lg_cook_complex.cProgramNumber == (uint8_t)MULTICOOK_PROGRAM){                      // Если "мультиповар"
		if(beep == 1){
			BEEP();
			if(lg_cook_complex.cCookTemp < lg_cook_complex.cMaxValueTemp)/*lg_cook_complex.cCookTemp += 5; //5C */lg_cook_complex.cCookTemp ++; //1C ????????????????????????????????
			else lg_cook_complex.cCookTemp = lg_cook_complex.cMinValueTemp;			
		}else{
			if(lg_cook_complex.cCookTemp < lg_cook_complex.cMaxValueTemp){
				if((lg_cook_complex.cCookTemp%5) == 0) lg_cook_complex.cCookTemp +=5;            // Если остаток равен "0" + 5C
				else lg_cook_complex.cCookTemp += (5-(lg_cook_complex.cCookTemp%5));             // Прибавляем для кратности 5С				
			}else lg_cook_complex.cCookTemp = lg_cook_complex.cMinValueTemp;
		}
		lg_cook_complex.cBotTempWarm = lg_cook_complex.cCookTemp - 6;
		lg_cook_complex.cBotTempStat = lg_cook_complex.cCookTemp - 1;			
		blank_faze_temp = 0;		
		ind_temperature(lg_cook_complex.cCookTemp, 1);
		Ind_LED_On(LED_IMG_TEMP);
		Ind_LED_On(LED_IMG_GRAD);		
		timer_reset(TIMER_30SEK);
	  if(timer_active(TIMER_30SEK) == 0) timer_start(TIMER_30SEK);
	}
}
/**
 * Функция вызываемая таймером BLANK
 */
static inline void blank_menu(void)
{
	if(led_blank_state == 0){
		if(blank_faze == 0) {
			Ind_LED_On(LED_MULTICOOK);
			Ind_LED_On(LED_IMG_TEMP);
			Ind_LED_On(LED_IMG_GRAD);
			if(fl_load_delay_taim == 0) ind_taim(lg_cook_complex.iCookTime, 1);
			else ind_taim(lg_cook_complex.iPostPonementTime, 1);
			ind_temperature(lg_cook_complex.cCookTemp, 1);
		}else {
			Ind_LED_Off(LED_MULTICOOK);
					
			if(blank_faze_time == 1) ind_taim(lg_cook_complex.iCookTime, 0);
			else{
				if(fl_load_delay_taim == 0) ind_taim(lg_cook_complex.iCookTime, 1);
				else ind_taim(lg_cook_complex.iPostPonementTime, 1);
			}
			if(blank_faze_temp == 1){
				Ind_LED_Off(LED_IMG_TEMP);
			  Ind_LED_Off(LED_IMG_GRAD);
				ind_temperature(lg_cook_complex.cCookTemp, 0);
			}else{
				Ind_LED_On(LED_IMG_TEMP);
			  Ind_LED_On(LED_IMG_GRAD);
				ind_temperature(lg_cook_complex.cCookTemp, 1);				
			} 
		}		
	}else if(led_blank_state == 21){
		if(blank_faze == 1) Ind_LED_Off(LED_START);
		else Ind_LED_On(LED_START);		
	}else if(led_blank_state == 30){
		if(blank_faze == 1) Ind_LED_Off(LED_MP);
		else Ind_LED_On(LED_MP);		
	}else if(led_blank_state == 32){
		if(blank_faze == 1) {
			if(state_cooking == STAGE_STAT || lg_cook_complex.bBoost == FALSE) Ind_LED_Off(LED_MP);
			Ind_LED_Off(LED_IMG_PAR);
		}else{
			Ind_LED_On(LED_MP);	
      Ind_LED_On(LED_IMG_PAR);
		}			
	}else if(led_blank_state == 33){
		if(blank_faze == 1){
			ind_taim(lg_cook_complex.iCookTime, 0); 
			logic_prog_on_of(lg_cook_complex.cProgramNumber, 0);
		}else{
			ind_taim(lg_cook_complex.iCookTime, 1);	
			logic_prog_on_of(lg_cook_complex.cProgramNumber, 1);
		}				
	}else if(led_blank_state == 34){
		if(blank_faze == 1) Ind_LED_Off(LED_IMG_PAR); else Ind_LED_On(LED_IMG_PAR);		
	}else if(led_blank_state == 36){
		if(blank_faze == 1){
			ind_blank_express(0); 
			logic_prog_on_of(lg_cook_complex.cProgramNumber, 0);
		}else{
			ind_blank_express(1);	
			logic_prog_on_of(lg_cook_complex.cProgramNumber, 1);
		}				
	}else if(led_blank_state == 37) {
		if(blank_faze == 1) ind_taim(keep_warm_time, 0); else ind_taim(keep_warm_time, 1);		
	}else if(led_blank_state == 38) {
		if(blank_faze == 1) Ind_LED_Off(LED_TIME_LOAD); else Ind_LED_On(LED_TIME_LOAD);		
	}else if(led_blank_state == 39){
		if(blank_faze == 1){
			Ind_LED_Off(LED_MP); 
			Ind_LED_Off(LED_LOAD_START_1);
			Ind_LED_Off(LED_LOAD_START_2);
		}else{
			Ind_LED_On(LED_MP);	
			Ind_LED_On(LED_LOAD_START_1);
			Ind_LED_On(LED_LOAD_START_2);
		}				
	}else if(led_blank_state == 40){
		if(blank_faze == 1) ind_paring(1); else ind_paring(0);		
	}else if(led_blank_state > 0 && led_blank_state < 16){
		if(blank_faze == 0) {
			logic_prog_on_of(led_blank_state, 1);
			if(fl_load_delay_taim == 0) ind_taim(lg_cook_complex.iCookTime, 1);
			else ind_taim(lg_cook_complex.iPostPonementTime, 1);
		}else{		
			logic_prog_on_of(led_blank_state, 0);
			if(blank_faze_time == 1) ind_taim(lg_cook_complex.iCookTime, 0);
			else{
				if(fl_load_delay_taim == 0) ind_taim(lg_cook_complex.iCookTime, 1);
				else ind_taim(lg_cook_complex.iPostPonementTime, 1);
		  }			
		}			
	}
  if(blank_faze == 0){
		blank_faze = 1;
		blank_faze_time = 1;
		blank_faze_temp = 1;
	}else{
		blank_faze = 0;
    blank_faze_time = 0;
		blank_faze_temp = 0;
	}		
}
/**
 * Установка параметров для функции void blank_menu(void)
 */
static void logic_led_start_bl(uint8_t stat)
{
	if(stat != 20){
    timer_reset(TIMER_LEDS_BLANK);
		timer_start(TIMER_LEDS_BLANK);
    if(stat < 16){
      Ind_LED_On(LED_MULTICOOK);
      Ind_LED_On(LED_MILK_PORRIDGE);	
      Ind_LED_On(LED_STEW);
      Ind_LED_On(LED_FRY_1);
      Ind_LED_On(LED_FRY_2);			

      Ind_LED_On(LED_SOUP);
      Ind_LED_On(LED_STEAM);	
      Ind_LED_On(LED_PASTA);
      Ind_LED_On(LED_SOAKING);

      Ind_LED_On(LED_COOKING);
      Ind_LED_On(LED_PASTRY);
      Ind_LED_On(LED_CEREALS);
      Ind_LED_On(LED_PILAW);

      Ind_LED_On(LED_YOGURT);
      Ind_LED_On(LED_PIZZA);
      Ind_LED_On(LED_BREAD);
      Ind_LED_On(LED_DESSERT);

      Ind_LED_On(LED_IMG_ML);
      Ind_LED_On(LED_IMG_K_ML);
      Ind_LED_On(LED_MP);
			Ind_LED_On(LED_TIME_LOAD);
			logic_prog_on_of(stat, 0);
      ind_taim(lg_cook_complex.iCookTime, 1);
		}
	}else{
		timer_stop(TIMER_LEDS_BLANK);	
    Ind_Clr();		
	}
	led_blank_state = stat;
	blank_faze = 0;
	blank_faze_time = 0;
	blank_faze_temp = 0;
}
/**
 * logic_prog_on_of
 */
static inline void logic_prog_on_of(uint8_t n_prog, uint8_t state)
{
	if(state == 0){
			switch(n_prog)
		  {
			  case 0: Ind_LED_Off(LED_MULTICOOK); break;				
			  case 1: Ind_LED_Off(LED_MILK_PORRIDGE); break;
				case 2: Ind_LED_Off(LED_STEW);      break;
				case 3: Ind_LED_Off(LED_FRY_1); Ind_LED_Off(LED_FRY_2); break;
				case 4: Ind_LED_Off(LED_SOUP);      break;
			  case 5: Ind_LED_Off(LED_STEAM);     break;
				case 6: Ind_LED_Off(LED_PASTA);     break;
				case 7: Ind_LED_Off(LED_SOAKING);   break;
				case 8: Ind_LED_Off(LED_COOKING);   break;
			  case 9: Ind_LED_Off(LED_PASTRY);    break;
				case 10: Ind_LED_Off(LED_CEREALS);  break;
				case 11: Ind_LED_Off(LED_PILAW);    break;
				case 12: Ind_LED_Off(LED_YOGURT);   break;
			  case 13: Ind_LED_Off(LED_PIZZA);    break;
				case 14: Ind_LED_Off(LED_BREAD);    break;
				case 15: Ind_LED_Off(LED_DESSERT);  break;
			  case 16: Ind_LED_Off(LED_IMG_EXPRES); break;				
		  }	
	}else{		
		switch(n_prog)
		{		
			case 0: Ind_LED_On(LED_MULTICOOK); break;
			case 1: Ind_LED_On(LED_MILK_PORRIDGE); break;
			case 2: Ind_LED_On(LED_STEW);      break;
			case 3: Ind_LED_On(LED_FRY_1); Ind_LED_On(LED_FRY_2); break;
			case 4: Ind_LED_On(LED_SOUP);      break;
			case 5: Ind_LED_On(LED_STEAM);     break;
			case 6: Ind_LED_On(LED_PASTA);     break;
			case 7: Ind_LED_On(LED_SOAKING);   break;
			case 8: Ind_LED_On(LED_COOKING);   break;
			case 9: Ind_LED_On(LED_PASTRY);    break;
			case 10: Ind_LED_On(LED_CEREALS);  break;
			case 11: Ind_LED_On(LED_PILAW);    break;
			case 12: Ind_LED_On(LED_YOGURT);   break;
			case 13: Ind_LED_On(LED_PIZZA);    break;
			case 14: Ind_LED_On(LED_BREAD);    break;
			case 15: Ind_LED_On(LED_DESSERT);  break;
			case 16: Ind_LED_On(LED_IMG_EXPRES); break;
		}			
	}		
}
//===============================================================================
/**
 * Коллбэк для таймера-пищалки
 */
static void cb_beep_off(uint32_t timer){
  if(TIMER_BEEP == timer){
    timer_stop(timer);
    timer_reset(timer);
    Buz_Off();
  }
}
/**
 * Пэринг ble
 */
static void logic_paring(void){
	BEEP();
	Clk_Delay(25);
	BEEP();
	Clk_Delay(25);
	BEEP();
	state_mode = PARING_MODE;         // Состояние пэринга
	state_cooking = STAGE_PARING;   
	timer_reset(TIMER_PARING_TIMER);  // Запускаем таймер пэринга
	timer_start(TIMER_PARING_TIMER);      
	logic_led_start_bl(20);           // Сбрасываем индикацию
	logic_led_start_bl(40);           // Индикация перинга
	ind_paring(0);
}
/**
 * Унпэринг ble
 */
static void logic_unparing(void){
	BEEP_BIG_LONG();
	state_mode = UNPARING_MODE;         // Состояние унпэринга  
	timer_reset(TIMER_UNPARING_TIMER);  // Запускаем таймер унпэринга
	timer_start(TIMER_UNPARING_TIMER);      
}
/*=======================================================================================

 * API for R4S

 * The all Set...() functions return a true/false (Success/Fail) value

=======================================================================================*/
/**
 * Get firmvare version
 */
uint16_t Appl_GetVersion(void){
	return FIRMWARE_VER;
}
/**
 * Start
 */
bool Appl_Start(void){
	if(state_mode == MENU_MODE){
    if(lg_cook_complex.cProgramNumber == (uint8_t)EXPRESS_PROGRAM){
      logic_cooking_express(1);
		}else if(lg_cook_complex.cProgramNumber == (uint8_t)KEEP_PROGRAM){ // 29_07_2015 V1_3
			logic_go_keepwarm(1);
		}
		else logic_mode_cooking(1);
		return true;
	}else if(state_mode == POWER_MODE){
		application_power_mode_go(1); // Продолжение работы программы
		return true;
	}else if(state_mode == COOKING_MODE){
		logic_go_time_pasta(1);
		return true;
	}
	return false;
}
/**
 * Stop
 */
bool Appl_Stop(void){
	if(state_mode != ERROR_MODE) logic_mode_standby(1); // 29_07_2015 V1_3
	return true;
}
/**
 * Get device state
 */
uint8_t Appl_GetState(void){
	switch(state_cooking){
		case STAGE_NONE:         return APPL_BEGIN_STATE;
		case STAGE_PROGRAM: 		 return APPL_PROGRAM_STATE;
		case STAGE_POSTPONEMENT: return APPL_START_DELAY_STATE; 
		case STAGE_BOOST:        return APPL_BOOST_STATE;
		case STAGE_ENDOFBOOST:   return APPL_WAIT_STATE;
		case STAGE_BREAD_LOAD:
		case STAGE_WARM: 
		case STAGE_STAT:         return APPL_COOKING_STATE;
		case STAGE_KEEPWARM:     return APPL_REHEAT_STATE; 	
		case STAGE_ERROR:        return APPL_ERROR_STATE; 	
		case STAGE_PARING:       return APPL_PAIRING_STATE; 
		case STATE_POWER:      	 
		{
			if(lg_cook_complex.cPower_flag != 1) return APPL_POWER;
		  return APPL_POWER_STOP;
		}			
		case STAGE_TEST:      	 return APPL_TEST_STATE;
  }
	return APPL_ERROR_STATE;
}
/**
 * Set program
 */
bool Appl_SetProgram(uint8_t prog){
	if((state_mode == STANDBY_MODE || state_mode == MENU_MODE) && prog < 18){ // 17  -  29_07_2015 V1_3
		if(prog < 16){
			state_mode = MENU_MODE;       
			state_cooking = STAGE_PROGRAM;
			lg_cook_complex.cProgramNumber = prog;
			logic_mode_menu(1);
		  return true;
		}else{ // Express
			state_mode = MENU_MODE;
			state_cooking = STAGE_PROGRAM;			
			lg_cook_complex.cProgramNumber = prog;
			return true; 
		}
	}
	return false;
}
/**
 * Get program
 */
uint8_t Appl_GetProgram(void){
	return lg_cook_complex.cProgramNumber;
}
/**
 * Set cooking temperature
 */
bool Appl_SetCookTemp(uint8_t temp){
	if(state_mode == COOKING_MODE || state_mode == MENU_MODE){                             // Если режим варки или режим меню
		if(state_mode == MENU_MODE) timer_reset(TIMER_30SEK);                                // Сбрасываем таймер перехода в STANDBY_MODE
		if(lg_cook_complex.cMinValueTemp <= temp && lg_cook_complex.cMaxValueTemp >= temp){  // Проверка задаваемой температуры
			uint8_t temp_set_warm;// 29_07_2015 V1_3
			if(state_mode == COOKING_MODE){
				timer_reset(TIMER_ERROR);
				timer_start(TIMER_ERROR);
			}
			lg_cook_complex.cCookTemp = temp;                                                  // Меняем температуру 
			temp_set_warm = cook_program[lg_cook_complex.cProgramNumber].cCookTemp - cook_program[lg_cook_complex.cProgramNumber].cBotTempWarm;
			if(temp > temp_set_warm) lg_cook_complex.cBotTempWarm = temp - temp_set_warm; // 29_07_2015 V1_3
			else lg_cook_complex.cBotTempWarm = 10; // 29_07_2015 V1_3
			//lg_cook_complex.cBotTempWarm = temp - (cook_program[lg_cook_complex.cProgramNumber].cCookTemp - cook_program[lg_cook_complex.cProgramNumber].cBotTempWarm); // 29_07_2015 V1_3
			lg_cook_complex.cBotTempStat = temp - (cook_program[lg_cook_complex.cProgramNumber].cCookTemp - cook_program[lg_cook_complex.cProgramNumber].cBotTempStat);
			if(lg_cook_complex.cProgramNumber == (uint8_t)MULTICOOK_PROGRAM){                  // Если программа мультиповар 
				ind_temperature(lg_cook_complex.cCookTemp, 1);                                   // Выводим значение темперытуры
				Ind_LED_On(LED_IMG_TEMP);
				Ind_LED_On(LED_IMG_GRAD);
			}
			return true;
		}
	}	
	return false;
}
/**
 * Get cooking temperature
 */
uint8_t Appl_GetCookTemp(void){
	if(lg_cook_complex.cProgramNumber == (uint8_t)KEEP_PROGRAM){ // 29_07_2015 V1_3
		return 70;
	}
	return lg_cook_complex.cCookTemp;
}
/**
 * Set cooking time in minutes
 */
bool Appl_SetCookTime(uint16_t time){
	if(state_mode == COOKING_MODE || state_mode == MENU_MODE){                   // Если режим варки или режим меню
		if(state_mode == MENU_MODE) timer_reset(TIMER_30SEK);                      // Сбрасываем таймер перехода в STANDBY_MODE
		if(lg_cook_complex.iMinTime <= time && lg_cook_complex.iMaxTime >= time){  // Проверка задаваемого вермени варки	
			lg_cook_complex.iCookTime = time;
			if(state_cooking != STAGE_POSTPONEMENT) ind_taim(lg_cook_complex.iCookTime, 1);    // Выводим индикацию установленого времени
			return true;
		}
	}	
	return false;
}
/**
 * Get cooking time in minutes
 */
uint16_t Appl_GetCookTime(void){
	return lg_cook_complex.iCookTime;
}
/**
 * Set defered start time in minutes, 0 if disable
 */
bool Appl_SetDeferedStart(uint16_t time){
	if(state_mode == MENU_MODE){
		if(time == 0){
			fl_load_delay_taim = 0;
			return true;
		}else{
			if(lg_cook_complex.bPostPonementEnabled == TRUE && time <= (24*60)){ // Если возможна устанока отложенного старта и коректное время
				fl_load_delay_taim = 1;
				lg_cook_complex.iPostPonementTime = time;
			  return true;				
			}
		}
	}	
	return false;
}
/**
 * Get defered start time in minutes, 0 if disable
 */
uint16_t Appl_GetDeferedStart(void){
	if(lg_cook_complex.bPostPonementEnabled == FALSE) return 0;
	return lg_cook_complex.iPostPonementTime;
}
/**
 * Get time to end of cooking in minutes
 */
uint16_t Appl_GetEndTime(void){
	if(state_cooking == STAGE_POSTPONEMENT) return lg_cook_complex.iPostPonementTime; // оставшееся время варки и время отложенного старты
	else // 29_07_2015 V1_3
	{
		if(lg_cook_complex.cProgramNumber == (uint8_t)KEEP_PROGRAM) return keep_warm_time;
		return lg_cook_complex.iCookTime;
	}
	//else return lg_cook_complex.iCookTime;  // 29_07_2015 V1_3
}
/**
 * Set reheat state
 */
bool Appl_SetReheat(uint8_t state){	
	switch(state_mode){           // проверка возможности установки подогрева
		case MENU_MODE:
		{
      timer_reset(TIMER_30SEK); // Сбрасываем таймер перехода в STANDBY_MODE			
			if(state == 0) {
				lg_cook_complex.bKeepWarmEnabled = FALSE; 
				return true;				
			}else if(state == 1 && lg_cook_complex.cKeepWarmTime > 0){
				lg_cook_complex.bKeepWarmEnabled = TRUE;
				return true;	
			}else return false;
		}
		case COOKING_MODE: 
		{
			/* v1_3 */
			timer_reset(TIMER_BUTTONS_HANDLE);                                                     // Для отмены при удержание
			timer_stop(TIMER_BUTTONS_HANDLE);
			if(lg_cook_complex.bKeepWarmEnabled == TRUE && state == 0){                            // Если включен выключаем
				BEEP();
				lg_cook_complex.bKeepWarmEnabled = FALSE;
				Ind_LED_Off(LED_ESC);
				return true;
			}else if(lg_cook_complex.bKeepWarmEnabled == FALSE && state == 1){                                                                                 // Включаем
				if(lg_cook_complex.cKeepWarmTime > 0){                                               // Если разрешен подогрев
					BEEP();
					lg_cook_complex.bKeepWarmEnabled = TRUE;
					Ind_LED_On(LED_ESC);
					return true;
				}
			}	
			//logic_on_off_keepwarm(1); v1_3
			return false;
		}
		default: break;
  }
	return false;
}
/**
 * Get reheat state
 */
uint8_t Appl_GetReheat(void){
	if(lg_cook_complex.bKeepWarmEnabled == TRUE) return APPL_REHEAT_ON;
	return APPL_REHEAT_OFF;
}
/**
 * Get current time of reheat in minutes
 */
uint16_t Appl_GetReheatTime(void){
	return keep_warm_time;
}
/**
 * Get heater position 
 */
uint8_t Appl_GetPosition(void){
	return APPL_BOT_POSITION;
}
/**
 * Get error
 */
uint8_t Appl_GetError(void){
	return error;
}
/**
 * Return a state of the unpairing flag
 */
bool Appl_IsUnpairing(void){
	if(state_mode == UNPARING_MODE) return true;
	return false;
}
/**
 * Clear unpairing flag
 */
void Appl_ClrUnpairing(void){
}
/**
 * Get power
 */
uint8_t Appl_GetPower(void){
	return power_down;
}
/**
 * Get power cnt
 */
uint8_t Appl_GetPower_cnt(void){
	return lg_cook_complex.cPower_cnt;
}
/*=====================================================================================*/
Made on
Tilda