Программный модуль для мультиварки RMK-CB391S. Версия 1.7
ПО является неотъемлемой частью мультиварки RMK-CB391S, отдельно потребителю не поставляется и эксплуатируется только в составе устройства.
////////////////////////////////////////////////////////////////
// RMK-CB391S
//v1.7
////////////////////////////////////////////////////////////////
/*==============================================================
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 "radio_fm.h"
#include "timer.h"
#include "err.h"
#include "power_down.h"
/*==============================================================
Define
==============================================================*/
/*
* Включение пищалки
*/
#ifdef BEEP_ON
#define BEEP_BIG_LONG() {Buz_beep(BUZ_BIG_LONG_BEEP);}
#define BEEP_LONG() {Buz_beep(BUZ_LONG_BEEP);}
#define BEEP() {Buz_beep(BUZ_BEEP);}
#else
#define BEEP_BIG_LONG() {}
#define BEEP_LONG() {}
#define BEEP() {}
#endif
#define BEEP_NOT ((uint8_t)0)
#define BEEP_YES ((uint8_t)1)
/*==============================================================
static functions
==============================================================*/
static void application_timers_handler(void);
static void logic_commands(void);
static void logic_mode_menu(uint8_t beep);
static void logic_sound(uint8_t beep);
static void logic_sound_izm(void);
static void logic_sound_save(uint8_t key);
static void logic_menu_taim(uint8_t beep);
static void logic_menu_clok_min(void);
static void logic_menu_izm_tain(uint8_t kn_en);
static void logic_menu_temp(uint8_t beep);
static void logic_menu_produkt(uint8_t beep);
static void logic_mode_cooking(uint8_t beep);
static void logic_go_start(void);
static void logic_go_delay_start(void);
static void logic_ind_delay_i_start(void);
static void logic_on_off_keepwarm(uint8_t beep);
static void logic_go_keepwarm(uint8_t beep);
static void logic_cooking_express(uint8_t beep);
static void logic_go_time_pasta(uint8_t beep);
static void appl_paring(void);
static void appl_unparing(void);
static void logic_tim_1min(void);
static void logic_mode_radio(uint8_t beep);
static void logic_off_radio(uint8_t beep);
static void logic_radio_izm_chast(void);
static void logic_radio_volume(uint8_t beep);
static void logic_radio_seve(uint8_t beep);
static void logic_radio_search(uint8_t beep);
static void logic_radio_search_stop(uint8_t beep);
static void application_power_down(void);
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
==============================================================*/
volatile logic_state_mode state_mode = STANDBY_MODE, // Настоящее состояние мультиварки
power_state_mode = STANDBY_MODE;
volatile cookcomplexprog lg_cook_complex; // Параметры установленной программы готовки
volatile uint8_t state_cooking = STAGE_NONE; // Cостояние процесса готовки
volatile uint8_t number_radio_st = 1;
static uint8_t fl_nimber_beep = 0,
fl_radio_power = 0,
fl_mode_radio = 0,
fl_active_radio = 0,
fl_search_radio = 0,
fl_kn_search = 0,
error = 0, // Ошибка
power_taim = 0,
power_down = 0,
power_state_cooking = STAGE_NONE,
test_ind_on = 0;
static uint16_t keep_warm_time = 0, // Время подогрева
radio_chast = 0,
radio_vol = 8,
sound_on_off = 0,
test_en_key = 0;
volatile uint16_t master_shef_time, master_shef_temp;
/*==============================================================
init functions
==============================================================*/
/*
* Инит перефирии
*/
void Application_Init(void)
{
power_state state_power;
Clk_Init();
Temp_Init();
Heat_Init();
Buz_Init();
Ind_Init();
radio_fm_init();
radio_chast = radio_read_stations(number_radio_st);
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_60SEK,TIMER_SECOND(60),0); // 60s 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_BUTTUN_EN,5,0); // 50ms Обработка кнопки на энкодере
timer_start(TIMER_BUTTUN_EN);
timer_init(TIMER_5SEC_MENU,TIMER_SECOND(5),0); // 5S Меню
timer_start(TIMER_5SEC_MENU);
timer_init(TIMER_BEEP_3_10,TIMER_SECOND(10),0);
timer_init(TIMER_POWER_1_MIN,TIMER_MINUTE(1),0); // Время для режима перебоя питания
timer_init(TIMER_TEST_MODE,TIMER_MINUTE(2),0); // Время работы тестового режима
timer_init(TIMER_SOUND_ON_OFF,TIMER_SECOND(5),0); // Время режима настройки звуковых сигналов
timer_init(TIMER_ERROR, TIMER_MINUTE(5),0);
BEEP_LONG(); // Длинный сигнал
Ind_Set();
Ind_Release(); // Обновление дисплея
Clk_Delay(50);
Ind_Clr();
if(Buz_get() == BUZZER_OFF) Ind_LED_On(LED_SOUND_OFF);
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((cookcomplexprog *)&lg_cook_complex, \
(logic_state_mode *)&state_mode, \
(uint8_t *)&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(); ind_blank1(BL1_MP_DELAY); break;// Запуск отложенного старта
}
}
else if(state_power == STATE_DOWN_LONG) // Long перебой индикация паузы программы
{
power_read_params((cookcomplexprog *)&lg_cook_complex, \
(logic_state_mode *)&state_mode, \
(uint8_t *)&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: ind_blank1(BL1_TAIM); break;
}
}
BEEP();
}
}
if(Temp_GetBotTemp() < 5) Err_Stop(BOT_TEMP_SENSOR_ERR); // Ошибка датчика BOT
if(Temp_GetTopTemp() < 5) Err_Stop(TOP_TEMP_SENSOR_ERR); // Ошибка датчика TOP
}
////////////////////////////////////////////////////////////////
void Application(void)
{
R4S(); // Обработка радиокоманд
application_timers_handler(); // Обработка таймеров
logic_commands(); // Обработка пользовательских команд
application_power_down(); // Обработка пропадания питания
}
////////////////////////////////////////////////////////////////
/*
* Код обработчика таймеров
*/
static void logic_out_m_sh(void)
{
ind_blank1(BL_CLEAR);
Ind_LED_On(LED_TIME_LOAD);
if(state_cooking == STAGE_STAT || lg_cook_complex.bBoost == FALSE){ // Если идет отсчет времени
ind_blank1(BL_MP);
}else{
Ind_LED_On(LED_MP);
ind_blank1(BL1_TAIM);
}
if(keyb_en_adr() == (uint16_t*)&master_shef_time){ // Если изменялось время приготовления
if(master_shef_time > (2*60) && lg_cook_complex.cCookTemp >= 130) master_shef_time = (2*60);
lg_cook_complex.iCookTime = master_shef_time;
}
if(keyb_en_adr() == (uint16_t*)&master_shef_temp){ // Если изменялясь температура приготовления
if(master_shef_temp >= 130 && lg_cook_complex.iCookTime > (2*60)) lg_cook_complex.iCookTime = (2*60);
if(master_shef_temp < 80){ // Если установлена температура ниже 80 градусов
if(lg_cook_complex.bKeepWarmEnabled == TRUE){ // Отключаем подогрев
lg_cook_complex.bKeepWarmEnabled = FALSE;
Ind_LED_Off(LED_HEATING);
Ind_LED_Off(LED_ESC);
}
}
if(master_shef_temp > cook_temp_d_warm()){
lg_cook_complex.cBotTempWarm = master_shef_temp - cook_temp_d_warm();
}else lg_cook_complex.cBotTempWarm = 10;
lg_cook_complex.cBotTempStat = master_shef_temp - cook_temp_d_stat();
lg_cook_complex.cCookTemp = master_shef_temp;
lg_cook_complex.cTopTempStat = cook_param_get_top_stat(lg_cook_complex.cProgramNumber, lg_cook_complex.cCookTemp);
}
keyb_en_off();
ind_taim(lg_cook_complex.iCookTime, 1);
if(lg_cook_complex.iCookTime == 0){
if(lg_cook_complex.bKeepWarmEnabled == TRUE) logic_go_keepwarm(0); // Если включен подогрев
else logic_mode_standby(0);
logic_beep_3(3); // beep_3
}
}
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_BUTTUN_EN))
{
timer_ready_clr(TIMER_BUTTUN_EN);
key_handler();
}
if(timer_ready(TIMER_LEDS_BLANK)) // Таймер BLANK индикации
{
timer_ready_clr(TIMER_LEDS_BLANK);
ind_blank_handler();
}
if(timer_ready(TIMER_30SEK)) // Таймер выхода из пользовательского меню установок
{
timer_ready_clr(TIMER_30SEK);
timer_stop(TIMER_30SEK);
if(state_mode == MENU_MODE){ // Если мы в режиме меню
logic_mode_standby(0); // И прошла минута выходим в STANDBY_MODE режим
}
}
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);
cook_4sec_pwm(); // Таймер для работы ШИМ (управление нагревателями)
}
if(timer_ready(TIMER_5SEC_MENU)) // 5 Сек меню
{
timer_ready_clr(TIMER_5SEC_MENU);
timer_stop(TIMER_5SEC_MENU);
if(state_mode == MENU_MODE){ // Если режим меню
ind_blank1(BL_CLEAR); // Обнуляем blank1
if(keyb_en_adr() == (uint16_t*)&lg_cook_complex.iCookTime){ // Если изменялось время приготовления
ind_taim(lg_cook_complex.iCookTime, 1);
Ind_LED_On(LED_MP);
Ind_LED_On(LED_TIME_LOAD);
}
else if(keyb_en_adr() == (uint16_t*)&lg_cook_complex.cCookTemp){
ind_taim(lg_cook_complex.iCookTime, 1);
Ind_LED_On(LED_MP);
Ind_LED_On(LED_TIME_LOAD);
if(lg_cook_complex.cCookTemp < 80){ // Если установлена температура ниже 80 градусов
if(lg_cook_complex.bKeepWarmEnabled == TRUE){ // Отключаем подогрев
lg_cook_complex.bKeepWarmEnabled = FALSE;
Ind_LED_Off(LED_HEATING);
Ind_LED_Off(LED_ESC);
}
}
}
else if(keyb_en_adr() == (uint16_t*)&lg_cook_complex.iPostPonementTime){ // Если изменялось время отложенного старта
ind_taim(lg_cook_complex.iPostPonementTime, 1);
Ind_LED_On(LED_MP);
Ind_LED_On(LED_LOAD_START);
}
else if(keyb_en_adr() == (uint16_t*)&lg_cook_complex.cProductNumber){ // Если изменялся продукт
ind_taim(lg_cook_complex.iCookTime, 1);
Ind_LED_On(LED_MP);
Ind_LED_On(LED_TIME_LOAD);
ind_produkt();
}
keyb_en((uint16_t*)&lg_cook_complex.cProgramNumber, 0, 19, 1, 1); // Энкодер на изменение программы
}
else if(state_mode == COOKING_MODE){ // Если мы в режиме варки
if(state_cooking == STAGE_POSTPONEMENT){ // Если мы в отложенном старте
Ind_LED_On(LED_LOAD_START);
Ind_LED_Off(LED_TIME_LOAD);
ind_taim(lg_cook_complex.iPostPonementTime, 1);
ind_blank1(BL_MP);
}else{ // Если мы в процессе варки
logic_out_m_sh();
}
}
}
if(timer_ready(TIMER_BEEP_3)) // Сигнал закладки "макарон"
{
timer_ready_clr(TIMER_BEEP_3);
BEEP();
if(--fl_nimber_beep == 0) timer_stop(TIMER_BEEP_3);
}
if(timer_ready(TIMER_BEEP_3_10))
{
timer_ready_clr(TIMER_BEEP_3_10);
logic_beep_3(2);
}
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_SOUND_ON_OFF)){
timer_ready_clr(TIMER_SOUND_ON_OFF);
timer_stop(TIMER_SOUND_ON_OFF);
logic_sound_save(OFF_OK_KEY);
}
if(timer_ready(TIMER_IND_END)){
timer_ready_clr(TIMER_IND_END);
timer_stop(TIMER_IND_END);
logic_mode_standby(0);
}
if(timer_ready(TIMER_ERROR)) {
timer_ready_clr(TIMER_ERROR);
timer_stop(TIMER_ERROR);
if(state_mode == COOKING_MODE){
if(Temp_GetBotTemp() > lg_cook_complex.cCookTemp + 45) Err_Stop(EMPTY_POT_ERR);
}
}
/**
********************************************************************
* Timer test mode
********************************************************************
*/
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_test(0, TEST_TEST);
}
}
if(test_ind_on != 0){
if(timer_read_taim(TIMER_TEST_MODE) >= TIMER_SECOND(10)){
test_ind_on = 0;
if(fl_radio_power == 1)
{
logic_off_radio(BEEP_YES);
fl_mode_radio = 0;
keyb_en(&test_en_key, 0, 5, 1, 1);
}
Ind_Clr();
ind_taim_test(0, TEST_TEST);
}
}
}
/**
********************************************************************
* Timer radio
********************************************************************
*/
if(timer_ready(TIMER_RADIO)) {
timer_ready_clr(TIMER_RADIO);
timer_stop(TIMER_RADIO);
logic_radio_deactive(BEEP_NOT);
}
if(timer_active(TIMER_RADIO)){
if(fl_search_radio == 1 && timer_read_taim(TIMER_RADIO) >= 20){
static radio_fm_rd radio_srch;
while(radio_srch.channel != radio_chast){
radio_fm_read_params((radio_fm_rd *)&radio_srch);
}
if(radio_srch.fm_true == true){
fl_search_radio = 0;
fl_kn_search = 0;
keyb_en(&radio_chast, RADIO_CHAST_MIN, RADIO_CHAST_MAX, 1, 1);
}else{
if(radio_chast < RADIO_CHAST_MAX) radio_chast ++; else radio_chast = RADIO_CHAST_MIN;
radio_fm_on(radio_chast, 0);
ind_fm_chast(radio_chast, 1);
}
timer_reset(TIMER_RADIO);
if(timer_active(TIMER_30SEK) == 1) timer_reset(TIMER_30SEK);
}
if(fl_kn_search == 1 && timer_read_taim(TIMER_RADIO) >= 50){
fl_kn_search = 0;
logic_radio_volume(BEEP_YES);
}
if(ind_blank_state(2) == BL_VOLUME && timer_read_taim(TIMER_RADIO) >= 500){
logic_radio_volume(BEEP_YES);
}
if(ind_blank_state(2) == BL_STAN && timer_read_taim(TIMER_RADIO) >= 300){
ind_blank2(BL_CLEAR);
ind_fm(number_radio_st, 1);
}
}
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 мин.
ind_blank0(BL_CLEAR);
switch(power_state_cooking)
{
case STAGE_BOOST:
case STAGE_ENDOFBOOST:
case STAGE_WARM:
case STAGE_STAT:
case STAGE_BREAD_LOAD:
{ /* Если готовка */
ind_blank1(BL1_TAIM);
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_key = key_encoder(); // Считываем кнопку энкодера
if(state_key == NOT_KEY){ // Считываем значения энкодера
if(keyb_en_fl() == 1){ // Если были изменения энкодера
if(keyb_en_adr() == (uint16_t*)&lg_cook_complex.cProgramNumber) state_key = EN_PROG_KEY;
else if(keyb_en_adr() == (uint16_t*)&lg_cook_complex.iCookTime) state_key = EN_TIME_KEY;
else if(keyb_en_adr() == (uint16_t*)&lg_cook_complex.iPostPonementTime) state_key = EN_DTIME_KEY;
else if(keyb_en_adr() == (uint16_t*)&lg_cook_complex.cCookTemp) state_key = EN_TEMP_KEY;
else if(keyb_en_adr() == (uint16_t*)&lg_cook_complex.cProductNumber) state_key = EN_PRODUKT_KEY;
else if(keyb_en_adr() == (uint16_t*)&radio_chast) state_key = EN_CHAST_KEY;
else if(keyb_en_adr() == (uint16_t*)&radio_vol) state_key = EN_VOLUME_KEY;
else if(keyb_en_adr() == (uint16_t*)&sound_on_off) state_key = EN_SOUND_KEY;
else if(keyb_en_adr() == (uint16_t*)&test_en_key) state_key = EN_TEST_KEY;
else if(keyb_en_adr() == (uint16_t*)&master_shef_time) state_key = EN_TIME_KEY_M_SH;
else if(keyb_en_adr() == (uint16_t*)&master_shef_temp) state_key = EN_TEMP_KEY_M_SH;
}
}
if(state_key != NOT_KEY || state_mode == TEST_MODE) // Если нажата кнопка обрабатываем ее
{
// Обработка кнопок управления радио //
if(state_mode != TEST_MODE){
if(state_key == OFF_RADIO_KEY){ // Если нажата кнопка радио
logic_mode_radio(BEEP_YES); // Включаем/переключаем радио
return;
}
else if(state_key == LONG_RADIO_KEY){ // Если длительное нажатие кнопки радио
logic_off_radio(BEEP_YES); // Выключаем радио
return;
}
if(fl_active_radio == 1){
switch(state_key)
{
case REHEAT_KEY: logic_radio_deactive(BEEP_YES); break; // Деактивируем радио
case EN_CHAST_KEY: logic_radio_izm_chast(); break; // Изменение частоты радио
case EN_VOLUME_KEY: // Изменение громкости радио
{
timer_reset(TIMER_RADIO);
radio_volume(radio_vol);
break;
}
case OFF_OK_KEY:
{
timer_reset(TIMER_RADIO);
fl_kn_search = 1;
/*logic_radio_volume(BEEP_YES);*/ break; // Настройка громкости
}
case OK_KEY:
{
if(fl_kn_search == 1){
fl_kn_search = 0;
logic_radio_search(BEEP_YES); // Поиск станции
}else fl_search_radio = 0;
break;
}
case LONG_OK_KEY: logic_radio_seve(BEEP_YES); break; // Сохранение станции
}
return;
}
}
//////////////////////////////////////////////////////////////////
switch(state_mode)
{
// Обработка кнопок в режиме ожидания //
case STANDBY_MODE:
{
switch(state_key)
{
case OFF_OK_KEY:
case REHEAT_KEY: logic_sound_save(state_key); break;
case LONG_REHEAT_KEY: logic_go_keepwarm(1); break; // Включаем программу разогрев
case LONG_TEMP_KEY: if(fl_radio_power == 0)logic_vesion(); break; // Выводим номер версии прошивки
case LONG_START_KEY: logic_cooking_express(BEEP_YES); break; // Включаем программу экспресс
case LONG_OK_KEY: logic_sound(BEEP_YES); break; // Входим в меню отключения/вклчения звука
case EN_SOUND_KEY: logic_sound_izm(); break;
case PARING_KEY: appl_paring(); break; // Пэринг
case UNPARING_KEY: appl_unparing(); break; // Унпэринг
}
break;
}
// Обработка кнопок в режиме меню (выбора параметров) //
case MENU_MODE:
{
switch(state_key)
{
case REHEAT_KEY:
{
if(timer_active(TIMER_5SEC_MENU)) logic_mode_menu(BEEP_YES);
else logic_mode_standby(BEEP_YES);
break; // Выход в состояние ожидания
}
case DELAY_KEY: logic_menu_taim(BEEP_YES); break; // Установка времени
case TEMP_KEY: logic_menu_temp(BEEP_YES); break; // Установка температуры
case PRODUKT_KEY: logic_menu_produkt(BEEP_YES); break; // Выбор продукта
case OFF_START_KEY: logic_on_off_keepwarm(BEEP_YES); break; // Включение / отключение подогрева
case LONG_START_KEY: logic_mode_cooking(BEEP_YES); break; // Запуск программы
case EN_PROG_KEY: logic_mode_menu(BEEP_YES); break; // Изменяем номер программы готовки
case OK_KEY: logic_menu_clok_min(); break;
case EN_TIME_KEY:
case EN_DTIME_KEY:
case EN_TEMP_KEY:
case EN_PRODUKT_KEY: logic_menu_izm_tain(state_key); break;
default:break;
}
break;
}
// Обработка кнопок в режиме приготовления //
case COOKING_MODE:
{
switch(state_key)
{
case DELAY_KEY: // Установка времени
{
if(lg_cook_complex.cProgramNumber != (uint8_t)EXPRESS_PROGRAM){
if(keyb_en_adr() == (uint16_t*)&master_shef_temp) logic_out_m_sh();
logic_menu_taim(BEEP_YES);
}
break;
}
case OK_KEY: logic_menu_clok_min(); break;
case EN_TEMP_KEY_M_SH:
case EN_TIME_KEY_M_SH: logic_menu_izm_tain(state_key); break;
case LONG_REHEAT_KEY: logic_mode_standby(1); break; // Выход в состояние ожидания
case START_KEY:
{
if(state_cooking == STAGE_ENDOFBOOST) logic_go_time_pasta(BEEP_YES);
else logic_on_off_keepwarm(BEEP_YES);
break; // Включение / отключение подогрева
}
case TEMP_KEY:
{
if(keyb_en_adr() == (uint16_t*)&master_shef_time) logic_out_m_sh();
logic_menu_temp(BEEP_YES);
break; // Установка температуры во время приготовления
}
//case EN_TEMP_KEY_M_SH: logic_menu_izm_temp(BEEP_YES); break;
}
break;
}
// Обработка кнопок в режиме подогрева //
case KEEP_MODE:
{
switch(state_key)
{
case LONG_REHEAT_KEY: logic_mode_standby(1); break; // Выход в состояние ожидания
}
break;
}
case PARING_MODE:
{
switch(state_key)
{
case REHEAT_KEY: logic_mode_standby(1); break; // Выход в состояние ожидания
}
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 OFF_REHEAT_KEY:
case OFF_DELAY_KEY:
case OFF_RADIO_KEY:
case OFF_TEMP_KEY:
case OFF_PRODUKT_KEY:
case OFF_OK_KEY:
case OFF_START_KEY: state_key = NOT_KEY; break; // BEEP
case LONG_REHEAT_KEY: state_key = REHEAT_KEY; break; // Включаем верхний нагреватель
case UNPARING_KEY:
case LONG_DELAY_KEY: state_key = DELAY_KEY; break; // Включаем боковой нагреватель
case LONG_RADIO_KEY: state_key = RADIO_KEY; break; // BEEP
case LONG_TEMP_KEY: state_key = TEMP_KEY; break; // Включаем нижний нагреватель
case PARING_KEY:
case LONG_PRODUKT_KEY: state_key = PRODUKT_KEY; break; // BEEP
}
test_heat(state_key); // Обработка нажатых копок для режима тестирования
break;
}
// End parametrs //
default: break;
}
}
}
//===============================================================================
// Функции работы радио
//===============================================================================
uint8_t logic_radio_active(void){
return fl_active_radio;
}
/*
* Включение радио и переклчение каналов
*/
static void logic_mode_radio(uint8_t beep)
{
if(fl_mode_radio == 1) fl_mode_radio = 0;
else{
if(beep == BEEP_YES) BEEP();
fl_kn_search = 0;
fl_search_radio = 0;
timer_init(TIMER_RADIO,TIMER_SECOND(10),0);
timer_start(TIMER_RADIO);
if(timer_active(TIMER_30SEK) == 1) timer_reset(TIMER_30SEK);
timer_stop(TIMER_5SEC_MENU);
if(fl_radio_power == 0){ // Если радио выключенно
fl_radio_power = 1; // Устанавливаем флаг включения радио
fl_active_radio = 0; // Сбрасываем ативность радио
radio_volume(radio_vol); // Задаем начальную/прошлую громкость
}
if(fl_active_radio == 0){ // Если радио не активно
fl_active_radio = 1;
ind_blank1(BL_CLEAR);
radio_chast = radio_fm_on(radio_chast, number_radio_st);
}else{ // Если радио активно переключаем станцию
if(number_radio_st < 9) number_radio_st ++;
else number_radio_st = 1;
radio_chast = radio_fm_on(0, number_radio_st);
}
ind_fm(number_radio_st, 1);
Ind_LED_On(LED_IMG_FM);
Ind_LED_On(LED_IMG_RADOI);
ind_blank2(BL_CLEAR);
keyb_en(&radio_chast, RADIO_CHAST_MIN, RADIO_CHAST_MAX, 1, 1);
if(state_mode == MENU_MODE){
ind_produkt();
Ind_LED_On(LED_TIME_LOAD);
Ind_LED_Off(LED_LOAD_START);
}
else if(state_mode == COOKING_MODE){
if(state_cooking == STAGE_POSTPONEMENT){
Ind_LED_Off(LED_TIME_LOAD);
Ind_LED_On(LED_LOAD_START);
}
Ind_LED_On(LED_TIME_LOAD);
}
}
}
/*
* Выключаем радио
*/
static void logic_off_radio(uint8_t beep)
{
if(fl_radio_power == 1){
if(beep == BEEP_YES) BEEP();
radio_fm_off();
fl_radio_power = 0;
fl_active_radio = 0;
fl_mode_radio = 1;
fl_kn_search = 0;
fl_search_radio = 0;
ind_blank2(BL_CLEAR);
timer_stop(TIMER_RADIO);
if(timer_active(TIMER_30SEK) == 1) timer_reset(TIMER_30SEK);
ind_fm(number_radio_st, 0);
ind_fm_chast(0, 0);
keyb_en_off();
Ind_LED_Off(LED_IMG_FM);
Ind_LED_Off(LED_IMG_RADOI);
logic_radio_deactive(BEEP_NOT);
}
}
/*
* Изменяем частоту радиостанции
*/
static void logic_radio_izm_chast(void)
{
timer_reset(TIMER_RADIO);
fl_kn_search = 0;
fl_search_radio = 0;
radio_fm_on(radio_chast, number_radio_st);
ind_fm_chast(radio_chast, 1);
if(timer_active(TIMER_30SEK) == 1) timer_reset(TIMER_30SEK);
}
/*
* Изменяем громкость радио
*/
static void logic_radio_volume(uint8_t beep)
{
if(beep == BEEP_YES) BEEP();
timer_reset(TIMER_RADIO);
fl_kn_search = 0;
fl_search_radio = 0;
if(timer_active(TIMER_30SEK) == 1) timer_reset(TIMER_30SEK);
if(keyb_en_adr() != (uint16_t*)&radio_vol){ // Если включаем изменение громкости
keyb_en(&radio_vol, 0, 15, 1, 0);
ind_blank2(BL_VOLUME);
}else{ // Если выключаем изменение громкости
keyb_en(&radio_chast, RADIO_CHAST_MIN, RADIO_CHAST_MAX, 1, 1);
ind_blank2(BL_CLEAR);
}
}
/*
* Сохраняем частоту радиостанции
*/
static void logic_radio_seve(uint8_t beep)
{
if(beep == BEEP_YES) BEEP_LONG();
timer_reset(TIMER_RADIO);
fl_kn_search = 0;
fl_search_radio = 0;
if(timer_active(TIMER_30SEK) == 1) timer_reset(TIMER_30SEK);
radio_fm_save(number_radio_st, radio_chast);
ind_blank2(BL_STAN);
}
/*
* Деактивация радио
*/
void logic_radio_deactive(uint8_t beep)
{
if(beep == BEEP_YES) BEEP();
if(timer_active(TIMER_30SEK) == 1) timer_reset(TIMER_30SEK);
ind_blank2(BL_CLEAR);
fl_kn_search = 0;
fl_search_radio = 0;
fl_active_radio = 0;
timer_stop(TIMER_RADIO);
ind_fm(number_radio_st, 0);
ind_fm_chast(0, 0);
keyb_en_off();
if(state_mode == STANDBY_MODE) logic_mode_standby(0); // Если режим остановки
else if(state_mode == MENU_MODE){ // Если режим меню
keyb_en((uint16_t*)&lg_cook_complex.cProgramNumber, 0, 19, 1, 1); // Энкодер на изменение программы
ind_taim(lg_cook_complex.iCookTime, 1); // Выводим время приготовления
Ind_LED_On(LED_MP);
Ind_LED_On(LED_TIME_LOAD);
Ind_LED_Off(LED_LOAD_START);
ind_produkt();
}
else if(state_mode == COOKING_MODE){ // Если режим приготовления
if(state_cooking == STAGE_POSTPONEMENT){
ind_taim(lg_cook_complex.iPostPonementTime, 1);
Ind_LED_Off(LED_TIME_LOAD);
Ind_LED_On(LED_LOAD_START);
ind_blank1(BL_MP);
}else{
Ind_LED_On(LED_TIME_LOAD);
if(lg_cook_complex.cProgramNumber != (uint8_t)EXPRESS_PROGRAM){
ind_taim(lg_cook_complex.iCookTime, 1);
if(state_cooking == STAGE_STAT || lg_cook_complex.bBoost == FALSE) ind_blank1(BL_MP); // Если идет отсчет времени
else Ind_LED_On(LED_MP);
}else ind_blank1(BL1_ZM);
}
}
else if(state_mode == KEEP_MODE){ // Если режим подогрева
ind_taim(keep_warm_time, 1);
ind_blank1(BL_MP);
}
}
/*
* Поиск радиостанций
*/
static void logic_radio_search(uint8_t beep)
{
if(keyb_en_adr() != &radio_vol){
if(beep == BEEP_YES) BEEP();
timer_reset(TIMER_RADIO);
if(timer_active(TIMER_30SEK) == 1) timer_reset(TIMER_30SEK);
keyb_en_off();
if(radio_chast < RADIO_CHAST_MAX) radio_chast ++; else radio_chast = RADIO_CHAST_MIN;
radio_fm_on(radio_chast, 0);
ind_fm_chast(radio_chast, 1);
fl_search_radio = 1;
}
}
/*
* Остановка поиска радиостанций
*/
static void logic_radio_search_stop(uint8_t beep)
{
if(beep == BEEP_YES) BEEP();
timer_reset(TIMER_RADIO);
if(timer_active(TIMER_30SEK) == 1) timer_reset(TIMER_30SEK);
fl_search_radio = 0;
fl_kn_search = 0;
keyb_en(&radio_chast, RADIO_CHAST_MIN, RADIO_CHAST_MAX, 1, 1);
}
//===============================================================================
// Функции основной работы мультиварки
//===============================================================================
/*
* Режим полного останова мультиварки
*/
void logic_mode_standby(uint8_t beep)
{
if(beep == BEEP_YES) BEEP();
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_stop(TIMER_BEEP_3_10);
timer_ready_clr(TIMER_BEEP_3_10); // 21_09_2015 V1_1
timer_stop(TIMER_5SEC_MENU);
timer_stop(TIMER_TEST_MODE);
timer_stop(TIMER_RADIO);
timer_stop(TIMER_POWER_1_MIN);
timer_stop(TIMER_SOUND_ON_OFF);
timer_stop(TIMER_ERROR);
lg_cook_complex.cProgramNumber = (uint8_t)ASPIC_PROGRAM;
ind_blank0(BL_CLEAR); // Сбрасываем индикацию
ind_blank0(BL_STANDBY);
ind_taim(0, 4); // ----
keyb_en_off();
fl_active_radio = 0;
}
/*
* Режим меню (установка параметров приготовления)
*/
static void logic_mode_menu(uint8_t beep)
{
if(beep == BEEP_YES) BEEP();
state_mode = MENU_MODE; // Состояние установки программы
cook_load_program(); // Заполнение структуры нужной программой
ind_blank0(BL_CLEAR); // Сбрасываем индикацию
ind_blank0((ind_state_blank)(lg_cook_complex.cProgramNumber | 0xC0)); // Устанвка blank программы
keyb_en((uint16_t*)&lg_cook_complex.cProgramNumber, 0, 19, 1, 1); // Энкодер на изменение программы
ind_taim(lg_cook_complex.iCookTime, 1); // Выводим время приготовления
Ind_LED_On(LED_MP);
if(lg_cook_complex.cKeepWarmTime > 0){ // Если возможен подогрев
//Ind_LED_On(LED_ESC); // Выводим индикацию подогрева
Ind_LED_On(LED_HEATING);
}
if(lg_cook_complex.cProductNumber != 0xFF) Ind_LED_On(LED_MEAT); // Если возможен продукт
Ind_LED_On(LED_TIME_LOAD);
timer_stop(TIMER_5SEC_MENU);
timer_reset(TIMER_30SEK); // Включем таймер 1 минута
timer_start(TIMER_30SEK);
}
/*
* Режим приготовления
*/
static void logic_mode_cooking(uint8_t beep)
{
if(beep == BEEP_YES) BEEP_LONG();
state_mode = COOKING_MODE;
keyb_en_off();
if(lg_cook_complex.iPostPonementTime != 0) // Если включен таймер отложенного старта
{
logic_go_delay_start(); // Запуск отложенного старта
}
else logic_go_start(); // Запускаем программу приготовления
}
/*
* Процесс приготовления
*/
static void logic_go_start(void)
{
ind_blank0(BL_CLEAR); // Сбрасываем индикацию
logic_radio_deactive(BEEP_NOT);
if(lg_cook_complex.cProgramNumber == (uint8_t)PASTA_PROGRAM){ // Если программа "МАКАРОНЫ"
state_cooking = STAGE_BOOST; // Нагрев до кипения перед закладкой продуктов
}
else if(lg_cook_complex.cProgramNumber == (uint8_t)BREAD_PROGRAM){ // Если программа "ХЛЕБ"
if(state_cooking == STAGE_BREAD_LOAD){ // Если мы пришли после пропадания питания
lg_cook_complex.cHeatEnable = HEAT_MAIN; // Используем только нижний тен
}else{
if(lg_cook_complex.iCookTime < 60){ // Если хлеб делается меньше 1 часа сразу запускаем выпекание
state_cooking = STAGE_WARM;
lg_cook_complex.cHeatEnable = (HEAT_TOP | HEAT_SIDE | HEAT_MAIN); // Включаем все тены
}else{
state_cooking = STAGE_BREAD_LOAD; // Иначе включаем закваску хлеба на 1 час.
lg_cook_complex.cHeatEnable = HEAT_MAIN; // Используем только нижний тен
}
}
}
else if(lg_cook_complex.cProgramNumber == (uint8_t)MULTICOOK_PROGRAM){ // Если программа "Мультиповар"
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);
lg_cook_complex.cBotTempWarm = lg_cook_complex.cCookTemp - 4;
lg_cook_complex.cBotTempStat = lg_cook_complex.cCookTemp - 1;
if(lg_cook_complex.cCookTemp > 94 && lg_cook_complex.cCookTemp < 115){
lg_cook_complex.cTopTempStat = cook_param_get_top_stat(lg_cook_complex.cProgramNumber, lg_cook_complex.cCookTemp);
}
else if(lg_cook_complex.cCookTemp < 60){
lg_cook_complex.cBotTempWarm = lg_cook_complex.cCookTemp - 12;
lg_cook_complex.cBotTempStat = lg_cook_complex.cCookTemp - 6;
lg_cook_complex.cPWMstat = 4;
lg_cook_complex.cPWM_kp = 3;
}
state_cooking = STAGE_WARM;
}else state_cooking = STAGE_WARM; // Нагрев с продуктами до рабочей температуры
if(lg_cook_complex.cProgramNumber != (uint8_t)EXPRESS_PROGRAM)
{
Ind_LED_On(LED_TIME_LOAD);
Ind_LED_Off(LED_LOAD_START);
ind_taim(lg_cook_complex.iCookTime, 1); // Выводим время приготовления
logic_ind_delay_i_start();
}
if(lg_cook_complex.bBoost == TRUE) ind_blank1(BL1_TAIM);
}
/**
* Отложенный старт
*/
static void logic_go_delay_start(void)
{
logic_radio_deactive(BEEP_NOT);
ind_blank0(BL_CLEAR); // Сбрасываем индикацию
state_cooking = STAGE_POSTPONEMENT; // Отложенный старт
Ind_LED_On(LED_LOAD_START);
ind_taim(lg_cook_complex.iPostPonementTime, 1);
logic_ind_delay_i_start();
}
static void logic_ind_delay_i_start(void)
{
timer_reset(TIMER_1MIN_START);
timer_start(TIMER_1MIN_START);
timer_stop(TIMER_30SEK);
timer_stop(TIMER_5SEC_MENU);
if(lg_cook_complex.bBoost == false) ind_blank1(BL_MP);
else Ind_LED_On(LED_MP);
if(lg_cook_complex.cProgramNumber == (uint8_t)MULTICOOK_PROGRAM){
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_HEATING);
}
Ind_LED_On(LED_START);
ind_prog_on_of(lg_cook_complex.cProgramNumber, 1);
if(lg_cook_complex.cProductNumber != 0xFF){ // Если выбран продукт
switch(lg_cook_complex.cProductNumber)
{
case 0: Ind_LED_On(LED_MEAT); break;
case 1: Ind_LED_On(LED_CHICKEN); break;
case 2: Ind_LED_On(LED_FISH); break;
case 3: Ind_LED_On(LED_VEGETABLES); break;
}
}
}
/**
* Включение выключение подогрева
*/
static void logic_on_off_keepwarm(uint8_t beep)
{
if(state_mode == MENU_MODE) timer_reset(TIMER_30SEK);
if(lg_cook_complex.bKeepWarmEnabled == TRUE) // Если включен выключаем
{
if(beep == BEEP_YES) BEEP();
lg_cook_complex.bKeepWarmEnabled = FALSE;
Ind_LED_Off(LED_ESC);
Ind_LED_Off(LED_HEATING);
}
else // Включаем
{
if(lg_cook_complex.cKeepWarmTime > 0 && lg_cook_complex.cCookTemp > 80) // Если разрешен подогрев
{
if(beep == BEEP_YES) BEEP();
lg_cook_complex.bKeepWarmEnabled = TRUE;
if(state_mode != MENU_MODE)Ind_LED_On(LED_ESC);
Ind_LED_On(LED_HEATING);
}
}
}
/*===================================================================
* Функции меню
===================================================================*/
/*
* Выбор настройки времени отложенного старта / времени готовки
*/
static void logic_menu_taim(uint8_t beep)
{
if(beep == BEEP_YES) BEEP();
if(state_mode == MENU_MODE){ // Если мы в режиме меню
timer_reset(TIMER_30SEK); // Обнуляем таймер 1 минуты
timer_reset(TIMER_5SEC_MENU); // Запускаем таймер 5 секунд
timer_start(TIMER_5SEC_MENU);
Ind_LED_On(LED_MP); // Включем индикацию точек
ind_produkt(); // Индикация продукта
if(keyb_en_adr() != (uint16_t*)&lg_cook_complex.iCookTime){ // Если энкодер меняет не время приготовления
ind_blank1(BL1_TAIM_CLOK); // Устанавливаем изменение часов времени приготовление
keyb_en((uint16_t*)&lg_cook_complex.iCookTime, lg_cook_complex.iMinTime, lg_cook_complex.iMaxTime, 60, 1);
}else{ // Устанавливаем изменение часов времени отложенного старта
if(lg_cook_complex.bPostPonementEnabled == true){ // Если возможен отложеный старт
ind_blank1(BL1_DELAY_CLOK);
keyb_en((uint16_t*)&lg_cook_complex.iPostPonementTime, 0, 24*60, 60, 1);
}
}
}
else if(state_mode == COOKING_MODE){ // Если мы в режиме варки
timer_reset(TIMER_5SEC_MENU);
timer_start(TIMER_5SEC_MENU);
if(state_cooking == STAGE_POSTPONEMENT){ // Если мы в отложенном старте
Ind_LED_Off(LED_LOAD_START);
Ind_LED_On(LED_TIME_LOAD);
ind_taim(lg_cook_complex.iCookTime, 1);
ind_blank1(BL_CLEAR);
Ind_LED_On(LED_MP);
}else{ // Если мы в процессе варки
ind_blank1(BL_CLEAR);
Ind_LED_On(LED_MP);
ind_blank1(BL1_TAIM_CLOK_M_SH);
master_shef_time = lg_cook_complex.iCookTime;
keyb_en((uint16_t*)&master_shef_time, 0, lg_cook_complex.iMaxTime, 60, 1);
}
}
}
/*
* Выбор настройки времени час / минуты
*/
static void logic_menu_clok_min(void)
{
if(timer_active(TIMER_5SEC_MENU) == 1){ // Если мы в режиме установки времени
if(keyb_en_adr() != (uint16_t*)&lg_cook_complex.cCookTemp &&\
state_cooking != STAGE_POSTPONEMENT) BEEP();
timer_reset(TIMER_30SEK);
timer_reset(TIMER_5SEC_MENU);
if(keyb_en_adr() == (uint16_t*)&lg_cook_complex.iCookTime){ // Если энкодер меняет время приготовления
if(keyb_en_shag() == 60){ // Если шаг 60 минут значит переключаем на изменение минут
ind_blank1(BL1_TAIM_MIN);
if(lg_cook_complex.iCookTime > 59){ // Если время больше 1 часа
uint16_t max_t = ((lg_cook_complex.iCookTime/60)*60+(60 - lg_cook_complex.cStepTime[1]));
if(max_t > lg_cook_complex.iMaxTime) max_t = lg_cook_complex.iMaxTime;
keyb_en((uint16_t*)&lg_cook_complex.iCookTime, ((lg_cook_complex.iCookTime/60)*60), max_t, lg_cook_complex.cStepTime[1], 1);
}else{ // Если меньше часа
uint16_t max_t = (60 - lg_cook_complex.cStepTime[0]);
if(lg_cook_complex.iMinTime < lg_cook_complex.cStepTime[0]) max_t = (60 - lg_cook_complex.iMinTime);
if(lg_cook_complex.iMaxTime < 60) max_t = lg_cook_complex.iMaxTime;
keyb_en((uint16_t*)&lg_cook_complex.iCookTime, lg_cook_complex.iMinTime, max_t, lg_cook_complex.cStepTime[0], 1);
}
}else{ // Переключаем на изменение часов
ind_blank1(BL1_TAIM_CLOK);
keyb_en((uint16_t*)&lg_cook_complex.iCookTime, lg_cook_complex.iMinTime, lg_cook_complex.iMaxTime, 60, 1);
}
}
else if(keyb_en_adr() == (uint16_t*)&lg_cook_complex.iPostPonementTime){ // Если энкодер меняет время отложенного старта
if(keyb_en_shag() == 60){ // Если шаг 60 минут значит переключаем на изменение минут
uint16_t min, max;
ind_blank1(BL1_DELAY_MIN);
min = (lg_cook_complex.iPostPonementTime/60)*60;
max = (lg_cook_complex.iPostPonementTime/60)*60+59;
if(min == (24*60)){ // Если 24 часа
min = 0; max = 59;
}
keyb_en((uint16_t*)&lg_cook_complex.iPostPonementTime, min, max, 1, 1);
}else{ // Переключаем на изменение часов
ind_blank1(BL1_DELAY_CLOK);
keyb_en((uint16_t*)&lg_cook_complex.iPostPonementTime, 0, 24*60, 60, 1);
}
}
else if(keyb_en_adr() == (uint16_t*)&lg_cook_complex.cProductNumber){ // Если изменялся продукт
timer_stop(TIMER_5SEC_MENU);
keyb_en((uint16_t*)&lg_cook_complex.cProgramNumber, 0, 19, 1, 1);
ind_blank1(BL_CLEAR);
Ind_LED_On(LED_TIME_LOAD);
Ind_LED_On(LED_MP);
ind_produkt();
}
else if(keyb_en_adr() == (uint16_t*)&lg_cook_complex.cCookTemp){ // Если изменялась температура
// timer_stop(TIMER_5SEC_MENU);
// keyb_en((uint16_t*)&lg_cook_complex.cProgramNumber, 0, 19, 1, 1);
// ind_blank1(BL_CLEAR);
// Ind_LED_On(LED_TIME_LOAD);
// Ind_LED_On(LED_MP);
// ind_produkt();
BEEP();
}
else if(keyb_en_adr() == (uint16_t*)&master_shef_time){ // Если энкодер меняет время приготовления мастер шеф
if(keyb_en_shag() == 60){ // Если шаг 60 минут значит переключаем на изменение минут
ind_blank1(BL1_TAIM_MIN_M_SH);
if(master_shef_time > 59){ // Если время больше 1 часа
uint16_t max_t = ((master_shef_time/60)*60+(60 - 1)),
min_t = (master_shef_time/60)*60;
if(max_t >= lg_cook_complex.iMaxTime){
max_t = 59;//lg_cook_complex.iMaxTime;
min_t = 0;
}
keyb_en((uint16_t*)&master_shef_time, min_t, max_t, 1, 1);
}else{ // Если меньше часа
uint16_t max_t = (60 - 1);
if(lg_cook_complex.iMinTime < 1) max_t = (60 - lg_cook_complex.iMinTime);
if(lg_cook_complex.iMaxTime < 60) max_t = lg_cook_complex.iMaxTime;
keyb_en((uint16_t*)&master_shef_time, 0, max_t, 1, 1);
}
}else{ // Переключаем на изменение часов
ind_blank1(BL1_TAIM_CLOK_M_SH);
keyb_en((uint16_t*)&master_shef_time, 0, lg_cook_complex.iMaxTime, 60, 1);
}
}
}
}
/**
* Обработка изменения времени, температуры и продукта
*/
static void logic_menu_izm_tain(uint8_t kn_en)
{
timer_reset(TIMER_30SEK);
timer_reset(TIMER_5SEC_MENU);
if(kn_en == EN_TIME_KEY){ // Изменение времени приготовления
ind_blank1_clear_fl();
if(lg_cook_complex.cProgramNumber == (uint8_t)MULTICOOK_PROGRAM && \
lg_cook_complex.cCookTemp >= 130 && \
lg_cook_complex.iCookTime > 120) lg_cook_complex.iCookTime = 120;
ind_taim(lg_cook_complex.iCookTime, 1);
}
else if(kn_en == EN_DTIME_KEY){ // Изменение времени отложенного старта
ind_blank1_clear_fl();
if(keyb_en_max() < lg_cook_complex.iPostPonementTime) lg_cook_complex.iPostPonementTime = keyb_en_max();
ind_taim(lg_cook_complex.iPostPonementTime, 1);
}
else if(kn_en == EN_TEMP_KEY){ // Изменение температуры приготовления
ind_blank1_clear_fl();
if(lg_cook_complex.cProgramNumber == (uint8_t)MULTICOOK_PROGRAM && \
lg_cook_complex.cCookTemp >= 130 && \
lg_cook_complex.iCookTime > 120) lg_cook_complex.iCookTime = 120;
ind_temperature(lg_cook_complex.cCookTemp, 1);
}
else if(kn_en == EN_PRODUKT_KEY){ // Изменение продукта
uint8_t n_prd = cook_number_produkts(lg_cook_complex.cProgramNumber);
BEEP();
ind_blank1_clear_fl();
Ind_LED_On(LED_MEAT);
Ind_LED_On(LED_CHICKEN);
Ind_LED_On(LED_FISH);
if(n_prd == 3) Ind_LED_On(LED_VEGETABLES);
switch(lg_cook_complex.cProductNumber)
{
case 0: Ind_LED_Off(LED_MEAT); break;
case 1: Ind_LED_Off(LED_CHICKEN); break;
case 2: Ind_LED_Off(LED_FISH); break;
case 3: Ind_LED_Off(LED_VEGETABLES); break;
}
cook_time_produkt(lg_cook_complex.cProgramNumber, lg_cook_complex.cProductNumber);
ind_taim(lg_cook_complex.iCookTime, 1);
}
else if(kn_en == EN_TIME_KEY_M_SH){ // Изменение времени приготовления
ind_blank1_clear_fl();
if(keyb_en_max() < master_shef_time) master_shef_time = keyb_en_max();
ind_taim(master_shef_time, 1);
}
else if(kn_en == EN_TEMP_KEY_M_SH){ // Изменение температуры приготовления
ind_blank1_clear_fl();
ind_temperature(master_shef_temp, 1);
}
}
/**
* Меню изменения температуры
*/
static void logic_menu_temp(uint8_t beep)
{
if(state_mode == MENU_MODE){
if(lg_cook_complex.cProgramNumber == (uint16_t)MULTICOOK_PROGRAM){ // Если программа мультиповар
if(beep == BEEP_YES) BEEP();
timer_reset(TIMER_30SEK);
timer_reset(TIMER_5SEC_MENU);
timer_start(TIMER_5SEC_MENU);
ind_blank1(BL1_TEMP);
Ind_LED_On(LED_TIME_LOAD);
keyb_en((uint16_t*)&lg_cook_complex.cCookTemp, lg_cook_complex.cMinValueTemp, lg_cook_complex.cMaxValueTemp, 5, 1);
}
}
else if(state_mode == COOKING_MODE && state_cooking != STAGE_POSTPONEMENT/*&& state_cooking == STAGE_STAT*/){ // Если процес варки и состояние поддержания
if(lg_cook_complex.cProgramNumber != (uint16_t)EXPRESS_PROGRAM){
if(beep == BEEP_YES) BEEP();
timer_reset(TIMER_5SEC_MENU);
timer_start(TIMER_5SEC_MENU);
master_shef_temp = lg_cook_complex.cCookTemp;
ind_blank1(BL1_TEMP_M_SH);
Ind_LED_On(LED_TIME_LOAD);
keyb_en((uint16_t*)&master_shef_temp, lg_cook_complex.cMinValueTemp, lg_cook_complex.cMaxValueTemp, 1, 1);
}
}
}
/**
* Меню изменения продукта
*/
static void logic_menu_produkt(uint8_t beep)
{
if(lg_cook_complex.cProductNumber != 0xFF){ // Если возможно изменение продукта
uint16_t max_prod;
if(beep == BEEP_YES) BEEP();
timer_reset(TIMER_30SEK);
timer_reset(TIMER_5SEC_MENU);
timer_start(TIMER_5SEC_MENU);
Ind_LED_On(LED_MP);
Ind_LED_On(LED_TIME_LOAD);
Ind_LED_Off(LED_LOAD_START);
ind_blank1(BL1_PRODUKT);
max_prod = (uint16_t)cook_number_produkts(lg_cook_complex.cProgramNumber);
keyb_en((uint16_t*)&lg_cook_complex.cProductNumber, 0, max_prod, 1, 1);
ind_taim(lg_cook_complex.iCookTime, 1);
}
}
/**
* Запуск времени готовки "МАКАРОН"
*/
static void logic_go_time_pasta(uint8_t beep)
{
if(beep == BEEP_YES) BEEP_LONG();
state_cooking = STAGE_STAT; // Поддержание температуры варки
timer_stop(TIMER_BEEP_3_10); // Отключаем beep
timer_ready_clr(TIMER_BEEP_3_10); // 21_09_2015 V1_1
ind_blank1(BL_MP);
Ind_LED_On(LED_TIME_LOAD);
}
/**
* Подогрев
*/
static void logic_go_keepwarm(uint8_t beep)
{
logic_radio_deactive(BEEP_NOT);
if(beep == BEEP_YES) // Если мы пришли из режима ожидания
{
BEEP();
lg_cook_complex.cProgramNumber = (uint8_t)KEEP_PROGRAM;
cook_load_program(); // Заполнение структуры нужной программой
}
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 температуры приготовления
fl_active_radio = 0;
timer_reset(TIMER_1MIN_START);
timer_start(TIMER_1MIN_START);
timer_stop(TIMER_30SEK);
timer_stop(TIMER_5SEC_MENU);
state_mode = KEEP_MODE; // Режим подогрева
state_cooking = STAGE_KEEPWARM; // Статус варки подогрев
ind_blank0(BL_CLEAR);
ind_blank1(BL_MP);
if(beep != 2) keep_warm_time = 0;
ind_taim(keep_warm_time, 1);
Ind_LED_On(LED_ESC);
Ind_LED_On(LED_HEATING);
}
/**
* Запуск программы экспресс
*/
static void logic_cooking_express(uint8_t beep)
{
if(beep == BEEP_YES) BEEP();
fl_active_radio = 0;
timer_reset(TIMER_1MIN_START);
timer_start(TIMER_1MIN_START);
timer_stop(TIMER_30SEK);
timer_stop(TIMER_5SEC_MENU);
state_mode = COOKING_MODE;
lg_cook_complex.cProgramNumber = (uint8_t)EXPRESS_PROGRAM;
cook_load_program(); // Заполнение структуры нужной программой
logic_go_start(); // Запускаем программу приготовления
Ind_LED_Off(LED_MP);
ind_blank1(BL1_ZM);
Ind_LED_On(LED_START);
Ind_LED_On(LED_TIME_LOAD);
}
/**
* Обработка таймеров отложенного старта, работы, подогрев.
*/
static void logic_tim_1min(void)
{
switch(state_cooking)
{
case STAGE_POSTPONEMENT: // Отложенный старт
{
lg_cook_complex.iPostPonementTime --;
if(lg_cook_complex.iPostPonementTime > 0)
{
if(fl_active_radio == 0) ind_taim(lg_cook_complex.iPostPonementTime, 1);
}
else{
logic_go_start();
logic_beep_3(3); // beep_3
}
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){
if(lg_cook_complex.iCookTime > 0)lg_cook_complex.iCookTime--;
if(lg_cook_complex.iCookTime > 0) {
if(fl_active_radio == 0) ind_taim(lg_cook_complex.iCookTime, 1);
}else { // Если вышло время приготовления
if(lg_cook_complex.bKeepWarmEnabled == TRUE) logic_go_keepwarm(0); // Если включен подогрев
else logic_mode_standby(0);
logic_beep_3(3); // beep_3
}
}
}
break;
}
case STAGE_KEEPWARM: // Подогрев
{
if(++keep_warm_time < (uint16_t)(lg_cook_complex.cKeepWarmTime * 60))
{
if(fl_active_radio == 0) ind_taim(keep_warm_time, 1);
}
else {
logic_mode_standby(0);
logic_beep_3(3);
}
break;
}
}
}
/**
* BEEP 3
*/
void logic_beep_3(uint8_t state)
{
fl_nimber_beep = state;
timer_init(TIMER_BEEP_3,50,0);
timer_start(TIMER_BEEP_3);
}
/**
* logic_ind_end
*/
void logic_ind_end(void)
{
timer_init(TIMER_IND_END,300,0); // 3 sec
timer_start(TIMER_IND_END);
ind_taim(0, 10); // End
}
/**
* Пэринг ble
*/
static void appl_paring(void)
{
BEEP();
ind_blank1(BL_CLEAR); // Сбрасываем индикацию
ind_blank1(BL1_PARING); // Индикация перинга
ind_paring(1);
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);
}
/**
* Унпэринг ble
*/
static void appl_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(BEEP_YES);
}
else if(lg_cook_complex.cProgramNumber == (uint8_t)KEEP_PROGRAM){ // 21_09_2015 V1_1
logic_go_keepwarm(BEEP_YES);
}
else logic_mode_cooking(BEEP_YES);
return true;
}
else if(state_mode == POWER_MODE){
application_power_mode_go(BEEP_YES); // Продолжение работы программы
return true;
}
else if(state_mode == COOKING_MODE){ // 21_09_2015 V1_1
if(state_cooking == STAGE_ENDOFBOOST){
logic_go_time_pasta(BEEP_YES);
return true;
}
}
return false;
}
/**
* Stop
*/
bool Appl_Stop(void){
if(state_mode != ERROR_MODE) logic_mode_standby(BEEP_YES); // 21_09_2015 V1_1
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:
{
if(lg_cook_complex.cProgramNumber == RICE_CEREALS_PROGRAM || \
lg_cook_complex.cProgramNumber == STEAM_PROGRAM || \
lg_cook_complex.cProgramNumber == FRY_PROGRAM || \
lg_cook_complex.cProgramNumber == FRYING_PROGRAM) return APPL_BOOST_STATE;
return APPL_COOKING_STATE;
}
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;// 21_09_2015 V1_1
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 < 22) // 21 21_09_2015 V1_1
{
state_mode = MENU_MODE;
state_cooking = STAGE_PROGRAM;
lg_cook_complex.cProgramNumber = prog;
if(prog < 20) logic_mode_menu(1);
return true;
}
return false;
}
/**
* Get program
*/
uint8_t Appl_GetProgram(void){
return (uint8_t)lg_cook_complex.cProgramNumber;
}
/**
* Set produkt
*/
bool Appl_SetProdukt(uint8_t prod)
{
if(prod > APPL_VEGETABLES_PROD) return false;
if(state_mode != MENU_MODE) return false;
timer_reset(TIMER_30SEK);
if(lg_cook_complex.cProductNumber != 0xFF){// Если возможно задание продукта
if(prod == APPL_NOT_PROD) return false;
if(lg_cook_complex.cProgramNumber == ASPIC_PROGRAM && prod == APPL_VEGETABLES_PROD) return false;
lg_cook_complex.cProductNumber = prod-1;
ind_produkt();
}else if(prod != APPL_NOT_PROD) return false;
return true;
}
/**
* Get produkt
*/
uint8_t Appl_GetProdukt(void){
uint8_t prod = (uint8_t)lg_cook_complex.cProductNumber;
switch(prod)
{
case 0: prod = APPL_MEAT_PROD; break;
case 1: prod = APPL_CHICKEN_PROD; break;
case 2: prod = APPL_FISH_PROD; break;
case 3: prod = APPL_VEGETABLES_PROD; break;
default: prod = APPL_NOT_PROD; break;
}
return prod;
}
/**
* 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;// 21_09_2015 V1_1
if(state_mode == COOKING_MODE){
timer_reset(TIMER_ERROR);
timer_start(TIMER_ERROR);
}
lg_cook_complex.cCookTemp = temp; // Меняем температуру
temp_set_warm = cook_temp_d_warm();
if(temp > temp_set_warm) lg_cook_complex.cBotTempWarm = temp - temp_set_warm;
else lg_cook_complex.cBotTempWarm = 10;
lg_cook_complex.cBotTempStat = temp - cook_temp_d_stat();
lg_cook_complex.cTopTempStat = cook_param_get_top_stat(lg_cook_complex.cProgramNumber, lg_cook_complex.cCookTemp);
if(lg_cook_complex.cProgramNumber == (uint8_t)MULTICOOK_PROGRAM && state_mode == MENU_MODE){// Если программа мультиповар
ind_temperature(temp, 1); // Выводим значение темперытуры
Ind_LED_Off(LED_MP);
}
if(lg_cook_complex.cCookTemp < 80){ // Если установлена температура ниже 80 градусов
if(lg_cook_complex.bKeepWarmEnabled == TRUE){ // Отключаем подогрев
lg_cook_complex.bKeepWarmEnabled = FALSE;
Ind_LED_Off(LED_HEATING);
Ind_LED_Off(LED_ESC);
}
}
if(lg_cook_complex.cCookTemp > 130){
if(lg_cook_complex.iCookTime > 2*60) lg_cook_complex.iCookTime = 2*60;
}
return true;
}
}
return false;
}
/**
* Get cooking temperature
*/
uint8_t Appl_GetCookTemp(void){
if(lg_cook_complex.cProgramNumber == (uint8_t)KEEP_PROGRAM){
return 70;
}
if(state_mode == KEEP_MODE) 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
Ind_LED_On(LED_MP);
}
if(state_mode == MENU_MODE){
if(lg_cook_complex.iMinTime <= time && lg_cook_complex.iMaxTime >= time){ // Проверка задаваемого вермени варки
lg_cook_complex.iCookTime = time;
// if(lg_cook_complex.cCookTemp > 130){
// if(lg_cook_complex.iCookTime > 2*60) lg_cook_complex.iCookTime = 2*60;
// }
if(state_cooking != STAGE_POSTPONEMENT) ind_taim(lg_cook_complex.iCookTime, 1); // Выводим индикацию установленого времени
return true;
}
}else{
if(lg_cook_complex.iMaxTime >= time){ // Проверка задаваемого времени варки
lg_cook_complex.iCookTime = time;
if(lg_cook_complex.cCookTemp > 130){
if(lg_cook_complex.iCookTime > 2*60) lg_cook_complex.iCookTime = 2*60;
}
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){
lg_cook_complex.iPostPonementTime = 0;
return true;
}else{
if(lg_cook_complex.bPostPonementEnabled == TRUE && time <= (24*60+lg_cook_complex.iCookTime)) // Если возможна устанока отложенного старта и коректное время
{
if(time < lg_cook_complex.iCookTime) return false;
lg_cook_complex.iPostPonementTime = time-lg_cook_complex.iCookTime;
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 + lg_cook_complex.iCookTime);
}
/**
* Get time to end of cooking in minutes
*/
uint16_t Appl_GetEndTime(void)
{
// оставшееся время варки и время отложенного старты
if(state_cooking == STAGE_POSTPONEMENT) return lg_cook_complex.iPostPonementTime;
else{
if(lg_cook_complex.cProgramNumber == (uint8_t)KEEP_PROGRAM) return keep_warm_time;
return lg_cook_complex.iCookTime;
}
}
/**
* Set reheat state
*/
bool Appl_SetReheat(uint8_t state)
{
if(state_mode == MENU_MODE || state_mode == COOKING_MODE)
{
if(state_mode == MENU_MODE) timer_reset(TIMER_30SEK);
if(state == 0){
if(lg_cook_complex.bKeepWarmEnabled == TRUE) // Если включен выключаем
{
BEEP();
lg_cook_complex.bKeepWarmEnabled = FALSE;
Ind_LED_Off(LED_ESC);
Ind_LED_Off(LED_HEATING);
return true;
}
}else if(state == 1)
{
if(lg_cook_complex.bKeepWarmEnabled == FALSE)
{
if(lg_cook_complex.cKeepWarmTime > 0 && lg_cook_complex.cCookTemp > 80) // Если разрешен подогрев
{
BEEP();
lg_cook_complex.bKeepWarmEnabled = TRUE;
if(state_mode != MENU_MODE)Ind_LED_On(LED_ESC);
Ind_LED_On(LED_HEATING);
return true;
}
}
}
}
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;
}
/**
******************************************************************************
* Appl FM functions
******************************************************************************
*/
uint8_t* Appl_FM_State(void)
{
static uint8_t fm_state[5];
fm_state[0] = fl_radio_power;
fm_state[1] = number_radio_st-1;
fm_state[2] = (uint8_t)(radio_chast/10);
fm_state[3] = (uint8_t)(radio_chast%10);
fm_state[4] = radio_vol;
if(fl_radio_power == 1 && fl_search_radio == 1) fm_state[0] = 2;
return (uint8_t*)fm_state;
}
bool Appl_FM_On_num(uint8_t num)
{
if(num < 9){
fl_active_radio = 0;
number_radio_st = num+1;
fl_mode_radio = 0;
radio_chast = 0;
logic_mode_radio(BEEP_YES);
return true;
}
return false;
}
bool Appl_FM_On_chs(uint16_t chs)
{
if(chs >= 760 && chs <= 1800){
fl_active_radio = 0;
fl_mode_radio = 0;
radio_chast = chs;//13_10_15
logic_mode_radio(BEEP_YES);
//radio_chast = chs;
//logic_radio_izm_chast();
return true;
}
return false;
}
bool Appl_FM_Off(void)
{
if(fl_radio_power == 1)
{
logic_off_radio(BEEP_YES);
fl_mode_radio = 0;
return true;
}
return false;
}
bool Appl_FM_Volume(uint8_t vol)
{
radio_vol = vol;
timer_reset(TIMER_RADIO);
radio_volume(radio_vol);
return true;
}
bool Appl_FM_SaveChs(uint8_t num, uint16_t chs)
{
if(num < 9 && chs > 759 && chs < 1801)
{
BEEP_LONG();
//timer_reset(TIMER_RADIO);
fl_kn_search = 0;
fl_search_radio = 0;
if(timer_active(TIMER_30SEK) == 1) timer_reset(TIMER_30SEK);
radio_fm_save(num+1, chs);
//ind_blank2(BL_STAN);
return true;
}
return false;
}
bool Appl_FM_StartAuto(void)
{
// if(fl_active_radio == 1){
// logic_radio_search(BEEP_YES); // Поиск станции
// return true;
// }
// return false;
if(fl_radio_power == 1)
{
if(fl_active_radio == 0)
{
fl_mode_radio = 0;
logic_mode_radio(BEEP_NOT);
}
logic_radio_search(BEEP_YES);
return true;
}
return false;
}
bool Appl_FM_StopAuto(void)
{
if(fl_search_radio == 1){
logic_radio_search_stop(BEEP_YES); // Остановка поиска станции
return true;
}
return false;
}
uint16_t Appl_FM_ReadChs(uint8_t num)
{
if(num < 9){
return radio_read_stations(num+1);
}
return 0;
}
bool Appl_SetBuzer(uint8_t st)//???????????????????????????????
{
uint8_t st_t;
if(st>1) return false;
st_t = (uint8_t)Buz_get();
if(st_t != st)
{
Buz_set((hw_buzzer_state_t)st);
if(st == 0) Ind_LED_On(LED_SOUND_OFF);
else Ind_LED_Off(LED_SOUND_OFF);
BEEP();
}
return true;
}
uint8_t Appl_GetBuzer(void)
{
return (uint8_t)Buz_get();
}
////////////////////////////////////////////////////////////////
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.bKeepWarmEnabled == TRUE){ // Если возможен подогрев led_подогрев
Ind_LED_On(LED_ESC);
Ind_LED_On(LED_HEATING);
}
Ind_LED_On(LED_START); // Led_start
ind_produkt();
if(lg_cook_complex.cProgramNumber == (uint8_t)EXPRESS_PROGRAM) // Если программа Экспресс
{
ind_blank1(BL1_ZM_TAIM); // Blank змейка
}
else /* Если рабочая программа */
{
ind_taim(lg_cook_complex.iCookTime, 1);
Ind_LED_On(LED_MP);
ind_blank1(BL1_TAIM);
ind_blank0((ind_state_blank)(lg_cook_complex.cProgramNumber | 0x80));
}
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; // Запускаем готовку
}
}
}
/*
* Обработка пропадения питания
*/
static void application_power_down(void)
{
if(power_read_down() != STATE_OK){ // Если питание ниже 2V7
if(state_mode == COOKING_MODE){ // И состояние работы
power_seve_params((cookcomplexprog *)&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((cookcomplexprog *)&lg_cook_complex, \
state_mode, \
state_cooking, \
keep_warm_time, 255); // Сохраняем текущие параметры
}
}
}
/**
********************************************************************
* Function test mode and image version hex
********************************************************************
*/
uint8_t logic_test_temp(void){
return test_ind_on;
}
static void logic_vesion(void)
{
uint8_t key_test = LONG_TEMP_KEY;
BEEP();
Ind_Clr();
while(key_test == LONG_TEMP_KEY || key_test == TEMP_KEY)
{
ind_taim_test(FIRMWARE_VER, TEST_VER);
Ind_Release();
keyb_clear();
Clk_Delay(50);
key_test = Keyb_GetKey();
}
if(key_test == PRODUKT_KEY) // TEST_MODE
{
BEEP_LONG();
ind_blank0(BL_CLEAR);// 05_11_2015
test_ind_on = 0;
state_mode = TEST_MODE;
state_cooking = STAGE_TEST;
timer_start(TIMER_TEST_MODE);
ind_taim_test(0, TEST_TEST); // Ind "tESt"
keyb_en(&test_en_key, 0, 5, 1, 1);
}
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 != 0){
if(f_key == OFF_OK_KEY) f_key = NOT_KEY;
test_ind_on = 0;
Ind_Clr();
//ind_taim_test(0, TEST_TEST); // Ind "tESt"
}
if(fl_radio_power == 1)
{
if(f_key != RADIO_KEY)
{
logic_off_radio(BEEP_YES);
fl_mode_radio = 0;
keyb_en(&test_en_key, 0, 5, 1, 1);
}
}
timer_reset(TIMER_TEST_MODE);
if(f_key == REHEAT_KEY){
heat_on_off(HEAT_TOP);
ind_taim_test(1, TEST_HEAT);
}
else if(f_key == DELAY_KEY){
heat_on_off(HEAT_SIDE);
ind_taim_test(2, TEST_HEAT);
}
else if(f_key == TEMP_KEY){
heat_on_off(HEAT_MAIN);
ind_taim_test(3, TEST_HEAT);
}
else if(f_key == PRODUKT_KEY){
heat_on_off(HEAT_OFF);
ind_taim_test(0, TEST_TEST); // Ind "tESt"
test_ind_on = 2;
}
else if(f_key == LONG_START_KEY)
{
logic_mode_standby(1);
}
else if(f_key == OK_KEY){
heat_on_off(HEAT_OFF);
test_ind_on = 1;
for(uint8_t i=0;i<8;i++) Ind_LED_On(i, 0xFFFF);
}
else if(f_key == EN_TEST_KEY)
{
test_ind_on = 1;
heat_on_off(HEAT_OFF);
ind_taim_test_en(test_en_key);
//ind_taim_test(test_en_key, TEST_ENCD);
}
else if(f_key == RADIO_KEY)
{
test_ind_on = 1;
fl_active_radio = 0;
fl_mode_radio = 0;
radio_chast = 901;
logic_mode_radio(BEEP_YES);
keyb_en(&test_en_key, 0, 5, 1, 1);
}
else{
heat_on_off(HEAT_OFF);
ind_taim_test(0, TEST_TEST); // Ind "tESt"
}
}
}
}
/*
* Выключение/включение звука
*/
static void logic_sound(uint8_t beep)
{
if(beep == BEEP_YES) BEEP();
sound_on_off = (uint16_t)Buz_get();
timer_reset(TIMER_SOUND_ON_OFF);
timer_start(TIMER_SOUND_ON_OFF);
if(sound_on_off == 0) ind_blank1(BL1_OFF); else ind_blank1(BL1_ON);
keyb_en(&sound_on_off, 0, 1, 1, 0); // Вращение в одну сторону устанавливает ON в другую OFF
// keyb_en(&sound_on_off, 0, 1, 1, 1); // Вращение в любую сторону попеременно устанавливает ON, OFF
}
static void logic_sound_izm(void)
{
timer_reset(TIMER_SOUND_ON_OFF);
if(sound_on_off == 0){
Ind_LED_On(LED_SOUND_OFF);
ind_blank1(BL1_OFF);
}else{
Ind_LED_Off(LED_SOUND_OFF);
ind_blank1(BL1_ON);
}
}
static void logic_sound_save(uint8_t key)
{
timer_stop(TIMER_SOUND_ON_OFF);
ind_blank1(BL_CLEAR);
if(keyb_en_adr() == (uint16_t*)&sound_on_off){
if(key == REHEAT_KEY) sound_on_off = (uint16_t)Buz_get();
else Buz_set((hw_buzzer_state_t)sound_on_off);
if(sound_on_off == 0) Ind_LED_On(LED_SOUND_OFF);
else Ind_LED_Off(LED_SOUND_OFF);
logic_mode_standby(BEEP_YES);
}
else{
if(key == OFF_OK_KEY) logic_mode_menu(BEEP_YES);
}
}