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.
310 lines
12 KiB
310 lines
12 KiB
#include "main.h"
|
|
|
|
#include <stdbool.h> //定义布尔
|
|
|
|
#include "board.h"
|
|
|
|
/***********************************************************************************************************************
|
|
* =====================================================函数声明====================================================== *
|
|
***********************************************************************************************************************/
|
|
void onkey(zkey_t *key, zkey_state_t key_state);
|
|
/***********************************************************************************************************************
|
|
* =====================================================全局变量====================================================== *
|
|
***********************************************************************************************************************/
|
|
|
|
static zkey_t s_keys[] = {
|
|
ZKEY_INIT("timerkey", port_gpio_get_timer_key_state),
|
|
ZKEY_INIT("gearskey", port_gpio_get_gears_key_state),
|
|
ZKEY_INIT("intervalkey", port_gpio_get_interval_key_state),
|
|
ZKEY_INIT("switchkey", port_gpio_get_switch_key_state),
|
|
};
|
|
zkey_module_t key_module = ZMODULE_INIT(s_keys, onkey);
|
|
|
|
/***********************************************************************************************************************
|
|
* =====================================================全局状态====================================================== *
|
|
***********************************************************************************************************************/
|
|
static bool error_even_trigger_after_stop_ozone_work_state; //错误事件触发后停止臭氧工作标志位
|
|
|
|
// 设置
|
|
bool g_setting_interval_work_flag = false; //现在的档位
|
|
WORK_LEVEL_T g_setting_level = WORK_LEVEL_LOW; //关机前的档位
|
|
|
|
//标志位
|
|
bool g_power_flag = false; //开关机标志位
|
|
static int g_error_num;
|
|
bool g_auto_shutdown_flag = false; //定时功能使能标志位
|
|
static uint32_t g_auto_shutdown_countdown_s; //定时时间
|
|
|
|
//其他
|
|
static bool pwm_modble_enable_falg; //硬件pwm使能标志位
|
|
|
|
/***********************************************************************************************************************
|
|
* =======================================================HOOK======================================================== *
|
|
***********************************************************************************************************************/
|
|
void HOOK_pwm_module_set_pwm_duty(uint32_t frequency, uint32_t duty) {
|
|
set_pwm_modbul_freq_duty(frequency, duty);
|
|
port_fan_set(true); //打开风扇
|
|
pwm_modble_enable_falg = true;
|
|
printf("work\r\n");
|
|
}
|
|
void HOOK_pwm_stop(void) {
|
|
set_pwm_modbul_freq_duty(1, 0); //关闭PWM输出
|
|
port_fan_set(false); //风扇结束工作
|
|
pwm_modble_enable_falg = false;
|
|
printf("rest\r\n");
|
|
}
|
|
bool HOOK_pwm_is_enable(void) { return pwm_modble_enable_falg; }
|
|
int hook_get_autoshutdown_timecount() { return g_auto_shutdown_countdown_s; }
|
|
|
|
/***********************************************************************************************************************
|
|
* =================================================INTERNAL_FUNCTION================================================= *
|
|
***********************************************************************************************************************/
|
|
/**
|
|
* @brief 根据档位设置pwm输出,rgb的颜色
|
|
*
|
|
* @param gears
|
|
*/
|
|
void update_ozone_work_level(bool interval_work, WORK_LEVEL_T level) {
|
|
printf("update_ozone_work_level(interval_work:%d,level:%d)\n", interval_work, level);
|
|
rgb_light_mode_t lightmode;
|
|
int duty = 0;
|
|
|
|
if (level == WORK_LEVEL_CLOSE) {
|
|
duty = 0;
|
|
lightmode = RGB_CLOSE;
|
|
} else if (level == WORK_LEVEL_LOW) {
|
|
duty = 25;
|
|
lightmode = RGB_COLOR_GERRN;
|
|
} else if (level == WORK_LEVEL_MIDDLE) {
|
|
duty = 50;
|
|
lightmode = RGB_COLOR_BLUE;
|
|
} else if (level == WORK_LEVEL_HIGHT) {
|
|
duty = 100;
|
|
lightmode = RGB_COLOR_RED;
|
|
}
|
|
|
|
if (interval_work) {
|
|
ozone_pwm_control_module_set_pwm_output_2(1, 0, INTERVAL_WORK_DUTY, INTERVAL_WORK_PERIOD_MS);
|
|
} else {
|
|
set_pwm_modbul_freq_duty(1, duty);
|
|
}
|
|
light_module_set_rgb_mode(lightmode);
|
|
light_module_set_rgb_flicker_mode(interval_work);
|
|
}
|
|
|
|
/**
|
|
* @brief 关机
|
|
*/
|
|
void shutdown(void) {
|
|
printf("shutdown\n");
|
|
g_power_flag = false;
|
|
g_error_num = 0;
|
|
g_auto_shutdown_flag = false;
|
|
g_auto_shutdown_countdown_s = 0;
|
|
|
|
update_ozone_work_level(false, WORK_LEVEL_CLOSE);
|
|
port_fan_set(false); //关闭风扇
|
|
light_module_close_all_light();
|
|
}
|
|
/***********************************************************************************************************************
|
|
* ======================================================看门狗======================================================= *
|
|
***********************************************************************************************************************/
|
|
void iwdt_init(void) {
|
|
/**
|
|
* @brief 看门狗介绍:当计数到0时,窗口计数器+1
|
|
* 当窗口计数为“2”的时候,产生中断
|
|
* 当窗口计数器为“4”的之前没有进行喂狗操作,产生复位
|
|
*/
|
|
IWDT_InitStruType x;
|
|
|
|
x.WDT_Tms = 4000;
|
|
x.WDT_IE = Enable; /* IWDT中断使能 */
|
|
x.WDT_Rst = Enable; /* IWDT复位使能 */
|
|
x.WDT_Clock = IWDT_CLOCK_WDT; /* LRC */
|
|
IWDT_Init(&x);
|
|
/* 使能IWDT */
|
|
IWDT_Enable();
|
|
}
|
|
void feed_iwdt(void) {
|
|
//喂狗
|
|
if (0x01 == IWDT_GetFlagStatus()) {
|
|
IWDT_Clear();
|
|
// printf("喂狗\r\n");
|
|
}
|
|
}
|
|
|
|
void onkey(zkey_t *key, zkey_state_t key_state) {
|
|
if (key->hasProcessed) return;
|
|
/**
|
|
* @brief 关机时,只处理电源按键
|
|
*/
|
|
if (!g_power_flag) {
|
|
if (key == &s_keys[3] && key->cur_state == zks_falling_edge) {
|
|
key->hasProcessed = true;
|
|
printf("key zks_rising_edge\r\n");
|
|
/**
|
|
* @brief 开机
|
|
* 1.设置标志位
|
|
* 2.打开风扇
|
|
* 3.打开臭氧并打开相应的指示灯
|
|
*/
|
|
|
|
g_power_flag = true; //开关机标志位
|
|
g_error_num = 0;
|
|
g_auto_shutdown_flag = false; //定时功能使能标志位
|
|
g_auto_shutdown_countdown_s = 0; //定时时间
|
|
|
|
port_fan_set(true); //打开你风扇
|
|
update_ozone_work_level(g_setting_interval_work_flag, g_setting_level);
|
|
}
|
|
return;
|
|
}
|
|
|
|
/**
|
|
* @brief 发生异常时,除了电源按键外,所有按键失效。
|
|
*/
|
|
if (g_error_num != 0) { //设备存在异常
|
|
if (key == &s_keys[3] && key->cur_state == zks_falling_edge) {
|
|
key->hasProcessed = true;
|
|
printf("process key[2] event\r\n");
|
|
/**
|
|
* @brief 关机
|
|
*/
|
|
shutdown();
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (key == &s_keys[0] && key->cur_state == zks_falling_edge) //小于3s
|
|
{
|
|
printf("process key[0] event\r\n");
|
|
/**
|
|
* @brief 处理定时按键事件
|
|
*/
|
|
if (!g_auto_shutdown_flag) {
|
|
g_auto_shutdown_flag = true;
|
|
g_auto_shutdown_countdown_s = 0;
|
|
}
|
|
g_auto_shutdown_countdown_s += AUTO_SHUTDOWN_ONE_LIGHT_EQ_TIME_S;
|
|
} else if (key == &s_keys[1] && key->cur_state == zks_falling_edge) {
|
|
/**
|
|
* @brief 处理等级按键
|
|
*/
|
|
printf("process key[1] event\r\n");
|
|
if (g_setting_level == WORK_LEVEL_HIGHT) {
|
|
update_ozone_work_level(g_setting_interval_work_flag, WORK_LEVEL_LOW);
|
|
} else if (g_setting_level == WORK_LEVEL_MIDDLE) {
|
|
update_ozone_work_level(g_setting_interval_work_flag, WORK_LEVEL_HIGHT);
|
|
} else if (g_setting_level == WORK_LEVEL_LOW) {
|
|
update_ozone_work_level(g_setting_interval_work_flag, WORK_LEVEL_MIDDLE);
|
|
}
|
|
} else if (key == &s_keys[2] && key->cur_state == zks_falling_edge) {
|
|
printf("process key[2] event\r\n");
|
|
/**
|
|
* @brief 处理间歇按键事件
|
|
*/
|
|
g_setting_interval_work_flag = !g_setting_interval_work_flag;
|
|
update_ozone_work_level(g_setting_interval_work_flag, g_setting_level);
|
|
} else if (key == &s_keys[3] && key->cur_state == zks_falling_edge) {
|
|
printf("process key[2] event\r\n");
|
|
/**
|
|
* @brief 关机
|
|
*/
|
|
shutdown();
|
|
}
|
|
}
|
|
/***********************************************************************************************************************
|
|
* ======================================================主函数=======================================================
|
|
***********************************************************************************************************************/
|
|
int main(void) {
|
|
HRC_Config(Enable, SCU_HRC_48M, Enable); //时钟源SCU_CLK_HRC
|
|
SystemInit();
|
|
DeviceClockAllEnable(); //打开所有外设时钟
|
|
User_SysTickInit(); //滴答定时器初始化为(配置为1ms中断)
|
|
SysTick_Enable();
|
|
//硬件初始化
|
|
unused_gpio_init();
|
|
gpio_init();
|
|
uart0_init();
|
|
t16_pa4_init();
|
|
|
|
//模块初始化
|
|
zkey_init(&key_module);
|
|
|
|
//上电默认关机
|
|
shutdown();
|
|
|
|
//启动结束
|
|
printf("Initialization completed\r\n");
|
|
|
|
while (true) {
|
|
/*******************************************************************************************************************
|
|
* ==================================================调试指示灯=================================================== *
|
|
*******************************************************************************************************************/
|
|
port_do_debug_light_state();
|
|
|
|
/***********************************************************************************************************************
|
|
* =================================================按键模块调度代码================================================== *
|
|
***********************************************************************************************************************/
|
|
{
|
|
static uint32_t keylastprocess = 0;
|
|
if (port_haspassedms(keylastprocess) > KEY_PERIOD) {
|
|
keylastprocess = get_sys_ticket();
|
|
zkey_do_loop_in_each_period(NULL);
|
|
}
|
|
}
|
|
/***********************************************************************************************************************
|
|
* ===============================================灯光控制模块调度代码================================================ *
|
|
***********************************************************************************************************************/
|
|
light_module_schedule();
|
|
|
|
/***********************************************************************************************************************
|
|
* ===============================================臭氧控制模块调度代码================================================ *
|
|
***********************************************************************************************************************/
|
|
ozone_pwm_control_module_loop();
|
|
|
|
/***********************************************************************************************************************
|
|
* ===================================================自动关机逻辑==================================================== *
|
|
***********************************************************************************************************************/
|
|
//
|
|
if (g_power_flag && g_auto_shutdown_flag) {
|
|
static uint32_t ticket = 0;
|
|
ticket = get_sys_ticket();
|
|
//
|
|
if (port_haspassedms(ticket) > 1000) {
|
|
ticket = get_sys_ticket();
|
|
if (g_auto_shutdown_countdown_s > 0) {
|
|
g_auto_shutdown_countdown_s -= 1;
|
|
} else {
|
|
g_auto_shutdown_flag = false;
|
|
/**
|
|
* @brief 触发定时关机
|
|
*/
|
|
shutdown();
|
|
}
|
|
}
|
|
//
|
|
}
|
|
/***********************************************************************************************************************
|
|
* ===================================================定时指示灯显示逻辑====================================================
|
|
***********************************************************************************************************************/
|
|
updae_timing_light_state();
|
|
/***********************************************************************************************************************
|
|
* ===================================================异常监控逻辑====================================================
|
|
***********************************************************************************************************************/
|
|
{
|
|
static uint32_t ticket = 0;
|
|
if (port_haspassedms(ticket) > EXCEPTION_CHECK_PERIOD) {
|
|
ticket = get_sys_ticket();
|
|
|
|
/**
|
|
* @brief
|
|
* 这里检测ADC的数值是否超出规定范围
|
|
*/
|
|
if (false) {
|
|
}
|
|
}
|
|
}
|
|
// End..................................
|
|
}
|
|
}
|