108 lines
3.3 KiB
C
108 lines
3.3 KiB
C
/*
|
|
* 文件: components/su-03t/su-03t_voice.c
|
|
* 角色: SU-03T 语音命令解析与分发
|
|
*/
|
|
|
|
#include <stddef.h>
|
|
#include <string.h>
|
|
#include "esp_log.h"
|
|
#include "su-03t_voice.h"
|
|
|
|
static const char *TAG = "su03t_voice";
|
|
|
|
const su03t_voice_command_t *su03t_voice_command_from_msgno(uint8_t msgno)
|
|
{
|
|
static const su03t_voice_command_t k_commands[] = {
|
|
{SU03T_VOICE_CMD_ASK_TEMP, 0x00, "ask_temp", "温度是多少"},
|
|
{SU03T_VOICE_CMD_ASK_HUMI, 0x01, "ask_humi", "湿度是多少"},
|
|
{SU03T_VOICE_CMD_ASK_LUX, 0x02, "ask_lux", "光照强度是多少"},
|
|
{SU03T_VOICE_CMD_ASK_MQ2, 0x03, "ask_mq2", "烟雾浓度是多少"},
|
|
{SU03T_VOICE_CMD_ASK_CO2, 0x04, "ask_co2", "二氧化碳浓度是多少"},
|
|
{SU03T_VOICE_CMD_ASK_WEIGHT, 0x05, "ask_weight", "粮食重量是多少"},
|
|
{SU03T_VOICE_CMD_ASK_HUM, 0x06, "ask_hum", "有人在吗"},
|
|
{SU03T_VOICE_CMD_ASK_DOOR, 0x07, "ask_door", "门磁状态"},
|
|
{SU03T_VOICE_CMD_ASK_FAN, 0x08, "ask_fan", "风扇继电器状态"},
|
|
{SU03T_VOICE_CMD_ASK_LIGHT, 0x09, "ask_light", "照明继电器状态"},
|
|
{SU03T_VOICE_CMD_ASK_COOL, 0x0A, "ask_cool", "制冷继电器状态"},
|
|
{SU03T_VOICE_CMD_ASK_HOT, 0x0B, "ask_hot", "制热继电器状态"},
|
|
{SU03T_VOICE_CMD_ASK_CONTROL, 0x0C, "ask_control", "当前控制模式"},
|
|
{SU03T_VOICE_CMD_ASK_RICE, 0x0D, "ask_rice", "粮食状态"},
|
|
};
|
|
|
|
for (size_t i = 0; i < sizeof(k_commands) / sizeof(k_commands[0]); ++i)
|
|
{
|
|
if (k_commands[i].msgno == msgno)
|
|
{
|
|
return &k_commands[i];
|
|
}
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
const char *su03t_voice_command_key(uint8_t msgno)
|
|
{
|
|
const su03t_voice_command_t *cmd = su03t_voice_command_from_msgno(msgno);
|
|
return cmd != NULL ? cmd->key : NULL;
|
|
}
|
|
|
|
void su03t_voice_handle_frame(const su03t_frame_t *frame)
|
|
{
|
|
if (frame == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
const su03t_voice_command_t *cmd = su03t_voice_command_from_msgno(frame->msgno);
|
|
if (cmd == NULL)
|
|
{
|
|
ESP_LOGW(TAG, "unknown voice command: msgno=0x%02X", frame->msgno);
|
|
return;
|
|
}
|
|
|
|
switch (cmd->id)
|
|
{
|
|
case SU03T_VOICE_CMD_ASK_TEMP:
|
|
case SU03T_VOICE_CMD_ASK_HUMI:
|
|
case SU03T_VOICE_CMD_ASK_LUX:
|
|
case SU03T_VOICE_CMD_ASK_MQ2:
|
|
case SU03T_VOICE_CMD_ASK_CO2:
|
|
case SU03T_VOICE_CMD_ASK_WEIGHT:
|
|
case SU03T_VOICE_CMD_ASK_HUM:
|
|
case SU03T_VOICE_CMD_ASK_DOOR:
|
|
case SU03T_VOICE_CMD_ASK_FAN:
|
|
case SU03T_VOICE_CMD_ASK_LIGHT:
|
|
case SU03T_VOICE_CMD_ASK_COOL:
|
|
case SU03T_VOICE_CMD_ASK_HOT:
|
|
case SU03T_VOICE_CMD_ASK_CONTROL:
|
|
case SU03T_VOICE_CMD_ASK_RICE:
|
|
ESP_LOGI(TAG, "voice command matched: %s (%s)", cmd->key, cmd->label);
|
|
break;
|
|
default:
|
|
ESP_LOGW(TAG, "voice command id not handled: msgno=0x%02X", frame->msgno);
|
|
break;
|
|
}
|
|
}
|
|
|
|
esp_err_t su03t_voice_send_double_reply(uint8_t msgno, double value)
|
|
{
|
|
uint8_t payload[sizeof(double)];
|
|
memcpy(payload, &value, sizeof(payload));
|
|
return su03t_send_frame(msgno, payload, sizeof(payload));
|
|
}
|
|
|
|
bool su03t_voice_parse_double_payload(const su03t_frame_t *frame, double *out_value)
|
|
{
|
|
if (frame == NULL || out_value == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (frame->params_len != sizeof(double))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
memcpy(out_value, frame->params, sizeof(double));
|
|
return true;
|
|
} |