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.
163 lines
5.7 KiB
163 lines
5.7 KiB
#include "key.h"
|
|
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);
|
|
|
|
void zkey_init(zkey_module_t *module) {
|
|
/**
|
|
* @brief 按键初始化,三个状态的初始化,之前的,现在的,之后的
|
|
*
|
|
*/
|
|
s_module = module;
|
|
s_inited = true; //标志位说明按键初始化完成
|
|
|
|
for (int i = 0; i < s_module->nkey; i++) {
|
|
s_module->keys[i].cur_state = zks_keep;
|
|
s_module->keys[i].last_io_state = s_module->keys[i].get_key_state();
|
|
s_module->keys[i].after_filter_state = s_module->keys[i].get_key_state();
|
|
}
|
|
}
|
|
|
|
void zkey_do_loop_in_each_period(void *_null) { /**
|
|
* @brief 循环查询按键的状态
|
|
*
|
|
*/
|
|
if (!s_inited)
|
|
return;
|
|
for (int i = 0; i < s_module->nkey; i++) //开始对每个按键进行查询
|
|
{
|
|
zkey_process_each(&s_module->keys[i]);
|
|
}
|
|
}
|
|
|
|
void zkey_process_each(zkey_t *each) {
|
|
/**
|
|
* @brief 按键是否发生变换,没变换的时候进行时间记录
|
|
*
|
|
* @param each
|
|
*/
|
|
each->keep_state_count++;
|
|
|
|
bool now_io_state = each->get_key_state(); //获取现在的按键io状态
|
|
if (each->currentstatekeep_count < 1000) {
|
|
each->currentstatekeep_count++;
|
|
}
|
|
if (now_io_state != each->last_real_state) //发生变换
|
|
{
|
|
each->currentstatekeep_count = 0;
|
|
}
|
|
if (each->currentstatekeep_count >= 1) //按键状态保持时间大于20ms,更新按键状态
|
|
{
|
|
each->after_filter_state = now_io_state;
|
|
}
|
|
each->last_real_state = now_io_state;
|
|
zkey_process_each_after_filter(each, each->after_filter_state);
|
|
}
|
|
|
|
void zkey_process_each_after_filter(zkey_t *each, bool now_io_state) {
|
|
if (now_io_state != each->last_io_state) {
|
|
if (now_io_state) {
|
|
each->keep_state_count = 0;
|
|
each->hasProcessed = false;
|
|
each->cur_state = zks_rising_edge;
|
|
s_module->onkey(each, each->cur_state);
|
|
} else {
|
|
each->cur_state = zks_falling_edge;
|
|
s_module->onkey(each, each->cur_state);
|
|
each->keep_state_count = 0;
|
|
}
|
|
each->last_io_state = now_io_state;
|
|
} else {
|
|
each->cur_state = zks_keep;
|
|
if (now_io_state) {
|
|
s_module->onkey(each, each->cur_state);
|
|
}
|
|
}
|
|
}
|
|
//############################### 原本在main中的方法 以下都是
|
|
//###############################//
|
|
extern uint32_t g_frequency;
|
|
extern uint32_t g_duty[4];
|
|
extern int g_ozen_gears;
|
|
extern uint32_t g_count_down_begin_sys_time;
|
|
extern int time_key_press_frequency; //每按下4次进行清0
|
|
extern uint32_t g_ozone_work_time;
|
|
|
|
void onkey(zkey_t *key, zkey_state_t key_state) {
|
|
/**
|
|
* @brief 判断每个按键触发的状态
|
|
*
|
|
* @param key
|
|
* @param key_state
|
|
*/
|
|
if (get_ozone_starting_up_state()) { //开机中
|
|
if (key == &s_keys[0] && //定时按键
|
|
key->cur_state == zks_keep && //长按
|
|
!key->hasProcessed && //没有被处理过
|
|
key->keep_state_count >=
|
|
POWER_KEY_TRIGGER_TIME / KEY_SCAN_PERIOD) //按下持续时间大于3s
|
|
{
|
|
key->hasProcessed = true;
|
|
// printf("key0 zks_keep\r\n");
|
|
// stop_ozone_work();
|
|
} else if (key == &s_keys[0] && //定时按键
|
|
key->cur_state == zks_falling_edge && //下降沿触发
|
|
!key->hasProcessed &&
|
|
key->keep_state_count <=
|
|
POWER_KEY_TRIGGER_TIME / KEY_SCAN_PERIOD) //小于3s
|
|
{
|
|
key->hasProcessed = true;
|
|
printf("key0 zks_falling_edge\r\n");
|
|
// set_ozone_work_time();
|
|
// set_timing_time(running_time.timing_time_state);
|
|
} else if (key == &s_keys[1] && //高低档位选择
|
|
key->cur_state == zks_rising_edge && //
|
|
!key->hasProcessed && //
|
|
key->keep_state_count <=
|
|
POWER_KEY_TRIGGER_TIME / KEY_SCAN_PERIOD) {
|
|
key->hasProcessed = true;
|
|
// key_control_switch_gears(g_switch_gears);
|
|
printf("key1 zks_rising_edge\r\n");
|
|
// set_ozen_gears(g_ozen_gears);
|
|
} else if (key == &s_keys[2] && //间歇时间选择
|
|
key->cur_state == zks_rising_edge && //
|
|
!key->hasProcessed && //
|
|
key->keep_state_count <=
|
|
POWER_KEY_TRIGGER_TIME / KEY_SCAN_PERIOD) {
|
|
key->hasProcessed = true;
|
|
printf("key2 zks_rising_edge\r\n");
|
|
// set_interval_time();
|
|
// set_interval_time(running_time.interval_time_state);
|
|
} else if (key == &s_keys[3] && //开关
|
|
key->cur_state == zks_rising_edge && //
|
|
!key->hasProcessed && //
|
|
key->keep_state_count <=
|
|
POWER_KEY_TRIGGER_TIME / KEY_SCAN_PERIOD) {
|
|
key->hasProcessed = true;
|
|
printf("key3 zks_rising_edge\r\n");
|
|
process_switch_key();
|
|
// set_interval_time(running_time.interval_time_state);
|
|
}
|
|
} else {
|
|
if (key == &s_keys[3] && //开关
|
|
key->cur_state == zks_rising_edge && //
|
|
!key->hasProcessed && //
|
|
key->keep_state_count <= POWER_KEY_TRIGGER_TIME / KEY_SCAN_PERIOD) {
|
|
key->hasProcessed = true;
|
|
printf("key zks_rising_edge\r\n");
|
|
process_switch_key();
|
|
// set_interval_time(running_time.interval_time_state);
|
|
}
|
|
}
|
|
}
|
|
void port_key_state(void) {
|
|
static uint32_t keylastprocess = 0;
|
|
if (port_haspassedms(keylastprocess) > 20) {
|
|
keylastprocess = get_sys_ticket();
|
|
zkey_do_loop_in_each_period(NULL);
|
|
}
|
|
}
|