#pragma once #include #include #include #include "esp_err.h" #ifdef __cplusplus extern "C" { #endif // ---------- system_runtime ---------- esp_err_t system_runtime_start(void); esp_err_t system_runtime_shutdown(void); esp_err_t system_runtime_bootstrap(void); typedef enum { DOMAIN_POWER_EVENT_SHUTDOWN_REQUEST = 0, } domain_power_event_t; typedef void (*domain_power_event_cb_t)(domain_power_event_t event, void *user_data); esp_err_t system_runtime_set_power_event_callback(domain_power_event_cb_t cb, void *user_data); esp_err_t system_runtime_power_off(void); bool system_runtime_wifi_ready(void); void system_runtime_get_ip(char *buf, size_t buf_len); // ---------- domain_policy ---------- uint32_t domain_policy_lifecycle_start_retry_count(void); uint32_t domain_policy_lifecycle_retry_backoff_ms(uint32_t attempt); bool domain_policy_is_retryable_error(esp_err_t err); uint32_t domain_policy_printer_stop_timeout_ms(void); uint32_t domain_policy_image_generation_timeout_default_ms(void); uint32_t domain_policy_image_generation_timeout_min_ms(void); uint32_t domain_policy_image_generation_timeout_max_ms(void); uint32_t domain_policy_image_download_timeout_default_ms(void); uint32_t domain_policy_image_download_timeout_min_ms(void); uint32_t domain_policy_image_download_timeout_max_ms(void); // ---------- raster_tools ---------- esp_err_t raster_tools_render_text_384(const char *text, uint8_t scale, uint8_t line_spacing, uint16_t max_height, uint16_t *out_width, uint16_t *out_height, uint8_t **out_raster, size_t *out_len, char *err, size_t err_len); esp_err_t raster_tools_convert_gray8_to_raster_384(const uint8_t *gray, uint16_t src_width, uint16_t src_height, bool scale_to_width, uint8_t threshold, bool invert, uint16_t max_height, uint16_t *out_width, uint16_t *out_height, uint8_t **out_raster, size_t *out_len, char *err, size_t err_len); esp_err_t raster_tools_convert_png_to_raster_384(const uint8_t *png, size_t png_len, bool scale_to_width, uint8_t threshold, bool invert, uint16_t max_height, uint16_t *out_width, uint16_t *out_height, uint8_t **out_raster, size_t *out_len, char *err, size_t err_len); // ---------- image_generation ---------- typedef struct { const char *prompt; const char *size; bool prompt_extend; bool has_seed; uint32_t seed; uint32_t generation_timeout_ms; uint32_t download_timeout_ms; } image_generation_request_t; typedef struct { uint8_t *png; size_t png_len; char image_url[1024]; char output_prompt[256]; char request_id[80]; uint16_t width; uint16_t height; } image_generation_result_t; void image_generation_result_reset(image_generation_result_t *result); void image_generation_result_free(image_generation_result_t *result); void image_generation_schedule_prewarm(void); esp_err_t image_generation_generate_png(const image_generation_request_t *req, image_generation_result_t *out_result, char *err, size_t err_len); // ---------- screen_preview ---------- typedef enum { SCREEN_PREVIEW_EVENT_BOOTING = 0, SCREEN_PREVIEW_EVENT_RUNTIME_READY, SCREEN_PREVIEW_EVENT_RUNTIME_ERROR, SCREEN_PREVIEW_EVENT_WIFI_PROVISIONING, SCREEN_PREVIEW_EVENT_WIFI_CONNECTING, SCREEN_PREVIEW_EVENT_WIFI_CONNECTED, SCREEN_PREVIEW_EVENT_WIFI_FAILED, SCREEN_PREVIEW_EVENT_WIFI_DISCONNECTED, SCREEN_PREVIEW_EVENT_DEVICE_BUSY, SCREEN_PREVIEW_EVENT_VOICE_CONNECTING, SCREEN_PREVIEW_EVENT_VOICE_LISTENING, SCREEN_PREVIEW_EVENT_VOICE_PROCESSING, SCREEN_PREVIEW_EVENT_VOICE_RESPONDING, SCREEN_PREVIEW_EVENT_VOICE_ERROR, SCREEN_PREVIEW_EVENT_IMAGE_GENERATING, SCREEN_PREVIEW_EVENT_IMAGE_READY, SCREEN_PREVIEW_EVENT_IMAGE_FAILED, SCREEN_PREVIEW_EVENT_PRINT_QUEUED, SCREEN_PREVIEW_EVENT_PRINT_RUNNING, SCREEN_PREVIEW_EVENT_PRINT_SUCCESS, SCREEN_PREVIEW_EVENT_PRINT_FAILED, SCREEN_PREVIEW_EVENT_PRINT_CANCELED, SCREEN_PREVIEW_EVENT_SHUTDOWN, } screen_preview_event_t; typedef struct { const char *detail; uint8_t progress; } screen_preview_context_t; esp_err_t screen_preview_show_raster(const uint8_t *raster, size_t raster_len, uint16_t width, uint16_t height, uint32_t timeout_ms, char *err, size_t err_len); esp_err_t screen_preview_show_png(const uint8_t *png, size_t png_len, uint32_t timeout_ms, char *err, size_t err_len); esp_err_t screen_preview_show_text(const char *text, uint32_t timeout_ms, char *err, size_t err_len); esp_err_t screen_preview_show_event(screen_preview_event_t event, const screen_preview_context_t *ctx); esp_err_t screen_preview_start_runtime_feedback(void); void screen_preview_stop_runtime_feedback(void); // ---------- printer_protocol ---------- typedef enum { PRINT_JOB_STATE_NONE = 0, PRINT_JOB_STATE_QUEUED, PRINT_JOB_STATE_RUNNING, PRINT_JOB_STATE_SUCCESS, PRINT_JOB_STATE_FAILED, PRINT_JOB_STATE_CANCELED, } print_job_state_t; typedef struct { uint32_t id; print_job_state_t state; uint8_t progress; uint16_t width; uint16_t height; size_t data_len; char density[16]; char error[96]; int64_t created_ms; int64_t started_ms; int64_t finished_ms; } print_job_info_t; typedef enum { PRINTER_JOB_EVENT_QUEUED = 0, PRINTER_JOB_EVENT_RUNNING, PRINTER_JOB_EVENT_PROGRESS, PRINTER_JOB_EVENT_FINISHED, } printer_job_event_type_t; typedef struct { printer_job_event_type_t type; print_job_info_t job; } printer_job_event_t; typedef void (*printer_job_event_cb_t)(const printer_job_event_t *event, void *user_data); typedef struct { // Printer-only option: bypass paper/temp/battery precheck for this print job. bool ignore_precheck; } printer_print_options_t; typedef struct { bool busy; bool has_paper; int8_t paper_gpio_level; uint8_t paper_present_level; bool battery_adc_ready; bool ntc_adc_ready; int battery_adc_raw; int ntc_adc_raw; uint16_t battery_mv; uint8_t battery_percent; float temperature; uint32_t queue_depth; int64_t last_status_ms; } printer_runtime_status_t; typedef uint32_t printer_status_poll_pause_token_t; esp_err_t printer_protocol_init(void); esp_err_t printer_protocol_stop(uint32_t timeout_ms); void printer_protocol_get_runtime_status(printer_runtime_status_t *out_status); printer_status_poll_pause_token_t printer_protocol_status_poll_pause_acquire(void); void printer_protocol_status_poll_pause_release(printer_status_poll_pause_token_t *token); esp_err_t printer_protocol_submit_raster_job(const uint8_t *raster, size_t raster_len, uint16_t width, uint16_t height, const char *density, uint32_t *out_job_id, char *err, size_t err_len); esp_err_t printer_protocol_submit_raster_job_ex(const uint8_t *raster, size_t raster_len, uint16_t width, uint16_t height, const char *density, const printer_print_options_t *options, uint32_t *out_job_id, char *err, size_t err_len); bool printer_protocol_get_job(uint32_t job_id, print_job_info_t *out_info); esp_err_t printer_protocol_list_jobs(print_job_info_t *out_jobs, size_t max_jobs, size_t *out_count); esp_err_t printer_protocol_cancel_job(uint32_t job_id, char *err, size_t err_len); size_t printer_protocol_cleanup_jobs(bool include_success, bool include_failed, bool include_canceled); esp_err_t printer_protocol_set_event_callback(printer_job_event_cb_t cb, void *user_data); esp_err_t printer_protocol_gap_move(uint32_t timeout_ms, char *err, size_t err_len); const char *printer_protocol_job_state_str(print_job_state_t state); // ---------- voice_interaction ---------- typedef enum { VOICE_DIALOG_STATE_IDLE = 0, VOICE_DIALOG_STATE_LISTENING, VOICE_DIALOG_STATE_THINKING, VOICE_DIALOG_STATE_RESPONDING, } voice_dialog_state_t; typedef struct { bool ready; bool session_active; bool ws_connected; bool started; bool tap_active; bool marker_image_gen_running; voice_dialog_state_t dialog_state; char task_id[40]; char dialog_id[40]; char last_error[128]; int64_t last_event_ms; uint32_t upstream_packets; uint32_t downstream_packets; } voice_interaction_status_t; esp_err_t voice_interaction_init(void); esp_err_t voice_interaction_start_with_timeout(uint32_t timeout_ms, char *err, size_t err_len); esp_err_t voice_interaction_start(char *err, size_t err_len); esp_err_t voice_interaction_stop_with_timeout(uint32_t timeout_ms, char *err, size_t err_len); esp_err_t voice_interaction_stop(char *err, size_t err_len); esp_err_t voice_interaction_tap_start(char *err, size_t err_len); esp_err_t voice_interaction_tap_cancel(char *err, size_t err_len); esp_err_t voice_interaction_schedule_session_prewarm(void); void voice_interaction_get_status(voice_interaction_status_t *out_status); const char *voice_interaction_dialog_state_str(voice_dialog_state_t state); // ---------- product_test_service ---------- esp_err_t product_test_service_start(void); esp_err_t product_test_service_stop(uint32_t timeout_ms); #ifdef __cplusplus } #endif