#pragma once #include #include #include #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 EVT_SHUTDOWN BIT0 #define EVT_WORKER_EXITED BIT1 #define EVT_STATUS_POLL_EXITED BIT2 #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 typedef struct { bool used; bool cancel_requested; bool 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 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; 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);