chore(repo): keep only current main snapshot

History squashed to one root commit to permanently drop old branch history and objects.
This commit is contained in:
admin
2026-02-28 16:41:12 +08:00
commit 8df2095acf
89 changed files with 21634 additions and 0 deletions

View File

View File

@@ -0,0 +1,124 @@
#pragma once
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include "domain.h"
#include "esp_err.h"
#include "platform.h"
#include "freertos/FreeRTOS.h"
#include "freertos/event_groups.h"
#include "freertos/queue.h"
#include "freertos/semphr.h"
#include "freertos/task.h"
#define PROTO_ADDR 0x01
#define CMD_POWER 0x00
#define CMD_GET_STATUS 0x01
#define CMD_SET_DISTANCE 0x02
#define CMD_SET_PARAM 0x03
#define CMD_SEND_DATA 0x04
#define CMD_GAP_MOVE 0x05
#define CMD_GET_OFFSET 0x06
#define CMD_SET_OFFSET 0x07
#define CMD_BOOT_JUMP_BOOT 0xA0
#define CMD_BOOT_ERASE_PAGE 0xA1
#define CMD_BOOT_WRITE_DATA 0xA2
#define CMD_BOOT_JUMP_APP 0xA3
#define CMD_BOOT_GET_VERSION 0xA4
#define EVT_ACK BIT0
#define EVT_SHUTDOWN BIT1
#define EVT_WORKER_EXITED BIT2
#define EVT_STATUS_POLL_EXITED BIT3
#define JOB_QUEUE_LEN 8
#define JOB_SLOT_MAX 16
#define MAX_RASTER_BYTES (384 * 3000 / 8)
#define STATUS_POLL_PAUSE_SLOT_MAX 8
#define PRINTER_JOB_SENTINEL_STOP 0u
#define OTA_MAX_DATA_PER_FRAME 236u
typedef struct {
bool used;
bool cancel_requested;
bool direct_ignore_precheck;
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;
uint8_t *data;
} job_slot_t;
typedef struct {
bool has_paper;
int8_t paper_gpio_level;
uint8_t paper_present_level;
uint8_t battery;
float temperature;
int64_t updated_ms;
} parsed_status_t;
extern SemaphoreHandle_t s_mutex;
extern QueueHandle_t s_job_queue;
extern EventGroupHandle_t s_evt;
extern uint32_t s_busy_refcnt;
extern parsed_status_t s_status;
extern uint8_t s_last_rsp_cmd;
extern uint16_t s_last_rsp_payload_len;
extern uint8_t s_last_rsp_payload[252];
extern uint32_t s_status_poll_pause_next_token;
extern uint32_t s_status_poll_pause_tokens[STATUS_POLL_PAUSE_SLOT_MAX];
extern uint32_t s_next_job_id;
extern job_slot_t s_jobs[JOB_SLOT_MAX];
extern TaskHandle_t s_worker_task;
extern TaskHandle_t s_status_poll_task_handle;
extern bool s_protocol_initialized;
extern bool s_protocol_stopping;
bool printer_protocol_acquire_control_lane(uint32_t timeout_ms, char *err, size_t err_len);
void printer_protocol_release_control_lane(void);
esp_err_t printer_protocol_send_cmd_wait_response(uint8_t cmd,
const uint8_t *payload,
uint16_t payload_len,
bool with_checksum,
uint32_t timeout_ms,
bool expect_ack,
bool reset_transport_on_timeout,
uint8_t *out_payload,
size_t out_payload_cap,
uint16_t *out_payload_len,
char *err,
size_t err_len);
esp_err_t printer_protocol_send_frame(uint8_t cmd,
const uint8_t *payload,
uint16_t payload_len,
bool with_checksum);
bool printer_protocol_wait_response(uint8_t cmd,
uint8_t *out_payload,
size_t out_payload_cap,
uint16_t *out_payload_len,
uint32_t timeout_ms);
bool printer_protocol_send_cmd_with_ack(uint8_t cmd,
const uint8_t *payload,
uint16_t payload_len,
bool with_checksum,
uint32_t timeout_ms,
bool reset_transport_on_timeout);
int printer_protocol_find_job_idx_locked(uint32_t id);
int printer_protocol_alloc_job_slot_locked(void);
bool printer_protocol_is_terminal_state(print_job_state_t state);
void printer_protocol_worker_task(void *arg);
bool printer_protocol_is_stopping(void);

View File

