Программный модуль для обогревателя RFH-C4519S
ПО является неотъемлемой частью обогревателя RFH-C4519S, отдельно потребителю не поставляется и эксплуатируется только в составе устройства.
////////////////////////////////////////////////////////////////
//RFH-C4519S
//v1.8
//logic.c
////////////////////////////////////////////////////////////////
#include "logic.h"
#include "scheme.h"
#include "ind_key_i2c.h"
#include "buzzer.h"
#include "heater.h"
#include "timer.h"
#include "hardware.h"
#include "ble_commands.h"
#include "ir.h"
/**
* Включение пищалки
*/
#define BEEP_LONG() {timer_init(TIMER_BEEP,50,cb_beep_off);timer_start(TIMER_BEEP);buzzer_start();}
#define BEEP() {timer_init(TIMER_BEEP,10,cb_beep_off);timer_start(TIMER_BEEP);buzzer_start();}
//#define BEEP_LONG() {}
//#define BEEP() {}
#define OUT_MIN ((uint32_t)(100*60))
#define OUT_HOUR ((uint32_t)(100*60*60))
static inline void logic_handler_timers(void);
static void cb_beep_off(uint32_t timer);
static void logic_cm(void);
static void logic_led_power_max(void);
static inline void logic_cm_lock_off(void);
static inline void logic_cm_lock_on(void);
//==============================================================================
static inline void logic_init_main_off(void);
static inline void logic_main_off(void);
static inline void logic_init_main_heat(void);
static inline void logic_main_heat(void);
static inline void logic_pwr_main_heat(void);
static inline void logic_pwr_main_heat_l(void);
static inline void logic_pwr_main_heat_h(void);
static inline void logic_tim_main_heat(void);
static inline void logic_tim_1h_main_heat(void);
static inline void logic_tim_2h_main_heat(void);
static inline void logic_tim_4h_main_heat(void);
static inline void logic_tim_off_main_heat(void);
static inline void logic_body_s_main_heat(void);
static inline void logic_body_s_main_heat_off(void);
static inline void logic_body_s_main_heat_on(void);
static inline void logic_sensor_heater(void);
static inline void logic_init_main_str_tim(void);
static inline void logic_main_str_tim(void);
static inline void logic_main_str_tim_go_heat(void);
static inline void logic_app_s_main_str_tim(void);
static inline void logic_main_str_tim_4h(void);
static inline void logic_main_str_tim_6h(void);
static inline void logic_main_str_tim_8h(void);
static inline void logic_pwr_main_str_tim(void);
static inline void logic_pwr_main_str_tim_heat_l(void);
static inline void logic_pwr_main_str_tim_heat_h(void);
static inline void logic_body_s_main_str_tim(void);
static inline void logic_body_s_main_str_tim_on(void);
static inline void logic_body_s_main_str_tim_off(void);
static inline void logic_tim_main_srt_tim(void);
static inline void logic_main_str_tim_tim_1h(void);
static inline void logic_main_str_tim_tim_2h(void);
static inline void logic_main_str_tim_tim_4h(void);
static inline void logic_main_str_tim_tim_off(void);
//==============================================================================
// test mode
#ifdef TEST_MODE
static void logic_test_mode(void);
#endif
//==============================================================================
/******* Структура общей работы обогревателя *******/
static struct logic_work logic_work_cm = { MAIN_OFF,
HEAT_ST_OFF,
TIM_OFF,
STR_TIM_OFF,
BODY_S_OFF,
LOCK_OFF };
/******* Структура общих параметров принимаемых от приложения ******/
static logic_ble_params lg_ble_params = {0,0,0,0,0,0,0,0,0};
void logic_init(void)
{
hardware_init();
ble_commands_init();
/**
* Таймера:
* - TIMER_LEDS_HANDLE
* -- таймер обработки светодиодов
* - TIMER_HW_UPDATE_HANDLE
* -- таймер обработки hardware
* - TIMER_BEEP (c коллбэком выключения)
* -- таймер обработки пищалки
*/
timer_init(TIMER_BUT_LEDS_HANDLE,1,0); // 20 ms
timer_start(TIMER_BUT_LEDS_HANDLE);
timer_init(TIMER_FAN_OFF,TIMER_SECOND(10),0);
timer_init(TIMER_HEAT_ON,TIMER_SECOND(10),0);
timer_init(TIMER_LED_POWER,TIMER_MINUTE(1),0);
timer_start(TIMER_LED_POWER);
timer_init(TIMER_PAIRING_TIMER,TIMER_SECOND(10),0); // 10 sec
timer_init(TIMER_UNPAIRING_TIMER,TIMER_SECOND(10),0);
timer_init(TIMER_PAIRING_LED,TIMER_SECOND(1),0);
timer_init(TIMER_12_HOUR,
#ifndef TEST_TIM_SMOL
TIMET_HOUR(12)
#else
TIMER_MINUTE(1)
#endif
,0);
timer_init(TIMER_BODY_S, /*TIMER_SECOND(20)*/TIMER_MINUTE(2),0);
timer_init(TIMER_SENSOR_FL, 2,0); // 20 ms
timer_start(TIMER_SENSOR_FL);
/**
* Код инициализации приложения
*/
heater_stop();
fan_stop();
logic_main_off();
#ifdef TEST_MODE
for(uint8_t i=0;i<5;i++){
ind_key_i2c_handler();
//ind_key_i2c_handler();
}
if(BUTT_BODY_S == ind_but_get())
{
logic_test_mode();
heater_stop();
fan_stop();
logic_main_off();
}
#endif
leds_change(LEDS_POWER, LEDS_YES);
BEEP();
timer_delay(20);
BEEP();
}
void logic_handler(void)
{
logic_handler_timers();
ble_commands_handle();
logic_cm();
}
static inline void logic_handler_timers(void)
{
/**
* Код обработчика таймеров
*/
if( timer_ready(TIMER_BUT_LEDS_HANDLE) ){
timer_ready_clr(TIMER_BUT_LEDS_HANDLE);
ind_key_i2c_handler();
}
if( timer_ready(TIMER_FAN_OFF) ){
timer_ready_clr(TIMER_FAN_OFF);
timer_stop(TIMER_FAN_OFF);
fan_stop();
}
if( timer_ready(TIMER_HEAT_ON) ){
timer_ready_clr(TIMER_HEAT_ON);
timer_stop(TIMER_HEAT_ON);
heater_start(HEAT_ON_HL);
}
if( timer_ready(TIMER_HEAT_WORK) ){
timer_ready_clr(TIMER_HEAT_WORK);
switch (logic_work_cm.work_tim)
{
case TIM_1H: logic_main_off(); break;
case TIM_2H: logic_tim_1h_main_heat(); break;
case TIM_4H: logic_tim_2h_main_heat(); break;
}
}
if( timer_ready(TIMER_STR_TIM) ){
timer_ready_clr(TIMER_STR_TIM);
switch (logic_work_cm.work_str_tim)
{
case STR_TIM_4H: logic_main_str_tim_go_heat(); break;
case STR_TIM_6H: logic_main_str_tim_4h(); break;
case STR_TIM_8H: logic_main_str_tim_6h(); break;
}
}
if( timer_ready(TIMER_BODY_S) ){
timer_ready_clr(TIMER_BODY_S);
timer_stop(TIMER_BODY_S);
// FAN off 10 c
timer_stop(TIMER_FAN_OFF);
timer_reset(TIMER_FAN_OFF);
timer_start(TIMER_FAN_OFF);
// HEAT off без сброса флагов
timer_stop(TIMER_HEAT_ON);
heater_stop();
leds_change(LEDS_SENSOR, LEDS_BL);
leds_change(LEDS_HOTE, LEDS_NO);
}
if( timer_ready(TIMER_12_HOUR) ){
timer_ready_clr(TIMER_12_HOUR);
timer_stop(TIMER_12_HOUR);
logic_main_off();
}
if( timer_ready(TIMER_SENSOR_FL) ){
timer_ready_clr(TIMER_SENSOR_FL);
//timer_stop(TIMER_SENSOR_FL);
heater_sensor_fl_handler();
}
if( timer_ready(TIMER_LED_POWER) ){ // Обработка таймера яркости диодов
timer_ready_clr(TIMER_LED_POWER);
timer_stop(TIMER_LED_POWER);
ind_led_min_max_power(1); // Переход на min led
}
/*=============== PAIRING ======================================================
RFH-C4519S
Пэринг (привязка устройства).
В выкл. состоянии нажать и удерживать кнопку "POWER" в течении 5 сек (до звукового сигнала).
Три коротких звуковых сигнала.
В течении 10 сек. (или до подключения устройства) попеременно моргают светодиоды "Low" и "High".
Анпэринг (отвязка всех устройств).
В выкл. состоянии нажать и удерживать кнопку "TIMER" в течении 10 сек (до звукового сигнала).
Один длинный звуковой сигнал.
==============================================================================*/
if( timer_ready(TIMER_PAIRING_TIMER) ){
timer_ready_clr(TIMER_PAIRING_TIMER);
timer_stop(TIMER_PAIRING_TIMER);
timer_reset(TIMER_PAIRING_TIMER);
if(ble_commads_get_name() == BLE_MODE_PARING_TEST){ // Если тест перинг не состоялся возвращаем название
ble_commands_disconnection_device();
timer_delay(10);
ble_commads_set_name(BLE_MODE_PARING_NORM);
}else{
leds_change(LEDS_HOTE, LEDS_NO);
timer_stop(TIMER_PAIRING_LED);
timer_reset(TIMER_PAIRING_LED);
}
ble_commands_pairing_stop();
}
if( timer_ready(TIMER_UNPAIRING_TIMER) ){
timer_ready_clr(TIMER_UNPAIRING_TIMER);
timer_stop(TIMER_UNPAIRING_TIMER);
timer_reset(TIMER_UNPAIRING_TIMER);
}
if( timer_active(TIMER_PAIRING_TIMER) > 0 ){
if(ble_commads_get_name() == BLE_MODE_PARING_NORM){
if(timer_ready(TIMER_PAIRING_LED) ){
timer_ready_clr(TIMER_PAIRING_LED);
if(leds_state(LEDS_HOTE) == LEDS_L) leds_change(LEDS_HOTE, LEDS_H);
else leds_change(LEDS_HOTE, LEDS_L);
timer_stop(TIMER_PAIRING_LED);
timer_reset(TIMER_PAIRING_LED);
timer_start(TIMER_PAIRING_LED);
}
}
if(ble_commands_get_pairing() == 0){ // Если пейринг остановился, то остановить таймер ожидания
//if(timer_active(TIMER_PAIRING_TIMER)){
if(ble_commads_get_name() == BLE_MODE_PARING_NORM) leds_change(LEDS_HOTE, LEDS_NO);
timer_stop(TIMER_PAIRING_TIMER);
timer_reset(TIMER_PAIRING_TIMER);
//ble_commands_pairing_stop();
//}
}
}
else if( timer_active(TIMER_UNPAIRING_TIMER) > 0 ){
}
else
{
if(ble_commads_get_name() == BLE_MODE_PARING_TEST){ // Если произошел дисконект тестового соединения
if(ble_state_disconnect_connected_device_test() == 0){
ble_commands_disconnection_device();
timer_delay(10);
ble_commads_set_name(BLE_MODE_PARING_NORM);
}
}
if(logic_work_cm.work_main == MAIN_OFF) // Если мы в состояние ожидания
{
static buttons_state_t but_paring;
but_paring = ind_but_get();
if(but_paring == BUTT_PARING) // Если нажата кнопка перинг
{
BEEP();
timer_delay(20);
BEEP();
timer_delay(20);
BEEP();
leds_change(LEDS_HOTE, LEDS_L);
ble_commands_pairing_start();
timer_start(TIMER_PAIRING_LED);
//timer_init(TIMER_PAIRING_TIMER,TIMER_SECOND(10),0); // 10 sec
timer_reset(TIMER_PAIRING_TIMER);
timer_start(TIMER_PAIRING_TIMER);
}
else if(but_paring == BUTT_UNPARING)
{
BEEP_LONG();
ble_commands_unpairing_init();
timer_reset(TIMER_UNPAIRING_TIMER);
timer_start(TIMER_UNPAIRING_TIMER);
}
else if(but_paring == BUTT_PARING_TEST) // Если нажата кнопка перинг_тест
{
if(ble_state_disconnect_connected_device_test() == 0){
ble_commands_disconnection_device();
timer_delay(10);
ble_commads_set_name(BLE_MODE_PARING_TEST); // Делаем подменну имени
BEEP();
ble_commands_pairing_start();
//timer_init(TIMER_PAIRING_TIMER,TIMER_SECOND(15),0); // 15 sec
timer_reset(TIMER_PAIRING_TIMER);
timer_start(TIMER_PAIRING_TIMER);
}
}
}
}
//================== END PAIRING ===============================================
}
/*==============================================================================
* bl start статус
==============================================================================*/
uint8_t* logic_status(uint8_t com)
{
static uint8_t logic_status_ble[10];
static uint32_t taim_read = 0;
if(lg_ble_params.fl_state == 1) // Если состояние ожидание старта
{
switch (com)
{
case BLE_COMMANDS_CMD_GET_STATE: logic_status_ble[0] = DEV_PROG; break; // Запрос общего состояния
case BLE_COMMANDS_CMD_GET_PRG_PARAM: // Запрос полного состояния
{
logic_status_ble[0] = lg_ble_params.programma;
logic_status_ble[1] = lg_ble_params.sensor;
logic_status_ble[2] = lg_ble_params.temper;
logic_status_ble[3] = lg_ble_params.h_taim_heat;
logic_status_ble[4] = lg_ble_params.m_taim_heat;
logic_status_ble[5] = lg_ble_params.h_taim_start;
logic_status_ble[6] = lg_ble_params.m_taim_start;
logic_status_ble[7] = lg_ble_params.lock;
logic_status_ble[8] = DEV_PROG;
break;
}
}
}
else // Если обогреватель работает или выключен
{
switch (com)
{
case BLE_COMMANDS_CMD_GET_STATE: // Запрос общего состояния
{
switch (logic_work_cm.work_main)
{
case MAIN_OFF: logic_status_ble[0] = DEV_OFF; break;
case MAIN_HEAT: logic_status_ble[0] = DEV_HEAT; break;
case MAIN_STR_TIM: logic_status_ble[0] = DEV_LOAD_START; break;
}
break;
}
case BLE_COMMANDS_CMD_GET_PRG_PARAM: // Запрос полного состояния
{
if(logic_work_cm.work_main == MAIN_OFF)
{
logic_status_ble[0] = 0; // Режим
logic_status_ble[3] = 0; // Время обогрева
}
else
{
if(logic_work_cm.work_heat == HEAT_ST_L) logic_status_ble[0] = 0; // Режим
else logic_status_ble[0] = 1;
if(logic_work_cm.work_tim == TIM_4H) logic_status_ble[3] = 4; // Время обогрева
else if(logic_work_cm.work_tim == TIM_OFF) logic_status_ble[3] = 12;
else logic_status_ble[3] = (uint8_t)logic_work_cm.work_tim;
}
logic_status_ble[1] = (uint8_t)logic_work_cm.work_boby_s; // Сенсор
if(logic_work_cm.work_boby_s == BODY_S_ON && logic_work_cm.work_main == MAIN_HEAT) // Если режим обогрева и включен сенсор
{
if(heater_get() == HEAT_OFF) logic_status_ble[2] = 1;
else logic_status_ble[2] = 0;
}
else logic_status_ble[2] = 0;
logic_status_ble[4] = 0;
switch (logic_work_cm.work_main) // Вывод оставшегося времение старта + готовки
{
case MAIN_OFF: logic_status_ble[5] = 0; logic_status_ble[6] = 0; break;
case MAIN_HEAT:
{
switch (logic_work_cm.work_tim)
{
case TIM_OFF:
{
taim_read = timer_get(TIMER_12_HOUR);
taim_read -= timer_read_taim(TIMER_12_HOUR);
logic_status_ble[5] = 0;
break;
}
case TIM_1H:
{
taim_read = timer_get(TIMER_HEAT_WORK);
taim_read -= timer_read_taim(TIMER_HEAT_WORK);
logic_status_ble[5] = 0;
break;
}
case TIM_2H:
{
taim_read = timer_get(TIMER_HEAT_WORK);
taim_read -= timer_read_taim(TIMER_HEAT_WORK);
logic_status_ble[5] = 1;
break;
}
case TIM_4H:
{
taim_read = timer_get(TIMER_HEAT_WORK);
taim_read -= timer_read_taim(TIMER_HEAT_WORK);
logic_status_ble[5] = 2;
break;
}
}
logic_status_ble[5] += (uint8_t)(taim_read / OUT_HOUR); // Часы
logic_status_ble[6] = (uint8_t)((taim_read % OUT_HOUR) / OUT_MIN); // Минуты
break;
}
case MAIN_STR_TIM:
{
taim_read = timer_get(TIMER_STR_TIM);
taim_read -= timer_read_taim(TIMER_STR_TIM);
logic_status_ble[5] = (uint8_t)(taim_read / OUT_HOUR); // Часы
logic_status_ble[6] = (uint8_t)((taim_read % OUT_HOUR) / OUT_MIN); // Минуты
switch (logic_work_cm.work_str_tim)
{
case STR_TIM_6H: logic_status_ble[5] += 4; break;
case STR_TIM_8H: logic_status_ble[5] += 6; break;
}
if(logic_work_cm.work_tim == TIM_4H) logic_status_ble[5] += 4;
else if(logic_work_cm.work_tim == TIM_OFF) logic_status_ble[5] += 12;
else logic_status_ble[5] += (uint8_t)logic_work_cm.work_tim;
break;
}
}
logic_status_ble[7] = (uint8_t)logic_work_cm.work_lock; // Lock
switch (logic_work_cm.work_main) // Статус команды
{
case MAIN_OFF: logic_status_ble[8] = DEV_OFF; break;
case MAIN_HEAT: logic_status_ble[8] = DEV_HEAT; break;
case MAIN_STR_TIM: logic_status_ble[8] = DEV_LOAD_START; break;
}
}
}
}
return ((uint8_t*)logic_status_ble);
}
/*==============================================================================
* Дополнительные команды c параметрами от приложения
==============================================================================*/
uint8_t logic_set_params(uint8_t com, uint8_t * params)
{
switch (com)
{
case BLE_COMMANDS_CMD_SET_PRG_PARAM: // Запись всех параметров
{
lg_ble_params.fl_state = 1;
lg_ble_params.programma = *(params++);
lg_ble_params.sensor = *(params++);
lg_ble_params.temper = *(params++);
lg_ble_params.h_taim_heat = *(params++);
lg_ble_params.m_taim_heat = *(params++);
lg_ble_params.h_taim_start = *(params++);
lg_ble_params.m_taim_start = *(params++);
lg_ble_params.lock = *(params);
return CM_OUT_OK;
}
case BLE_COMMANDS_CMD_SET_PARAM_LOCK: // Установка LOCK
{
if(*params == 1 && logic_work_cm.work_lock == LOCK_OFF){
logic_cm_lock_on(); return CM_OUT_OK;
}
else if(*params == 0 && logic_work_cm.work_lock == LOCK_ON){
logic_cm_lock_off(); return CM_OUT_OK;
}
return CM_OUT_ERROR;
}
}
if(lg_ble_params.fl_state == 0 && logic_work_cm.work_main != MAIN_OFF)
{ // Если обогреватель работает и новые параметры не были заданны
switch (com)
{
case BLE_COMMANDS_CMD_SET_PARAM_TAIM_LOAD: // Установка таймера отложенного старта
{
if(logic_work_cm.work_main == MAIN_STR_TIM)
{
BEEP();
switch (*params)
{
case 0: logic_main_str_tim_go_heat(); return CM_OUT_OK;
case 4: logic_main_str_tim_4h(); return CM_OUT_OK;
case 6: logic_main_str_tim_6h(); return CM_OUT_OK;
case 8: logic_main_str_tim_8h(); return CM_OUT_OK;
}
}
break;
}
case BLE_COMMANDS_CMD_SET_PARAM_TAIM_HEAT: // Установка таймера продолжительности обогрева
{
if(logic_work_cm.work_main == MAIN_HEAT)
{
BEEP();
switch (*params)
{
case 0:
case 12: logic_tim_off_main_heat(); return CM_OUT_OK;
case 1: logic_tim_1h_main_heat(); return CM_OUT_OK;
case 2: logic_tim_2h_main_heat(); return CM_OUT_OK;
case 4: logic_tim_4h_main_heat(); return CM_OUT_OK;
}
}
else if(logic_work_cm.work_main == MAIN_STR_TIM)
{
BEEP();
switch (*params)
{
case 0:
case 12: logic_main_str_tim_tim_off(); return CM_OUT_OK;
case 1: logic_main_str_tim_tim_1h(); return CM_OUT_OK;
case 2: logic_main_str_tim_tim_2h(); return CM_OUT_OK;
case 4: logic_main_str_tim_tim_4h(); return CM_OUT_OK;
}
}
break;
}
case BLE_COMMANDS_CMD_SET_PARAM_HEAT: // Установка режима интенсивноти обогрева
{
if(logic_work_cm.work_main == MAIN_HEAT)
{
BEEP();
if(logic_work_cm.work_boby_s == BODY_S_ON) logic_sensor_heater(); // Если включен интелектуальный обогрев
switch (*params)
{
case 0: logic_pwr_main_heat_l(); return CM_OUT_OK;
case 1: logic_pwr_main_heat_h(); return CM_OUT_OK;
}
}
else if(logic_work_cm.work_main == MAIN_STR_TIM)
{
BEEP();
switch (*params)
{
case 0: logic_pwr_main_str_tim_heat_l(); return CM_OUT_OK;
case 1: logic_pwr_main_str_tim_heat_h(); return CM_OUT_OK;
}
}
break;
}
case BLE_COMMANDS_CMD_SET_PARAM_SENSOR:
{
if(logic_work_cm.work_main == MAIN_HEAT)
{
BEEP();
if(logic_work_cm.work_boby_s == BODY_S_ON) logic_sensor_heater(); // Если включен интелектуальный обогрев
switch (*params)
{
case 0: logic_body_s_main_heat_off(); return CM_OUT_OK;
case 1: logic_body_s_main_heat_on(); return CM_OUT_OK;
}
}
else if(logic_work_cm.work_main == MAIN_STR_TIM)
{
BEEP();
switch (*params)
{
case 0: logic_body_s_main_str_tim_off(); return CM_OUT_OK;
case 1: logic_body_s_main_str_tim_on(); return CM_OUT_OK;
}
}
break;
}
}
}
return CM_OUT_ERROR;
}
/*==============================================================================
* Команды от приложения старт и стоп
==============================================================================*/
uint8_t logic_ext_command(uint8_t command)
{
switch (command)
{
case BLE_COMMANDS_CMD_START_PARAM: // Старт с заданными параметрами
{
if(lg_ble_params.fl_state == 1)
{
lg_ble_params.fl_state = 0;
BEEP();
//========================== Старт программы ===================================
if(lg_ble_params.h_taim_start == 0) // Если отдоженый старт не включен
{
logic_init_main_heat(); // Включаем режим обогрева
if(lg_ble_params.programma == 0) logic_pwr_main_heat_l(); // Включаем low heat
if(lg_ble_params.sensor == 1) logic_body_s_main_heat_on(); // Включаем BODY_S
else logic_body_s_main_heat_off();
if(lg_ble_params.lock == 1 && logic_work_cm.work_lock == LOCK_OFF) logic_cm_lock_on(); // Включаем LOCK
else if(lg_ble_params.lock == 0 && logic_work_cm.work_lock == LOCK_ON) logic_cm_lock_off();
switch (lg_ble_params.h_taim_heat) // Включаем таймер
{
case 0:
case 12: logic_tim_off_main_heat(); break;
case 1: logic_tim_1h_main_heat(); break;
case 2: logic_tim_2h_main_heat(); break;
case 4: logic_tim_4h_main_heat(); break;
default: return CM_OUT_ERROR;
}
}
else{ // Если включен отложенный старт
logic_init_main_str_tim(); // Включаем режим отложенного старта
if(lg_ble_params.programma == 0) logic_pwr_main_str_tim_heat_l(); // Включаем low heat
switch (lg_ble_params.h_taim_start) // Включаем таймер отложенного старта
{
case 4: break;
case 6: logic_main_str_tim_6h(); break;
case 8: logic_main_str_tim_8h(); break;
default: return CM_OUT_ERROR;
}
switch (lg_ble_params.h_taim_heat) // Включаем таймер
{
case 0:
case 12: logic_main_str_tim_tim_off(); break;
case 1: logic_main_str_tim_tim_1h(); break;
case 2: logic_main_str_tim_tim_2h(); break;
case 4: logic_main_str_tim_tim_4h(); break;
default: return CM_OUT_ERROR;
}
if(lg_ble_params.sensor == 1) logic_body_s_main_str_tim_on(); // Включаем BODY_S
else logic_body_s_main_str_tim_off();
if(lg_ble_params.lock == 1 && logic_work_cm.work_lock == LOCK_OFF) logic_cm_lock_on(); // Включаем LOCK
else if(lg_ble_params.lock == 0 && logic_work_cm.work_lock == LOCK_ON) logic_cm_lock_off();
}
//================= Стоп прогрпммы =============================================
}
else return CM_OUT_ERROR;
return CM_OUT_OK;
}
case BLE_COMMANDS_CMD_STOP: // Стоп
{
lg_ble_params.fl_state = 0;
logic_init_main_off();
return CM_OUT_OK;
}
}
return CM_OUT_ERROR;
}
/*==============================================================================
* bl end
==============================================================================*/
static void logic_cm(void)
{
buttons_state_t button_push;
button_push = ind_key_i2c_buttons();
/**
* Проверяем нажатые кнопок на ПДУ
*/
if(button_push == BUTT_NO)
{
switch(ir_read_command())
{
case IR_COM_ON_OFF: button_push = BUTT_ON_OFF; break;
case IR_COM_POWER: button_push = BUTT_PWR; break;
case IR_COM_BODY_S: button_push = BUTT_BODY_S; break;
case IR_COM_APP_S: button_push = BUTT_APP_S; break;
case IR_COM_TIMER: button_push = BUTT_TIM; break;
case IR_COM_LOCK: button_push = BUTT_LOCK; break;
default: break;
}
}
//==============================================================================
//==============================================================================
///**
// * Проверка сенсора в режиме интелектуального обогрева
// */
if(logic_work_cm.work_boby_s == BODY_S_ON && logic_work_cm.work_main == MAIN_HEAT){
if(heater_sensor_get() || button_push != BUTT_NO){ // Если сенсор сработал
logic_sensor_heater();
}
}
//==============================================================================
if(button_push == BUTT_LOCK)
{
logic_led_power_max();
timer_start(TIMER_LED_POWER);
if(logic_work_cm.work_lock == LOCK_OFF) logic_cm_lock_on();
else logic_cm_lock_off();
}
/**
* Если нет блокировки и нажата кнопка обрабатываем ее
*/
if(logic_work_cm.work_lock == LOCK_OFF && button_push != BUTT_NO)
{
logic_led_power_max();
switch (logic_work_cm.work_main)
{
case MAIN_OFF:
{
switch (button_push)
{
case BUTT_ON_OFF: logic_init_main_heat(); break;
case BUTT_APP_S: logic_init_main_str_tim(); break;
}
break;
}
case MAIN_HEAT:
{
switch (button_push)
{
case BUTT_ON_OFF: logic_init_main_off(); break;
case BUTT_PWR: logic_pwr_main_heat(); break;
case BUTT_TIM: logic_tim_main_heat(); break;
case BUTT_BODY_S: logic_body_s_main_heat(); break;
}
break;
}
case MAIN_STR_TIM:
{
switch (button_push)
{
case BUTT_ON_OFF:
logic_main_off();
logic_init_main_heat();
break;
case BUTT_PWR: logic_pwr_main_str_tim(); break;
case BUTT_TIM: logic_tim_main_srt_tim(); break;
case BUTT_APP_S: logic_app_s_main_str_tim(); break;
case BUTT_BODY_S: logic_body_s_main_str_tim();break;
}
break;
}
}
}
}
/**
* Функции LOCK NO_LOCK
*/
static inline void logic_cm_lock_on(void)
{
logic_work_cm.work_lock = LOCK_ON;
leds_change(LEDS_LOCK, LEDS_YES);
BEEP_LONG();
}
static inline void logic_cm_lock_off(void)
{
logic_work_cm.work_lock = LOCK_OFF;
leds_change(LEDS_LOCK, LEDS_NO);
BEEP_LONG();
}
/**
* Функция выхода из всех режимов
*/
static inline void logic_init_main_off(void)
{
BEEP();
logic_main_off();
}
static inline void logic_main_off(void)
{
/* STATUS */
logic_work_cm.work_main = MAIN_OFF;
logic_work_cm.work_heat = HEAT_ST_OFF;
logic_work_cm.work_tim = TIM_OFF;
logic_work_cm.work_str_tim = STR_TIM_OFF;
logic_work_cm.work_boby_s = BODY_S_OFF;
/* LED */
leds_change(LEDS_HOTE, LEDS_NO);
leds_change(LEDS_WORK, LEDS_NO);
leds_change(LEDS_SENSOR, LEDS_NO);
leds_change(LEDS_START, LEDS_NO);
/* FAN OFF */
timer_stop(TIMER_FAN_OFF);
if(1 == fan_get()){
timer_reset(TIMER_FAN_OFF);
timer_start(TIMER_FAN_OFF);
}
/* TIMER STOP */
timer_stop(TIMER_12_HOUR);
timer_stop(TIMER_BODY_S);
timer_stop(TIMER_STR_TIM);
timer_stop(TIMER_HEAT_WORK);
/* HEAT STOP */
timer_stop(TIMER_HEAT_ON);
heater_stop();
}
/*==============================================================================
*
* Функции режима HEAT
*
==============================================================================*/
static inline void logic_init_main_heat(void)
{
BEEP();
logic_main_heat();
}
static inline void logic_main_heat(void)
{
logic_work_cm.work_main = MAIN_HEAT;
logic_work_cm.work_heat = HEAT_ST_H;
leds_change(LEDS_HOTE, LEDS_H);
/* FAN ON */
timer_stop(TIMER_FAN_OFF);
fan_start();
/* HEAT START L, HL */
heater_start(HEAT_ON_L);
timer_stop(TIMER_HEAT_ON);
timer_reset(TIMER_HEAT_ON);
timer_start(TIMER_HEAT_ON);
timer_stop(TIMER_12_HOUR);
timer_reset(TIMER_12_HOUR);
timer_start(TIMER_12_HOUR);
}
/**
* Обработка кнопки POWER
*/
static inline void logic_pwr_main_heat(void)
{
BEEP();
if(logic_work_cm.work_tim == TIM_OFF && logic_work_cm.work_boby_s == BODY_S_OFF)
{
timer_stop(TIMER_12_HOUR);
timer_reset(TIMER_12_HOUR);
timer_start(TIMER_12_HOUR);
}
switch (logic_work_cm.work_heat)
{
case HEAT_ST_L: logic_pwr_main_heat_h(); break;
case HEAT_ST_H: logic_pwr_main_heat_l(); break;
}
}
static inline void logic_pwr_main_heat_l(void)
{
logic_work_cm.work_heat = HEAT_ST_L;
leds_change(LEDS_HOTE, LEDS_L);
timer_stop(TIMER_HEAT_ON);
heater_start(HEAT_ON_L);
}
static inline void logic_pwr_main_heat_h(void)
{
logic_work_cm.work_heat = HEAT_ST_H;
leds_change(LEDS_HOTE, LEDS_H);
heater_start(HEAT_ON_L);
timer_stop(TIMER_HEAT_ON);
timer_reset(TIMER_HEAT_ON);
timer_start(TIMER_HEAT_ON);
}
/**
* Обработка кнопки TIMER
*/
static inline void logic_tim_main_heat(void)
{
BEEP();
switch (logic_work_cm.work_tim)
{
case TIM_OFF: logic_tim_1h_main_heat(); break;
case TIM_1H: logic_tim_2h_main_heat(); break;
case TIM_2H: logic_tim_4h_main_heat(); break;
case TIM_4H: logic_tim_off_main_heat(); break;
}
}
static inline void logic_tim_off_main_heat(void)
{
logic_work_cm.work_tim = TIM_OFF;
leds_change(LEDS_WORK, LEDS_NO);
timer_stop(TIMER_HEAT_WORK);
if(logic_work_cm.work_boby_s == BODY_S_OFF)
{
timer_stop(TIMER_12_HOUR);
timer_reset(TIMER_12_HOUR);
timer_start(TIMER_12_HOUR);
}
}
static inline void logic_tim_1h_main_heat(void)
{
logic_work_cm.work_tim = TIM_1H;
leds_change(LEDS_WORK, LEDS_1H);
timer_stop(TIMER_HEAT_WORK);
timer_init(TIMER_HEAT_WORK,
#ifndef TEST_TIM_SMOL
TIMET_HOUR(1)
#else
TIMER_SECOND(20)
#endif
,0);
timer_start(TIMER_HEAT_WORK);
timer_stop(TIMER_12_HOUR);
}
static inline void logic_tim_2h_main_heat(void)
{
logic_work_cm.work_tim = TIM_2H;
leds_change(LEDS_WORK, LEDS_2H);
timer_stop(TIMER_HEAT_WORK);
timer_init(TIMER_HEAT_WORK,
#ifndef TEST_TIM_SMOL
TIMET_HOUR(1)
#else
TIMER_SECOND(20)
#endif
,0);
timer_start(TIMER_HEAT_WORK);
timer_stop(TIMER_12_HOUR);
}
static inline void logic_tim_4h_main_heat(void)
{
logic_work_cm.work_tim = TIM_4H;
leds_change(LEDS_WORK, LEDS_4H);
timer_stop(TIMER_HEAT_WORK);
timer_init(TIMER_HEAT_WORK,
#ifndef TEST_TIM_SMOL
TIMET_HOUR(2)
#else
TIMER_SECOND(40)
#endif
,0);
timer_start(TIMER_HEAT_WORK);
timer_stop(TIMER_12_HOUR);
}
/**
* Обработка кнопки BODY_S
*/
static inline void logic_body_s_main_heat(void)
{
BEEP();
switch (logic_work_cm.work_boby_s)
{
case BODY_S_OFF: logic_body_s_main_heat_on(); break;
case BODY_S_ON: logic_body_s_main_heat_off(); break;
}
}
static inline void logic_body_s_main_heat_off(void)
{
logic_work_cm.work_boby_s = BODY_S_OFF;
leds_change(LEDS_SENSOR, LEDS_NO);
timer_stop(TIMER_BODY_S);
if(logic_work_cm.work_tim == TIM_OFF)
{
timer_stop(TIMER_12_HOUR);
timer_reset(TIMER_12_HOUR);
timer_start(TIMER_12_HOUR);
}
}
static inline void logic_body_s_main_heat_on(void)
{
logic_work_cm.work_boby_s = BODY_S_ON;
leds_change(LEDS_SENSOR, LEDS_YES);
timer_reset(TIMER_BODY_S);
timer_start(TIMER_BODY_S);
timer_stop(TIMER_12_HOUR);
timer_reset(TIMER_12_HOUR);/// ?????
}
static inline void logic_sensor_heater(void)
{
if(timer_active(TIMER_BODY_S)) timer_reset(TIMER_BODY_S);
else
{
logic_body_s_main_heat_on();
/* FAN ON */
timer_stop(TIMER_FAN_OFF);
fan_start();
if(logic_work_cm.work_heat == HEAT_ST_L) logic_pwr_main_heat_l();
else logic_pwr_main_heat_h();
}
}
/**=============================================================================
*
* Функции режима отложенного старта
*
=============================================================================**/
static inline void logic_init_main_str_tim(void)
{
BEEP();
logic_main_str_tim();
}
static inline void logic_main_str_tim(void)
{
logic_work_cm.work_main = MAIN_STR_TIM;
logic_work_cm.work_heat = HEAT_ST_H;
leds_change(LEDS_HOTE, LEDS_H_BL);
logic_main_str_tim_4h();
}
/*
* Функция перехода из режима отложенного старта в режим обогрева
*/
static inline void logic_main_str_tim_go_heat(void)
{
logic_work_cm.work_main = MAIN_HEAT;
leds_change(LEDS_START, LEDS_NO);
timer_stop(TIMER_STR_TIM);
timer_stop(TIMER_FAN_OFF);
fan_start();
heater_start(HEAT_ON_L);
if(logic_work_cm.work_heat == HEAT_ST_H)
{
leds_change(LEDS_HOTE, LEDS_H);
timer_stop(TIMER_HEAT_ON);
timer_reset(TIMER_HEAT_ON);
timer_start(TIMER_HEAT_ON);
}
else leds_change(LEDS_HOTE, LEDS_L);
switch (logic_work_cm.work_tim)
{
case TIM_OFF: logic_tim_off_main_heat(); break;
case TIM_1H: logic_tim_1h_main_heat(); break;
case TIM_2H: logic_tim_2h_main_heat(); break;
case TIM_4H: logic_tim_4h_main_heat(); break;
}
if(logic_work_cm.work_boby_s == BODY_S_ON) logic_body_s_main_heat_on();
// else
// {
// timer_stop(TIMER_12_HOUR);
// timer_reset(TIMER_12_HOUR);
// timer_start(TIMER_12_HOUR);
// }
}
/**
* Обработка кнопки APP_S
*/
static inline void logic_app_s_main_str_tim(void)
{
BEEP();
switch (logic_work_cm.work_str_tim)
{
case STR_TIM_4H: logic_main_str_tim_6h(); break;
case STR_TIM_6H: logic_main_str_tim_8h(); break;
case STR_TIM_8H: logic_main_off(); break;
}
}
static inline void logic_main_str_tim_4h(void)
{
logic_work_cm.work_str_tim = STR_TIM_4H;
leds_change(LEDS_START, LEDS_S4H);
timer_stop(TIMER_STR_TIM);
timer_init(TIMER_STR_TIM,
#ifndef TEST_TIM_SMOL
TIMET_HOUR(4)
#else
TIMER_SECOND(40)
#endif
,0);
timer_start(TIMER_STR_TIM);
}
static inline void logic_main_str_tim_6h(void)
{
logic_work_cm.work_str_tim = STR_TIM_6H;
leds_change(LEDS_START, LEDS_S6H);
timer_stop(TIMER_STR_TIM);
timer_init(TIMER_STR_TIM,
#ifndef TEST_TIM_SMOL
TIMET_HOUR(2)
#else
TIMER_SECOND(20)
#endif
,0);
timer_start(TIMER_STR_TIM);
}
static inline void logic_main_str_tim_8h(void)
{
logic_work_cm.work_str_tim = STR_TIM_8H;
leds_change(LEDS_START, LEDS_S8H);
timer_stop(TIMER_STR_TIM);
timer_init(TIMER_STR_TIM,
#ifndef TEST_TIM_SMOL
TIMET_HOUR(2)
#else
TIMER_SECOND(20)
#endif
,0);
timer_start(TIMER_STR_TIM);
}
/**
* Обработка кнопки POWER
*/
static inline void logic_pwr_main_str_tim(void)
{
BEEP();
switch (logic_work_cm.work_heat)
{
case HEAT_ST_L: logic_pwr_main_str_tim_heat_h(); break;
case HEAT_ST_H: logic_pwr_main_str_tim_heat_l(); break;
}
}
static inline void logic_pwr_main_str_tim_heat_l(void)
{
logic_work_cm.work_heat = HEAT_ST_L;
leds_change(LEDS_HOTE, LEDS_L_BL);
}
static inline void logic_pwr_main_str_tim_heat_h(void)
{
logic_work_cm.work_heat = HEAT_ST_H;
leds_change(LEDS_HOTE, LEDS_H_BL);
}
/*
* Таймер отключения обогрева в режиме отложенного старта
*/
static inline void logic_tim_main_srt_tim(void)
{
BEEP();
switch (logic_work_cm.work_tim)
{
case TIM_OFF: logic_main_str_tim_tim_1h(); break;
case TIM_1H: logic_main_str_tim_tim_2h(); break;
case TIM_2H: logic_main_str_tim_tim_4h(); break;
case TIM_4H: logic_main_str_tim_tim_off(); break;
}
}
static inline void logic_main_str_tim_tim_1h(void)
{
logic_work_cm.work_tim = TIM_1H;
leds_change(LEDS_WORK, LEDS_1H_BL);
}
static inline void logic_main_str_tim_tim_2h(void)
{
logic_work_cm.work_tim = TIM_2H;
leds_change(LEDS_WORK, LEDS_2H_BL);
}
static inline void logic_main_str_tim_tim_4h(void)
{
logic_work_cm.work_tim = TIM_4H;
leds_change(LEDS_WORK, LEDS_4H_BL);
}
static inline void logic_main_str_tim_tim_off(void)
{
logic_work_cm.work_tim = TIM_OFF;
leds_change(LEDS_WORK, LEDS_NO);
}
/**
* Обработка кнопки BODY_S
*/
static inline void logic_body_s_main_str_tim(void)
{
BEEP();
switch (logic_work_cm.work_boby_s)
{
case BODY_S_OFF: logic_body_s_main_str_tim_on(); break;
case BODY_S_ON: logic_body_s_main_str_tim_off(); break;
}
}
static inline void logic_body_s_main_str_tim_off(void)
{
logic_work_cm.work_boby_s = BODY_S_OFF;
leds_change(LEDS_SENSOR, LEDS_NO);
}
static inline void logic_body_s_main_str_tim_on(void)
{
logic_work_cm.work_boby_s = BODY_S_ON;
leds_change(LEDS_SENSOR, LEDS_BL);
}
/**
* Включаем максимальную яркость led
*/
static void logic_led_power_max(void)
{
timer_stop(TIMER_LED_POWER);
timer_reset(TIMER_LED_POWER);
timer_start(TIMER_LED_POWER);
ind_led_min_max_power(0);
}
//==============================================================================
/**
* Функция для описания состояния работы прибора
* Должна возвращать 1 в случае если прибор можно перепрошить
* т.е. находится в неактивном состоянии.
*/
int get_ready_for_firmware(void)
{
if(logic_work_cm.work_main == MAIN_OFF && 0 == fan_get()) return 1;
return 0;
}
/**
* Коллбэк для таймера-пищалки
*/
static void cb_beep_off(uint32_t timer)
{
if(TIMER_BEEP == timer)
{
timer_stop(timer);
timer_reset(timer);
buzzer_stop();
}
}
//==============================================================================
// test mode
//==============================================================================
#ifdef TEST_MODE
static void logic_test_mode(void)
{
static uint32_t load_test_mode = 0;
BEEP_LONG();
leds_change(LEDS_POWER, LEDS_YES);
leds_change(LEDS_HOTE, LEDS_H_L);
leds_change(LEDS_WORK, LEDS_124H);
leds_change(LEDS_START, LEDS_S468H);
leds_change(LEDS_SENSOR, LEDS_YES);
leds_change(LEDS_LOCK, LEDS_YES);
ind_key_i2c_handler();
timer_delay(100);
leds_change(LEDS_POWER, LEDS_NO);
leds_change(LEDS_HOTE, LEDS_NO);
leds_change(LEDS_WORK, LEDS_NO);
leds_change(LEDS_START, LEDS_NO);
leds_change(LEDS_SENSOR, LEDS_NO);
leds_change(LEDS_LOCK, LEDS_NO);
while(ind_but_get() != BUTT_NO){
ind_key_i2c_handler();
}
while(1)
{
uint8_t st_test_kn = 0;
static uint8_t fl_sens = 0;
timer_delay(2);
ind_key_i2c_handler();
st_test_kn = (uint8_t)ind_but_get();
if(st_test_kn == 0)
{
switch(ir_read_command())
{
case IR_COM_ON_OFF: st_test_kn = 1; break;
case IR_COM_POWER: st_test_kn = 2; break;
case IR_COM_BODY_S: st_test_kn = 3; break;
case IR_COM_APP_S: st_test_kn = 5; break;
case IR_COM_TIMER: st_test_kn = 4; break;
case IR_COM_LOCK: st_test_kn = 6; break;
default: break;
}
}
if(st_test_kn != 0 && st_test_kn != 3) BEEP();
switch(st_test_kn)
{
case 1: /* on/off */
{
if(leds_state(LEDS_POWER) == LEDS_NO) leds_change(LEDS_POWER, LEDS_YES);
else leds_change(LEDS_POWER, LEDS_NO);
break;
}
case 2: /* POWER fan on/off */
{
if(leds_state(LEDS_HOTE) == LEDS_NO){
leds_change(LEDS_HOTE, LEDS_H_L);
fan_start();
}else{
leds_change(LEDS_HOTE, LEDS_NO);
if(heater_get() == HEAT_OFF) fan_stop();
}
break;
}
case 3: /* body sensor on/off */
{
if(fl_sens == 0){
BEEP_LONG();
fl_sens = 1;
}else{
BEEP();
fl_sens = 0;
leds_change(LEDS_SENSOR, LEDS_NO);
}
break;
}
case 4: /* timer heat_l on/off */
{
if(leds_state(LEDS_WORK) == LEDS_NO){
leds_change(LEDS_WORK, LEDS_124H);
fan_start();
if(heater_get() == HEAT_ON_H) heater_start(HEAT_ON_HL);
else heater_start(HEAT_ON_L);
}else{
leds_change(LEDS_WORK, LEDS_NO);
if(heater_get() == HEAT_ON_L){
heater_start(HEAT_OFF);
if(leds_state(LEDS_HOTE) == LEDS_NO) fan_stop();
}else heater_start(HEAT_ON_H);
}
break;
}
case 5: /* APP-S heat_h on/off */
{
if(leds_state(LEDS_START) == LEDS_NO){
leds_change(LEDS_START, LEDS_S468H);
fan_start();
if(heater_get() == HEAT_ON_L) heater_start(HEAT_ON_HL);
else heater_start(HEAT_ON_H);
}else{
leds_change(LEDS_START, LEDS_NO);
if(heater_get() == HEAT_ON_H){
heater_start(HEAT_OFF);
if(leds_state(LEDS_HOTE) == LEDS_NO) fan_stop();
}else heater_start(HEAT_ON_L);
}
break;
}
case 6: /* lock led on/off */
{
if(leds_state(LEDS_LOCK) == LEDS_NO) leds_change(LEDS_LOCK, LEDS_YES);
else leds_change(LEDS_LOCK, LEDS_NO);
break;
}
}
if(st_test_kn != 0) load_test_mode = 0;
else load_test_mode ++;
if(load_test_mode > 0x1770) break;
if(fl_sens == 1){
static uint8_t tim_sen = 0;
if(tim_sen < 10) tim_sen ++;
else{
tim_sen = 0;
heater_sensor_fl_handler();
}
if(heater_sensor_get()) leds_change(LEDS_SENSOR, LEDS_YES);
else leds_change(LEDS_SENSOR, LEDS_NO);
}
while(ind_but_get() != BUTT_NO){
ind_key_i2c_handler();
}
}
}
#endif // test mode
//==============================================================================