#define os_log(format, ...) custom_log("KEY", format, ##__VA_ARGS__) #include "main.h" #include "user_gpio.h" #include "user_mqtt_client.h" #include "user_udp.h" #include "cJSON/cJSON.h" mico_gpio_t relay[Relay_NUM] = { Relay_0, Relay_1, Relay_2, Relay_3, Relay_4, Relay_5 }; void user_led_set(char x) { if (x == -1) MicoGpioOutputTrigger(Led); else if (x) MicoGpioOutputHigh(Led); else MicoGpioOutputLow(Led); } bool relay_out(void) { int i; for (i = 0; i < PLUG_NUM; i++) { if (user_config->plug[i].on != 0) { return true; } } return false; } const unsigned char* get_socket_status() { sprintf(socket_status, "%d,%d,%d,%d,%d,%d", user_config->plug[0].on, user_config->plug[1].on, user_config->plug[2].on, user_config->plug[3].on, user_config->plug[4].on, user_config->plug[5].on); return (const unsigned char*)socket_status; } void set_socket_status(char* socket_status) { int ons[6] = { 0 }; sscanf(socket_status, "%d,%d,%d,%d,%d,%d,", &ons[0], &ons[1], &ons[2], &ons[3], &ons[4], &ons[5]); int i = 0; for (i = 0; i < PLUG_NUM; i++) { user_relay_set(i, ons[i]); } } /*user_relay_set * 设置继电器开关 * i:编号 0-5 * on:开关 0:关 1:开 */ void user_relay_set(unsigned char i, unsigned char on) { if (i >= PLUG_NUM) return; if (on == Relay_ON) { MicoGpioOutputHigh(relay[i]); } else { MicoGpioOutputLow(relay[i]); } user_config->plug[i].on = on; if (relay_out()) { user_led_set(1); } else { user_led_set(0); } } /* * 设置所有继电器开关 * y: 0:全部关 1:全部开 * */ void user_relay_set_all(char y) { int i; for (i = 0; i < PLUG_NUM; i++) user_relay_set(i, y); } static void key_long_press(void) { // os_log("key_long_press"); // user_led_set(1); // user_mqtt_send("mqtt test"); } static void key_long_10s_press(void) { os_log("WARNGIN: user params restored!"); // char i = 0; // for (i = 0; i < 3; i++) // { // user_led_set(1); // mico_rtos_thread_msleep(100); // user_led_set(0); // } // appRestoreDefault_callback(user_config, sizeof(user_config_t)); sys_config->micoSystemConfig.ssid[0] = 0; mico_system_context_update(mico_system_context_get()); } static void key_short_press(void) { char i; if (relay_out()) { user_relay_set_all(0); } else { user_relay_set_all(1); } for (i = 0; i < PLUG_NUM; i++) { user_mqtt_send_plug_state(i); } } mico_timer_t user_key_timer; uint16_t key_time = 0; #define BUTTON_LONG_PRESS_TIME 10 //100ms*10=1s static void key_timeout_handler(void* arg) { static char key_trigger, key_continue; //按键扫描程序 char tmp = ~(0xfe | MicoGpioInputGet(Button)); key_trigger = tmp & (tmp ^ key_continue); key_continue = tmp; // os_log("button scan:%02x %02x",key_trigger,key_continue); if (key_trigger != 0) key_time = 0; //新按键按下时,重新开始按键计时 if (key_continue != 0) { //any button pressed key_time++; if (key_time <= BUTTON_LONG_PRESS_TIME) { os_log("button long pressed:%d",key_time); if (key_time == 30) { key_long_press(); } else if (key_time == 100) { key_long_10s_press(); } else if (key_time == 102) { user_led_set(1); } else if (key_time == 103) { user_led_set(0); key_time = 101; } } } else { //button released if (key_time < BUTTON_LONG_PRESS_TIME) { //100ms*10=1s 大于1s为长按 key_time = 0; os_log("button short pressed:%d",key_time); key_short_press(); } else if (key_time > 100) { MicoSystemReboot(); } mico_rtos_stop_timer(&user_key_timer); } } static void key_falling_irq_handler(void* arg) { mico_rtos_start_timer(&user_key_timer); } void key_init(void) { MicoGpioInitialize(Button, INPUT_PULL_UP); mico_rtos_init_timer(&user_key_timer, 100, key_timeout_handler, NULL); MicoGpioEnableIRQ(Button, IRQ_TRIGGER_FALLING_EDGE, key_falling_irq_handler, NULL); }