@@ -0,0 +1,134 @@
#pragma once
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include "esp_opus_dec.h"
#include "esp_opus_enc.h"
#include "esp_websocket_client.h"
#include "freertos/FreeRTOS.h"
#include "freertos/semphr.h"
#include "freertos/task.h"
#include "domain.h"
#include "platform.h"
#define VOICE_STREAMING_MODE "duplex"
#define VOICE_TASK_GROUP "aigc"
#define VOICE_TASK_NAME "multimodal-generation"
#define VOICE_FUNCTION_NAME "generation"
#define VOICE_MODEL_NAME "multimodal-dialog"
#define VOICE_SAMPLE_BYTES 2
#define VOICE_STATUS_LOCK_TIMEOUT_MS 1000
#define VOICE_WS_SEND_TIMEOUT_MS 1000
#define VOICE_WS_TASK_STACK 24576
#define VOICE_UPLINK_TASK_STACK 32768
#define VOICE_HEARTBEAT_TASK_STACK 4096
#define VOICE_START_CONNECT_TIMEOUT_MS 8000
#define VOICE_AUDIO_IO_TIMEOUT_MS 1200
#define VOICE_AUDIO_DRAIN_MARGIN_MS 120
#define VOICE_AUDIO_DRAIN_QUIET_MS 180
#define VOICE_AUDIO_DRAIN_WAIT_MS 2200
#define VOICE_AUDIO_DRAIN_WAIT_ON_STOP_MS 3500
typedef struct {
SemaphoreHandle_t lock;
esp_websocket_client_handle_t ws;
TaskHandle_t uplink_task;
TaskHandle_t heartbeat_task;
bool uplink_task_with_caps;
bool heartbeat_task_with_caps;
void *opus_enc;
void *opus_dec;
int opus_enc_in_size;
int opus_enc_out_size;
uint8_t *opus_tx_buf;
int16_t *pcm_tx_buf;
uint8_t *pcm_rx_buf;
size_t pcm_rx_buf_size;
uint8_t *text_agg;
size_t text_agg_size;
uint8_t *bin_agg;
size_t bin_agg_size;
bool ready;
bool session_active;
bool ws_connected;
bool started;
bool tap_active;
bool stop_requested;
bool ws_low_stack_warned;
bool response_first_sentence_checked;
voice_dialog_state_t dialog_state;
char task_id[40];
char dialog_id[40];
char device_uuid[40];
char last_error[128];
int64_t last_event_ms;
int64_t last_downstream_ms;
int64_t playback_deadline_ms;
uint32_t upstream_packets;
uint32_t downstream_packets;
} voice_context_t;
extern voice_context_t s_voice;
int64_t voice_now_ms(void);
void voice_fill_err(char *err, size_t err_len, const char *msg);
void voice_set_last_error_locked(const char *msg);
bool voice_lock(uint32_t timeout_ms);
void voice_unlock(void);
void voice_log_status_snapshot(const char *stage);
void voice_log_heap_snapshot(const char *stage);
void voice_wait_audio_playback_done(uint32_t timeout_ms, const char *stage);
void voice_close_audio_with_drain(uint32_t timeout_ms, const char *stage);
void *voice_malloc_prefer_psram(size_t size);
void *voice_calloc_prefer_psram(size_t n, size_t size);
void *voice_realloc_prefer_psram(void *ptr, size_t size);
BaseType_t voice_create_task_prefer_psram(TaskFunction_t task_fn,
const char *name,
uint32_t stack_size,
UBaseType_t priority,
TaskHandle_t *out_task,
bool *out_with_caps);
void voice_delete_task(TaskHandle_t task, bool with_caps);
void voice_delete_self_task(bool with_caps);
void voice_make_uuid(char out[40]);
void voice_make_device_uuid(char out[40]);
const char *voice_safe_user_id(void);
esp_err_t voice_setup_opus(char *err, size_t err_len);
esp_err_t voice_open_audio_for_dialog(char *err, size_t err_len);
void voice_release_runtime_resources(void);
esp_err_t voice_send_directive(const char *action,
const char *directive,
bool with_dialog_id);
void voice_ws_protocol_handle_text_message(const char *text, size_t len);
void voice_ws_audio_handle_downstream_packet(const uint8_t *data, size_t len);
void voice_marker_try_trigger_image_generation(const char *dialog_id, const char *final_text);
bool voice_marker_image_generation_is_running(void);
void voice_websocket_event_handler(void *handler_args,
esp_event_base_t base,
int32_t event_id,
void *event_data);
void voice_interaction_ws_init_cjson_hooks(void);
void voice_uplink_task(void *arg);
void voice_heartbeat_task(void *arg);