/* * SPDX-FileCopyrightText: 2024-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ #pragma once #include #include #include #include "control_plane.h" #include "domain.h" #include "esp_err.h" #include "control_plane_events.h" control_plane_direction_command_t control_plane_direction_parse_command_internal( const char *input, size_t *out_direction_index); bool control_plane_extract_model_command(const char *text, control_plane_model_command_type_t *out_command_type, char *out_value, size_t out_value_capacity, size_t *out_value_index, bool *out_value_index_valid); const char *control_plane_multimodal_resolve_upstream_mode(void); bool control_plane_multimodal_is_push2talk_mode(void); const char *control_plane_multimodal_resolve_voice_id(const char *auth_voice_id); uint32_t control_plane_multimodal_resolve_downstream_transmit_rate_limit( uint32_t configured_limit); uint32_t control_plane_multimodal_resolve_opus_frame_duration_ms(void); void control_plane_multimodal_generate_uuid(char *out, size_t out_len); esp_err_t control_plane_direction_calibrate_internal( const domain_direction_calibration_t *config, int timeout_ms); /* Daily fortune fetch/apply policy (control_plane-owned). */ esp_err_t control_plane_fortune_fetch(const char *target_date, domain_fortune_result_t *out_result); typedef void (*control_plane_multimodal_responding_text_callback_t)(const char *text, bool finished, void *user_data); typedef enum { CONTROL_PLANE_MULTIMODAL_EVENT_TRANSPORT_CONNECTED = 0, CONTROL_PLANE_MULTIMODAL_EVENT_TRANSPORT_DISCONNECTED, CONTROL_PLANE_MULTIMODAL_EVENT_TRANSPORT_ERROR, CONTROL_PLANE_MULTIMODAL_EVENT_TASK_STARTED, CONTROL_PLANE_MULTIMODAL_EVENT_TASK_FAILED, CONTROL_PLANE_MULTIMODAL_EVENT_SERVER_LISTENING, CONTROL_PLANE_MULTIMODAL_EVENT_SERVER_NOT_LISTENING, CONTROL_PLANE_MULTIMODAL_EVENT_RESPONDING_STARTED, CONTROL_PLANE_MULTIMODAL_EVENT_RESPONDING_CONTENT, CONTROL_PLANE_MULTIMODAL_EVENT_RESPONDING_ENDED, CONTROL_PLANE_MULTIMODAL_EVENT_SPEECH_STARTED, CONTROL_PLANE_MULTIMODAL_EVENT_SPEECH_CONTENT, CONTROL_PLANE_MULTIMODAL_EVENT_SPEECH_ENDED, CONTROL_PLANE_MULTIMODAL_EVENT_OUTPUT_ERROR, CONTROL_PLANE_MULTIMODAL_EVENT_DOWNSTREAM_AUDIO, CONTROL_PLANE_MULTIMODAL_EVENT_DOWNSTREAM_STALLED, } control_plane_multimodal_event_t; typedef void (*control_plane_multimodal_event_callback_t)(control_plane_multimodal_event_t event, void *user_data); typedef void (*control_plane_multimodal_downstream_audio_callback_t)(const uint8_t *data, size_t len, void *user_data); typedef struct { bool connected; bool starting; bool stopping; bool has_active_task; bool server_listening; bool remote_responding; bool request_to_speak_pending; bool client_speech_active; bool ptt_release_required; bool response_pending; bool local_responding_started; bool received_downstream_audio; uint32_t last_heartbeat_ms; uint32_t last_downstream_ms; uint32_t last_downstream_audio_ms; } control_plane_multimodal_runtime_state_t; typedef enum { CONTROL_PLANE_TRANSPORT_LOSS_WS_ERROR = 0, CONTROL_PLANE_TRANSPORT_LOSS_WS_DISCONNECTED, CONTROL_PLANE_TRANSPORT_LOSS_SEND_TEXT_FAILURE, CONTROL_PLANE_TRANSPORT_LOSS_SEND_BINARY_FAILURE, CONTROL_PLANE_TRANSPORT_LOSS_LISTENING_TIMEOUT, CONTROL_PLANE_TRANSPORT_LOSS_NO_RESPONSE_TIMEOUT, CONTROL_PLANE_TRANSPORT_LOSS_DOWNSTREAM_STALL, CONTROL_PLANE_TRANSPORT_LOSS_PROTOCOL_ERROR, } control_plane_transport_loss_reason_t; typedef enum { CONTROL_PLANE_NETWORK_ACTION_CONVERSATION = 0, CONTROL_PLANE_NETWORK_ACTION_CLOUD_CHOUQIAN, } control_plane_network_action_t; esp_err_t control_plane_multimodal_start(void); esp_err_t control_plane_multimodal_stop(void); bool control_plane_multimodal_is_connected(void); esp_err_t control_plane_multimodal_send_start(void); esp_err_t control_plane_multimodal_send_stop(const char *reason); esp_err_t control_plane_multimodal_request_downstream_stall_stop(void); esp_err_t control_plane_multimodal_send_request_to_speak(void); esp_err_t control_plane_multimodal_send_speech_start(void); 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_request_to_respond( 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( 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_ended(void); esp_err_t control_plane_multimodal_send_heartbeat(void); esp_err_t control_plane_multimodal_send_audio_realtime(const uint8_t *data, size_t len); void control_plane_multimodal_mark_transport_unavailable( control_plane_transport_loss_reason_t reason, const char *caller); esp_err_t control_plane_multimodal_get_runtime_state( control_plane_multimodal_runtime_state_t *out_state); esp_err_t control_plane_multimodal_register_event_callback( control_plane_multimodal_event_callback_t cb, void *user_data); esp_err_t control_plane_multimodal_register_downstream_audio_callback( control_plane_multimodal_downstream_audio_callback_t cb, void *user_data); esp_err_t control_plane_multimodal_register_responding_text_callback( control_plane_multimodal_responding_text_callback_t cb, void *user_data); esp_err_t control_plane_multimodal_start_capture(void); esp_err_t control_plane_multimodal_start_uplink(void); void control_plane_multimodal_stop_uplink(void); bool control_plane_multimodal_is_uplink_running(void); esp_err_t control_plane_multimodal_play_downstream_audio(const uint8_t *data, size_t len); esp_err_t control_plane_multimodal_handle_ptt_press_step(void); esp_err_t control_plane_multimodal_handle_ptt_release(void); void control_plane_multimodal_reset_uplink_failure_window(void); esp_err_t control_plane_local_wake_start(void); esp_err_t control_plane_local_wake_stop(int timeout_ms); void control_plane_local_wake_pause_for_foreground(void); void control_plane_local_wake_resume_after_foreground(void); bool control_plane_local_wake_prompt_gate_active(void); void control_plane_ptt_reset_capture_window(void); bool control_plane_voice_turn_is_idle(void); bool control_plane_ota_voice_services_allowed(void); bool control_plane_ota_business_interactions_allowed(void); bool control_plane_runtime_is_stopping(void); void control_plane_set_runtime_stop_requested(bool stop_requested); void control_plane_network_feedback_reset(void); void control_plane_network_feedback_mark_wifi_down(void); void control_plane_network_feedback_mark_wifi_recovered(void); void control_plane_network_feedback_mark_server_down(void); void control_plane_network_feedback_mark_service_ready(void); void control_plane_network_feedback_service(void); esp_err_t control_plane_network_feedback_require_ready( control_plane_network_action_t action); void control_plane_request_wifi_reconnect_now(void); esp_err_t control_plane_battery_service_stop(int timeout_ms); void control_plane_battery_service_set_light_standby(bool standby); void control_plane_runtime_diagnostics_set_light_standby(bool standby); esp_err_t control_plane_start_system_event_task(void); void control_plane_stop_system_event_task(void); esp_err_t control_plane_post_system_event(const control_plane_system_event_t *event, uint32_t timeout_ms); int64_t control_plane_event_timestamp_ms(void); const char *control_plane_key_id_name(control_plane_key_id_t key_id); const char *control_plane_key_event_type_name(control_plane_key_event_type_t type); esp_err_t control_plane_start_key_input_task(void); void control_plane_stop_key_input_task(void); void control_plane_reset_wifi_provisioning_and_restart(void); esp_err_t control_plane_schedule_websocket_wait_task(void); void control_plane_set_ptt_active(bool active); void control_plane_set_ptt_active_from_local_wake(void); esp_err_t control_plane_enter_mini_program_reprovisioning(const char *reason); esp_err_t control_plane_remote_log_start(void); void control_plane_remote_log_stop(int timeout_ms); void control_plane_remote_log_set_light_standby(bool standby); esp_err_t control_plane_remote_log_flush_now(void); esp_err_t control_plane_remote_log_clear(void); esp_err_t control_plane_remote_log_format_status(char *out, size_t out_len);