dreamstack/devices/waveshare-p4-panel/main/ds_runtime.h

90 lines
2.3 KiB
C

/**
* DreamStack Panel IR Runtime — LVGL Widget Builder
*
* Parses Panel IR JSON and creates LVGL widgets.
* Handles signal binding, text template expansion,
* event dispatch, and timer execution.
*
* This is the C equivalent of the browser-based panel previewer.
*/
#pragma once
#include <stdint.h>
#include <stdbool.h>
#include "esp_err.h"
// ─── Limits ───
#define DS_MAX_SIGNALS 64
#define DS_MAX_NODES 128
#define DS_MAX_TIMERS 8
#define DS_MAX_BINDINGS 64
// ─── Signal types ───
typedef enum {
DS_SIG_INT = 0,
DS_SIG_BOOL,
DS_SIG_STRING,
} ds_sig_type_t;
// ─── Signal value ───
typedef struct {
int32_t i; // integer value (also used for bool: 0/1)
char s[32]; // string value (short strings only)
ds_sig_type_t type;
bool used;
} ds_signal_t;
// ─── Timer entry ───
typedef struct {
uint32_t ms; // interval in milliseconds
uint8_t action_op; // action opcode
uint16_t action_sig; // target signal
int32_t action_val; // value for set/add/sub
void *timer; // LVGL timer handle (lv_timer_t *)
} ds_timer_t;
// ─── Action callback (for forwarding to ESP-NOW) ───
typedef void (*ds_action_cb_t)(uint8_t node_id, uint8_t action_type);
/**
* Initialize the Panel IR runtime.
* Must be called after LVGL is initialized.
*
* @param parent LVGL parent object (usually lv_scr_act())
* @param action_cb Callback for widget actions (forwarded to ESP-NOW)
*/
esp_err_t ds_runtime_init(void *parent, ds_action_cb_t action_cb);
/**
* Build the UI from Panel IR JSON.
* Parses the JSON, creates LVGL widgets, binds signals.
* Destroys any previously built UI first.
*
* @param ir_json Panel IR JSON string
* @param length Length of the JSON string
*/
esp_err_t ds_ui_build(const char *ir_json, size_t length);
/**
* Destroy the current UI tree.
* Removes all LVGL widgets and clears signal bindings.
*/
void ds_ui_destroy(void);
/**
* Update a signal value and refresh bound widgets.
*
* @param signal_id Signal ID (0-based)
* @param value New integer value
*/
void ds_signal_update(uint16_t signal_id, int32_t value);
/**
* Get current signal count.
*/
uint16_t ds_signal_count(void);
/**
* Get signal value by ID.
*/
int32_t ds_signal_get(uint16_t signal_id);