You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

314 lines
11 KiB

#include <stdbool.h> //定义布尔
#include <string.h>
#include "board.h"
//
#include "zes8p5066lib/basic.h"
#include "zes8p5066lib/gpio.h"
#include "zes8p5066lib/key.h"
#include "zes8p5066lib/systicket.h"
#include "zes8p5066lib/uart0.h"
//
#include "service/human_computer_interaction_service.h"
#include "service/ozone_control_service.h"
#include "service/thisdevice.h"
#include "test.h"
#include "zsimple_timer/zsimple_timer.h"
/***********************************************************************************************************************
* =====================================================函数声明====================================================== *
***********************************************************************************************************************/
void onkey(zkey_t* key, zkey_state_t key_state);
/***********************************************************************************************************************
* =====================================================全局变量====================================================== *
***********************************************************************************************************************/
static zkey_t s_keys[] = {
ZKEY_INIT("powerkey", port_gpio_get_power_key_state), //电源按键
ZKEY_INIT("levelkey", port_gpio_get_level_key_state), //左1
ZKEY_INIT("timerkey", port_gpio_get_timer_key_state), //左2
ZKEY_INIT("intervalkey", port_gpio_get_interval_key_state), //左3
};
zkey_module_t key_module = ZMODULE_INIT(s_keys, onkey);
/***********************************************************************************************************************
* =======================================================方法======================================================== *
***********************************************************************************************************************/
/***********************************************************************************************************************
* ===================================================COUNT_COMPUTE=================================================== *
***********************************************************************************************************************/
static uint32_t compute_countdown_num(int countdowns) {
if (countdowns) return countdowns / kconst_countdown_step_s + !!(countdowns % kconst_countdown_step_s);
}
static void increase_and_assign_countdonwnum() {
if (thisDevice.countdonwnum == 4) {
thisDevice.countdonwnum = 0;
thisDevice.countdonwnum_s = 0;
thisDevice.countdonw_setting_num = 0;
} else {
thisDevice.countdonwnum_s = (thisDevice.countdonwnum + 1) * kconst_countdown_step_s;
thisDevice.countdonwnum = thisDevice.countdonwnum + 1;
thisDevice.countdonw_setting_num = thisDevice.countdonwnum;
thisDevice.countdonw_start_ticket = systicket_get_now_ms();
}
}
static void mf_set_countdown(int countdownnum) {
thisDevice.countdonwnum = countdownnum;
thisDevice.countdonwnum_s = thisDevice.countdonwnum * kconst_countdown_step_s;
thisDevice.countdonw_setting_num = thisDevice.countdonwnum;
thisDevice.countdonw_start_ticket = systicket_get_now_ms();
}
/***********************************************************************************************************************
* ===================================================POWER_CONTROL=================================================== *
***********************************************************************************************************************/
//设备开始工作
static void startwork() {
port_fan_set(true);
ozone_control_start();
thisDevice.working = true;
}
//停止设备工作
static void stopwork() {
ozone_control_stop();
port_fan_set(false);
thisDevice.working = false;
}
//关机
static void shutdwon() {
printf("power off\n");
thisDevice.poweron = false;
stopwork();
}
//开机
static void poweron() {
printf("power on\n");
thisDevice.poweron = true;
thisDevice.level = klevel1;
thisDevice.mode = knormal;
startwork();
}
/***********************************************************************************************************************
* =================================================KEY_EVENT_PROCESS================================================= *
***********************************************************************************************************************/
//电源按键处理
static void mf_process_poweron_key(zkey_t* key) {
printf("on %s \n", key->name);
if (!thisDevice.poweron) {
poweron();
} else {
shutdwon();
}
return;
}
//等级按键处理
static void mf_process_level_key(zkey_t* key) {
if (!thisDevice.poweron) return;
printf("on %s \n", key->name);
/**
* @brief 当前在不在修改状态,不在,则进入修改状态
*/
if (thisDevice.level == klevel1) {
printf("changet level to level2\n");
thisDevice.level = klevel2;
//更改臭氧状态
} else if (thisDevice.level == klevel2) {
printf("changet level to level1\n");
thisDevice.level = klevel1;
//更改臭氧状态
}
hcis_active_input(kchange_level_input);
return;
}
//定时按键处理
static void mf_process_timer_key(zkey_t* key) {
if (!thisDevice.poweron) return;
printf("on %s \n", key->name);
if (!thisDevice.working) {
startwork();
}
if (thisDevice.mode != ktimingMode) {
mf_set_countdown(0);
}
increase_and_assign_countdonwnum();
if (thisDevice.countdonwnum_s == 0) {
hcis_active_input(knone_active);
thisDevice.mode = knormal;
} else {
hcis_active_input(kchange_countdonw_time_input);
thisDevice.mode = ktimingMode;
}
}
//间隔按键处理
static void mf_process_interval_key(zkey_t* key) {
if (!thisDevice.poweron) return;
printf("on %s \n", key->name);
if (!thisDevice.working) {
startwork();
}
if (thisDevice.mode != kintermittentMode) {
mf_set_countdown(0);
}
increase_and_assign_countdonwnum();
if (thisDevice.countdonwnum_s == 0) {
hcis_active_input(knone_active);
thisDevice.mode = knormal;
} else {
hcis_active_input(kchange_countdonw_time_input);
thisDevice.mode = kintermittentMode;
}
}
static void onkey(zkey_t* key, zkey_state_t key_state) {
if /* */ (strcmp(key->name, "powerkey") == 0 && zks_rising_edge == key_state) {
mf_process_poweron_key(key);
} else if (strcmp(key->name, "levelkey") == 0 && zks_rising_edge == key_state) {
mf_process_level_key(key);
} else if (strcmp(key->name, "timerkey") == 0 && zks_rising_edge == key_state) {
mf_process_timer_key(key);
} else if (strcmp(key->name, "intervalkey") == 0 && zks_rising_edge == key_state) {
mf_process_interval_key(key);
}
}
/***********************************************************************************************************************
* ===============================================THIS_MODULE_SCHEDULE================================================ *
***********************************************************************************************************************/
static void mf_try_autoshutdown() {
if (thisDevice.poweron) {
if (thisDevice.countdonwnum_s == 0) {
shutdwon();
}
}
}
static void mf_try_autostop() {
//间歇模式下,定时到达定时时间,停止工作
if (thisDevice.countdonwnum_s == 0) stopwork();
}
static void mf_try_auto_restart() {
//间歇模式下,设备工作一定时间后,休息一定时间
if (systicket_haspassedms(thisDevice.countdonw_start_ticket) / 1000 > //
(/*设备工作时间:*/ thisDevice.countdonw_setting_num * kconst_countdown_step_s + //
/*设备休息时间*/ thisDevice.countdonw_setting_num * kconst_countdown_step_s)) {
mf_set_countdown(thisDevice.countdonw_setting_num);
startwork();
}
}
static void mf_update_countdown() {
if /* */ (thisDevice.mode == knormal) {
thisDevice.countdonwnum = 0;
thisDevice.countdonwnum_s = 0;
} else if (thisDevice.mode == ktimingMode || thisDevice.mode == kintermittentMode) {
if (thisDevice.countdonwnum_s != 0) {
thisDevice.countdonwnum_s = //
thisDevice.countdonw_setting_num * kconst_countdown_step_s - systicket_haspassedms(thisDevice.countdonw_start_ticket) / 1000;
thisDevice.countdonwnum = compute_countdown_num(thisDevice.countdonwnum_s);
}
}
}
void this_module_schedule() {
/**
* @brief 定时模式下
*/
if (thisDevice.mode == ktimingMode) {
//定时自动关机
mf_update_countdown();
mf_try_autoshutdown();
}
/**
* @brief 间歇模式下,自动停止,自动重启
*/
if (thisDevice.mode == kintermittentMode) {
mf_update_countdown();
if (thisDevice.working) {
mf_try_autostop();
} else {
mf_try_auto_restart();
}
}
};
/***********************************************************************************************************************
* =======================================================MAIN======================================================== *
***********************************************************************************************************************/
static void mf_do_debug_light_state() {
static uint8_t debug_led_state = 1;
debug_led_state = !debug_led_state;
port_debug_set(debug_led_state);
}
static void mf_init_all_subdevice_state() {
port_debug_set(false);
port_fan_set(false);
port_led0_set(false);
port_led1_set(false);
port_led2_set(false);
port_led3_set(false);
port_led_r_set(false);
port_led_g_set(false);
port_led_b_set(false);
}
void WDTInit(void) {
IWDT_InitStruType x;
x.WDT_Tms = 10000;
x.WDT_IE = Enable; /* IWDT中断使能 */
x.WDT_Rst = Enable; /* IWDT复位使能 */
x.WDT_Clock = IWDT_CLOCK_WDT; /* LRC */
IWDT_Init(&x);
/* 使能IWDT */
IWDT_Enable();
}
int main(void) {
SystemInit(); //配置系统时钟
DeviceClockAllEnable(); //打开所有外设时钟
systicket_init();
/*系统初始化*/
zgpio_init_all_gpio(); //
port_init(); //
mf_init_all_subdevice_state(); //
printf("==========OZONE_GENERATOR==========\n"); //
printf("= manufactor: iflytop\n"); //
printf("= version : %s\n", VERSION); //
printf("=\n"); //
WDTInit();
/*组件初始化*/
zkey_init(&key_module); //按键初始化
ozone_control_init();
/**
* @brief
* 频率从20k起步,递增50hz,每次等待100ms计算功率
*/
while (true) {
//按键扫描逻辑
DO_IT_EACH_MS(KEY_PERIOD) { zkey_do_loop_in_each_period(NULL); }
END();
//调试指示灯
DO_IT_EACH_MS(150) { mf_do_debug_light_state(); }
END();
//臭氧控制逻辑Schedule
ozone_control_schedule();
//人机交互逻辑Schedule
hcis_shcedule();
//当前模块逻辑Schedule
this_module_schedule();
//喂狗
if (0x01 == IWDT_GetFlagStatus()) IWDT_Clear();
}
}