shuichan_old/V1.4/STM32F103_App1/HardWare/USER_CMD/user_cmd.c

115 lines
4.0 KiB
C
Raw Normal View History

/* user_cmd.c - 蓝牙串口调试命令处理
*
* USART1 :
* RESET/OTA -
* RECOVERY - WiFi模块 AT+RESTORE (SmartConfig) +
* INFO - MQTT
* STATUS -
* R1ON ~ R4OFF -
* ALLON / ALLOFF -
* HELP -
*/
#include "user_cmd.h"
#include "app_common.h"
#include "relay.h"
#include "24c02.h"
#include "uart.h"
#include "log.h"
#include "network.h"
#include "esp8266.h"
/* 本地命令字符串不区分大小写比较 */
static int cmd_is(const char *a, const char *b)
{
while (*a && *b) {
char ca = *a, cb = *b;
if (ca >= 'A' && ca <= 'Z') ca += 'a' - 'A';
if (cb >= 'A' && cb <= 'Z') cb += 'a' - 'A';
if (ca != cb) return 0;
a++; b++;
}
return (*a == 0 && *b == 0);
}
/* 通过蓝牙串口直接控制单个继电器,并保存/上报状态 */
static void relay_set(uint8_t ch, uint8_t on)
{
if (ch < 1 || ch > 4) return;
relaySet(ch, on);
log_info("> BT: SW%d %s", ch, on ? "ON" : "OFF");
eepromWriteData(102, &MqttInfoStr.Relay_State[0], 7);
relayRequestReport();
}
void userCmdInit(void)
{
/* 无需额外初始化 */
}
/* 处理 USART1 蓝牙调试命令 */
void process_usart1_command(void)
{
const char *cmd = USART1_GetCommand();
if (!cmd) return;
if (cmd_is(cmd, "RESET")) {
log_warn("> USART1 RESET command received, rebooting...");
HAL_Delay(100);
NVIC_SystemReset();
}
else if (cmd_is(cmd, "INFO")) {
log_info("> BT INFO: ver=%u, server=%s:%d, client=%s",
MqttInfoStr.Ver, MqttInfoStr.ServerIP,
MqttInfoStr.ServerPort, MqttInfoStr.ClientID);
}
else if (cmd_is(cmd, "R1ON")) { relay_set(1, 1); }
else if (cmd_is(cmd, "R1OFF")) { relay_set(1, 0); }
else if (cmd_is(cmd, "R2ON")) { relay_set(2, 1); }
else if (cmd_is(cmd, "R2OFF")) { relay_set(2, 0); }
else if (cmd_is(cmd, "R3ON")) { relay_set(3, 1); }
else if (cmd_is(cmd, "R3OFF")) { relay_set(3, 0); }
else if (cmd_is(cmd, "R4ON")) { relay_set(4, 1); }
else if (cmd_is(cmd, "R4OFF")) { relay_set(4, 0); }
else if (cmd_is(cmd, "ALLON")) {
relay_set(1, 1); relay_set(2, 1); relay_set(3, 1); relay_set(4, 1);
}
else if (cmd_is(cmd, "ALLOFF")) {
relay_set(1, 0); relay_set(2, 0); relay_set(3, 0); relay_set(4, 0);
}
else if (cmd_is(cmd, "STATUS")) {
log_info("> BT STATUS: SW1=%s, SW2=%s, SW3=%s, SW4=%s",
MqttInfoStr.Relay_State[1] ? "ON" : "OFF",
MqttInfoStr.Relay_State[2] ? "ON" : "OFF",
MqttInfoStr.Relay_State[3] ? "ON" : "OFF",
MqttInfoStr.Relay_State[4] ? "ON" : "OFF");
}
else if (cmd_is(cmd, "OTA")) {
log_info("> BT OTA: reboot to bootloader for OTA check");
HAL_Delay(100);
NVIC_SystemReset();
}
else if (cmd_is(cmd, "RECOVERY")) {
/* WiFi 模块 AT+RESTORE 恢复出厂(忘掉已保存的热点),用于测试 SmartConfig
* WiFi UART4 4G
* 4G UART4 4G */
if (NET_GetActiveBackend() == NET_BACKEND_WIFI) {
log_warn("> BT RECOVERY: restore WiFi module & reboot");
if (esp_factory_restore() != 0) {
log_warn("> BT RECOVERY: RESTORE failed, reboot anyway");
}
} else {
log_warn("> BT RECOVERY: 4G mode, WiFi module untouched, reboot only");
}
HAL_Delay(100);
NVIC_SystemReset();
}
else if (cmd_is(cmd, "HELP")) {
log_info("CMD: RESET, INFO, STATUS, R1ON/R1OFF~R4ON/R4OFF, ALLON, ALLOFF, OTA, RECOVERY, HELP");
}
else {
log_warn("> BT unknown cmd: %s", cmd);
}
}