feat(control-plane): trigger cloud draw from SW2 button
This commit is contained in:
@@ -104,6 +104,7 @@ esp_err_t control_plane_multimodal_send_speech_stop(void);
|
|||||||
esp_err_t control_plane_multimodal_send_cancel_speech(void);
|
esp_err_t control_plane_multimodal_send_cancel_speech(void);
|
||||||
esp_err_t control_plane_multimodal_send_request_to_respond(
|
esp_err_t control_plane_multimodal_send_request_to_respond(
|
||||||
const control_plane_multimodal_respond_request_t *request);
|
const control_plane_multimodal_respond_request_t *request);
|
||||||
|
esp_err_t control_plane_request_cloud_chouqian(void);
|
||||||
esp_err_t control_plane_multimodal_send_update_info(
|
esp_err_t control_plane_multimodal_send_update_info(
|
||||||
const control_plane_multimodal_update_info_request_t *request);
|
const control_plane_multimodal_update_info_request_t *request);
|
||||||
esp_err_t control_plane_multimodal_send_local_responding_started(void);
|
esp_err_t control_plane_multimodal_send_local_responding_started(void);
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ static bool s_multimodal_watchdog_stop_requested;
|
|||||||
static bool s_multimodal_watchdog_task_starting;
|
static bool s_multimodal_watchdog_task_starting;
|
||||||
static bool s_model_command_dispatched;
|
static bool s_model_command_dispatched;
|
||||||
static bool s_server_success_prompt_played;
|
static bool s_server_success_prompt_played;
|
||||||
|
static bool s_cloud_chouqian_pending;
|
||||||
static control_plane_model_command_callback_t s_model_command_cb;
|
static control_plane_model_command_callback_t s_model_command_cb;
|
||||||
static void *s_model_command_cb_user_data;
|
static void *s_model_command_cb_user_data;
|
||||||
static portMUX_TYPE s_multimodal_runtime_lock = portMUX_INITIALIZER_UNLOCKED;
|
static portMUX_TYPE s_multimodal_runtime_lock = portMUX_INITIALIZER_UNLOCKED;
|
||||||
@@ -160,6 +161,22 @@ static void control_plane_set_model_command_dispatched(bool dispatched)
|
|||||||
portEXIT_CRITICAL(&s_multimodal_runtime_lock);
|
portEXIT_CRITICAL(&s_multimodal_runtime_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void control_plane_clear_cloud_chouqian_pending(const char *reason)
|
||||||
|
{
|
||||||
|
bool was_pending = false;
|
||||||
|
|
||||||
|
portENTER_CRITICAL(&s_multimodal_runtime_lock);
|
||||||
|
was_pending = s_cloud_chouqian_pending;
|
||||||
|
s_cloud_chouqian_pending = false;
|
||||||
|
portEXIT_CRITICAL(&s_multimodal_runtime_lock);
|
||||||
|
|
||||||
|
if (was_pending) {
|
||||||
|
ESP_LOGI(TAG,
|
||||||
|
"Cloud chouqian request completed: %s",
|
||||||
|
reason != NULL ? reason : "unknown");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void control_plane_set_model_command_callback(control_plane_model_command_callback_t cb,
|
static void control_plane_set_model_command_callback(control_plane_model_command_callback_t cb,
|
||||||
void *user_data)
|
void *user_data)
|
||||||
{
|
{
|
||||||
@@ -226,6 +243,9 @@ static void control_plane_responding_text_bridge(const char *text,
|
|||||||
value,
|
value,
|
||||||
(unsigned int)value_index,
|
(unsigned int)value_index,
|
||||||
value_index_valid ? 1 : 0);
|
value_index_valid ? 1 : 0);
|
||||||
|
if (command_type == CONTROL_PLANE_MODEL_COMMAND_CHOUQIAN) {
|
||||||
|
ESP_LOGI(TAG, "Cloud chouqian result received: %s", value);
|
||||||
|
}
|
||||||
cb(command_type, value, value_index, value_index_valid, cb_user_data);
|
cb(command_type, value, value_index, value_index_valid, cb_user_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -359,6 +379,32 @@ esp_err_t control_plane_multimodal_request_to_respond(
|
|||||||
return control_plane_multimodal_send_request_to_respond(request);
|
return control_plane_multimodal_send_request_to_respond(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
esp_err_t control_plane_request_cloud_chouqian(void)
|
||||||
|
{
|
||||||
|
portENTER_CRITICAL(&s_multimodal_runtime_lock);
|
||||||
|
if (s_cloud_chouqian_pending) {
|
||||||
|
portEXIT_CRITICAL(&s_multimodal_runtime_lock);
|
||||||
|
return ESP_ERR_INVALID_STATE;
|
||||||
|
}
|
||||||
|
s_cloud_chouqian_pending = true;
|
||||||
|
s_model_command_dispatched = false;
|
||||||
|
portEXIT_CRITICAL(&s_multimodal_runtime_lock);
|
||||||
|
|
||||||
|
const control_plane_multimodal_respond_request_t request = {
|
||||||
|
.type = CONTROL_PLANE_MULTIMODAL_RESPOND_TYPE_PROMPT,
|
||||||
|
.text = "我要抽签",
|
||||||
|
.parameters_json = NULL,
|
||||||
|
};
|
||||||
|
esp_err_t err = control_plane_multimodal_send_request_to_respond(&request);
|
||||||
|
if (err != ESP_OK) {
|
||||||
|
control_plane_clear_cloud_chouqian_pending("request send failed");
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
ESP_LOGI(TAG, "Cloud chouqian prompt sent");
|
||||||
|
return ESP_OK;
|
||||||
|
}
|
||||||
|
|
||||||
esp_err_t control_plane_multimodal_update_info(
|
esp_err_t control_plane_multimodal_update_info(
|
||||||
const control_plane_multimodal_update_info_request_t *request)
|
const control_plane_multimodal_update_info_request_t *request)
|
||||||
{
|
{
|
||||||
@@ -499,14 +545,17 @@ static void control_plane_multimodal_event_bridge(control_plane_multimodal_event
|
|||||||
}
|
}
|
||||||
|
|
||||||
case CONTROL_PLANE_MULTIMODAL_EVENT_TRANSPORT_DISCONNECTED:
|
case CONTROL_PLANE_MULTIMODAL_EVENT_TRANSPORT_DISCONNECTED:
|
||||||
|
control_plane_clear_cloud_chouqian_pending("transport disconnected");
|
||||||
control_plane_multimodal_stop_uplink();
|
control_plane_multimodal_stop_uplink();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CONTROL_PLANE_MULTIMODAL_EVENT_TRANSPORT_ERROR:
|
case CONTROL_PLANE_MULTIMODAL_EVENT_TRANSPORT_ERROR:
|
||||||
|
control_plane_clear_cloud_chouqian_pending("transport error");
|
||||||
control_plane_multimodal_stop_uplink();
|
control_plane_multimodal_stop_uplink();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CONTROL_PLANE_MULTIMODAL_EVENT_TASK_FAILED:
|
case CONTROL_PLANE_MULTIMODAL_EVENT_TASK_FAILED:
|
||||||
|
control_plane_clear_cloud_chouqian_pending("task failed");
|
||||||
control_plane_request_server_error_expression(DOMAIN_EXPRESSION_TRIGGER_SERVER_TASK_FAILED);
|
control_plane_request_server_error_expression(DOMAIN_EXPRESSION_TRIGGER_SERVER_TASK_FAILED);
|
||||||
control_plane_multimodal_stop_uplink();
|
control_plane_multimodal_stop_uplink();
|
||||||
break;
|
break;
|
||||||
@@ -530,6 +579,7 @@ static void control_plane_multimodal_event_bridge(control_plane_multimodal_event
|
|||||||
}
|
}
|
||||||
|
|
||||||
case CONTROL_PLANE_MULTIMODAL_EVENT_RESPONDING_ENDED:
|
case CONTROL_PLANE_MULTIMODAL_EVENT_RESPONDING_ENDED:
|
||||||
|
control_plane_clear_cloud_chouqian_pending("response ended");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CONTROL_PLANE_MULTIMODAL_EVENT_SPEECH_STARTED:
|
case CONTROL_PLANE_MULTIMODAL_EVENT_SPEECH_STARTED:
|
||||||
@@ -537,6 +587,7 @@ static void control_plane_multimodal_event_bridge(control_plane_multimodal_event
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case CONTROL_PLANE_MULTIMODAL_EVENT_OUTPUT_ERROR:
|
case CONTROL_PLANE_MULTIMODAL_EVENT_OUTPUT_ERROR:
|
||||||
|
control_plane_clear_cloud_chouqian_pending("output error");
|
||||||
control_plane_request_server_error_expression(DOMAIN_EXPRESSION_TRIGGER_SERVER_OUTPUT_ERROR);
|
control_plane_request_server_error_expression(DOMAIN_EXPRESSION_TRIGGER_SERVER_OUTPUT_ERROR);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -601,6 +652,7 @@ esp_err_t control_plane_start_multimodal_client(void)
|
|||||||
|
|
||||||
void control_plane_stop_multimodal_client(void)
|
void control_plane_stop_multimodal_client(void)
|
||||||
{
|
{
|
||||||
|
control_plane_clear_cloud_chouqian_pending("multimodal client stopped");
|
||||||
stop_watchdog_task();
|
stop_watchdog_task();
|
||||||
control_plane_multimodal_stop();
|
control_plane_multimodal_stop();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -129,13 +129,13 @@ static void control_plane_dispatch_key_event(const control_plane_key_event_t *ev
|
|||||||
|
|
||||||
if (event->key_id == CONTROL_PLANE_KEY_ID_SW2) {
|
if (event->key_id == CONTROL_PLANE_KEY_ID_SW2) {
|
||||||
if (event->type == CONTROL_PLANE_KEY_EVENT_SHORT_PRESS) {
|
if (event->type == CONTROL_PLANE_KEY_EVENT_SHORT_PRESS) {
|
||||||
const domain_expression_request_t request = {
|
esp_err_t request_err = control_plane_request_cloud_chouqian();
|
||||||
.id = DOMAIN_EXPRESSION_CHOUQIAN,
|
if (request_err == ESP_ERR_INVALID_STATE) {
|
||||||
.trigger = DOMAIN_EXPRESSION_TRIGGER_SW2_SINGLE_CLICK,
|
ESP_LOGI(TAG, "Cloud chouqian request skipped: multimodal session unavailable or request pending");
|
||||||
};
|
} else if (request_err != ESP_OK) {
|
||||||
esp_err_t expr_err = domain_runtime_request_expression(&request);
|
ESP_LOGW(TAG,
|
||||||
if (expr_err != ESP_OK && expr_err != ESP_ERR_INVALID_STATE) {
|
"Cloud chouqian request failed: %s",
|
||||||
ESP_LOGW(TAG, "SW2 single-click chouqian expression failed: %s", esp_err_to_name(expr_err));
|
esp_err_to_name(request_err));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (event->type == CONTROL_PLANE_KEY_EVENT_DOUBLE_CLICK) {
|
if (event->type == CONTROL_PLANE_KEY_EVENT_DOUBLE_CLICK) {
|
||||||
|
|||||||
Reference in New Issue
Block a user