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.
241 lines
8.7 KiB
241 lines
8.7 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/device_state.h"
|
|
#include "service/light_control_service.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);
|
|
static zsimple_timer_t zsimple_timer_mem[20]; //最多同时存在20个定时器
|
|
zsimple_timer_t* debuglighttimer;
|
|
|
|
/***********************************************************************************************************************
|
|
* =======================================================方法======================================================== *
|
|
***********************************************************************************************************************/
|
|
|
|
static uint32_t compute_countdown_num(int countdowns) {
|
|
if (countdowns) return countdowns / kconst_countdown_step_s + !!(countdowns % kconst_countdown_step_s);
|
|
}
|
|
|
|
static void shutdwon() {
|
|
printf("power off\n");
|
|
thisDevice.poweron = false;
|
|
port_fan_set(false);
|
|
//@TODO:关闭臭氧
|
|
}
|
|
|
|
static void increase_and_assign_countdonwnum() {
|
|
if (thisDevice.countdonwnum == 4) {
|
|
thisDevice.countdonwnum = 0;
|
|
thisDevice.countdonwnum_s = 0;
|
|
thisDevice.countdonw_s_setting_num = 0;
|
|
lcs_active_input(knone_active);
|
|
} else {
|
|
thisDevice.countdonwnum_s = (thisDevice.countdonwnum + 1) * kconst_countdown_step_s;
|
|
thisDevice.countdonwnum = thisDevice.countdonwnum + 1;
|
|
thisDevice.countdonw_s_setting_num = thisDevice.countdonwnum_s;
|
|
thisDevice.countdonw_start_ticket = systicket_get_now_ms();
|
|
}
|
|
}
|
|
|
|
static void onkey(zkey_t* key, zkey_state_t key_state) {
|
|
if /* */ (strcmp(key->name, "powerkey") == 0 && zks_rising_edge == key_state) {
|
|
printf("on %s \n", key->name);
|
|
if (!thisDevice.poweron) {
|
|
printf("power on\n");
|
|
thisDevice.poweron = true;
|
|
thisDevice.level = klevel1;
|
|
thisDevice.mode = knormal;
|
|
|
|
//设置灯光效果
|
|
port_fan_set(true);
|
|
//@TODO:启动臭氧
|
|
} else {
|
|
shutdwon();
|
|
}
|
|
return;
|
|
}
|
|
// levelkey
|
|
if (strcmp(key->name, "levelkey") == 0 && zks_rising_edge == key_state) {
|
|
printf("on %s \n", key->name);
|
|
/**
|
|
* @brief 当前在不在修改状态,不在,则进入修改状态
|
|
*/
|
|
if (!lcs_input_is_active(kchange_level_input)) {
|
|
lcs_active_input(kchange_level_input);
|
|
return;
|
|
}
|
|
|
|
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;
|
|
//更改臭氧状态
|
|
}
|
|
lcs_active_input(kchange_level_input);
|
|
return;
|
|
}
|
|
// timerkey
|
|
if (strcmp(key->name, "timerkey") == 0 && zks_rising_edge == key_state) {
|
|
printf("on %s \n", key->name);
|
|
if (!lcs_input_is_active(kchange_countdonw_time_input)) {
|
|
lcs_active_input(kchange_countdonw_time_input);
|
|
|
|
if (thisDevice.mode != ktimingMode || thisDevice.countdonwnum_s == 0) {
|
|
thisDevice.countdonwnum_s = kconst_countdown_step_s;
|
|
thisDevice.countdonwnum = 1;
|
|
thisDevice.countdonw_s_setting_num = thisDevice.countdonwnum_s;
|
|
thisDevice.countdonw_start_ticket = systicket_get_now_ms();
|
|
}
|
|
return;
|
|
}
|
|
|
|
lcs_active_input(kchange_countdonw_time_input);
|
|
increase_and_assign_countdonwnum();
|
|
}
|
|
if (strcmp(key->name, "intervalkey") == 0 && zks_rising_edge == key_state) {
|
|
printf("on %s \n", key->name);
|
|
|
|
if (!lcs_input_is_active(kchange_intermittentmode_time_input)) {
|
|
lcs_active_input(kchange_intermittentmode_time_input);
|
|
|
|
if (thisDevice.mode != kintermittentMode || thisDevice.countdonwnum_s == 0) {
|
|
thisDevice.countdonwnum_s = kconst_countdown_step_s;
|
|
thisDevice.countdonwnum = 1;
|
|
thisDevice.countdonw_s_setting_num = thisDevice.countdonwnum_s;
|
|
thisDevice.countdonw_start_ticket = systicket_get_now_ms();
|
|
}
|
|
return;
|
|
}
|
|
|
|
lcs_active_input(kchange_intermittentmode_time_input);
|
|
increase_and_assign_countdonwnum();
|
|
}
|
|
}
|
|
|
|
void process_countdwonevent() {
|
|
//计算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_s_setting_num - systicket_haspassedms(thisDevice.countdonw_start_ticket) / 1000;
|
|
thisDevice.countdonwnum = compute_countdown_num(thisDevice.countdonwnum_s);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief 处理倒计时事件发生时的事件
|
|
*/
|
|
if (thisDevice.mode == ktimingMode) {
|
|
//定时自动关机
|
|
if (thisDevice.poweron) {
|
|
if (thisDevice.countdonwnum_s == 0) {
|
|
shutdwon();
|
|
}
|
|
}
|
|
} else if (thisDevice.mode == kintermittentMode) {
|
|
if (!thisDevice.intermittentMode_idle) {
|
|
if (thisDevice.countdonwnum_s == 0) {
|
|
//切换状态到待机状态
|
|
// TODO:关闭臭氧
|
|
thisDevice.intermittentMode_idle = true;
|
|
}
|
|
} else {
|
|
if (systicket_haspassedms(thisDevice.countdonw_start_ticket) / 1000 > INTERMITTENTMODE_PERIOD_S) {
|
|
thisDevice.intermittentMode_idle = false;
|
|
//
|
|
thisDevice.countdonw_start_ticket = systicket_get_now_ms();
|
|
thisDevice.countdonwnum_s = thisDevice.countdonw_s_setting_num;
|
|
thisDevice.countdonwnum = compute_countdown_num(thisDevice.countdonwnum_s);
|
|
|
|
//启动设备
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
void do_debug_light_state(zsimple_timer_t* handler) {
|
|
static uint8_t debug_led_state = 1;
|
|
debug_led_state = !debug_led_state;
|
|
port_debug_set(debug_led_state);
|
|
}
|
|
|
|
void 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);
|
|
}
|
|
|
|
int main(void) {
|
|
SystemInit(); //配置系统时钟
|
|
DeviceClockAllEnable(); //打开所有外设时钟
|
|
systicket_init();
|
|
|
|
/*系统初始化*/
|
|
zgpio_init_all_gpio(); //
|
|
port_init(); //
|
|
init_all_subdevice_state(); //
|
|
printf("==========OZONE_GENERATOR==========\n"); //
|
|
printf("= manufactor: iflytop\n"); //
|
|
printf("= version : %s\n", VERSION); //
|
|
printf("=\n"); //
|
|
|
|
/*组件初始化*/
|
|
zsimple_timer_module_init(zsimple_timer_mem, ZARR_SIZE(zsimple_timer_mem), systicket_get_now_ms); //定时器模块初始化
|
|
zkey_init(&key_module); //按键初始化
|
|
|
|
port_fan_set(true);
|
|
port_ozone_pwm_set_duty(30000, 10 * 1000);
|
|
port_ozone_pwm_start();
|
|
|
|
debuglighttimer = zsimple_timer_alloc();
|
|
zsimple_timer_trigger_static(debuglighttimer, 300, INFINITE_TIMES /*触发次数:*/, true, do_debug_light_state);
|
|
|
|
lcs_count_donwload_light__set_count_num(3);
|
|
lcs_status_light__set_color(/*r:*/ true, /*g:*/ false, /*b:*/ false);
|
|
|
|
while (true) {
|
|
//按键扫描逻辑
|
|
DO_IT_EACH_MS(KEY_PERIOD) { zkey_do_loop_in_each_period(NULL); }
|
|
END();
|
|
|
|
zsimple_timer_schedule();
|
|
lcs_shcedule();
|
|
// test_all_light();
|
|
}
|
|
}
|