123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- #include "ets_sys.h"
- #include "os_type.h"
- #include "osapi.h"
- #include "mem.h"
- #include "gpio.h"
- #include "user_interface.h"
- #include "driver/key.h"
- LOCAL void key_intr_handler(struct keys_param *keys);
- struct single_key_param *ICACHE_FLASH_ATTR
- key_init_single(uint8 gpio_id, uint32 gpio_name, uint8 gpio_func, key_function long_press, key_function short_press)
- {
- struct single_key_param *single_key = (struct single_key_param *)os_zalloc(sizeof(struct single_key_param));
- single_key->gpio_id = gpio_id;
- single_key->gpio_name = gpio_name;
- single_key->gpio_func = gpio_func;
- single_key->long_press = long_press;
- single_key->short_press = short_press;
- return single_key;
- }
- void ICACHE_FLASH_ATTR
- key_init(struct keys_param *keys)
- {
- uint8 i;
- ETS_GPIO_INTR_ATTACH(key_intr_handler, keys);
- ETS_GPIO_INTR_DISABLE();
- for (i = 0; i < keys->key_num; i++) {
- keys->single_key[i]->key_level = 1;
- PIN_FUNC_SELECT(keys->single_key[i]->gpio_name, keys->single_key[i]->gpio_func);
- gpio_output_set(0, 0, 0, GPIO_ID_PIN(keys->single_key[i]->gpio_id));
- gpio_register_set(GPIO_PIN_ADDR(keys->single_key[i]->gpio_id), GPIO_PIN_INT_TYPE_SET(GPIO_PIN_INTR_DISABLE)
- | GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_DISABLE)
- | GPIO_PIN_SOURCE_SET(GPIO_AS_PIN_SOURCE));
-
- GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, BIT(keys->single_key[i]->gpio_id));
-
- gpio_pin_intr_state_set(GPIO_ID_PIN(keys->single_key[i]->gpio_id), GPIO_PIN_INTR_NEGEDGE);
- }
- ETS_GPIO_INTR_ENABLE();
- }
- LOCAL void ICACHE_FLASH_ATTR
- key_5s_cb(struct single_key_param *single_key)
- {
- os_timer_disarm(&single_key->key_5s);
-
- if (0 == GPIO_INPUT_GET(GPIO_ID_PIN(single_key->gpio_id))) {
- if (single_key->long_press) {
- single_key->long_press();
- }
- }
- }
- LOCAL void ICACHE_FLASH_ATTR
- key_50ms_cb(struct single_key_param *single_key)
- {
- os_timer_disarm(&single_key->key_50ms);
-
- if (1 == GPIO_INPUT_GET(GPIO_ID_PIN(single_key->gpio_id))) {
- os_timer_disarm(&single_key->key_5s);
- single_key->key_level = 1;
- gpio_pin_intr_state_set(GPIO_ID_PIN(single_key->gpio_id), GPIO_PIN_INTR_NEGEDGE);
- if (single_key->short_press) {
- single_key->short_press();
- }
- } else {
- gpio_pin_intr_state_set(GPIO_ID_PIN(single_key->gpio_id), GPIO_PIN_INTR_POSEDGE);
- }
- }
- LOCAL void
- key_intr_handler(struct keys_param *keys)
- {
- uint8 i;
- uint32 gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);
- for (i = 0; i < keys->key_num; i++) {
- if (gpio_status & BIT(keys->single_key[i]->gpio_id)) {
-
- gpio_pin_intr_state_set(GPIO_ID_PIN(keys->single_key[i]->gpio_id), GPIO_PIN_INTR_DISABLE);
-
- GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status & BIT(keys->single_key[i]->gpio_id));
- if (keys->single_key[i]->key_level == 1) {
-
- os_timer_disarm(&keys->single_key[i]->key_5s);
- os_timer_setfn(&keys->single_key[i]->key_5s, (os_timer_func_t *)key_5s_cb, keys->single_key[i]);
- os_timer_arm(&keys->single_key[i]->key_5s, 5000, 0);
- keys->single_key[i]->key_level = 0;
- gpio_pin_intr_state_set(GPIO_ID_PIN(keys->single_key[i]->gpio_id), GPIO_PIN_INTR_POSEDGE);
- } else {
-
- os_timer_disarm(&keys->single_key[i]->key_50ms);
- os_timer_setfn(&keys->single_key[i]->key_50ms, (os_timer_func_t *)key_50ms_cb, keys->single_key[i]);
- os_timer_arm(&keys->single_key[i]->key_50ms, 50, 0);
- }
- }
- }
- }
|