# DALI ESP-IDF Component A lightweight C++ implementation of the DALI stack used in `lib/dali/*.dart` for gateway type 1 (USB UART) traffic. The component mirrors Dart method names so it can be used as an embedded replacement target. ## Quick Start 1. Add the component to your ESP-IDF project (e.g., via `EXTRA_COMPONENT_DIRS`). 2. Provide UART callbacks when constructing `DaliComm`: ```cpp DaliComm comm( /* send */ [](const uint8_t* data, size_t len) { // write bytes to the gateway UART return my_uart_write(data, len) == ESP_OK; }, /* read (optional) */ [](size_t len, uint32_t timeoutMs) -> std::vector { return my_uart_read(len, timeoutMs); }, /* transact */ [](const uint8_t* data, size_t len) -> std::vector { my_uart_write(data, len); return my_uart_read_response(); // should return the raw gateway reply }); Dali dali(comm); ``` 3. Use the API just like the Dart version: ```cpp dali.base.setBright(5, 200); // direct arc power control dali.base.off(5); dali.base.dtSelect(8); dali.dt8.setColorTemperature(5, 4000); // Kelvin std::vector rgb = dali.dt8.getColourRGB(5); ``` ## Behaviour Parity - Frame formats match the Dart implementation: `[0x10, addr, cmd]` (send), `[0x11, addr, cmd]` (extended), `[0x12, addr, cmd]` (query with `[0xFF, data]` response). - Address encoding matches Dart helpers: `dec*2` for direct arc, `dec*2+1` for command/query addresses. - Colour conversion utilities (`rgb2xy`, `xy2rgb`, XYZ/LAB helpers) are ported from `lib/dali/color.dart`. - Public APIs from `base.dart`, `dt8.dart`, `dt1.dart`, `addr.dart`, and `decode.dart` are exposed with matching method names. - App-side model parity modules are included for `device.dart`, `sequence.dart`, and `sequence_store.dart` via `device.hpp`, `sequence.hpp`, and `sequence_store.hpp`. - Utility APIs from `errors.dart`, `log.dart`, `query_scheduler.dart`, and `bus_monitor.dart` are available as embedded-friendly C++ headers. ## Notes - Optional query support: provide a `transact` callback that returns the gateway reply; otherwise, query methods return `std::nullopt`. - `Dali` facade in `include/dali.hpp` mirrors `lib/dali/dali.dart` and wires `base`, `decode`, `dt1`, `dt8`, and `addr` together. - The `t`, `d`, and `g` parameters in Dart are not required here; timing/gateway selection is driven by your callbacks.