修改按键配置相关的代码

This commit is contained in:
nhkefus
2025-03-21 12:20:49 +08:00
parent b38f9f91d8
commit f7b6b8ae0a
4 changed files with 192 additions and 75 deletions

View File

@@ -226,7 +226,7 @@ static int HttpSetShortClickEvent(httpd_request_t *req) {
int index; int index;
int func; int func;
sscanf(buf, "%d %d", &index, &func); sscanf(buf, "%d %d", &index, &func);
user_config->user[index + 1] = func; set_key_map(index + 1,func, get_long_func(index + 1));
mico_system_context_update(sys_config); mico_system_context_update(sys_config);
send_http("OK", 2, exit, &err); send_http("OK", 2, exit, &err);

View File

@@ -34,7 +34,6 @@ void appRestoreDefault_callback(void *const user_config_data, uint32_t size) {
user_config_t *userConfigDefault = user_config_data; user_config_t *userConfigDefault = user_config_data;
userConfigDefault->user[0] = 0; userConfigDefault->user[0] = 0;
userConfigDefault->user[1] = SWITCH_TOTAL_SOCKET;
userConfigDefault->mqtt_ip[0] = 0; userConfigDefault->mqtt_ip[0] = 0;
userConfigDefault->mqtt_port = 0; userConfigDefault->mqtt_port = 0;
userConfigDefault->mqtt_user[0] = 0; userConfigDefault->mqtt_user[0] = 0;
@@ -46,8 +45,16 @@ void appRestoreDefault_callback(void *const user_config_data, uint32_t size) {
userConfigDefault->p_count_1_day_ago = 0; userConfigDefault->p_count_1_day_ago = 0;
userConfigDefault->power_led_enabled = 1; userConfigDefault->power_led_enabled = 1;
userConfigDefault->version = USER_CONFIG_VERSION; userConfigDefault->version = USER_CONFIG_VERSION;
for (int i = 2; i < 11; ++i){ set_key_map(1, SWITCH_ALL_SOCKETS, NO_FUNCTION);
userConfigDefault->user[i] = -1; for (int i = 2; i < 32; ++i) {
int longFunc = NO_FUNCTION;
//出厂设置长按5秒开启配网模式长按10秒恢复出厂设置
if (i == 5) {
longFunc = CONFIG_WIFI;
} else if (i == 10) {
longFunc = RESET_SYSTEM;
}
set_key_map(i, NO_FUNCTION, longFunc);
} }
int i; int i;

View File

@@ -8,6 +8,7 @@
mico_gpio_t relay[Relay_NUM] = {Relay_0, Relay_1, Relay_2, Relay_3, Relay_4, Relay_5}; mico_gpio_t relay[Relay_NUM] = {Relay_0, Relay_1, Relay_2, Relay_3, Relay_4, Relay_5};
char socket_status[32] = {0}; char socket_status[32] = {0};
char short_click_config[32] = {0}; char short_click_config[32] = {0};
char long_click_config[32] = {0};
void UserLedSet(char x) { void UserLedSet(char x) {
if (x == -1) if (x == -1)
@@ -28,6 +29,55 @@ bool RelayOut(void) {
return false; return false;
} }
const char *get_func_name(char func_code) {
static char buffer[32];
switch (func_code) {
case SWITCH_ALL_SOCKETS:
return "Toggle All Sockets";
case SWITCH_SOCKET_1:
case SWITCH_SOCKET_2:
case SWITCH_SOCKET_3:
case SWITCH_SOCKET_4:
case SWITCH_SOCKET_5:
case SWITCH_SOCKET_6:
sprintf(buffer, "Toggle Socket %d %s", func_code - 1,
user_config->socket_names[func_code - 1]);
return buffer;
case SWITCH_LED_ENABLE:
return "Toggle LED";
case REBOOT_SYSTEM:
return "Reboot";
case CONFIG_WIFI:
return "WiFi Config";
case RESET_SYSTEM:
return "Factory Reset";
case -1:
case NO_FUNCTION:
return "Unassigned";
default:
return "Unknown";
}
}
/// 针对电源按钮的点击事件
/// \param index 判断短按(连击)时,代表连击次数,判断长按时代表长按秒数
/// \param short_func 功能码 在user_gpio.h中定义了
/// \param long_func 功能码 在user_gpio.h中定义了
void set_key_map(int index, char short_func, char long_func) {
user_config->user[index] = ((long_func & 0x0F) << 4) | (short_func & 0x0F);
}
char get_short_func(char val) {
char func = val & 0x0F;
return (func == NO_FUNCTION) ? -1 : func; // -1 表示未配置
}
char get_long_func(char val) {
char func = (val >> 4) & 0x0F;
return (func == NO_FUNCTION) ? -1 : func; // -1 表示未配置
}
char *GetSocketStatus() { char *GetSocketStatus() {
sprintf(socket_status, "%d,%d,%d,%d,%d,%d", sprintf(socket_status, "%d,%d,%d,%d,%d,%d",
user_config->socket_status[0], user_config->socket_status[0],
@@ -41,16 +91,16 @@ char *GetSocketStatus() {
char *GetShortClickConfig() { char *GetShortClickConfig() {
sprintf(short_click_config, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d", sprintf(short_click_config, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",
user_config->user[1], get_short_func(user_config->user[1]),
user_config->user[2], get_short_func(user_config->user[2]),
user_config->user[3], get_short_func(user_config->user[3]),
user_config->user[4], get_short_func(user_config->user[4]),
user_config->user[5], get_short_func(user_config->user[5]),
user_config->user[6], get_short_func(user_config->user[6]),
user_config->user[7], get_short_func(user_config->user[7]),
user_config->user[8], get_short_func(user_config->user[8]),
user_config->user[9], get_short_func(user_config->user[9]),
user_config->user[10]); get_short_func(user_config->user[10]));
return short_click_config; return short_click_config;
} }
@@ -84,9 +134,9 @@ void UserRelaySet(unsigned char i, char on) {
} else if (on == Relay_OFF) { } else if (on == Relay_OFF) {
MicoGpioOutputLow(relay[i]); MicoGpioOutputLow(relay[i]);
} else if (on == Relay_TOGGLE) { } else if (on == Relay_TOGGLE) {
if(user_config->socket_status[i]==Relay_OFF){ if (user_config->socket_status[i] == Relay_OFF) {
MicoGpioOutputHigh(relay[i]); MicoGpioOutputHigh(relay[i]);
}else{ } else {
MicoGpioOutputLow(relay[i]); MicoGpioOutputLow(relay[i]);
} }
} }
@@ -109,28 +159,15 @@ void UserRelaySetAll(char y) {
for (i = 0; i < SOCKET_NUM; i++) for (i = 0; i < SOCKET_NUM; i++)
UserRelaySet(i, y); UserRelaySet(i, y);
} }
static void KeyEventHandler(int num, boolean longPress) {
static void KeyLong5sPress(void) { key_log("WARNGIN:Power key %s %d %s", !longPress ? "quick clicked" : "longPressed", num,
key_log("WARNGIN: wifi ap started!"); num > 1 ? (longPress ? "seconds" : "times") : (longPress ? "second" : "time"));
micoWlanSuspendStation(); if (num > 30 || num <= 0)
ApInit(true);
}
static void KeyLong10sPress(void) {
key_log("WARNGIN: user params restored!");
mico_system_context_restore(sys_config);
// appRestoreDefault_callback(user_config, sizeof(user_config_t));
// sys_config->micoSystemConfig.ssid[0] = 0;
// mico_system_context_update(mico_system_context_get());
}
static void KeyShortPress(int clickCnt) {
key_log("WARNGIN:Power key quick clicked %d time%s",clickCnt,clickCnt>1?"s":"");
if (clickCnt > 10||clickCnt <= 0)
return; return;
switch (user_config->user[clickCnt]) { int function = !longPress ? get_short_func(user_config->user[clickCnt]) : get_long_func(
case SWITCH_TOTAL_SOCKET: user_config->user[clickCnt]);key_log("WARNGIN:%s", get_func_name(function));
key_log("WARNGIN:SWITCH_TOTAL_SOCKET"); switch (function) {
case SWITCH_ALL_SOCKETS:
if (RelayOut()) { if (RelayOut()) {
UserRelaySetAll(0); UserRelaySetAll(0);
} else { } else {
@@ -148,14 +185,12 @@ static void KeyShortPress(int clickCnt) {
case SWITCH_SOCKET_4: case SWITCH_SOCKET_4:
case SWITCH_SOCKET_5: case SWITCH_SOCKET_5:
case SWITCH_SOCKET_6: case SWITCH_SOCKET_6:
key_log("WARNGIN:SWITCH_SOCKET%d %s",user_config->user[clickCnt] - 1,user_config->socket_names[user_config->user[clickCnt] - 1]);
UserRelaySet(user_config->user[clickCnt] - 1, Relay_TOGGLE); UserRelaySet(user_config->user[clickCnt] - 1, Relay_TOGGLE);
UserMqttSendSocketState(user_config->user[clickCnt] - 1); UserMqttSendSocketState(user_config->user[clickCnt] - 1);
UserMqttSendTotalSocketState(); UserMqttSendTotalSocketState();
mico_system_context_update(sys_config); mico_system_context_update(sys_config);
break; break;
case SWITCH_LED_ENABLE: case SWITCH_LED_ENABLE:
key_log("WARNGIN:SWITCH_LED_ENABLE");
MQTT_LED_ENABLED = MQTT_LED_ENABLED == 0 ? 1 : 0; MQTT_LED_ENABLED = MQTT_LED_ENABLED == 0 ? 1 : 0;
if (RelayOut() && MQTT_LED_ENABLED) { if (RelayOut() && MQTT_LED_ENABLED) {
UserLedSet(1); UserLedSet(1);
@@ -165,6 +200,20 @@ static void KeyShortPress(int clickCnt) {
UserMqttSendLedState(); UserMqttSendLedState();
mico_system_context_update(sys_config); mico_system_context_update(sys_config);
break; break;
case REBOOT_SYSTEM:
MicoSystemReboot();
break;
case CONFIG_WIFI:
StartLedBlink(3);
micoWlanSuspendStation();
ApInit(true);
break;
case RESET_SYSTEM:
StartLedBlink(8);
mico_system_context_restore(sys_config);
mico_rtos_thread_sleep(1);
MicoSystemReboot();
break;
default: default:
break; break;
} }
@@ -175,14 +224,56 @@ mico_timer_t user_key_timer;
static uint8_t click_count = 0; static uint8_t click_count = 0;
static mico_timer_t click_end_timer; static mico_timer_t click_end_timer;
uint16_t key_time = 0; uint16_t key_time = 0;
#define BUTTON_LONG_PRESS_TIME 10 //100ms*10=1s
static mico_timer_t led_blink_timer;
static bool timer_initialized = false;
static uint8_t total_blinks = 0;
static uint8_t blink_counter = 0;
static bool led_state = false;
#define BUTTON_LONG_PRESS_TIME 10 //100ms*10=1s
// 定时器回调
static void _led_blink_timer_handler(void *arg)
{
if (blink_counter >= total_blinks) {
UserLedSet(0); // 闪烁完成,灭灯
mico_stop_timer(&led_blink_timer);
mico_deinit_timer(&led_blink_timer);
timer_initialized = false;
return;
}
led_state = !led_state;
UserLedSet(led_state ? 1 : 0);
blink_counter++;
}
// 安全重入的启动函数
void StartLedBlink(uint8_t times)
{
if (times == 0) return;
// 如果之前已启动,先停止并清理
if (timer_initialized) {
mico_stop_timer(&led_blink_timer);
mico_deinit_timer(&led_blink_timer);
timer_initialized = false;
}
total_blinks = times * 2;
blink_counter = 0;
led_state = false;
mico_init_timer(&led_blink_timer, 100, _led_blink_timer_handler, NULL);
mico_start_timer(&led_blink_timer);
timer_initialized = true;
}
static void ClickEndTimeoutHandler(void *arg) { static void ClickEndTimeoutHandler(void *arg) {
if(click_count<=0){ if (click_count <= 0) {
click_count = 0; click_count = 0;
return; return;
} }
KeyShortPress(click_count); KeyEventHandler(click_count,false);
click_count = 0; click_count = 0;
} }
@@ -202,29 +293,41 @@ static void KeyTimeoutHandler(void *arg) {
if (key_continue != 0) { if (key_continue != 0) {
key_time++; key_time++;
if (key_time > BUTTON_LONG_PRESS_TIME) { // if (key_time > BUTTON_LONG_PRESS_TIME) {
if (key_time == 50) { // if (key_time == 50) {
KeyLong5sPress(); // KeyLong5sPress();
} else if (key_time > 50 && key_time < 57) { // } else if (key_time > 50 && key_time < 57) {
switch (key_time) { // switch (key_time) {
case 51: UserLedSet(1); break; // case 51:
case 52: UserLedSet(0); break; // UserLedSet(1);
case 53: UserLedSet(1); break; // break;
case 54: UserLedSet(0); break; // case 52:
case 55: UserLedSet(1); break; // UserLedSet(0);
case 56: UserLedSet(0); break; // break;
} // case 53:
} else if (key_time == 57) { // UserLedSet(1);
UserLedSet(RelayOut() && user_config->power_led_enabled); // break;
} else if (key_time == 100) { // case 54:
KeyLong10sPress(); // UserLedSet(0);
} else if (key_time == 102) { // break;
UserLedSet(1); // case 55:
} else if (key_time == 103) { // UserLedSet(1);
UserLedSet(0); // break;
key_time = 101; // case 56:
} // UserLedSet(0);
} // break;
// }
// } else if (key_time == 57) {
// UserLedSet(RelayOut() && user_config->power_led_enabled);
// } else if (key_time == 100) {
// KeyLong10sPress();
// } else if (key_time == 102) {
// UserLedSet(1);
// } else if (key_time == 103) {
// UserLedSet(0);
// key_time = 101;
// }
// }
} else { } else {
if (key_time < BUTTON_LONG_PRESS_TIME) { if (key_time < BUTTON_LONG_PRESS_TIME) {
click_count++; click_count++;
@@ -232,8 +335,8 @@ static void KeyTimeoutHandler(void *arg) {
// 重启 click_end_timer300ms // 重启 click_end_timer300ms
mico_rtos_stop_timer(&click_end_timer); mico_rtos_stop_timer(&click_end_timer);
mico_rtos_start_timer(&click_end_timer); mico_rtos_start_timer(&click_end_timer);
} else if (key_time > 100) { } else {
MicoSystemReboot(); KeyEventHandler(key_time/10,true);
} }
mico_rtos_stop_timer(&user_key_timer); mico_rtos_stop_timer(&user_key_timer);

View File

@@ -4,7 +4,8 @@
#include "mico.h" #include "mico.h"
#include "micokit_ext.h" #include "micokit_ext.h"
#define SWITCH_TOTAL_SOCKET 0 #define NO_FUNCTION 0x0F
#define SWITCH_ALL_SOCKETS 0
#define SWITCH_SOCKET_1 1 #define SWITCH_SOCKET_1 1
#define SWITCH_SOCKET_2 2 #define SWITCH_SOCKET_2 2
#define SWITCH_SOCKET_3 3 #define SWITCH_SOCKET_3 3
@@ -12,6 +13,9 @@
#define SWITCH_SOCKET_5 5 #define SWITCH_SOCKET_5 5
#define SWITCH_SOCKET_6 6 #define SWITCH_SOCKET_6 6
#define SWITCH_LED_ENABLE 7 #define SWITCH_LED_ENABLE 7
#define REBOOT_SYSTEM 8
#define CONFIG_WIFI 9
#define RESET_SYSTEM 10
extern char socket_status[32]; extern char socket_status[32];
@@ -23,5 +27,8 @@ bool RelayOut(void);
char* GetSocketStatus(); char* GetSocketStatus();
char* GetShortClickConfig(); char* GetShortClickConfig();
void SetSocketStatus(char* socket_status); void SetSocketStatus(char* socket_status);
void set_key_map(int index, char short_func, char long_func);
char get_short_func(char val);
char get_long_func(char val);
#endif #endif