🌙 Lua Scripting
Lua is the primary engine behind Artok's interactivity. By embedding a lightweight Lua 5.4 VM (Virtual Machine), Artok allows you to write complex UI logic, animations, and hardware communication protocols without needing to recompile your C firmware for every minor change.
⚙️ Why Lua for Embedded?
While the Core Engine is written in C for speed, Lua provides:
- Memory Safety: Automatic garbage collection prevents common memory leaks.
- Rapid Iteration: Update logic on the fly via the Live Simulator.
- Small Footprint: The VM adds minimal overhead to the MCU (approx. 100-200 KB Flash).
- Decoupling: Separate your visual UI logic from your critical real-time hardware tasks.
🛠 Scripting Architecture
Artok uses an Event-Driven model. You don't write a "Main Loop"; instead, you write functions that react to system or user signals.
1. The Global app Object
Every script has access to the app and system namespaces to control the lifecycle of the interface.
function on_init()
app:set_screen("dashboard")
system:set_backlight(80) -- 0-100%
end
2. Widget References
Widgets are accessed by their ID defined in the Hierarchy Tree.
-- Change a label text based on a button click
function on_btn_click()
lbl_status:set_text("System Active")
lbl_status:set_style_text_color(0x00FF00) -- Green
end
🎨 Advanced Logic Examples
Multi-State Logic
Handle complex workflows based on sensor data.
function update_temp_display(celsius)
lbl_temp:set_text(string.format("%.1f °C", celsius))
if celsius > 45.0 then
img_warning:set_hidden(false)
bar_heat:set_style_bg_color(0xFF0000) -- Red
else
img_warning:set_hidden(true)
bar_heat:set_style_bg_color(0x222222) -- Dark Grey
end
end
Custom Animations
Create bespoke movements not available in the standard AI Interactions.
function pulse_logo()
local anim = animation:create()
anim:set_var(img_logo)
anim:set_values(100, 150) -- Scale from 100% to 150%
anim:set_time(500)
anim:set_playback_time(500)
anim:set_repeat_count(LOOP_INFINITE)
anim:start()
end
⚡ C and Lua Interop
Artok makes it easy to pass data between the high-level UI and the low-level C firmware.
| Direction | Method | Use Case |
|---|---|---|
| C → Lua | artok_lua_call("fn_name", value) | Sending sensor data to the UI. |
| Lua → C | hardware:pin_write(13, 1) | Controlling a GPIO from a UI button. |
| Shared | system:get_variable("v_batt") | Reading a shared memory variable. |
🚀 Optimization Tips
- Localize Variables: Use
local my_var = ...inside functions to speed up access and save memory. - Avoid
while true: Never write blocking loops in Lua; the UI will freeze. Use Timers instead. - Garbage Collection: The engine handles this automatically, but for tight memory constraints, you can manually call
collectgarbage()after closing large windows.
Artok supports modern Lua 5.4 features, including <const> variables and the improved generational garbage collector, perfect for modern MCUs like the ESP32-S3 or STM32H7.
🚀 Next Steps
- Logic and Events — How to attach these scripts to widgets in the Studio.
- Live Simulator — Test your Lua code in real-time.
- Lua API Reference — The complete list of available methods and constants.