CDC Badge OS
Firmware for the CDC Badge v1.0 hardware security key
Loading...
Searching...
No Matches
WamrImports.cpp
Go to the documentation of this file.
1
10
13#include "cdc_core/Raii.h"
14#include "cdc_views/ListView.h"
16
17extern "C" {
18#include "wasm_export.h"
19void plg_log_info (const char* msg);
20void plg_log_warn (const char* msg);
21void plg_log_error(const char* msg);
22}
23
24#include <cstdio>
25#include <cstring>
26
27namespace cdc::plugin_manager {
28
29// Wrapper signature notation:
30// i = i32, I = i64, $ = null-terminated string, *~ = buffer+length.
31// WAMR injects wasm_exec_env_t as the first C argument automatically.
32
33#define W(name, fn, sig) { name, (void*)fn, sig, nullptr }
34
35// WAMR validates only 1 byte for a bare '*' pointer parameter (a pointer not
36// immediately followed by '~length' in the signature). Any host call that reads
37// or writes more than 1 byte through such a pointer must re-validate the full
38// extent against the calling instance's linear memory, otherwise a plugin can
39// place the pointer at the end of linear memory and drive an out-of-bounds
40// access into native heap. Returns false (caller maps to HOST_ERR_INVALID_ARG)
41// when [ptr, ptr+len) is not fully inside the plugin's linear memory.
42static inline bool wbuf_ok(wasm_exec_env_t env, const void* ptr, size_t len)
43{
44 if (len == 0) return true;
45 wasm_module_inst_t inst = wasm_runtime_get_module_inst(env);
46 return ptr && wasm_runtime_validate_native_addr(inst, const_cast<void*>(ptr),
47 static_cast<uint64_t>(len));
48}
49
50// -- Logging ----------------------------------------------------------------
51
52static void w_host_log(wasm_exec_env_t, uint32_t level, const char* tag, const char* msg)
53{ host_log(static_cast<uint8_t>(level), tag, msg); }
54
55// -- Time / Power -----------------------------------------------------------
56
57static uint64_t w_host_uptime_ms(wasm_exec_env_t) { return host_uptime_ms(); }
58static int64_t w_host_unix_time(wasm_exec_env_t) { return host_unix_time(); }
59static int32_t w_host_is_time_set(wasm_exec_env_t) { return host_is_time_set() ? 1 : 0; }
60static int32_t w_host_timezone_offset(wasm_exec_env_t) { return host_timezone_offset(); }
61
62static uint32_t w_host_battery_mv(wasm_exec_env_t) { return host_battery_mv(); }
63static uint32_t w_host_battery_pct(wasm_exec_env_t) { return host_battery_pct(); }
64static int32_t w_host_is_usb_connected(wasm_exec_env_t) { return host_is_usb_connected(); }
65static uint32_t w_host_power_source(wasm_exec_env_t) { return host_power_source(); }
66static uint32_t w_host_charge_status(wasm_exec_env_t) { return host_charge_status(); }
67static int32_t w_host_is_battery_low(wasm_exec_env_t) { return host_is_battery_low(); }
68static int32_t w_host_is_battery_critical(wasm_exec_env_t) { return host_is_battery_critical(); }
69static void w_host_set_sleep_inhibit(wasm_exec_env_t, uint32_t on) { host_set_sleep_inhibit(on); }
70
71// -- UI ---------------------------------------------------------------------
72
73static int32_t w_host_ui_push_toast(wasm_exec_env_t, const char* t, uint32_t icon, uint32_t ms)
74{ return host_ui_push_toast(t, icon, static_cast<uint16_t>(ms)); }
75
76static int32_t w_host_ui_push_message(wasm_exec_env_t, const char* t, uint32_t icon, uint32_t ms)
77{ return host_ui_push_message(t, icon, ms); }
78
79static int32_t w_host_ui_push_info(wasm_exec_env_t, const char* title, const char* body)
80{ return host_ui_push_info(title, body); }
81
82static int32_t w_host_ui_push_confirm(wasm_exec_env_t, const char* text, uint32_t icon, uint32_t action_id)
83{ return host_ui_push_confirm(text, icon, action_id); }
84
85static int32_t w_host_browser_open(wasm_exec_env_t, const char* url)
86{ return host_browser_open(url); }
87
88namespace {
89int translate_and_call(wasm_exec_env_t exec_env, const char* title, const ui_item_t* items,
90 uint32_t count, uint32_t sel, uint32_t menu, bool replace)
91{
92 if (count == 0 || !items) {
93 return replace ? host_ui_replace_list(title, items, 0, sel, menu)
94 : host_ui_push_list (title, items, 0, sel, menu);
95 }
96 wasm_module_inst_t inst = wasm_runtime_get_module_inst(exec_env);
98 if (!wasm_runtime_validate_native_addr(inst, const_cast<ui_item_t*>(items),
99 static_cast<uint64_t>(count) * sizeof(ui_item_t)))
101 auto native = cdc::core::psramAlloc<ui_item_t>(count);
102 if (!native) return HOST_ERR_NO_MEMORY;
103 for (uint32_t i = 0; i < count; ++i) {
104 native[i] = items[i];
105 uint32_t off = static_cast<uint32_t>(reinterpret_cast<uintptr_t>(items[i].label));
106 if (off != 0 && wasm_runtime_validate_app_str_addr(inst, off)) {
107 native[i].label = static_cast<const char*>(wasm_runtime_addr_app_to_native(inst, off));
108 } else {
109 native[i].label = "";
110 }
111 }
112 return replace ? host_ui_replace_list(title, native.get(), static_cast<uint16_t>(count), sel, menu)
113 : host_ui_push_list (title, native.get(), static_cast<uint16_t>(count), sel, menu);
114}
115} // namespace
116
117static int32_t w_host_ui_push_list(wasm_exec_env_t exec_env, const char* title, const ui_item_t* items,
118 uint32_t count, uint32_t sel, uint32_t menu)
119{
120 return translate_and_call(exec_env, title, items, count, sel, menu, false);
121}
122
123static int32_t w_host_ui_replace_list(wasm_exec_env_t exec_env, const char* title, const ui_item_t* items,
124 uint32_t count, uint32_t sel, uint32_t menu)
125{
126 return translate_and_call(exec_env, title, items, count, sel, menu, true);
127}
128
129static int32_t w_host_ui_set_view_footer(wasm_exec_env_t, const char* hint)
130{
131 return host_ui_set_view_footer(hint);
132}
133
134static int32_t w_host_ui_set_view_empty(wasm_exec_env_t, const char* text)
135{
136 return host_ui_set_view_empty(text);
137}
138
139static int32_t w_host_ui_set_view_lifecycle(wasm_exec_env_t, uint32_t hide_action_id,
140 uint32_t show_action_id)
141{
142 return host_ui_set_view_lifecycle(hide_action_id, show_action_id);
143}
144
145static int32_t w_host_ui_update_list_item(wasm_exec_env_t exec_env, uint32_t index,
146 const ui_item_t* item)
147{
148 if (!item) return HOST_ERR_INVALID_ARG;
149 wasm_module_inst_t inst = wasm_runtime_get_module_inst(exec_env);
150 if (!wasm_runtime_validate_native_addr(inst, const_cast<ui_item_t*>(item), sizeof(ui_item_t)))
152 ui_item_t native = *item;
153 uint32_t off = static_cast<uint32_t>(reinterpret_cast<uintptr_t>(item->label));
154 if (off != 0 && wasm_runtime_validate_app_str_addr(inst, off)) {
155 native.label = static_cast<const char*>(wasm_runtime_addr_app_to_native(inst, off));
156 } else {
157 native.label = "";
158 }
159 return host_ui_update_list_item(static_cast<uint16_t>(index), &native);
160}
161
162static int32_t w_host_ui_insert_list_item(wasm_exec_env_t exec_env, uint32_t index,
163 const ui_item_t* item)
164{
165 if (!item) return HOST_ERR_INVALID_ARG;
166 wasm_module_inst_t inst = wasm_runtime_get_module_inst(exec_env);
167 if (!wasm_runtime_validate_native_addr(inst, const_cast<ui_item_t*>(item), sizeof(ui_item_t)))
169 ui_item_t native = *item;
170 uint32_t off = static_cast<uint32_t>(reinterpret_cast<uintptr_t>(item->label));
171 if (off != 0 && wasm_runtime_validate_app_str_addr(inst, off)) {
172 native.label = static_cast<const char*>(wasm_runtime_addr_app_to_native(inst, off));
173 } else {
174 native.label = "";
175 }
176 return host_ui_insert_list_item(static_cast<uint16_t>(index), &native);
177}
178
179static int32_t w_host_ui_remove_list_item(wasm_exec_env_t, uint32_t index)
180{
181 return host_ui_remove_list_item(static_cast<uint16_t>(index));
182}
183
184static int32_t w_host_ui_push_context_menu(wasm_exec_env_t exec_env, const char* title,
185 const ui_item_t* items, uint32_t count, uint32_t sel)
186{
187 if (count == 0 || !items) return host_ui_push_context_menu(title, items, 0, sel);
188 wasm_module_inst_t inst = wasm_runtime_get_module_inst(exec_env);
189 constexpr uint32_t kMaxItems = cdc::ui::ContextMenuView::MAX_ITEMS;
190 if (count > kMaxItems) return HOST_ERR_INVALID_ARG;
191 if (!wasm_runtime_validate_native_addr(inst, const_cast<ui_item_t*>(items),
192 static_cast<uint64_t>(count) * sizeof(ui_item_t)))
194 ui_item_t native[kMaxItems];
195 for (uint32_t i = 0; i < count; ++i) {
196 native[i] = items[i];
197 uint32_t off = static_cast<uint32_t>(reinterpret_cast<uintptr_t>(items[i].label));
198 if (off != 0 && wasm_runtime_validate_app_str_addr(inst, off)) {
199 native[i].label = static_cast<const char*>(wasm_runtime_addr_app_to_native(inst, off));
200 } else {
201 native[i].label = "";
202 }
203 }
204 return host_ui_push_context_menu(title, native, static_cast<uint16_t>(count), sel);
205}
206
207static int32_t w_host_ui_pop(wasm_exec_env_t) { return host_ui_pop(); }
208static int32_t w_host_ui_pop_to_plugin(wasm_exec_env_t) { return host_ui_pop_to_plugin(); }
209static int32_t w_host_ui_repaint(wasm_exec_env_t) { return host_ui_repaint(); }
210static int32_t w_host_ui_wink(wasm_exec_env_t, uint32_t count, uint32_t period_ms)
211{ return host_ui_wink(static_cast<uint8_t>(count), static_cast<uint16_t>(period_ms)); }
212
213static int32_t w_host_ui_push_t9_input(wasm_exec_env_t, const char* title, const char* initial,
214 uint32_t max_len, uint32_t action_id)
215{ return host_ui_push_t9_input(title, initial, static_cast<uint16_t>(max_len), action_id); }
216
217static int32_t w_host_ui_push_password(wasm_exec_env_t, const char* title, const char* initial,
218 uint32_t max_len, uint32_t action_id)
219{ return host_ui_push_password(title, initial, static_cast<uint16_t>(max_len), action_id); }
220
221static int32_t w_host_ui_push_pin_entry(wasm_exec_env_t, const char* title, uint32_t max_len,
222 uint32_t max_attempts, uint32_t action_id)
223{ return host_ui_push_pin_entry(title, static_cast<uint8_t>(max_len),
224 static_cast<uint8_t>(max_attempts), action_id); }
225
226static int32_t w_host_ui_push_slider(wasm_exec_env_t, const char* title, int32_t min, int32_t max,
227 int32_t init, int32_t step, const char* unit, uint32_t action_id)
228{ return host_ui_push_slider(title, min, max, init, step, unit, action_id); }
229
230static int32_t w_host_ui_push_color_picker(wasm_exec_env_t, uint32_t r, uint32_t g,
231 uint32_t b, uint32_t action_id)
232{ return host_ui_push_color_picker(static_cast<uint8_t>(r), static_cast<uint8_t>(g),
233 static_cast<uint8_t>(b), action_id); }
234
235static int32_t w_host_ui_consume_input_text(wasm_exec_env_t, char* out, uint32_t out_size)
236{ return host_ui_consume_input_text(out, out_size); }
237
238static int32_t w_host_ui_consume_input_int(wasm_exec_env_t exec_env, int32_t* out)
239{
240 if (!wbuf_ok(exec_env, out, sizeof(int32_t))) return HOST_ERR_INVALID_ARG;
241 return host_ui_consume_input_int(out);
242}
243
244// -- Canvas view -----------------------------------------------------------
245
246static int32_t w_host_view_canvas_push(wasm_exec_env_t, const char* title,
247 uint32_t key_action_id, uint32_t widget_action_id)
248{ return host_view_canvas_push(title, key_action_id, widget_action_id); }
249
250static int32_t w_host_view_canvas_get_body_size(wasm_exec_env_t exec_env, uint16_t* w, uint16_t* h)
251{
252 if (!wbuf_ok(exec_env, w, sizeof(uint16_t)) || !wbuf_ok(exec_env, h, sizeof(uint16_t)))
255}
256
257static int32_t w_host_view_canvas_set_footer(wasm_exec_env_t, const char* hint)
258{ return host_view_canvas_set_footer(hint); }
259
260static int32_t w_host_view_canvas_clear(wasm_exec_env_t)
261{ return host_view_canvas_clear(); }
262
263static int32_t w_host_view_canvas_clear_ex(wasm_exec_env_t, uint32_t flags)
265
266static int32_t w_host_view_canvas_set_text_size(wasm_exec_env_t, uint32_t size)
267{ return host_view_canvas_set_text_size(static_cast<uint8_t>(size)); }
268
269static int32_t w_host_view_canvas_set_text_color(wasm_exec_env_t, uint32_t inverted)
270{ return host_view_canvas_set_text_color(inverted != 0); }
271
272static int32_t w_host_view_canvas_set_font(wasm_exec_env_t, uint32_t font_id)
273{ return host_view_canvas_set_font(static_cast<uint8_t>(font_id)); }
274
275static int32_t w_host_text_pick_font_that_fits(wasm_exec_env_t, const char* text, int32_t max_width_px,
276 const uint8_t* candidates, uint32_t count,
277 uint8_t* out_font_id)
278{
279 return host_text_pick_font_that_fits(text, static_cast<int16_t>(max_width_px),
280 candidates, count, out_font_id);
281}
282
283static int32_t w_host_view_canvas_draw_text(wasm_exec_env_t, int32_t x, int32_t y, const char* text)
284{ return host_view_canvas_draw_text(static_cast<int16_t>(x), static_cast<int16_t>(y), text); }
285
286static int32_t w_host_view_canvas_draw_text_aligned(wasm_exec_env_t, int32_t x, int32_t y,
287 int32_t w, const char* text, uint32_t align)
288{ return host_view_canvas_draw_text_aligned(static_cast<int16_t>(x), static_cast<int16_t>(y),
289 static_cast<int16_t>(w), text,
290 static_cast<uint8_t>(align)); }
291
292static int32_t w_host_view_canvas_draw_rect(wasm_exec_env_t, int32_t x, int32_t y,
293 int32_t w, int32_t h, uint32_t filled)
294{ return host_view_canvas_draw_rect(static_cast<int16_t>(x), static_cast<int16_t>(y),
295 static_cast<int16_t>(w), static_cast<int16_t>(h),
296 filled != 0); }
297
298static int32_t w_host_view_canvas_draw_pixel(wasm_exec_env_t, int32_t x, int32_t y)
299{ return host_view_canvas_draw_pixel(static_cast<int16_t>(x), static_cast<int16_t>(y)); }
300
301static int32_t w_host_view_canvas_draw_line(wasm_exec_env_t, int32_t x0, int32_t y0,
302 int32_t x1, int32_t y1)
303{ return host_view_canvas_draw_line(static_cast<int16_t>(x0), static_cast<int16_t>(y0),
304 static_cast<int16_t>(x1), static_cast<int16_t>(y1)); }
305
306static int32_t w_host_view_canvas_draw_circle(wasm_exec_env_t, int32_t x, int32_t y,
307 int32_t r, uint32_t filled)
308{ return host_view_canvas_draw_circle(static_cast<int16_t>(x), static_cast<int16_t>(y),
309 static_cast<int16_t>(r), filled != 0); }
310
311static int32_t w_host_view_canvas_draw_triangle(wasm_exec_env_t, int32_t x0, int32_t y0,
312 int32_t x1, int32_t y1,
313 int32_t x2, int32_t y2, uint32_t filled)
314{ return host_view_canvas_draw_triangle(static_cast<int16_t>(x0), static_cast<int16_t>(y0),
315 static_cast<int16_t>(x1), static_cast<int16_t>(y1),
316 static_cast<int16_t>(x2), static_cast<int16_t>(y2),
317 filled != 0); }
318
319static int32_t w_host_view_canvas_draw_round_rect(wasm_exec_env_t, int32_t x, int32_t y,
320 int32_t w, int32_t h, int32_t r,
321 uint32_t filled)
322{ return host_view_canvas_draw_round_rect(static_cast<int16_t>(x), static_cast<int16_t>(y),
323 static_cast<int16_t>(w), static_cast<int16_t>(h),
324 static_cast<int16_t>(r), filled != 0); }
325
326static int32_t w_host_view_canvas_draw_bitmap(wasm_exec_env_t env, int32_t x, int32_t y,
327 int32_t w, int32_t h,
328 const uint8_t* data, uint32_t len)
329{
330 if (!wbuf_ok(env, data, len)) return HOST_ERR_INVALID_ARG;
331 return host_view_canvas_draw_bitmap(static_cast<int16_t>(x), static_cast<int16_t>(y),
332 static_cast<int16_t>(w), static_cast<int16_t>(h),
333 data, len);
334}
335
336static int32_t w_host_view_canvas_set_shade(wasm_exec_env_t, uint32_t shade)
337{ return host_view_canvas_set_shade(static_cast<uint8_t>(shade)); }
338
339static int32_t w_host_view_canvas_hline(wasm_exec_env_t, int32_t x, int32_t y, int32_t w)
340{ return host_view_canvas_hline(static_cast<int16_t>(x), static_cast<int16_t>(y),
341 static_cast<int16_t>(w)); }
342
343static int32_t w_host_view_canvas_vline(wasm_exec_env_t, int32_t x, int32_t y, int32_t h)
344{ return host_view_canvas_vline(static_cast<int16_t>(x), static_cast<int16_t>(y),
345 static_cast<int16_t>(h)); }
346
347static int32_t w_host_view_canvas_commit(wasm_exec_env_t, uint32_t full_refresh)
348{ return host_view_canvas_commit(full_refresh != 0); }
349
350static int32_t w_host_view_canvas_elem_begin(wasm_exec_env_t, uint32_t elem_id)
351{ return host_view_canvas_elem_begin(elem_id); }
352
353static int32_t w_host_view_canvas_elem_end(wasm_exec_env_t)
354{ return host_view_canvas_elem_end(); }
355
356static int32_t w_host_view_canvas_elem_set_offset(wasm_exec_env_t, uint32_t elem_id,
357 int32_t ox, int32_t oy)
358{ return host_view_canvas_elem_set_offset(elem_id, static_cast<int16_t>(ox),
359 static_cast<int16_t>(oy)); }
360
361static int32_t w_host_view_canvas_elem_move(wasm_exec_env_t, uint32_t elem_id,
362 int32_t dx, int32_t dy)
363{ return host_view_canvas_elem_move(elem_id, static_cast<int16_t>(dx),
364 static_cast<int16_t>(dy)); }
365
366static int32_t w_host_view_canvas_elem_show(wasm_exec_env_t, uint32_t elem_id,
367 uint32_t visible)
368{ return host_view_canvas_elem_show(elem_id, visible != 0); }
369
370static int32_t w_host_view_canvas_elem_remove(wasm_exec_env_t, uint32_t elem_id)
371{ return host_view_canvas_elem_remove(elem_id); }
372
373static int32_t w_host_view_canvas_elem_clear(wasm_exec_env_t, uint32_t elem_id)
374{ return host_view_canvas_elem_clear(elem_id); }
375
376static int32_t w_host_view_canvas_elem_set_z(wasm_exec_env_t, uint32_t elem_id, int32_t z)
377{ return host_view_canvas_elem_set_z(elem_id, static_cast<int8_t>(z)); }
378
379static int32_t w_host_view_canvas_elem_get_offset(wasm_exec_env_t exec_env, uint32_t elem_id,
380 int16_t* ox, int16_t* oy)
381{
382 if (!wbuf_ok(exec_env, ox, sizeof(int16_t)) || !wbuf_ok(exec_env, oy, sizeof(int16_t))) {
384 }
385 return host_view_canvas_elem_get_offset(elem_id, ox, oy);
386}
387
388static int32_t w_host_view_canvas_elem_get_bounds(wasm_exec_env_t exec_env, uint32_t elem_id,
389 int16_t* x, int16_t* y,
390 uint16_t* w, uint16_t* h)
391{
392 if (!wbuf_ok(exec_env, x, sizeof(int16_t)) || !wbuf_ok(exec_env, y, sizeof(int16_t))
393 || !wbuf_ok(exec_env, w, sizeof(uint16_t)) || !wbuf_ok(exec_env, h, sizeof(uint16_t))) {
395 }
396 return host_view_canvas_elem_get_bounds(elem_id, x, y, w, h);
397}
398
399static int32_t w_host_view_canvas_set_anim_policy(wasm_exec_env_t, uint32_t policy, uint32_t max_fps)
400{ return host_view_canvas_set_anim_policy(static_cast<uint8_t>(policy),
401 static_cast<uint8_t>(max_fps)); }
402
403static int32_t w_host_view_canvas_draw_sprite(wasm_exec_env_t, int32_t x, int32_t y, uint32_t sprite)
404{ return host_view_canvas_draw_sprite(static_cast<int16_t>(x), static_cast<int16_t>(y), sprite); }
405
406// -- Sprites --
407static int32_t w_host_sprite_create(wasm_exec_env_t, uint32_t w, uint32_t h, uint32_t frames,
408 const uint8_t* data, uint32_t len)
409{ return host_sprite_create(static_cast<uint16_t>(w), static_cast<uint16_t>(h),
410 static_cast<uint16_t>(frames), data, len); }
411
412static int32_t w_host_sprite_create_from_surface(wasm_exec_env_t, uint32_t surface, uint32_t w,
413 uint32_t h, uint32_t frames)
414{ return host_sprite_create_from_surface(surface, static_cast<uint16_t>(w),
415 static_cast<uint16_t>(h), static_cast<uint16_t>(frames)); }
416
417static int32_t w_host_sprite_set_mask(wasm_exec_env_t, uint32_t sprite, const uint8_t* mask,
418 uint32_t len)
419{ return host_sprite_set_mask(sprite, mask, len); }
420
421static int32_t w_host_sprite_set_flags(wasm_exec_env_t, uint32_t sprite, uint32_t flags)
422{ return host_sprite_set_flags(sprite, static_cast<uint8_t>(flags)); }
423
424static int32_t w_host_sprite_set_scale(wasm_exec_env_t, uint32_t sprite, uint32_t scale)
425{ return host_sprite_set_scale(sprite, static_cast<uint8_t>(scale)); }
426
427static int32_t w_host_sprite_create_from_image(wasm_exec_env_t, const uint8_t* data, uint32_t len,
428 uint32_t target_w, uint32_t frame_h)
429{ return host_sprite_create_from_image(data, len, static_cast<uint16_t>(target_w),
430 static_cast<uint16_t>(frame_h)); }
431
432static int32_t w_host_view_canvas_set_ink(wasm_exec_env_t, uint32_t white)
433{ return host_view_canvas_set_ink(white != 0); }
434
435static int32_t w_host_view_canvas_marquee(wasm_exec_env_t, int32_t x, int32_t y, int32_t window_w,
436 const char* text, uint32_t step_px, uint32_t frame_ms)
437{ return host_view_canvas_marquee(static_cast<int16_t>(x), static_cast<int16_t>(y),
438 static_cast<int16_t>(window_w), text,
439 static_cast<uint16_t>(step_px), static_cast<uint16_t>(frame_ms)); }
440
441static int32_t w_host_sprite_set_frame(wasm_exec_env_t, uint32_t sprite, uint32_t frame)
442{ return host_sprite_set_frame(sprite, static_cast<uint16_t>(frame)); }
443
444static int32_t w_host_sprite_get_frame(wasm_exec_env_t exec_env, uint32_t sprite, uint16_t* out)
445{
446 if (!wbuf_ok(exec_env, out, sizeof(uint16_t))) return HOST_ERR_INVALID_ARG;
447 return host_sprite_get_frame(sprite, out);
448}
449
450static int32_t w_host_sprite_set_frame_durations(wasm_exec_env_t exec_env, uint32_t sprite,
451 const uint16_t* ms, uint32_t count)
452{
453 if (count != 0
454 && !wbuf_ok(exec_env, ms, static_cast<uint64_t>(count) * sizeof(uint16_t))) {
456 }
457 return host_sprite_set_frame_durations(sprite, ms, static_cast<uint16_t>(count));
458}
459
460static int32_t w_host_sprite_play(wasm_exec_env_t, uint32_t sprite, uint32_t mode,
461 uint32_t frame_ms, uint32_t repeat, uint32_t done_aid)
462{ return host_sprite_play(sprite, static_cast<uint8_t>(mode), static_cast<uint16_t>(frame_ms),
463 static_cast<uint16_t>(repeat), done_aid); }
464
465static int32_t w_host_sprite_stop(wasm_exec_env_t, uint32_t sprite)
466{ return host_sprite_stop(sprite); }
467
468static int32_t w_host_sprite_destroy(wasm_exec_env_t, uint32_t sprite)
469{ return host_sprite_destroy(sprite); }
470
471// -- Canvas tweens --
472static int32_t w_host_anim_start(wasm_exec_env_t exec_env, const host_anim_t* cfg)
473{
474 if (!wbuf_ok(exec_env, cfg, sizeof(host_anim_t))) return HOST_ERR_INVALID_ARG;
475 return host_anim_start(cfg);
476}
477
478static int32_t w_host_anim_cancel(wasm_exec_env_t, uint32_t handle)
479{ return host_anim_cancel(handle); }
480
481static int32_t w_host_anim_pause(wasm_exec_env_t, uint32_t handle, uint32_t paused)
482{ return host_anim_pause(handle, paused != 0); }
483
484static int32_t w_host_anim_state(wasm_exec_env_t, uint32_t handle)
485{ return host_anim_state(handle); }
486
487static int32_t w_host_anim_active_count(wasm_exec_env_t)
488{ return host_anim_active_count(); }
489
490static int32_t w_host_anim_blink(wasm_exec_env_t, uint32_t elem_id, uint32_t period_ms,
491 uint32_t count, uint32_t done_aid)
492{ return host_anim_blink(elem_id, static_cast<uint16_t>(period_ms),
493 static_cast<uint16_t>(count), done_aid); }
494
495static int32_t w_host_view_canvas_add_slider(wasm_exec_env_t, uint32_t widget_id,
496 int32_t min, int32_t max, int32_t initial, int32_t step)
497{ return host_view_canvas_add_slider(widget_id, min, max, initial, step); }
498
499static int32_t w_host_view_canvas_add_text(wasm_exec_env_t, uint32_t widget_id,
500 uint32_t max_len, const char* initial)
501{ return host_view_canvas_add_text(widget_id, static_cast<uint16_t>(max_len), initial); }
502
503static int32_t w_host_view_canvas_add_button(wasm_exec_env_t, uint32_t widget_id)
504{ return host_view_canvas_add_button(widget_id); }
505
506static int32_t w_host_view_canvas_remove_widget(wasm_exec_env_t, uint32_t widget_id)
507{ return host_view_canvas_remove_widget(widget_id); }
508
509static int32_t w_host_view_canvas_set_value(wasm_exec_env_t, uint32_t widget_id, int32_t value)
510{ return host_view_canvas_set_value(widget_id, value); }
511
512static int32_t w_host_view_canvas_get_value(wasm_exec_env_t exec_env, uint32_t widget_id, int32_t* out)
513{
514 if (!wbuf_ok(exec_env, out, sizeof(int32_t))) return HOST_ERR_INVALID_ARG;
515 return host_view_canvas_get_value(widget_id, out);
516}
517
518static int32_t w_host_view_canvas_set_text(wasm_exec_env_t, uint32_t widget_id, const char* text)
519{ return host_view_canvas_set_text(widget_id, text); }
520
521static int32_t w_host_view_canvas_get_text(wasm_exec_env_t, uint32_t widget_id,
522 char* out, uint32_t cap)
523{ return host_view_canvas_get_text(widget_id, out, cap); }
524
525static int32_t w_host_view_canvas_set_focus(wasm_exec_env_t, uint32_t widget_id)
526{ return host_view_canvas_set_focus(widget_id); }
527
528static int32_t w_host_view_canvas_get_focus(wasm_exec_env_t exec_env, uint32_t* out)
529{
530 if (!wbuf_ok(exec_env, out, sizeof(uint32_t))) return HOST_ERR_INVALID_ARG;
531 return host_view_canvas_get_focus(out);
532}
533
534static int32_t w_host_view_canvas_set_key_repeat(wasm_exec_env_t, uint32_t initial_ms, uint32_t repeat_ms)
535{ return host_view_canvas_set_key_repeat(static_cast<uint16_t>(initial_ms),
536 static_cast<uint16_t>(repeat_ms)); }
537
538static int32_t w_host_view_canvas_set_long_press_action(wasm_exec_env_t, uint32_t action_id)
539{ return host_view_canvas_set_long_press_action(action_id); }
540
541// -- I18n -------------------------------------------------------------------
542
543static int32_t w_host_i18n_tr_key (wasm_exec_env_t, const char* k, char* o, uint32_t c) { return host_i18n_tr_key(k, o, c); }
544static int32_t w_host_i18n_tr_meta(wasm_exec_env_t, const char* f, char* o, uint32_t c) { return host_i18n_tr_meta(f, o, c); }
545static int32_t w_host_i18n_tr_core(wasm_exec_env_t, const char* k, char* o, uint32_t c) { return host_i18n_tr_core(k, o, c); }
546static uint32_t w_host_i18n_current_language(wasm_exec_env_t) { return host_i18n_current_language(); }
547
548// -- NVS --------------------------------------------------------------------
549
550static int32_t w_host_nvs_get_blob(wasm_exec_env_t, const char* key, uint8_t* buf, uint32_t buf_size)
551{
552 size_t len = buf_size;
553 int rc = host_nvs_get_blob(key, buf, &len);
554 return rc == HOST_OK ? static_cast<int32_t>(len) : rc;
555}
556
557static int32_t w_host_nvs_set_blob(wasm_exec_env_t, const char* key, const uint8_t* buf, uint32_t len)
558{ return host_nvs_set_blob(key, buf, len); }
559
560static int32_t w_host_nvs_get_u32(wasm_exec_env_t exec_env, const char* key, uint32_t* out)
561{
562 if (!wbuf_ok(exec_env, out, sizeof(uint32_t))) return HOST_ERR_INVALID_ARG;
563 return host_nvs_get_u32(key, out);
564}
565
566static int32_t w_host_nvs_set_u32(wasm_exec_env_t, const char* key, uint32_t value)
567{ return host_nvs_set_u32(key, value); }
568
569static int32_t w_host_nvs_get_str(wasm_exec_env_t, const char* key, char* buf, uint32_t buf_size)
570{ return host_nvs_get_str(key, buf, buf_size); }
571
572static int32_t w_host_nvs_set_str(wasm_exec_env_t, const char* key, const char* value)
573{ return host_nvs_set_str(key, value); }
574
575static int32_t w_host_nvs_erase(wasm_exec_env_t, const char* key) { return host_nvs_erase(key); }
576
577// -- vFAT (sandboxed plugin file storage) -----------------------------------
578
579static int32_t w_host_fs_write(wasm_exec_env_t, const char* name, const uint8_t* data, uint32_t len)
580{ return host_fs_write(name, data, len); }
581
582static int32_t w_host_fs_read(wasm_exec_env_t, const char* name, uint8_t* buf, uint32_t buf_size)
583{
584 size_t len = buf_size;
585 int rc = host_fs_read(name, buf, &len);
586 return rc == HOST_OK ? static_cast<int32_t>(len) : rc;
587}
588
589static int32_t w_host_fs_remove(wasm_exec_env_t, const char* name) { return host_fs_remove(name); }
590
591static int32_t w_host_fs_size(wasm_exec_env_t, const char* name)
592{
593 size_t sz = 0;
594 int rc = host_fs_size(name, &sz);
595 return rc == HOST_OK ? static_cast<int32_t>(sz) : rc;
596}
597
598static int32_t w_host_fs_list(wasm_exec_env_t, char* out, uint32_t out_size)
599{
600 size_t len = out_size;
601 int rc = host_fs_list(out, &len);
602 return rc == HOST_OK ? static_cast<int32_t>(len) : rc;
603}
604
605static int32_t w_host_fs_view(wasm_exec_env_t, const char* name) { return host_fs_view(name); }
606static int32_t w_host_fs_view_image(wasm_exec_env_t, const char* name) { return host_fs_view_image(name); }
607static int32_t w_host_fs_view_markdown(wasm_exec_env_t, const char* name) { return host_fs_view_markdown(name); }
608
609static int32_t w_host_ui_view_image(wasm_exec_env_t env, const uint8_t* data, uint32_t len)
610{ if (!wbuf_ok(env, data, len)) return HOST_ERR_INVALID_ARG; return host_ui_view_image(data, len); }
611static int32_t w_host_ui_view_markdown(wasm_exec_env_t env, const uint8_t* data, uint32_t len)
612{ if (!wbuf_ok(env, data, len)) return HOST_ERR_INVALID_ARG; return host_ui_view_markdown(data, len); }
613
614// -- Crypto -----------------------------------------------------------------
615
616static int32_t w_host_random(wasm_exec_env_t, uint8_t* buf, uint32_t len)
617{ return host_random(buf, len); }
618
619static int32_t w_host_sha256(wasm_exec_env_t exec_env, const uint8_t* data, uint32_t len, uint8_t* out)
620{
621 if (!wbuf_ok(exec_env, out, 32)) return HOST_ERR_INVALID_ARG;
622 return host_sha256(data, len, out);
623}
624
625static int32_t w_host_hmac_sha256(wasm_exec_env_t exec_env, const uint8_t* key, uint32_t klen,
626 const uint8_t* data, uint32_t dlen, uint8_t* out)
627{
628 if (!wbuf_ok(exec_env, out, 32)) return HOST_ERR_INVALID_ARG;
629 return host_hmac_sha256(key, klen, data, dlen, out);
630}
631
632static int32_t w_host_base32_encode(wasm_exec_env_t, const uint8_t* in, uint32_t in_len, char* out, uint32_t out_size)
633{ return host_base32_encode(in, in_len, out, out_size); }
634
635static int32_t w_host_base32_decode(wasm_exec_env_t, const char* in, uint32_t in_len, uint8_t* out, uint32_t out_size)
636{ return host_base32_decode(in, in_len, out, out_size); }
637
638static int32_t w_host_hex_encode(wasm_exec_env_t, const uint8_t* in, uint32_t in_len, char* out, uint32_t out_size)
639{ return host_hex_encode(in, in_len, out, out_size); }
640
641// -- HTTP -------------------------------------------------------------------
642
643static int32_t w_host_http_open(wasm_exec_env_t, uint32_t method, const char* url, uint32_t timeout)
644{ return host_http_open(static_cast<uint8_t>(method), url, timeout); }
645
646static int32_t w_host_http_set_header(wasm_exec_env_t, int32_t h, const char* k, const char* v)
647{ return host_http_set_header(h, k, v); }
648
649static int32_t w_host_http_set_body(wasm_exec_env_t, int32_t h, const uint8_t* body, uint32_t len)
650{ return host_http_set_body(h, body, len); }
651
652static int32_t w_host_http_perform(wasm_exec_env_t, int32_t h) { return host_http_perform(h); }
653static int32_t w_host_http_status(wasm_exec_env_t, int32_t h) { return host_http_status(h); }
654static int32_t w_host_http_close (wasm_exec_env_t, int32_t h) { return host_http_close(h); }
655
656static int32_t w_host_http_read_chunk(wasm_exec_env_t, int32_t h, uint8_t* buf, uint32_t buf_size)
657{
658 size_t out_len = 0;
659 int rc = host_http_read_chunk(h, buf, buf_size, &out_len);
660 return rc == HOST_OK ? static_cast<int32_t>(out_len) : rc;
661}
662
663// -- Socket -----------------------------------------------------------------
664
665static int32_t w_host_socket_open(wasm_exec_env_t, uint32_t proto, const char* host,
666 uint32_t port, uint32_t timeout)
667{ return host_socket_open(static_cast<uint8_t>(proto), host,
668 static_cast<uint16_t>(port), timeout); }
669
670static int32_t w_host_socket_write(wasm_exec_env_t, int32_t h, const uint8_t* data,
671 uint32_t len, uint32_t timeout)
672{ return host_socket_write(h, data, len, timeout); }
673
674static int32_t w_host_socket_read(wasm_exec_env_t, int32_t h, uint8_t* out,
675 uint32_t cap, uint32_t timeout)
676{ return host_socket_read(h, out, cap, timeout); }
677
678static int32_t w_host_socket_close(wasm_exec_env_t, int32_t h) { return host_socket_close(h); }
679
680// -- Inbound TCP listener ---------------------------------------------------
681static int32_t w_host_net_listen(wasm_exec_env_t, uint32_t port, uint32_t action_id)
682{ return host_net_listen(static_cast<uint16_t>(port), action_id); }
683static int32_t w_host_net_accept(wasm_exec_env_t) { return host_net_accept(); }
684static int32_t w_host_net_close(wasm_exec_env_t, uint32_t port)
685{ return host_net_close(static_cast<uint16_t>(port)); }
686
687static int32_t w_host_set_resident(wasm_exec_env_t, int32_t resident)
688{ return host_set_resident(resident != 0); }
689
690// -- WiFi -------------------------------------------------------------------
691
692static int32_t w_host_wifi_request(wasm_exec_env_t, uint32_t t) { return host_wifi_request(t); }
693static int32_t w_host_wifi_release(wasm_exec_env_t) { return host_wifi_release(); }
694static int32_t w_host_wifi_is_connected(wasm_exec_env_t) { return host_wifi_is_connected(); }
695static int32_t w_host_wifi_ssid(wasm_exec_env_t, char* out, uint32_t sz)
696{ return host_wifi_ssid(out, sz); }
697static int32_t w_host_wifi_ip(wasm_exec_env_t, char* out, uint32_t sz)
698{ return host_wifi_ip(out, sz); }
699
700// -- SecureElement ----------------------------------------------------------
701
702static int32_t w_host_rmem_read_named(wasm_exec_env_t, const char* name,
703 uint8_t* buf, uint32_t buf_size)
704{
705 size_t len = buf_size;
706 int rc = host_rmem_read_named(name, buf, &len);
707 return rc == HOST_OK ? static_cast<int32_t>(len) : rc;
708}
709
710static int32_t w_host_rmem_write_named(wasm_exec_env_t, const char* name,
711 const uint8_t* buf, uint32_t len)
712{ return host_rmem_write_named(name, buf, len); }
713
714static int32_t w_host_rmem_erase_named(wasm_exec_env_t, const char* name)
715{ return host_rmem_erase_named(name); }
716
717static int32_t w_host_rmem_name_used(wasm_exec_env_t, const char* name)
718{ return host_rmem_name_used(name) ? 1 : 0; }
719
720static uint32_t w_host_rmem_slot_size(wasm_exec_env_t)
721{ return host_rmem_slot_size(); }
722
723static int32_t w_host_ecc_generate(wasm_exec_env_t, const char* name, uint32_t curve)
724{ return host_ecc_generate(name, static_cast<uint8_t>(curve)); }
725static int32_t w_host_ecc_import(wasm_exec_env_t exec_env, const char* name, const uint8_t* priv, uint32_t curve)
726{
727 if (!wbuf_ok(exec_env, priv, 32)) return HOST_ERR_INVALID_ARG;
728 return host_ecc_import(name, priv, static_cast<uint8_t>(curve));
729}
730static int32_t w_host_ecc_pubkey(wasm_exec_env_t exec_env, const char* name, uint8_t* pub, uint32_t curve)
731{
732 if (!wbuf_ok(exec_env, pub, 64)) return HOST_ERR_INVALID_ARG;
733 return host_ecc_pubkey(name, pub, static_cast<uint8_t>(curve));
734}
735static int32_t w_host_ecc_delete(wasm_exec_env_t, const char* name)
736{ return host_ecc_delete(name); }
737static int32_t w_host_ecc_exists(wasm_exec_env_t, const char* name)
738{ return host_ecc_exists(name) ? 1 : 0; }
739static int32_t w_host_ecdsa_sign(wasm_exec_env_t exec_env, const char* name, const uint8_t* msg, uint32_t len, uint8_t* sig)
740{
741 if (!wbuf_ok(exec_env, sig, 64)) return HOST_ERR_INVALID_ARG;
742 return host_ecdsa_sign(name, msg, len, sig);
743}
744static int32_t w_host_eddsa_sign(wasm_exec_env_t exec_env, const char* name, const uint8_t* msg, uint32_t len, uint8_t* sig)
745{
746 if (!wbuf_ok(exec_env, sig, 64)) return HOST_ERR_INVALID_ARG;
747 return host_eddsa_sign(name, msg, len, sig);
748}
749
750// -- EventBus ---------------------------------------------------------------
751
752static int32_t w_host_event_subscribe(wasm_exec_env_t, uint32_t mask, uint32_t action_id)
753{ return host_event_subscribe(mask, action_id); }
754static int32_t w_host_event_unsubscribe(wasm_exec_env_t, uint32_t sub) { return host_event_unsubscribe(sub); }
755
756// -- GPIO -------------------------------------------------------------------
757
758static int32_t w_host_gpio_set_direction(wasm_exec_env_t, uint32_t pin, uint32_t dir)
759{ return host_gpio_set_direction(static_cast<uint8_t>(pin), static_cast<uint8_t>(dir)); }
760static int32_t w_host_gpio_set_pull(wasm_exec_env_t, uint32_t pin, uint32_t pull)
761{ return host_gpio_set_pull(static_cast<uint8_t>(pin), static_cast<uint8_t>(pull)); }
762static int32_t w_host_gpio_write(wasm_exec_env_t, uint32_t pin, int32_t level)
763{ return host_gpio_write(static_cast<uint8_t>(pin), level != 0); }
764static int32_t w_host_gpio_read(wasm_exec_env_t exec_env, uint32_t pin, int32_t* out)
765{
766 if (!wbuf_ok(exec_env, out, sizeof(int32_t))) return HOST_ERR_INVALID_ARG;
767 bool level = false;
768 int rc = host_gpio_read(static_cast<uint8_t>(pin), &level);
769 if (rc == HOST_OK) *out = level ? 1 : 0;
770 return rc;
771}
772static int32_t w_host_gpio_release(wasm_exec_env_t, uint32_t pin)
773{ return host_gpio_release(static_cast<uint8_t>(pin)); }
774static int32_t w_host_gpio_pwm_start(wasm_exec_env_t, uint32_t pin, uint32_t freq, uint32_t duty)
775{ return host_gpio_pwm_start(static_cast<uint8_t>(pin), freq, static_cast<uint16_t>(duty)); }
776static int32_t w_host_gpio_pwm_stop(wasm_exec_env_t, uint32_t pin)
777{ return host_gpio_pwm_stop(static_cast<uint8_t>(pin)); }
778
779// -- Date/Time + System info ------------------------------------------------
780
781static int32_t w_host_ui_push_date(wasm_exec_env_t, const char* title, uint32_t d,
782 uint32_t m, uint32_t y, uint32_t action_id)
783{ return host_ui_push_date(title, static_cast<uint8_t>(d), static_cast<uint8_t>(m),
784 static_cast<uint16_t>(y), action_id); }
785
786static int32_t w_host_ui_push_time(wasm_exec_env_t, const char* title, uint32_t h,
787 uint32_t m, uint32_t action_id)
788{ return host_ui_push_time(title, static_cast<uint8_t>(h), static_cast<uint8_t>(m), action_id); }
789
790static int32_t w_host_get_firmware_version(wasm_exec_env_t, char* out, uint32_t out_size)
791{ return host_get_firmware_version(out, out_size); }
792
793static int32_t w_host_str_to_display(wasm_exec_env_t, const char* in, char* out,
794 uint32_t out_size, uint32_t target)
795{ return host_str_to_display(in, out, out_size, target); }
796
797static int32_t w_host_str_to_utf8(wasm_exec_env_t, const char* in, char* out, uint32_t out_size)
798{ return host_str_to_utf8(in, out, out_size); }
799
800static int32_t w_host_get_build_profile(wasm_exec_env_t, char* out, uint32_t out_size)
801{ return host_get_build_profile(out, out_size); }
802
803static int32_t w_host_feature_enabled(wasm_exec_env_t, uint32_t feature_id)
804{ return host_feature_enabled(static_cast<uint16_t>(feature_id)) ? 1 : 0; }
805
806static uint32_t w_host_cpu_load(wasm_exec_env_t) { return host_cpu_load(); }
807
808static int32_t w_host_cmd_consume(wasm_exec_env_t, char* out, uint32_t out_size)
809{ return host_cmd_consume(out, out_size); }
810
811// -- Message transfer --
812static int32_t w_host_msg_register_handler(wasm_exec_env_t, const char* mime, uint32_t aid)
813{ return host_msg_register_handler(mime, aid); }
814static int32_t w_host_msg_unregister_handler(wasm_exec_env_t, const char* mime)
815{ return host_msg_unregister_handler(mime); }
816static int32_t w_host_msg_consume(wasm_exec_env_t, uint8_t* buf, uint32_t buf_size,
817 char* mime_out, uint32_t mime_size)
818{ return host_msg_consume(buf, buf_size, mime_out, mime_size); }
819static int32_t w_host_msg_send_interactive(wasm_exec_env_t, const char* mime,
820 const uint8_t* data, uint32_t len, uint32_t flags)
821{ return host_msg_send_interactive(mime, data, len, flags); }
822static int32_t w_host_msg_send(wasm_exec_env_t exec_env, const uint8_t* addr, uint32_t addr_type,
823 const char* mime, const uint8_t* data, uint32_t len, uint32_t flags)
824{
825 // addr is a bare '*' (WAMR validates only 1 byte) -> re-validate all 6 bytes.
826 if (!wbuf_ok(exec_env, addr, 6)) return HOST_ERR_INVALID_ARG;
827 return host_msg_send(addr, static_cast<uint8_t>(addr_type), mime, data, len, flags);
828}
829
830// -- vCard store (read-only) --
831static int32_t w_host_vcard_get_own(wasm_exec_env_t, char* out, uint32_t out_size)
832{ return host_vcard_get_own(out, out_size); }
833static int32_t w_host_vcard_received_count(wasm_exec_env_t)
834{ return host_vcard_received_count(); }
835static int32_t w_host_vcard_received_get(wasm_exec_env_t, uint32_t index, char* out, uint32_t out_size)
836{ return host_vcard_received_get(static_cast<uint16_t>(index), out, out_size); }
837static int32_t w_host_vcard_received_display(wasm_exec_env_t, uint32_t index, char* out, uint32_t out_size)
838{ return host_vcard_received_display(static_cast<uint16_t>(index), out, out_size); }
839static int32_t w_host_vcard_set_own(wasm_exec_env_t, const char* vcard, uint32_t len)
840{ return host_vcard_set_own(vcard, len); }
841static int32_t w_host_vcard_received_add(wasm_exec_env_t, const char* vcard, uint32_t len)
842{ return host_vcard_received_add(vcard, len); }
843static int32_t w_host_vcard_received_update(wasm_exec_env_t, uint32_t index, const char* vcard, uint32_t len)
844{ return host_vcard_received_update(static_cast<uint16_t>(index), vcard, len); }
845static int32_t w_host_vcard_received_delete(wasm_exec_env_t, uint32_t index)
846{ return host_vcard_received_delete(static_cast<uint16_t>(index)); }
847
848// -- QR encoding --
849static int32_t w_host_qr_measure(wasm_exec_env_t exec_env, const char* data,
850 uint32_t max_version, uint32_t ecc, uint16_t* out_modules)
851{
852 if (!wbuf_ok(exec_env, out_modules, sizeof(uint16_t))) return HOST_ERR_INVALID_ARG;
853 return host_qr_measure(data, static_cast<uint8_t>(max_version),
854 static_cast<uint8_t>(ecc), out_modules);
855}
856static int32_t w_host_qr_render_bitmap(wasm_exec_env_t exec_env, const char* data,
857 uint32_t max_version, uint32_t ecc,
858 uint32_t scale, uint32_t quiet,
859 uint8_t* out, uint32_t out_size,
860 uint16_t* stride_out, uint16_t* height_out)
861{
862 if (!wbuf_ok(exec_env, stride_out, sizeof(uint16_t)) ||
863 !wbuf_ok(exec_env, height_out, sizeof(uint16_t))) {
865 }
866 return host_qr_render_bitmap(data, static_cast<uint8_t>(max_version),
867 static_cast<uint8_t>(ecc), static_cast<uint8_t>(scale),
868 static_cast<uint8_t>(quiet), out, out_size,
869 stride_out, height_out);
870}
871
872// -- Image decoding --
873static int32_t w_host_image_info(wasm_exec_env_t exec_env, const uint8_t* data, uint32_t len,
874 uint16_t* out_w, uint16_t* out_h)
875{
876 if (!wbuf_ok(exec_env, out_w, sizeof(uint16_t)) ||
877 !wbuf_ok(exec_env, out_h, sizeof(uint16_t))) {
879 }
880 return host_image_info(data, len, out_w, out_h);
881}
882static int32_t w_host_image_render(wasm_exec_env_t exec_env, const uint8_t* data, uint32_t len,
883 uint32_t target_w, uint8_t* out, uint32_t out_size,
884 uint16_t* stride_out, uint16_t* height_out)
885{
886 if (!wbuf_ok(exec_env, stride_out, sizeof(uint16_t)) ||
887 !wbuf_ok(exec_env, height_out, sizeof(uint16_t))) {
889 }
890 return host_image_render(data, len, static_cast<uint16_t>(target_w),
891 out, out_size, stride_out, height_out);
892}
893
894// -- Offscreen surfaces --
895static int32_t w_host_surface_create(wasm_exec_env_t, uint32_t w, uint32_t h)
896{ return host_surface_create(static_cast<uint16_t>(w), static_cast<uint16_t>(h)); }
897static int32_t w_host_surface_destroy(wasm_exec_env_t, uint32_t s)
898{ return host_surface_destroy(s); }
899static int32_t w_host_surface_clear(wasm_exec_env_t, uint32_t s)
900{ return host_surface_clear(s); }
901static int32_t w_host_surface_set_font(wasm_exec_env_t, uint32_t s, uint32_t font_id)
902{ return host_surface_set_font(s, static_cast<uint8_t>(font_id)); }
903static int32_t w_host_surface_set_text_size(wasm_exec_env_t, uint32_t s, uint32_t size)
904{ return host_surface_set_text_size(s, static_cast<uint8_t>(size)); }
905static int32_t w_host_surface_set_text_color(wasm_exec_env_t, uint32_t s, uint32_t inverted)
906{ return host_surface_set_text_color(s, static_cast<uint8_t>(inverted)); }
907static int32_t w_host_surface_set_shade(wasm_exec_env_t, uint32_t s, uint32_t shade)
908{ return host_surface_set_shade(s, static_cast<uint8_t>(shade)); }
909static int32_t w_host_surface_draw_text(wasm_exec_env_t, uint32_t s, int32_t x, int32_t y,
910 const char* text)
911{ return host_surface_draw_text(s, static_cast<int16_t>(x), static_cast<int16_t>(y), text); }
912static int32_t w_host_surface_draw_text_aligned(wasm_exec_env_t, uint32_t s, int32_t x,
913 int32_t y, int32_t w, const char* text,
914 uint32_t align)
915{ return host_surface_draw_text_aligned(s, static_cast<int16_t>(x), static_cast<int16_t>(y),
916 static_cast<int16_t>(w), text,
917 static_cast<uint8_t>(align)); }
918static int32_t w_host_surface_measure_text(wasm_exec_env_t exec_env, uint32_t s,
919 const char* text, uint16_t* out_w, uint16_t* out_h)
920{
921 if (!wbuf_ok(exec_env, out_w, sizeof(uint16_t)) ||
922 !wbuf_ok(exec_env, out_h, sizeof(uint16_t))) {
924 }
925 return host_surface_measure_text(s, text, out_w, out_h);
926}
927static int32_t w_host_surface_draw_pixel(wasm_exec_env_t, uint32_t s, int32_t x, int32_t y)
928{ return host_surface_draw_pixel(s, static_cast<int16_t>(x), static_cast<int16_t>(y)); }
929static int32_t w_host_surface_draw_line(wasm_exec_env_t, uint32_t s, int32_t x0, int32_t y0,
930 int32_t x1, int32_t y1)
931{ return host_surface_draw_line(s, static_cast<int16_t>(x0), static_cast<int16_t>(y0),
932 static_cast<int16_t>(x1), static_cast<int16_t>(y1)); }
933static int32_t w_host_surface_draw_rect(wasm_exec_env_t, uint32_t s, int32_t x, int32_t y,
934 int32_t w, int32_t h, uint32_t filled)
935{ return host_surface_draw_rect(s, static_cast<int16_t>(x), static_cast<int16_t>(y),
936 static_cast<int16_t>(w), static_cast<int16_t>(h),
937 static_cast<uint8_t>(filled)); }
938static int32_t w_host_surface_draw_circle(wasm_exec_env_t, uint32_t s, int32_t x, int32_t y,
939 int32_t r, uint32_t filled)
940{ return host_surface_draw_circle(s, static_cast<int16_t>(x), static_cast<int16_t>(y),
941 static_cast<int16_t>(r), static_cast<uint8_t>(filled)); }
942static int32_t w_host_surface_draw_triangle(wasm_exec_env_t, uint32_t s, int32_t x0, int32_t y0,
943 int32_t x1, int32_t y1, int32_t x2, int32_t y2,
944 uint32_t filled)
945{ return host_surface_draw_triangle(s, static_cast<int16_t>(x0), static_cast<int16_t>(y0),
946 static_cast<int16_t>(x1), static_cast<int16_t>(y1),
947 static_cast<int16_t>(x2), static_cast<int16_t>(y2),
948 static_cast<uint8_t>(filled)); }
949static int32_t w_host_surface_draw_round_rect(wasm_exec_env_t, uint32_t s, int32_t x, int32_t y,
950 int32_t w, int32_t h, int32_t r, uint32_t filled)
951{ return host_surface_draw_round_rect(s, static_cast<int16_t>(x), static_cast<int16_t>(y),
952 static_cast<int16_t>(w), static_cast<int16_t>(h),
953 static_cast<int16_t>(r), static_cast<uint8_t>(filled)); }
954static int32_t w_host_surface_hline(wasm_exec_env_t, uint32_t s, int32_t x, int32_t y, int32_t w)
955{ return host_surface_hline(s, static_cast<int16_t>(x), static_cast<int16_t>(y),
956 static_cast<int16_t>(w)); }
957static int32_t w_host_surface_vline(wasm_exec_env_t, uint32_t s, int32_t x, int32_t y, int32_t h)
958{ return host_surface_vline(s, static_cast<int16_t>(x), static_cast<int16_t>(y),
959 static_cast<int16_t>(h)); }
960static int32_t w_host_surface_draw_bitmap(wasm_exec_env_t, uint32_t s, int32_t x, int32_t y,
961 int32_t w, int32_t h, const uint8_t* data, uint32_t len)
962{ return host_surface_draw_bitmap(s, static_cast<int16_t>(x), static_cast<int16_t>(y),
963 static_cast<int16_t>(w), static_cast<int16_t>(h), data, len); }
964static int32_t w_host_surface_export(wasm_exec_env_t exec_env, uint32_t s, uint8_t* out,
965 uint32_t out_size, uint16_t* stride_out)
966{
967 if (!wbuf_ok(exec_env, stride_out, sizeof(uint16_t))) return HOST_ERR_INVALID_ARG;
968 return host_surface_export(s, out, out_size, stride_out);
969}
970static int32_t w_host_surface_export_jpg(wasm_exec_env_t exec_env, uint32_t s, uint32_t quality,
971 uint8_t* out, uint32_t out_size, uint32_t* len_out)
972{
973 if (!wbuf_ok(exec_env, len_out, sizeof(uint32_t))) return HOST_ERR_INVALID_ARG;
974 return host_surface_export_jpg(s, static_cast<uint8_t>(quality), out, out_size, len_out);
975}
976static int32_t w_host_surface_draw_sprite(wasm_exec_env_t, uint32_t s, int32_t x, int32_t y,
977 uint32_t sprite)
978{ return host_surface_draw_sprite(s, static_cast<int16_t>(x), static_cast<int16_t>(y), sprite); }
979
980// -- External features (inter-plugin) --
981static int32_t w_host_ext_feature_available(wasm_exec_env_t, const char* feature)
982{ return host_ext_feature_available(feature); }
983static int32_t w_host_ext_feature_use(wasm_exec_env_t, const char* feature,
984 const uint8_t* data, uint32_t len, uint32_t status_aid)
985{ return host_ext_feature_use(feature, data, len, status_aid); }
986static int32_t w_host_ext_feature_register_handler(wasm_exec_env_t, const char* feature,
987 uint32_t aid)
988{ return host_ext_feature_register_handler(feature, aid); }
989static int32_t w_host_ext_feature_consume(wasm_exec_env_t, uint8_t* buf, uint32_t buf_size,
990 char* feature_out, uint32_t feature_size)
991{ return host_ext_feature_consume(buf, buf_size, feature_out, feature_size); }
992static int32_t w_host_ext_feature_result(wasm_exec_env_t, int32_t status_code)
993{ return host_ext_feature_result(status_code); }
994
995static int32_t w_host_ui_acquire_exclusive(wasm_exec_env_t) { return host_ui_acquire_exclusive(); }
996static int32_t w_host_ui_release_exclusive(wasm_exec_env_t) { return host_ui_release_exclusive(); }
997static int32_t w_host_ui_set_inactivity(wasm_exec_env_t, uint32_t timeout_ms, uint32_t action_id)
998{ return host_ui_set_inactivity(timeout_ms, action_id); }
999
1000// -- Pixel strip ------------------------------------------------------------
1001
1002static int32_t w_host_pixel_strip_init(wasm_exec_env_t, uint32_t gpio, uint32_t num, uint32_t format)
1003{ return host_pixel_strip_init(static_cast<uint8_t>(gpio),
1004 static_cast<uint16_t>(num),
1005 static_cast<uint8_t>(format)); }
1006static int32_t w_host_pixel_strip_deinit(wasm_exec_env_t) { return host_pixel_strip_deinit(); }
1007static int32_t w_host_pixel_strip_set(wasm_exec_env_t, uint32_t idx,
1008 uint32_t r, uint32_t g, uint32_t b)
1009{ return host_pixel_strip_set(static_cast<uint16_t>(idx),
1010 static_cast<uint8_t>(r),
1011 static_cast<uint8_t>(g),
1012 static_cast<uint8_t>(b)); }
1013static int32_t w_host_pixel_strip_fill(wasm_exec_env_t, uint32_t r, uint32_t g, uint32_t b)
1014{ return host_pixel_strip_fill(static_cast<uint8_t>(r),
1015 static_cast<uint8_t>(g),
1016 static_cast<uint8_t>(b)); }
1017static int32_t w_host_pixel_strip_clear (wasm_exec_env_t) { return host_pixel_strip_clear(); }
1018static int32_t w_host_pixel_strip_refresh(wasm_exec_env_t) { return host_pixel_strip_refresh(); }
1019static uint32_t w_host_pixel_strip_length(wasm_exec_env_t) { return host_pixel_strip_length(); }
1020static int32_t w_host_pixel_strip_ready (wasm_exec_env_t) { return host_pixel_strip_ready() ? 1 : 0; }
1021
1022// -- Lockscreen quick-action -----------------------------------------------
1023
1024static int32_t w_host_lockscreen_register_action(wasm_exec_env_t,
1025 const char* label_key,
1026 uint32_t action_id)
1027{ return host_lockscreen_register_action(label_key, action_id); }
1028
1029static int32_t w_host_lockscreen_unregister_action(wasm_exec_env_t)
1031
1032static int32_t w_host_lockscreen_alert(wasm_exec_env_t, const char* text,
1033 uint32_t icon, uint32_t action_id)
1034{ return host_lockscreen_alert(text, static_cast<uint8_t>(icon), action_id); }
1035
1036// -- Additional crypto ------------------------------------------------------
1037
1038static int32_t w_host_random_strict(wasm_exec_env_t, uint8_t* buf, uint32_t len)
1039{ return host_random_strict(buf, len); }
1040static int32_t w_host_base64_encode(wasm_exec_env_t, const uint8_t* in, uint32_t in_len, char* out, uint32_t out_size)
1041{ return host_base64_encode(in, in_len, out, out_size); }
1042static int32_t w_host_base64_decode(wasm_exec_env_t, const char* in, uint32_t in_len, uint8_t* out, uint32_t out_size)
1043{ return host_base64_decode(in, in_len, out, out_size); }
1044static int32_t w_host_hex_decode(wasm_exec_env_t, const char* in, uint32_t in_len, uint8_t* out, uint32_t out_size)
1045{ return host_hex_decode(in, in_len, out, out_size); }
1046static int32_t w_host_aes_gcm_encrypt(wasm_exec_env_t exec_env, const uint8_t* key, const uint8_t* iv,
1047 const uint8_t* aad, uint32_t aad_len,
1048 const uint8_t* pt, uint32_t pt_len, uint8_t* ct, uint8_t* tag)
1049{
1050 if (!wbuf_ok(exec_env, key, 32) || !wbuf_ok(exec_env, iv, 12) ||
1051 !wbuf_ok(exec_env, ct, pt_len) || !wbuf_ok(exec_env, tag, 16))
1052 return HOST_ERR_INVALID_ARG;
1053 return host_aes_gcm_encrypt(key, iv, aad, aad_len, pt, pt_len, ct, tag);
1054}
1055static int32_t w_host_aes_gcm_decrypt(wasm_exec_env_t exec_env, const uint8_t* key, const uint8_t* iv,
1056 const uint8_t* aad, uint32_t aad_len,
1057 const uint8_t* ct, uint32_t ct_len, const uint8_t* tag, uint8_t* pt)
1058{
1059 if (!wbuf_ok(exec_env, key, 32) || !wbuf_ok(exec_env, iv, 12) ||
1060 !wbuf_ok(exec_env, tag, 16) || !wbuf_ok(exec_env, pt, ct_len))
1061 return HOST_ERR_INVALID_ARG;
1062 return host_aes_gcm_decrypt(key, iv, aad, aad_len, ct, ct_len, tag, pt);
1063}
1064
1065// -- Additional time / logging / nvs / sysinfo ------------------------------
1066
1067static int32_t w_host_local_time(wasm_exec_env_t exec_env, void* out)
1068{
1069 if (!wbuf_ok(exec_env, out, sizeof(struct host_tm))) return HOST_ERR_INVALID_ARG;
1070 return host_local_time(reinterpret_cast<struct host_tm*>(out));
1071}
1072
1073static void w_host_log_hex(wasm_exec_env_t, const char* tag, const char* label,
1074 const uint8_t* data, uint32_t len)
1075{ host_log_hex(tag, label, data, len); }
1076
1077static int32_t w_host_nvs_erase_all(wasm_exec_env_t) { return host_nvs_erase_all(); }
1078static int32_t w_host_nvs_list_keys(wasm_exec_env_t exec_env, char* out, uint32_t* out_len)
1079{
1080 if (!wbuf_ok(exec_env, out_len, sizeof(uint32_t))) return HOST_ERR_INVALID_ARG;
1081 size_t len = *out_len;
1082 if (!wbuf_ok(exec_env, out, len)) return HOST_ERR_INVALID_ARG;
1083 int rc = host_nvs_list_keys(out, &len);
1084 *out_len = static_cast<uint32_t>(len);
1085 return rc;
1086}
1087
1088// -- Additional wifi --------------------------------------------------------
1089
1090static int32_t w_host_wifi_mac(wasm_exec_env_t exec_env, uint8_t* out)
1091{ return wbuf_ok(exec_env, out, 6) ? host_wifi_mac(out) : HOST_ERR_INVALID_ARG; }
1092static int32_t w_host_wifi_rssi(wasm_exec_env_t) { return host_wifi_rssi(); }
1093static int32_t w_host_wifi_start_scan(wasm_exec_env_t) { return host_wifi_start_scan(); }
1094static int32_t w_host_wifi_scan_done(wasm_exec_env_t) { return host_wifi_scan_done() ? 1 : 0; }
1095static int32_t w_host_wifi_scan_results(wasm_exec_env_t exec_env, void* out, uint32_t* count)
1096{
1097 if (!wbuf_ok(exec_env, count, sizeof(uint32_t))) return HOST_ERR_INVALID_ARG;
1098 size_t c = *count;
1099 size_t cap = c > 32 ? 32 : c; // host clamps to IWifiController::MAX_SCAN_RESULTS (32)
1100 if (!wbuf_ok(exec_env, out, cap * sizeof(wifi_scan_result_t))) return HOST_ERR_INVALID_ARG;
1101 int rc = host_wifi_scan_results(reinterpret_cast<wifi_scan_result_t*>(out), &c);
1102 *count = static_cast<uint32_t>(c);
1103 return rc;
1104}
1105
1106// -- Additional gpio / adc / i2c / sao --------------------------------------
1107
1108static int32_t w_host_gpio_pwm_set_duty(wasm_exec_env_t, uint32_t pin, uint32_t duty)
1109{ return host_gpio_pwm_set_duty(static_cast<uint8_t>(pin), static_cast<uint16_t>(duty)); }
1110static int32_t w_host_adc_read(wasm_exec_env_t exec_env, uint32_t pin, uint16_t* raw, uint16_t* mv)
1111{
1112 if (!wbuf_ok(exec_env, raw, sizeof(uint16_t)) || !wbuf_ok(exec_env, mv, sizeof(uint16_t)))
1113 return HOST_ERR_INVALID_ARG;
1114 return host_adc_read(static_cast<uint8_t>(pin), raw, mv);
1115}
1116
1117static int32_t w_host_i2c_write(wasm_exec_env_t, uint32_t bus, uint32_t addr, const uint8_t* data, uint32_t len)
1118{ return host_i2c_write(static_cast<uint8_t>(bus), static_cast<uint8_t>(addr), data, len); }
1119static int32_t w_host_i2c_read(wasm_exec_env_t, uint32_t bus, uint32_t addr, uint8_t* data, uint32_t len)
1120{ return host_i2c_read(static_cast<uint8_t>(bus), static_cast<uint8_t>(addr), data, len); }
1121static int32_t w_host_i2c_write_read(wasm_exec_env_t, uint32_t bus, uint32_t addr,
1122 const uint8_t* wr, uint32_t wr_len, uint8_t* rd, uint32_t rd_len)
1123{ return host_i2c_write_read(static_cast<uint8_t>(bus), static_cast<uint8_t>(addr), wr, wr_len, rd, rd_len); }
1124static int32_t w_host_i2c_scan(wasm_exec_env_t exec_env, uint32_t bus, uint8_t* found, uint32_t* count)
1125{
1126 if (!wbuf_ok(exec_env, count, sizeof(uint32_t))) return HOST_ERR_INVALID_ARG;
1127 size_t c = *count;
1128 size_t cap = c > 112 ? 112 : c; // host probes I2C addresses 0x08..0x77 (<=112)
1129 if (!wbuf_ok(exec_env, found, cap)) return HOST_ERR_INVALID_ARG;
1130 int rc = host_i2c_scan(static_cast<uint8_t>(bus), found, &c);
1131 *count = static_cast<uint32_t>(c);
1132 return rc;
1133}
1134static int32_t w_host_sao_eeprom_read(wasm_exec_env_t, uint32_t off, uint8_t* buf, uint32_t len)
1135{ return host_sao_eeprom_read(static_cast<uint16_t>(off), buf, len); }
1136static int32_t w_host_sao_eeprom_write(wasm_exec_env_t, uint32_t off, const uint8_t* buf, uint32_t len)
1137{ return host_sao_eeprom_write(static_cast<uint16_t>(off), buf, len); }
1138
1139// -- Additional http / event / secure element ------------------------------
1140
1141static uint32_t w_host_http_content_length(wasm_exec_env_t, int32_t h)
1142{ return static_cast<uint32_t>(host_http_content_length(h)); }
1143
1144static int32_t w_host_event_publish(wasm_exec_env_t, uint32_t subtype, uint32_t value)
1145{ return host_event_publish(subtype, value); }
1146
1147static int32_t w_host_se_chip_id(wasm_exec_env_t exec_env, uint8_t* serial, uint32_t* len)
1148{
1149 if (!wbuf_ok(exec_env, len, sizeof(uint32_t))) return HOST_ERR_INVALID_ARG;
1150 size_t l = *len;
1151 size_t cap = l > 16 ? 16 : l; // getChipId writes at most sizeof(ser_num) = 16 bytes
1152 if (!wbuf_ok(exec_env, serial, cap)) return HOST_ERR_INVALID_ARG;
1153 int rc = host_se_chip_id(serial, &l);
1154 *len = static_cast<uint32_t>(l);
1155 return rc;
1156}
1157static int32_t w_host_se_fw_version(wasm_exec_env_t exec_env, uint8_t* riscv, uint8_t* spect)
1158{
1159 if (!wbuf_ok(exec_env, riscv, 4) || !wbuf_ok(exec_env, spect, 4)) return HOST_ERR_INVALID_ARG;
1160 return host_se_fw_version(riscv, spect);
1161}
1162
1163// -- Display (low-level GFX) ------------------------------------------------
1164
1165static uint32_t w_host_display_width(wasm_exec_env_t) { return host_display_width(); }
1166static uint32_t w_host_display_height(wasm_exec_env_t) { return host_display_height(); }
1167static int32_t w_host_display_clear(wasm_exec_env_t) { return host_display_clear(); }
1168static int32_t w_host_display_draw_pixel(wasm_exec_env_t, int32_t x, int32_t y, uint32_t color)
1169{ return host_display_draw_pixel(static_cast<int16_t>(x), static_cast<int16_t>(y), static_cast<uint16_t>(color)); }
1170static int32_t w_host_display_draw_line(wasm_exec_env_t, int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t color)
1171{ return host_display_draw_line(static_cast<int16_t>(x0), static_cast<int16_t>(y0),
1172 static_cast<int16_t>(x1), static_cast<int16_t>(y1), static_cast<uint16_t>(color)); }
1173static int32_t w_host_display_draw_rect(wasm_exec_env_t, int32_t x, int32_t y, int32_t w, int32_t h, uint32_t color)
1174{ return host_display_draw_rect(static_cast<int16_t>(x), static_cast<int16_t>(y),
1175 static_cast<int16_t>(w), static_cast<int16_t>(h), static_cast<uint16_t>(color)); }
1176static int32_t w_host_display_fill_rect(wasm_exec_env_t, int32_t x, int32_t y, int32_t w, int32_t h, uint32_t color)
1177{ return host_display_fill_rect(static_cast<int16_t>(x), static_cast<int16_t>(y),
1178 static_cast<int16_t>(w), static_cast<int16_t>(h), static_cast<uint16_t>(color)); }
1179static int32_t w_host_display_draw_text(wasm_exec_env_t, int32_t x, int32_t y, const char* text, uint32_t size, uint32_t color)
1180{ return host_display_draw_text(static_cast<int16_t>(x), static_cast<int16_t>(y), text,
1181 static_cast<uint8_t>(size), static_cast<uint16_t>(color)); }
1182static int32_t w_host_display_flush(wasm_exec_env_t, uint32_t mode) { return host_display_flush(static_cast<uint8_t>(mode)); }
1183static int32_t w_host_display_is_busy(wasm_exec_env_t) { return host_display_is_busy() ? 1 : 0; }
1184static int32_t w_host_display_set_backlight(wasm_exec_env_t, uint32_t level)
1185{ return host_display_set_backlight(static_cast<uint16_t>(level)); }
1186static uint32_t w_host_display_get_backlight(wasm_exec_env_t) { return host_display_get_backlight(); }
1187
1188// -- Keypad / USB -----------------------------------------------------------
1189
1190static int32_t w_host_key_pressed(wasm_exec_env_t, uint32_t key) { return host_key_pressed(static_cast<uint8_t>(key)) ? 1 : 0; }
1191static int32_t w_host_key_consume_next(wasm_exec_env_t, uint8_t* out) { return host_key_consume_next(out); }
1192static int32_t w_host_usb_cdc_write(wasm_exec_env_t, const uint8_t* data, uint32_t len) { return host_usb_cdc_write(data, len); }
1193
1194// -- BLE --------------------------------------------------------------------
1195
1196static int32_t w_host_ble_is_enabled(wasm_exec_env_t) { return host_ble_is_enabled() ? 1 : 0; }
1197static int32_t w_host_ble_mac(wasm_exec_env_t exec_env, uint8_t* out)
1198{ return wbuf_ok(exec_env, out, 6) ? host_ble_mac(out) : HOST_ERR_INVALID_ARG; }
1199static int32_t w_host_ble_device_name(wasm_exec_env_t, char* out, uint32_t size) { return host_ble_device_name(out, size); }
1200static int32_t w_host_ble_rssi(wasm_exec_env_t) { return host_ble_rssi(); }
1201
1202static int32_t w_host_ble_register_service(wasm_exec_env_t exec_env, void* def, void* chars, uint32_t num)
1203{
1204 size_t nchars = num > 6 ? 6 : num; // host rejects num > MAX_PLUGIN_CHARS (6)
1205 if (!wbuf_ok(exec_env, def, sizeof(ble_service_def_t)) ||
1206 !wbuf_ok(exec_env, chars, nchars * sizeof(ble_char_def_t)))
1207 return HOST_ERR_INVALID_ARG;
1208 return host_ble_register_service(reinterpret_cast<ble_service_def_t*>(def),
1209 reinterpret_cast<ble_char_def_t*>(chars), num);
1210}
1211static int32_t w_host_ble_unregister_service(wasm_exec_env_t, uint32_t h) { return host_ble_unregister_service(h); }
1212static int32_t w_host_ble_send_notification(wasm_exec_env_t, uint32_t ch, const uint8_t* data, uint32_t len)
1213{ return host_ble_send_notification(ch, data, len); }
1214static int32_t w_host_ble_send_indication(wasm_exec_env_t, uint32_t ch, const uint8_t* data, uint32_t len)
1215{ return host_ble_send_indication(ch, data, len); }
1216static int32_t w_host_ble_consume_write(wasm_exec_env_t, uint32_t ch, uint8_t* buf, uint32_t size)
1217{ return host_ble_consume_write(ch, buf, size); }
1218
1219static int32_t w_host_ble_scan_start(wasm_exec_env_t, uint32_t dur) { return host_ble_scan_start(dur); }
1220static int32_t w_host_ble_scan_done(wasm_exec_env_t) { return host_ble_scan_done() ? 1 : 0; }
1221static int32_t w_host_ble_scan_results(wasm_exec_env_t exec_env, void* out, uint32_t* count)
1222{
1223 if (!wbuf_ok(exec_env, count, sizeof(uint32_t))) return HOST_ERR_INVALID_ARG;
1224 size_t c = *count;
1225 size_t cap = c > 32 ? 32 : c; // host clamps to 32 scan results
1226 if (!wbuf_ok(exec_env, out, cap * sizeof(ble_scan_result_t))) return HOST_ERR_INVALID_ARG;
1227 int rc = host_ble_scan_results(reinterpret_cast<ble_scan_result_t*>(out), &c);
1228 *count = static_cast<uint32_t>(c);
1229 return rc;
1230}
1231static int32_t w_host_ble_connect(wasm_exec_env_t, const uint8_t* addr, uint32_t type)
1232{ return host_ble_connect(addr, static_cast<uint8_t>(type)); }
1233static uint32_t w_host_ble_conn_handle(wasm_exec_env_t) { return host_ble_conn_handle(); }
1234static int32_t w_host_ble_disconnect(wasm_exec_env_t, uint32_t conn) { return host_ble_disconnect(conn); }
1235static int32_t w_host_ble_discover(wasm_exec_env_t, uint32_t conn, const uint8_t* uuid, uint32_t aid)
1236{ return host_ble_discover(conn, uuid, aid); }
1237static int32_t w_host_ble_consume_discovery(wasm_exec_env_t exec_env, void* out, uint32_t* count)
1238{
1239 if (!wbuf_ok(exec_env, count, sizeof(uint32_t))) return HOST_ERR_INVALID_ARG;
1240 size_t c = *count;
1241 size_t cap = c > 8 ? 8 : c; // host clamps to MAX_DISC_CHARS (8)
1242 if (!wbuf_ok(exec_env, out, cap * sizeof(ble_remote_char_t))) return HOST_ERR_INVALID_ARG;
1243 int rc = host_ble_consume_discovery(reinterpret_cast<ble_remote_char_t*>(out), &c);
1244 *count = static_cast<uint32_t>(c);
1245 return rc;
1246}
1247static int32_t w_host_ble_read_char(wasm_exec_env_t, uint32_t conn, uint32_t vh, uint32_t aid)
1248{ return host_ble_read_char(conn, static_cast<uint16_t>(vh), aid); }
1249static int32_t w_host_ble_consume_read(wasm_exec_env_t, uint8_t* buf, uint32_t size)
1250{ return host_ble_consume_read(buf, size); }
1251static int32_t w_host_ble_write_char(wasm_exec_env_t, uint32_t conn, uint32_t vh,
1252 const uint8_t* data, uint32_t len, uint32_t wr)
1253{ return host_ble_write_char(conn, static_cast<uint16_t>(vh), data, len, static_cast<uint8_t>(wr)); }
1254static int32_t w_host_ble_subscribe(wasm_exec_env_t, uint32_t conn, uint32_t cccd, uint32_t aid)
1255{ return host_ble_subscribe(conn, static_cast<uint16_t>(cccd), aid); }
1256static int32_t w_host_ble_subscribe_char(wasm_exec_env_t, uint32_t conn, uint32_t vh, uint32_t aid)
1257{ return host_ble_subscribe_char(conn, static_cast<uint16_t>(vh), aid); }
1258static int32_t w_host_ble_consume_notification(wasm_exec_env_t exec_env, uint16_t* vh_out, uint8_t* buf, uint32_t size)
1259{
1260 if (!wbuf_ok(exec_env, vh_out, sizeof(uint16_t))) return HOST_ERR_INVALID_ARG;
1261 return host_ble_consume_notification(vh_out, buf, size);
1262}
1263static uint32_t w_host_ble_get_mtu(wasm_exec_env_t, uint32_t conn)
1264{ return host_ble_get_mtu(conn); }
1265static int32_t w_host_ble_on_write_complete(wasm_exec_env_t, uint32_t aid)
1266{ return host_ble_on_write_complete(aid); }
1267
1268// -- Symbol table -----------------------------------------------------------
1269
1270static const NativeSymbol s_symbols[] = {
1271 W("host_log", w_host_log, "(i$$)"),
1272 W("host_uptime_ms", w_host_uptime_ms, "()I"),
1273 W("host_unix_time", w_host_unix_time, "()I"),
1274 W("host_is_time_set", w_host_is_time_set, "()i"),
1275 W("host_timezone_offset", w_host_timezone_offset, "()i"),
1276
1277 W("host_battery_mv", w_host_battery_mv, "()i"),
1278 W("host_battery_pct", w_host_battery_pct, "()i"),
1279 W("host_is_usb_connected", w_host_is_usb_connected, "()i"),
1280 W("host_power_source", w_host_power_source, "()i"),
1281 W("host_charge_status", w_host_charge_status, "()i"),
1282 W("host_is_battery_low", w_host_is_battery_low, "()i"),
1283 W("host_is_battery_critical",w_host_is_battery_critical,"()i"),
1284 W("host_set_sleep_inhibit", w_host_set_sleep_inhibit, "(i)"),
1285
1286 W("host_ui_push_toast", w_host_ui_push_toast, "($ii)i"),
1287 W("host_ui_push_message", w_host_ui_push_message, "($ii)i"),
1288 W("host_ui_push_info", w_host_ui_push_info, "($$)i"),
1289 W("host_ui_push_confirm", w_host_ui_push_confirm, "($ii)i"),
1290 W("host_browser_open", w_host_browser_open, "($)i"),
1291 W("host_ui_push_list", w_host_ui_push_list, "($*~ii)i"),
1292 W("host_ui_replace_list", w_host_ui_replace_list, "($*~ii)i"),
1293 W("host_ui_set_view_footer", w_host_ui_set_view_footer, "($)i"),
1294 W("host_ui_update_list_item", w_host_ui_update_list_item, "(i*)i"),
1295 W("host_ui_insert_list_item", w_host_ui_insert_list_item, "(i*)i"),
1296 W("host_ui_remove_list_item", w_host_ui_remove_list_item, "(i)i"),
1297 W("host_ui_set_view_empty", w_host_ui_set_view_empty, "($)i"),
1298 W("host_ui_set_view_lifecycle", w_host_ui_set_view_lifecycle, "(ii)i"),
1299 W("host_ui_push_context_menu", w_host_ui_push_context_menu, "($*~i)i"),
1300 W("host_ui_push_t9_input", w_host_ui_push_t9_input, "($$ii)i"),
1301 W("host_ui_push_password", w_host_ui_push_password, "($$ii)i"),
1302 W("host_ui_push_pin_entry", w_host_ui_push_pin_entry, "($iii)i"),
1303 W("host_ui_push_slider", w_host_ui_push_slider, "($iiii$i)i"),
1304 W("host_ui_push_color_picker", w_host_ui_push_color_picker, "(iiii)i"),
1305 W("host_ui_consume_input_text", w_host_ui_consume_input_text, "(*~)i"),
1306 W("host_ui_consume_input_int", w_host_ui_consume_input_int, "(*)i"),
1307 W("host_ui_pop", w_host_ui_pop, "()i"),
1308 W("host_ui_pop_to_plugin", w_host_ui_pop_to_plugin, "()i"),
1309 W("host_ui_repaint", w_host_ui_repaint, "()i"),
1310 W("host_ui_wink", w_host_ui_wink, "(ii)i"),
1311
1312 W("host_view_canvas_push", w_host_view_canvas_push, "($ii)i"),
1313 W("host_view_canvas_get_body_size", w_host_view_canvas_get_body_size, "(**)i"),
1314 W("host_view_canvas_set_footer", w_host_view_canvas_set_footer, "($)i"),
1315 W("host_view_canvas_clear", w_host_view_canvas_clear, "()i"),
1316 W("host_view_canvas_clear_ex", w_host_view_canvas_clear_ex, "(i)i"),
1317 W("host_view_canvas_set_text_size", w_host_view_canvas_set_text_size, "(i)i"),
1318 W("host_view_canvas_set_text_color",w_host_view_canvas_set_text_color,"(i)i"),
1319 W("host_view_canvas_set_shade", w_host_view_canvas_set_shade, "(i)i"),
1320 W("host_view_canvas_set_font", w_host_view_canvas_set_font, "(i)i"),
1321 W("host_text_pick_font_that_fits", w_host_text_pick_font_that_fits, "($i*~*)i"),
1322 W("host_view_canvas_draw_text", w_host_view_canvas_draw_text, "(ii$)i"),
1323 W("host_view_canvas_draw_text_aligned", w_host_view_canvas_draw_text_aligned, "(iii$i)i"),
1324 W("host_view_canvas_draw_rect", w_host_view_canvas_draw_rect, "(iiiii)i"),
1325 W("host_view_canvas_draw_pixel", w_host_view_canvas_draw_pixel, "(ii)i"),
1326 W("host_view_canvas_draw_line", w_host_view_canvas_draw_line, "(iiii)i"),
1327 W("host_view_canvas_draw_circle", w_host_view_canvas_draw_circle, "(iiii)i"),
1328 W("host_view_canvas_draw_triangle", w_host_view_canvas_draw_triangle, "(iiiiiii)i"),
1329 W("host_view_canvas_draw_round_rect",w_host_view_canvas_draw_round_rect,"(iiiiii)i"),
1330 W("host_view_canvas_draw_bitmap", w_host_view_canvas_draw_bitmap, "(iiii*~)i"),
1331 W("host_view_canvas_hline", w_host_view_canvas_hline, "(iii)i"),
1332 W("host_view_canvas_vline", w_host_view_canvas_vline, "(iii)i"),
1333 W("host_view_canvas_commit", w_host_view_canvas_commit, "(i)i"),
1334 W("host_view_canvas_elem_begin", w_host_view_canvas_elem_begin, "(i)i"),
1335 W("host_view_canvas_elem_end", w_host_view_canvas_elem_end, "()i"),
1336 W("host_view_canvas_elem_set_offset", w_host_view_canvas_elem_set_offset, "(iii)i"),
1337 W("host_view_canvas_elem_move", w_host_view_canvas_elem_move, "(iii)i"),
1338 W("host_view_canvas_elem_show", w_host_view_canvas_elem_show, "(ii)i"),
1339 W("host_view_canvas_elem_remove", w_host_view_canvas_elem_remove, "(i)i"),
1340 W("host_view_canvas_elem_clear", w_host_view_canvas_elem_clear, "(i)i"),
1341 W("host_view_canvas_elem_set_z", w_host_view_canvas_elem_set_z, "(ii)i"),
1342 W("host_view_canvas_elem_get_offset", w_host_view_canvas_elem_get_offset, "(i**)i"),
1343 W("host_view_canvas_elem_get_bounds", w_host_view_canvas_elem_get_bounds, "(i****)i"),
1344 W("host_view_canvas_set_anim_policy", w_host_view_canvas_set_anim_policy, "(ii)i"),
1345 W("host_view_canvas_draw_sprite", w_host_view_canvas_draw_sprite, "(iii)i"),
1346 W("host_sprite_create", w_host_sprite_create, "(iii*~)i"),
1347 W("host_sprite_create_from_surface",w_host_sprite_create_from_surface,"(iiii)i"),
1348 W("host_sprite_create_from_image", w_host_sprite_create_from_image, "(*~ii)i"),
1349 W("host_sprite_set_mask", w_host_sprite_set_mask, "(i*~)i"),
1350 W("host_sprite_set_flags", w_host_sprite_set_flags, "(ii)i"),
1351 W("host_sprite_set_scale", w_host_sprite_set_scale, "(ii)i"),
1352 W("host_view_canvas_set_ink", w_host_view_canvas_set_ink, "(i)i"),
1353 W("host_view_canvas_marquee", w_host_view_canvas_marquee, "(iii$ii)i"),
1354 W("host_sprite_set_frame", w_host_sprite_set_frame, "(ii)i"),
1355 W("host_sprite_get_frame", w_host_sprite_get_frame, "(i*)i"),
1356 W("host_sprite_set_frame_durations",w_host_sprite_set_frame_durations,"(i*i)i"),
1357 W("host_sprite_play", w_host_sprite_play, "(iiiii)i"),
1358 W("host_sprite_stop", w_host_sprite_stop, "(i)i"),
1359 W("host_sprite_destroy", w_host_sprite_destroy, "(i)i"),
1360 W("host_anim_start", w_host_anim_start, "(*)i"),
1361 W("host_anim_cancel", w_host_anim_cancel, "(i)i"),
1362 W("host_anim_pause", w_host_anim_pause, "(ii)i"),
1363 W("host_anim_state", w_host_anim_state, "(i)i"),
1364 W("host_anim_active_count", w_host_anim_active_count, "()i"),
1365 W("host_anim_blink", w_host_anim_blink, "(iiii)i"),
1366 W("host_view_canvas_add_slider", w_host_view_canvas_add_slider, "(iiiii)i"),
1367 W("host_view_canvas_add_text", w_host_view_canvas_add_text, "(ii$)i"),
1368 W("host_view_canvas_add_button", w_host_view_canvas_add_button, "(i)i"),
1369 W("host_view_canvas_remove_widget", w_host_view_canvas_remove_widget, "(i)i"),
1370 W("host_view_canvas_set_value", w_host_view_canvas_set_value, "(ii)i"),
1371 W("host_view_canvas_get_value", w_host_view_canvas_get_value, "(i*)i"),
1372 W("host_view_canvas_set_text", w_host_view_canvas_set_text, "(i$)i"),
1373 W("host_view_canvas_get_text", w_host_view_canvas_get_text, "(i*~)i"),
1374 W("host_view_canvas_set_focus", w_host_view_canvas_set_focus, "(i)i"),
1375 W("host_view_canvas_get_focus", w_host_view_canvas_get_focus, "(*)i"),
1376 W("host_view_canvas_set_key_repeat",w_host_view_canvas_set_key_repeat,"(ii)i"),
1377 W("host_view_canvas_set_long_press_action",w_host_view_canvas_set_long_press_action,"(i)i"),
1378
1379 W("host_i18n_tr_key", w_host_i18n_tr_key, "($*~)i"),
1380 W("host_i18n_tr_meta", w_host_i18n_tr_meta, "($*~)i"),
1381 W("host_i18n_tr_core", w_host_i18n_tr_core, "($*~)i"),
1382 W("host_i18n_current_language", w_host_i18n_current_language, "()i"),
1383
1384 W("host_nvs_get_blob", w_host_nvs_get_blob, "($*~)i"),
1385 W("host_nvs_set_blob", w_host_nvs_set_blob, "($*~)i"),
1386 W("host_nvs_get_u32", w_host_nvs_get_u32, "($*)i"),
1387 W("host_nvs_set_u32", w_host_nvs_set_u32, "($i)i"),
1388 W("host_nvs_get_str", w_host_nvs_get_str, "($*~)i"),
1389 W("host_nvs_set_str", w_host_nvs_set_str, "($$)i"),
1390 W("host_nvs_erase", w_host_nvs_erase, "($)i"),
1391
1392 W("host_fs_write", w_host_fs_write, "($*~)i"),
1393 W("host_fs_read", w_host_fs_read, "($*~)i"),
1394 W("host_fs_remove", w_host_fs_remove, "($)i"),
1395 W("host_fs_size", w_host_fs_size, "($)i"),
1396 W("host_fs_list", w_host_fs_list, "(*~)i"),
1397 W("host_fs_view", w_host_fs_view, "($)i"),
1398 W("host_fs_view_image", w_host_fs_view_image, "($)i"),
1399 W("host_fs_view_markdown", w_host_fs_view_markdown, "($)i"),
1400 W("host_ui_view_image", w_host_ui_view_image, "(*~)i"),
1401 W("host_ui_view_markdown", w_host_ui_view_markdown, "(*~)i"),
1402
1403 W("host_random", w_host_random, "(*~)i"),
1404 W("host_sha256", w_host_sha256, "(*~*)i"),
1405 W("host_hmac_sha256", w_host_hmac_sha256, "(*~*~*)i"),
1406 W("host_base32_encode", w_host_base32_encode, "(*~*~)i"),
1407 W("host_base32_decode", w_host_base32_decode, "(*~*~)i"),
1408 W("host_hex_encode", w_host_hex_encode, "(*~*~)i"),
1409
1410 W("host_http_open", w_host_http_open, "(i$i)i"),
1411 W("host_http_set_header", w_host_http_set_header, "(i$$)i"),
1412 W("host_http_set_body", w_host_http_set_body, "(i*~)i"),
1413 W("host_http_perform", w_host_http_perform, "(i)i"),
1414 W("host_http_status", w_host_http_status, "(i)i"),
1415 W("host_http_read_chunk", w_host_http_read_chunk, "(i*~)i"),
1416 W("host_http_close", w_host_http_close, "(i)i"),
1417
1418 W("host_socket_open", w_host_socket_open, "(i$ii)i"),
1419 W("host_socket_write", w_host_socket_write, "(i*~i)i"),
1420 W("host_socket_read", w_host_socket_read, "(i*~i)i"),
1421 W("host_socket_close", w_host_socket_close, "(i)i"),
1422 W("host_net_listen", w_host_net_listen, "(ii)i"),
1423 W("host_net_accept", w_host_net_accept, "()i"),
1424 W("host_net_close", w_host_net_close, "(i)i"),
1425 W("host_set_resident", w_host_set_resident, "(i)i"),
1426
1427 W("host_wifi_request", w_host_wifi_request, "(i)i"),
1428 W("host_wifi_release", w_host_wifi_release, "()i"),
1429 W("host_wifi_is_connected", w_host_wifi_is_connected, "()i"),
1430 W("host_wifi_ssid", w_host_wifi_ssid, "(*~)i"),
1431 W("host_wifi_ip", w_host_wifi_ip, "(*~)i"),
1432
1433 W("host_rmem_read_named", w_host_rmem_read_named, "($*~)i"),
1434 W("host_rmem_write_named", w_host_rmem_write_named, "($*~)i"),
1435 W("host_rmem_erase_named", w_host_rmem_erase_named, "($)i"),
1436 W("host_rmem_name_used", w_host_rmem_name_used, "($)i"),
1437 W("host_rmem_slot_size", w_host_rmem_slot_size, "()i"),
1438 W("host_ecc_generate", w_host_ecc_generate, "($i)i"),
1439 W("host_ecc_import", w_host_ecc_import, "($*i)i"),
1440 W("host_ecc_pubkey", w_host_ecc_pubkey, "($*i)i"),
1441 W("host_ecc_delete", w_host_ecc_delete, "($)i"),
1442 W("host_ecc_exists", w_host_ecc_exists, "($)i"),
1443 W("host_ecdsa_sign", w_host_ecdsa_sign, "($*~*)i"),
1444 W("host_eddsa_sign", w_host_eddsa_sign, "($*~*)i"),
1445
1446 W("host_event_subscribe", w_host_event_subscribe, "(ii)i"),
1447 W("host_event_unsubscribe", w_host_event_unsubscribe, "(i)i"),
1448
1449 W("host_gpio_set_direction", w_host_gpio_set_direction, "(ii)i"),
1450 W("host_gpio_set_pull", w_host_gpio_set_pull, "(ii)i"),
1451 W("host_gpio_write", w_host_gpio_write, "(ii)i"),
1452 W("host_gpio_read", w_host_gpio_read, "(i*)i"),
1453 W("host_gpio_release", w_host_gpio_release, "(i)i"),
1454 W("host_gpio_pwm_start", w_host_gpio_pwm_start, "(iii)i"),
1455 W("host_gpio_pwm_stop", w_host_gpio_pwm_stop, "(i)i"),
1456
1457 W("host_ui_push_date", w_host_ui_push_date, "($iiii)i"),
1458 W("host_ui_push_time", w_host_ui_push_time, "($iii)i"),
1459
1460 W("host_get_firmware_version", w_host_get_firmware_version, "(*~)i"),
1461 W("host_str_to_display", w_host_str_to_display, "($*~i)i"),
1462 W("host_str_to_utf8", w_host_str_to_utf8, "($*~)i"),
1463 W("host_get_build_profile", w_host_get_build_profile, "(*~)i"),
1464 W("host_feature_enabled", w_host_feature_enabled, "(i)i"),
1465 W("host_cpu_load", w_host_cpu_load, "()i"),
1466 W("host_cmd_consume", w_host_cmd_consume, "(*~)i"),
1467
1468 W("host_msg_register_handler", w_host_msg_register_handler, "($i)i"),
1469 W("host_msg_unregister_handler", w_host_msg_unregister_handler, "($)i"),
1470 W("host_msg_consume", w_host_msg_consume, "(*~*~)i"),
1471 W("host_msg_send_interactive", w_host_msg_send_interactive, "($*~i)i"),
1472 W("host_msg_send", w_host_msg_send, "(*i$*~i)i"),
1473
1474 W("host_vcard_get_own", w_host_vcard_get_own, "(*~)i"),
1475 W("host_vcard_received_count", w_host_vcard_received_count, "()i"),
1476 W("host_vcard_received_get", w_host_vcard_received_get, "(i*~)i"),
1477 W("host_vcard_received_display", w_host_vcard_received_display, "(i*~)i"),
1478 W("host_vcard_set_own", w_host_vcard_set_own, "(*~)i"),
1479 W("host_vcard_received_add", w_host_vcard_received_add, "(*~)i"),
1480 W("host_vcard_received_update", w_host_vcard_received_update, "(i*~)i"),
1481 W("host_vcard_received_delete", w_host_vcard_received_delete, "(i)i"),
1482
1483 W("host_qr_measure", w_host_qr_measure, "($ii*)i"),
1484 W("host_qr_render_bitmap", w_host_qr_render_bitmap, "($iiii*~**)i"),
1485
1486 W("host_image_info", w_host_image_info, "(*~**)i"),
1487 W("host_image_render", w_host_image_render, "(*~i*~**)i"),
1488
1489 W("host_surface_create", w_host_surface_create, "(ii)i"),
1490 W("host_surface_destroy", w_host_surface_destroy, "(i)i"),
1491 W("host_surface_clear", w_host_surface_clear, "(i)i"),
1492 W("host_surface_set_font", w_host_surface_set_font, "(ii)i"),
1493 W("host_surface_set_text_size", w_host_surface_set_text_size, "(ii)i"),
1494 W("host_surface_set_text_color", w_host_surface_set_text_color, "(ii)i"),
1495 W("host_surface_set_shade", w_host_surface_set_shade, "(ii)i"),
1496 W("host_surface_draw_text", w_host_surface_draw_text, "(iii$)i"),
1497 W("host_surface_draw_text_aligned", w_host_surface_draw_text_aligned, "(iiii$i)i"),
1498 W("host_surface_measure_text", w_host_surface_measure_text, "(i$**)i"),
1499 W("host_surface_draw_pixel", w_host_surface_draw_pixel, "(iii)i"),
1500 W("host_surface_draw_line", w_host_surface_draw_line, "(iiiii)i"),
1501 W("host_surface_draw_rect", w_host_surface_draw_rect, "(iiiiii)i"),
1502 W("host_surface_draw_circle", w_host_surface_draw_circle, "(iiiii)i"),
1503 W("host_surface_draw_triangle", w_host_surface_draw_triangle, "(iiiiiiii)i"),
1504 W("host_surface_draw_round_rect", w_host_surface_draw_round_rect, "(iiiiiii)i"),
1505 W("host_surface_hline", w_host_surface_hline, "(iiii)i"),
1506 W("host_surface_vline", w_host_surface_vline, "(iiii)i"),
1507 W("host_surface_draw_bitmap", w_host_surface_draw_bitmap, "(iiiii*~)i"),
1508 W("host_surface_export", w_host_surface_export, "(i*~*)i"),
1509 W("host_surface_export_jpg", w_host_surface_export_jpg, "(ii*~*)i"),
1510 W("host_surface_draw_sprite", w_host_surface_draw_sprite, "(iiii)i"),
1511
1512 W("host_ext_feature_available", w_host_ext_feature_available, "($)i"),
1513 W("host_ext_feature_use", w_host_ext_feature_use, "($*~i)i"),
1514 W("host_ext_feature_register_handler", w_host_ext_feature_register_handler, "($i)i"),
1515 W("host_ext_feature_consume", w_host_ext_feature_consume, "(*~*~)i"),
1516 W("host_ext_feature_result", w_host_ext_feature_result, "(i)i"),
1517
1518 W("host_ui_acquire_exclusive", w_host_ui_acquire_exclusive, "()i"),
1519 W("host_ui_release_exclusive", w_host_ui_release_exclusive, "()i"),
1520 W("host_ui_set_inactivity", w_host_ui_set_inactivity, "(ii)i"),
1521
1522 W("host_pixel_strip_init", w_host_pixel_strip_init, "(iii)i"),
1523 W("host_pixel_strip_deinit", w_host_pixel_strip_deinit, "()i"),
1524 W("host_pixel_strip_set", w_host_pixel_strip_set, "(iiii)i"),
1525 W("host_pixel_strip_fill", w_host_pixel_strip_fill, "(iii)i"),
1526 W("host_pixel_strip_clear", w_host_pixel_strip_clear, "()i"),
1527 W("host_pixel_strip_refresh", w_host_pixel_strip_refresh, "()i"),
1528 W("host_pixel_strip_length", w_host_pixel_strip_length, "()i"),
1529 W("host_pixel_strip_ready", w_host_pixel_strip_ready, "()i"),
1530
1531 W("host_lockscreen_register_action", w_host_lockscreen_register_action, "($i)i"),
1532 W("host_lockscreen_unregister_action", w_host_lockscreen_unregister_action, "()i"),
1533 W("host_lockscreen_alert", w_host_lockscreen_alert, "($ii)i"),
1534
1535 W("host_random_strict", w_host_random_strict, "(*~)i"),
1536 W("host_base64_encode", w_host_base64_encode, "(*~*~)i"),
1537 W("host_base64_decode", w_host_base64_decode, "(*~*~)i"),
1538 W("host_hex_decode", w_host_hex_decode, "(*~*~)i"),
1539 W("host_aes_gcm_encrypt", w_host_aes_gcm_encrypt, "(***~*~**)i"),
1540 W("host_aes_gcm_decrypt", w_host_aes_gcm_decrypt, "(***~*~**)i"),
1541
1542 W("host_local_time", w_host_local_time, "(*)i"),
1543 W("host_log_hex", w_host_log_hex, "($$*~)"),
1544 W("host_nvs_erase_all", w_host_nvs_erase_all, "()i"),
1545 W("host_nvs_list_keys", w_host_nvs_list_keys, "(**)i"),
1546
1547 W("host_wifi_mac", w_host_wifi_mac, "(*)i"),
1548 W("host_wifi_rssi", w_host_wifi_rssi, "()i"),
1549 W("host_wifi_start_scan", w_host_wifi_start_scan, "()i"),
1550 W("host_wifi_scan_done", w_host_wifi_scan_done, "()i"),
1551 W("host_wifi_scan_results", w_host_wifi_scan_results, "(**)i"),
1552
1553 W("host_gpio_pwm_set_duty", w_host_gpio_pwm_set_duty, "(ii)i"),
1554 W("host_adc_read", w_host_adc_read, "(i**)i"),
1555 W("host_i2c_write", w_host_i2c_write, "(ii*~)i"),
1556 W("host_i2c_read", w_host_i2c_read, "(ii*~)i"),
1557 W("host_i2c_write_read", w_host_i2c_write_read, "(ii*~*~)i"),
1558 W("host_i2c_scan", w_host_i2c_scan, "(i**)i"),
1559 W("host_sao_eeprom_read", w_host_sao_eeprom_read, "(i*~)i"),
1560 W("host_sao_eeprom_write", w_host_sao_eeprom_write, "(i*~)i"),
1561
1562 W("host_http_content_length",w_host_http_content_length,"(i)i"),
1563 W("host_event_publish", w_host_event_publish, "(ii)i"),
1564 W("host_se_chip_id", w_host_se_chip_id, "(**)i"),
1565 W("host_se_fw_version", w_host_se_fw_version, "(**)i"),
1566
1567 W("host_display_width", w_host_display_width, "()i"),
1568 W("host_display_height", w_host_display_height, "()i"),
1569 W("host_display_clear", w_host_display_clear, "()i"),
1570 W("host_display_draw_pixel", w_host_display_draw_pixel, "(iii)i"),
1571 W("host_display_draw_line", w_host_display_draw_line, "(iiiii)i"),
1572 W("host_display_draw_rect", w_host_display_draw_rect, "(iiiii)i"),
1573 W("host_display_fill_rect", w_host_display_fill_rect, "(iiiii)i"),
1574 W("host_display_draw_text", w_host_display_draw_text, "(ii$ii)i"),
1575 W("host_display_flush", w_host_display_flush, "(i)i"),
1576 W("host_display_is_busy", w_host_display_is_busy, "()i"),
1577 W("host_display_set_backlight", w_host_display_set_backlight, "(i)i"),
1578 W("host_display_get_backlight", w_host_display_get_backlight, "()i"),
1579
1580 W("host_key_pressed", w_host_key_pressed, "(i)i"),
1581 W("host_key_consume_next", w_host_key_consume_next, "(*)i"),
1582 W("host_usb_cdc_write", w_host_usb_cdc_write, "(*~)i"),
1583
1584 W("host_ble_is_enabled", w_host_ble_is_enabled, "()i"),
1585 W("host_ble_mac", w_host_ble_mac, "(*)i"),
1586 W("host_ble_device_name", w_host_ble_device_name, "(*~)i"),
1587 W("host_ble_rssi", w_host_ble_rssi, "()i"),
1588 W("host_ble_register_service", w_host_ble_register_service, "(**i)i"),
1589 W("host_ble_unregister_service",w_host_ble_unregister_service,"(i)i"),
1590 W("host_ble_send_notification", w_host_ble_send_notification, "(i*~)i"),
1591 W("host_ble_send_indication", w_host_ble_send_indication, "(i*~)i"),
1592 W("host_ble_consume_write", w_host_ble_consume_write, "(i*~)i"),
1593 W("host_ble_scan_start", w_host_ble_scan_start, "(i)i"),
1594 W("host_ble_scan_done", w_host_ble_scan_done, "()i"),
1595 W("host_ble_scan_results", w_host_ble_scan_results, "(**)i"),
1596 W("host_ble_connect", w_host_ble_connect, "(*i)i"),
1597 W("host_ble_conn_handle", w_host_ble_conn_handle, "()i"),
1598 W("host_ble_disconnect", w_host_ble_disconnect, "(i)i"),
1599 W("host_ble_discover", w_host_ble_discover, "(i*i)i"),
1600 W("host_ble_consume_discovery", w_host_ble_consume_discovery, "(**)i"),
1601 W("host_ble_read_char", w_host_ble_read_char, "(iii)i"),
1602 W("host_ble_consume_read", w_host_ble_consume_read, "(*~)i"),
1603 W("host_ble_write_char", w_host_ble_write_char, "(ii*~i)i"),
1604 W("host_ble_subscribe", w_host_ble_subscribe, "(iii)i"),
1605 W("host_ble_subscribe_char", w_host_ble_subscribe_char, "(iii)i"),
1606 W("host_ble_consume_notification", w_host_ble_consume_notification, "(**~)i"),
1607 W("host_ble_get_mtu", w_host_ble_get_mtu, "(i)i"),
1608 W("host_ble_on_write_complete", w_host_ble_on_write_complete, "(i)i"),
1609};
1610
1612
1614{
1615 const uint32_t n = sizeof(s_symbols) / sizeof(s_symbols[0]);
1616 if (!s_symbols_ram) {
1618 if (!s_symbols_ram) {
1619 plg_log_error("WAMR: PSRAM alloc for host symbol table failed");
1620 return false;
1621 }
1622 std::memcpy(s_symbols_ram.get(), s_symbols, sizeof(s_symbols));
1623 }
1624 if (!wasm_runtime_register_natives("cdc", s_symbols_ram.get(), n)) {
1625 plg_log_error("WAMR: register_natives(\"cdc\") failed");
1626 return false;
1627 }
1628 char buf[64];
1629 std::snprintf(buf, sizeof(buf), "WAMR: %u host imports registered", static_cast<unsigned>(n));
1630 plg_log_info(buf);
1631 return true;
1632}
1633
1635{
1636 if (s_symbols_ram) wasm_runtime_unregister_natives("cdc", s_symbols_ram.get());
1637}
1638
1639} // namespace cdc::plugin_manager
void plg_log_error(const char *msg)
void plg_log_info(const char *msg)
char name[cdc::hal::ISecureElement::RMEM_NAME_LEN]
uint8_t flags
void plg_log_warn(const char *msg)
#define W(name, fn, sig)
void plg_log_error(const char *msg)
void plg_log_info(const char *msg)
Registers the host API as WAMR native imports under module "cdc".
Shared RAII wrappers for firmware resources.
static constexpr uint8_t MAX_ITEMS
static constexpr uint16_t MAX_ITEMS
Definition ListView.h:36
uint8_t curve
bool resident
int host_ble_consume_write(uint32_t char_handle, uint8_t *buf, size_t buf_size)
Pull the next queued inbound write for char_handle.
int host_ble_scan_start(uint32_t duration_ms)
Start a central scan for duration_ms milliseconds.
int host_ble_connect(const uint8_t addr[6], uint8_t addr_type)
Connect to a peer. Completion arrives as a BLE_CONNECTED event; read the resulting handle with host_b...
int host_ble_subscribe(uint32_t conn, uint16_t cccd_handle, uint32_t action_id)
Subscribe to notifications on a peer characteristic (by CCCD handle). Each notification fires action_...
int host_ble_send_notification(uint32_t char_handle, const uint8_t *data, size_t len)
Notify subscribers of a value on one of the plugin's characteristics.
int host_ble_discover(uint32_t conn, const uint8_t uuid[16], uint32_t action_id)
Discover the characteristics of one service on a connected peer. Completion fires action_id; read ent...
bool host_ble_scan_done(void)
True when the scan started by host_ble_scan_start() has finished.
int host_ble_read_char(uint32_t conn, uint16_t value_handle, uint32_t action_id)
Start reading a peer characteristic by value handle. Completion fires action_id; read the value with ...
int host_ble_disconnect(uint32_t conn)
Disconnect a connection.
uint16_t host_ble_get_mtu(uint32_t conn)
Usable ATT payload of the current connection (negotiated MTU - 3).
int host_ble_device_name(char *out, size_t out_size)
Copy the local BLE device name into out.
int8_t host_ble_rssi(void)
Signal strength of the active BLE link in dBm, or 0 when idle.
int host_ble_unregister_service(uint32_t service_handle)
Tear down the plugin's registered GATT service.
int host_ble_scan_results(ble_scan_result_t *out, size_t *count)
Read results from the last central scan.
int host_ble_on_write_complete(uint32_t action_id)
Register an action fired on every completed central write.
int host_ble_send_indication(uint32_t char_handle, const uint8_t *data, size_t len)
Indicate (acknowledged notify) a value on a plugin characteristic.
bool host_ble_is_enabled(void)
True when the BLE stack is initialised and advertising or connectable.
int host_ble_consume_notification(uint16_t *value_handle_out, uint8_t *buf, size_t buf_size)
Pull the next queued inbound notification.
int host_ble_subscribe_char(uint32_t conn, uint16_t value_handle, uint32_t action_id)
Subscribe to notifications on a peer characteristic by VALUE handle.
int host_ble_register_service(ble_service_def_t *def, ble_char_def_t *chars, uint32_t num_chars)
Register the plugin's GATT service and its characteristics.
int host_ble_write_char(uint32_t conn, uint16_t value_handle, const uint8_t *data, size_t len, uint8_t with_response)
Write a value to a peer characteristic by value handle.
int host_ble_consume_discovery(ble_remote_char_t *out, size_t *count)
Pull discovered characteristics after a discovery action fires.
int host_ble_mac(uint8_t out[6])
Read the local BLE MAC address.
int host_ble_consume_read(uint8_t *buf, size_t buf_size)
Pull the value delivered by the last read action.
uint32_t host_ble_conn_handle(void)
Current connection handle (central or peripheral), or 0 when idle.
int host_anim_pause(uint32_t handle, bool paused)
Pause (paused != 0) or resume a tween; delay time freezes too.
int host_anim_blink(uint32_t elem_id, uint16_t period_ms, uint16_t count, uint32_t done_action_id)
Convenience: blink an element.
int host_anim_active_count(void)
Number of live tweens plus playing sprites (>= 0).
int host_anim_start(const host_anim_t *cfg)
Start (or queue, when start_after != 0) a tween on an element.
int host_anim_cancel(uint32_t handle)
Cancel a tween and its chained successors; handle 0 cancels all of the canvas's tweens....
int host_anim_state(uint32_t handle)
Query a tween's state.
int host_cmd_consume(char *out, size_t out_size)
Copy the pending command string into out, clearing it.
int host_hex_encode(const uint8_t *in, size_t in_len, char *out, size_t out_size)
Lowercase-hex-encode in into NUL-terminated out.
int host_random_strict(uint8_t *buf, size_t len)
Fill buf with hardware-RNG bytes only; fails without TRNG.
int host_base64_decode(const char *in, size_t in_len, uint8_t *out, size_t out_size)
Base64-decode in into raw bytes in out.
int host_base32_encode(const uint8_t *in, size_t in_len, char *out, size_t out_size)
Base32-encode in into NUL-terminated out.
int host_random(uint8_t *buf, size_t len)
Fill buf with hardware-RNG bytes; may fall back to PRNG.
int host_aes_gcm_decrypt(const uint8_t *key, const uint8_t *iv, const uint8_t *aad, size_t aad_len, const uint8_t *ct, size_t ct_len, const uint8_t tag[16], uint8_t *pt)
AES-256-GCM decrypt and verify.
int host_base64_encode(const uint8_t *in, size_t in_len, char *out, size_t out_size)
Base64-encode in into NUL-terminated out.
int host_aes_gcm_encrypt(const uint8_t *key, const uint8_t *iv, const uint8_t *aad, size_t aad_len, const uint8_t *pt, size_t pt_len, uint8_t *ct, uint8_t tag[16])
AES-256-GCM encrypt.
int host_sha256(const uint8_t *data, size_t len, uint8_t out[32])
SHA-256 hash of data into the 32-byte out.
int host_hmac_sha256(const uint8_t *key, size_t klen, const uint8_t *data, size_t dlen, uint8_t out[32])
HMAC-SHA-256 of data under key into the 32-byte out.
int host_base32_decode(const char *in, size_t in_len, uint8_t *out, size_t out_size)
Base32-decode in into raw bytes in out.
int host_hex_decode(const char *in, size_t in_len, uint8_t *out, size_t out_size)
Hex-decode in (case-insensitive) into raw bytes in out.
int host_event_publish(uint32_t module_event_subtype, uint32_t value)
Publish an EVENT_MODULE_EVENT carrying subtype and value.
int host_event_unsubscribe(uint32_t subscription_id)
Cancel a subscription returned by host_event_subscribe.
int host_event_subscribe(uint32_t event_mask, uint32_t action_id)
Subscribe to one or more events.
int host_ext_feature_register_handler(const char *feature, uint32_t action_id)
Register this plugin as the live handler for a feature it provides.
int host_ext_feature_result(int32_t status_code)
Report the outcome of the job this provider is currently handling.
int host_ext_feature_use(const char *feature, const uint8_t *data, size_t len, uint32_t status_action_id)
Invoke feature with a payload; the provider runs in the foreground.
int host_ext_feature_consume(uint8_t *buf, size_t buf_size, char *feature_out, size_t feature_size)
Pull the payload of the job that fired the current handler action.
int host_ext_feature_available(const char *feature)
Check whether an installed plugin provides feature.
int host_i2c_write(uint8_t bus, uint8_t addr, const uint8_t *data, size_t len)
I2C write transaction.
int host_adc_read(uint8_t pin, uint16_t *raw, uint16_t *millivolt)
Single-shot ADC read.
int host_i2c_scan(uint8_t bus, uint8_t *found_addrs, size_t *count)
Scan the I2C bus for responding addresses.
int host_gpio_write(uint8_t pin, bool level)
Drive a digital output high/low.
int host_gpio_set_direction(uint8_t pin, uint8_t direction)
Configure pin direction (one of GPIO_DIR_*).
int host_gpio_set_pull(uint8_t pin, uint8_t pull)
Configure internal pull resistor (one of GPIO_PULL_*).
int host_sao_eeprom_write(uint16_t offset, const uint8_t *buf, size_t len)
Write to the SAO addon EEPROM at byte offset.
int host_gpio_pwm_start(uint8_t pin, uint32_t freq_hz, uint16_t duty_per_mille)
Start LEDC PWM on pin.
int host_gpio_read(uint8_t pin, bool *level)
Sample a digital input.
int host_i2c_write_read(uint8_t bus, uint8_t addr, const uint8_t *wr, size_t wr_len, uint8_t *rd, size_t rd_len)
I2C write-then-read transaction with repeated start.
int host_gpio_pwm_set_duty(uint8_t pin, uint16_t duty_per_mille)
Update PWM duty without restarting the timer.
int host_gpio_release(uint8_t pin)
Release the pin claim so other plugins can use it.
int host_gpio_pwm_stop(uint8_t pin)
Stop PWM and release the LEDC channel.
int host_sao_eeprom_read(uint16_t offset, uint8_t *buf, size_t len)
Read from the SAO addon EEPROM at byte offset.
int host_i2c_read(uint8_t bus, uint8_t addr, uint8_t *data, size_t len)
I2C read transaction.
int host_http_close(int handle)
Release a request handle.
int host_http_read_chunk(int handle, uint8_t *buf, size_t buf_size, size_t *out_len)
Stream one response chunk into buf.
int host_http_set_body(int handle, const uint8_t *body, size_t len)
Stage a request body before perform().
int host_http_status(int handle)
HTTP response status code, or negative on error.
int host_http_perform(int handle)
Send the request and read response headers.
size_t host_http_content_length(int handle)
Response Content-Length, or 0 when unknown / chunked.
int host_http_set_header(int handle, const char *key, const char *value)
Add a request header before perform().
int host_http_open(uint8_t method, const char *url, uint32_t timeout_ms)
Open an HTTP request.
uint8_t host_i18n_current_language(void)
Active language code (HOST_LANG_*).
int host_i18n_tr_core(const char *key, char *out, uint32_t out_cap)
Translate a core.* key from the firmware string table.
int host_i18n_tr_meta(const char *field, char *out, uint32_t out_cap)
Read a metadata field (name, description, ...) from the plugin manifest.
int host_i18n_tr_key(const char *key, char *out, uint32_t out_cap)
Translate a plugin-local key into the current language.
int host_image_info(const uint8_t *data, size_t len, uint16_t *out_w, uint16_t *out_h)
Decode only the image header to get its dimensions.
int host_image_render(const uint8_t *data, size_t len, uint16_t target_w, uint8_t *out, size_t out_size, uint16_t *out_stride_bytes, uint16_t *out_height_px)
Decode, scale to target_w (aspect preserved) and dither to 1-bpp.
int host_key_consume_next(uint8_t *out_key)
Pop the next queued key press, if any.
bool host_key_pressed(uint8_t key)
True while key is currently held down.
int host_set_resident(bool resident)
Request (true) or drop (false) background residency. Needs the background or autoload capability to h...
int host_lockscreen_alert(const char *text, uint8_t icon, uint32_t action_id)
Raise a persistent Y/N alert over whatever is on screen, lock screen included, that stays until the u...
int host_lockscreen_register_action(const char *label_key, uint32_t action_id)
Publish (or replace) the plugin's lockscreen quick-action.
int host_lockscreen_unregister_action(void)
Remove the plugin's lockscreen quick-action.
void host_log_hex(const char *tag, const char *label, const uint8_t *data, size_t len)
Write a labelled hex dump of a binary buffer at debug level.
void host_log(uint8_t level, const char *tag, const char *msg)
Write a single log line at the given level.
int host_msg_send(const uint8_t addr[6], uint8_t addr_type, const char *mime_type, const uint8_t *data, size_t len, uint32_t flags)
Send a typed payload directly to a known peer address (no picker).
int host_msg_unregister_handler(const char *mime_type)
Drop a previously registered handler.
int host_msg_send_interactive(const char *mime_type, const uint8_t *data, size_t len, uint32_t flags)
Send a typed payload via the firmware-owned interactive peer picker.
int host_msg_consume(uint8_t *buf, size_t buf_size, char *mime_out, size_t mime_size)
Pull the payload delivered by the most recent inbound message action.
int host_msg_register_handler(const char *mime_type, uint32_t action_id)
Register that this plugin handles an incoming MIME type.
int host_net_accept(void)
Take the next accepted connection as a socket handle for host_socket_read/write/close.
int host_net_listen(uint16_t port, uint32_t action_id)
Start a TCP listener on port; fires action_id while clients wait.
int host_net_close(uint16_t port)
Stop the listener (pass 0 or the listening port). Closes pending un-accepted connections.
int host_nvs_list_keys(char *out, size_t *out_len)
Enumerate the keys in the plugin's namespace.
int host_nvs_erase(const char *key)
Delete a single key.
int host_nvs_set_u32(const char *key, uint32_t value)
Write a uint32 value.
int host_nvs_get_blob(const char *key, uint8_t *buf, size_t *len)
Read a binary blob from NVS.
int host_nvs_get_str(const char *key, char *buf, size_t buf_size)
Read a NUL-terminated string.
int host_nvs_get_u32(const char *key, uint32_t *out)
Read a uint32 value.
int host_nvs_erase_all(void)
Erase every key in the plugin's namespace.
int host_nvs_set_blob(const char *key, const uint8_t *buf, size_t len)
Write a binary blob to NVS.
int host_nvs_set_str(const char *key, const char *value)
Write a NUL-terminated string.
int host_pixel_strip_refresh(void)
Push the strip buffer out over the RMT bus.
int host_pixel_strip_clear(void)
Clear every pixel to off (0, 0, 0).
uint16_t host_pixel_strip_length(void)
Number of pixels the strip was initialised with.
int host_pixel_strip_fill(uint8_t r, uint8_t g, uint8_t b)
Fill every pixel with the same RGB colour.
int host_pixel_strip_set(uint16_t index, uint8_t r, uint8_t g, uint8_t b)
Set one pixel's RGB colour in the strip buffer.
int host_pixel_strip_init(uint8_t gpio_pin, uint16_t num_pixels, uint8_t format)
Initialise or reconfigure the global pixel strip.
int host_pixel_strip_deinit(void)
Tear down the global pixel strip.
bool host_pixel_strip_ready(void)
True when the strip has been successfully initialised.
uint8_t host_charge_status(void)
Charger state machine value - one of CHARGE_*.
uint8_t host_power_source(void)
Active power source - one of POWER_SRC_*.
bool host_is_battery_low(void)
True when battery has crossed the low-warning threshold.
bool host_is_battery_critical(void)
True when battery has crossed the critical-shutdown threshold.
void host_set_sleep_inhibit(uint32_t on)
Hold or release a light-sleep inhibitor for the calling plugin. While any inhibitor is held the badge...
bool host_is_usb_connected(void)
True when USB VBUS is detected.
uint16_t host_battery_mv(void)
Battery voltage in millivolts.
uint8_t host_battery_pct(void)
Battery state of charge as 0..100 percent.
int host_qr_render_bitmap(const char *data, uint8_t max_version, uint8_t ecc, uint8_t scale, uint8_t quiet_modules, uint8_t *out, size_t out_size, uint16_t *out_stride_bytes, uint16_t *out_height_px)
Encode data into a packed 1-bpp QR raster.
int host_qr_measure(const char *data, uint8_t max_version, uint8_t ecc, uint16_t *out_modules)
Measure the QR module count for data without rendering.
int host_ecc_delete(const char *name)
Erase the named ECC key and free its pool slot.
int host_se_fw_version(uint8_t *riscv, uint8_t *spect)
Read TROPIC01 firmware versions for the RISC-V CPU and SPECT core.
int host_se_chip_id(uint8_t *serial, size_t *len)
Read the TROPIC01 chip serial / identity blob.
int host_rmem_read_named(const char *name, uint8_t *buf, size_t *len)
Read a named retained-memory slot.
int host_rmem_write_named(const char *name, const uint8_t *buf, size_t len)
Write up to host_rmem_slot_size() bytes into a named rmem slot.
uint16_t host_rmem_slot_size(void)
Maximum payload bytes per rmem slot.
int host_ecc_pubkey(const char *name, uint8_t *pub, uint8_t curve)
Export the public key for the named slot.
int host_ecdsa_sign(const char *name, const uint8_t *msg, size_t len, uint8_t sig[64])
ECDSA-sign msg with the P-256 named key; writes 64-byte raw sig.
bool host_rmem_name_used(const char *name)
True if the named rmem slot currently holds data.
int host_eddsa_sign(const char *name, const uint8_t *msg, size_t len, uint8_t sig[64])
Ed25519-sign msg with the named key; writes 64-byte signature.
int host_rmem_erase_named(const char *name)
Erase the contents of a named rmem slot.
int host_ecc_generate(const char *name, uint8_t curve)
Generate a fresh ECC key for the named slot.
int host_ecc_import(const char *name, const uint8_t *priv, uint8_t curve)
Import an externally-generated private key for the named slot.
bool host_ecc_exists(const char *name)
True when the named ECC key currently holds a key.
int host_socket_read(int handle, uint8_t *out, size_t cap, uint32_t timeout_ms)
Read bytes from the stream / receive a datagram from the connected peer.
int host_socket_close(int handle)
Close a socket handle.
int host_socket_write(int handle, const uint8_t *data, size_t len, uint32_t timeout_ms)
Write bytes to the stream / send a datagram to the connected peer.
int host_socket_open(uint8_t proto, const char *host, uint16_t port, uint32_t timeout_ms)
Open an outbound connection to a single remote endpoint.
int host_sprite_create(uint16_t frame_w, uint16_t frame_h, uint16_t frame_count, const uint8_t *frames, uint32_t len)
Create a sprite from a packed 1-bpp frame sheet in plugin memory.
int host_sprite_set_frame(uint32_t sprite, uint16_t frame)
Jump to a frame. A running playback continues from it.
int host_sprite_play(uint32_t sprite, uint8_t mode, uint16_t frame_ms, uint16_t repeat, uint32_t done_action_id)
Start host-driven playback from frame 0.
int host_sprite_create_from_image(const uint8_t *data, uint32_t len, uint16_t target_w, uint16_t frame_h)
Create a sprite straight from an encoded PNG/JPEG.
int host_sprite_destroy(uint32_t sprite)
Destroy a sprite and reclaim its arena bytes. Recorded draw-sprite commands referencing it are skippe...
int host_sprite_set_frame_durations(uint32_t sprite, const uint16_t *ms, uint16_t count)
Optional per-frame durations in milliseconds.
int host_sprite_set_scale(uint32_t sprite, uint8_t scale)
Integer upscale factor applied whenever the sprite is drawn.
int host_sprite_set_flags(uint32_t sprite, uint8_t flags)
Replace the sprite's flag set (HOST_SPRITE_FLAG_*).
int host_sprite_stop(uint32_t sprite)
Stop playback, keeping the current frame on screen.
int host_sprite_set_mask(uint32_t sprite, const uint8_t *mask, uint32_t len)
Attach a transparency mask plane (same sheet layout and size as the frame data). Mask bit set = pixel...
int host_sprite_create_from_surface(uint32_t surface, uint16_t frame_w, uint16_t frame_h, uint16_t frame_count)
Create a sprite by slicing a surface into a row-major grid of frame_w x frame_h cells.
int host_sprite_get_frame(uint32_t sprite, uint16_t *out)
Read the currently displayed frame index.
int host_str_to_utf8(const char *in, char *out, size_t out_size)
Convert CP437 display bytes in in to a UTF-8 string in out.
int host_str_to_display(const char *in, char *out, size_t out_size, uint32_t target)
Decode HTML entities + UTF-8 in in into single-byte display characters in out.
int host_surface_set_font(uint32_t surface, uint8_t font_id)
Select the font for subsequent text calls (HOST_FONT_* id).
int host_surface_draw_text(uint32_t surface, int16_t x, int16_t y, const char *text)
Draw UTF-8 text with the current font/size at (x, y) baseline-top.
int host_surface_draw_bitmap(uint32_t surface, int16_t x, int16_t y, int16_t w, int16_t h, const uint8_t *data, uint32_t len)
Blit a packed 1-bpp bitmap (MSB-first, set bit = black) at (x, y).
int host_surface_vline(uint32_t surface, int16_t x, int16_t y, int16_t h)
Draw a vertical line of height h.
int host_surface_draw_pixel(uint32_t surface, int16_t x, int16_t y)
Draw a pixel (current shade decides ink: shade > 0 draws black).
int host_surface_draw_sprite(uint32_t surface, int16_t x, int16_t y, uint32_t sprite)
Stamp a sprite's current frame onto a surface at (x, y).
int host_surface_measure_text(uint32_t surface, const char *text, uint16_t *out_w, uint16_t *out_h)
Measure UTF-8 text with the surface's current font/size.
int host_surface_destroy(uint32_t surface)
Destroy a surface and free its memory.
int host_surface_draw_line(uint32_t surface, int16_t x0, int16_t y0, int16_t x1, int16_t y1)
Draw a line.
int host_surface_draw_text_aligned(uint32_t surface, int16_t x, int16_t y, int16_t w, const char *text, uint8_t align)
Draw UTF-8 text aligned within a w-wide box starting at x.
int host_surface_draw_rect(uint32_t surface, int16_t x, int16_t y, int16_t w, int16_t h, uint8_t filled)
Draw a rectangle; filled ones use the current shade.
int host_surface_draw_circle(uint32_t surface, int16_t x, int16_t y, int16_t r, uint8_t filled)
Draw a circle centered at (x, y); filled ones use the current shade.
int host_surface_set_text_color(uint32_t surface, uint8_t inverted)
Draw text white-on-black (inverted != 0) or black-on-white.
int host_surface_draw_triangle(uint32_t surface, int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint8_t filled)
Draw a triangle; filled ones use the current shade.
int host_surface_export(uint32_t surface, uint8_t *out, size_t out_size, uint16_t *out_stride_bytes)
Copy the surface's packed pixel rows into out.
int host_surface_set_shade(uint32_t surface, uint8_t shade)
Set the fill shade for filled shapes: 0 white .. 255 solid black.
int host_surface_clear(uint32_t surface)
Clear a surface to white.
int host_surface_create(uint16_t w, uint16_t h)
Create a w x h surface, cleared to white.
int host_surface_set_text_size(uint32_t surface, uint8_t size)
Set the integer text scale (1..4) for subsequent text calls.
int host_surface_hline(uint32_t surface, int16_t x, int16_t y, int16_t w)
Draw a horizontal line of width w.
int host_surface_draw_round_rect(uint32_t surface, int16_t x, int16_t y, int16_t w, int16_t h, int16_t r, uint8_t filled)
Draw a rounded rectangle with corner radius r.
int host_surface_export_jpg(uint32_t surface, uint8_t quality, uint8_t *out, size_t out_size, uint32_t *out_len)
Encode the surface as a grayscale JPEG.
int host_get_build_profile(char *out, size_t out_size)
Copy the build profile name (e.g. "release", "debug") into out.
uint8_t host_cpu_load(void)
Aggregate CPU load across all cores as 0..100 percent. Sampled on demand from FreeRTOS run-time stats...
bool host_feature_enabled(uint16_t feature_id)
True when the firmware was built with the given feature id enabled.
int host_get_firmware_version(char *out, size_t out_size)
Copy the firmware semver string into out.
int host_local_time(struct host_tm *out)
Fill out with the current local time broken into fields.
bool host_is_time_set(void)
True when the RTC has been synchronised at least once.
uint64_t host_uptime_ms(void)
Monotonic milliseconds since boot.
int64_t host_unix_time(void)
Current Unix timestamp in seconds, or 0 if RTC not set.
int32_t host_timezone_offset(void)
Configured timezone offset from UTC in seconds.
int host_view_canvas_clear_ex(uint32_t flags)
Clear with options: like host_view_canvas_clear, but HOST_CANVAS_CLEAR_KEEP_SPRITES keeps the sprite ...
int host_view_canvas_get_value(uint32_t widget_id, int32_t *out)
Read the integer value of a slider widget.
int host_view_canvas_elem_show(uint32_t elem_id, bool visible)
Show or hide an element (hidden elements are skipped on replay).
int host_view_canvas_draw_round_rect(int16_t x, int16_t y, int16_t w, int16_t h, int16_t r, bool filled)
Draw a rounded rectangle outline or filled, corner radius r.
int host_view_canvas_elem_set_offset(uint32_t elem_id, int16_t ox, int16_t oy)
Set an element's replay offset relative to its recorded coordinates.
int host_view_canvas_elem_remove(uint32_t elem_id)
Remove an element and all draw commands recorded under it.
int host_view_canvas_push(const char *title, uint32_t key_action_id, uint32_t widget_action_id)
Push a new canvas view.
int host_view_canvas_get_focus(uint32_t *out)
Read the currently focused widget id, 0 if none.
int host_view_canvas_hline(int16_t x, int16_t y, int16_t w)
Draw a horizontal line.
int host_view_canvas_vline(int16_t x, int16_t y, int16_t h)
Draw a vertical line.
int host_view_canvas_clear(void)
Clear all draw state and widgets. Equals host_view_canvas_clear_ex(0).
int host_view_canvas_draw_rect(int16_t x, int16_t y, int16_t w, int16_t h, bool filled)
Draw a rectangle outline or filled rectangle.
int host_view_canvas_set_ink(bool white)
Draw subsequent shapes in white instead of black.
int host_view_canvas_elem_move(uint32_t elem_id, int16_t dx, int16_t dy)
Shift an element's replay offset by a delta.
int host_view_canvas_elem_begin(uint32_t elem_id)
Start recording draw calls under element elem_id.
int host_view_canvas_set_text_color(bool inverted)
Switch between normal and inverted (white on black) text.
int host_view_canvas_set_font(uint8_t font_id)
Switch the canvas font to one of the canonical HOST_FONT_* ids.
int host_view_canvas_draw_bitmap(int16_t x, int16_t y, int16_t w, int16_t h, const uint8_t *data, uint32_t len)
Draw a 1-bpp bitmap; set bits render black, unset bits are transparent.
int host_view_canvas_add_button(uint32_t widget_id)
Add a focusable button widget bound to widget_id.
int host_view_canvas_draw_pixel(int16_t x, int16_t y)
Draw a single pixel.
int host_view_canvas_draw_circle(int16_t x, int16_t y, int16_t r, bool filled)
Draw a circle outline or filled circle of radius r centred at (x, y).
int host_view_canvas_marquee(int16_t x, int16_t y, int16_t window_w, const char *text, uint16_t step_px, uint16_t frame_ms)
Record a host-driven text marquee (ticker).
int host_view_canvas_set_focus(uint32_t widget_id)
Move keyboard focus to the given widget.
int host_view_canvas_get_text(uint32_t widget_id, char *out, size_t cap)
Read the text of a text-input widget.
int host_view_canvas_set_text_size(uint8_t size)
Set text size multiplier (Adafruit-GFX semantics).
int host_view_canvas_elem_get_offset(uint32_t elem_id, int16_t *ox, int16_t *oy)
Read an element's current replay offset.
int host_view_canvas_set_key_repeat(uint16_t initial_ms, uint16_t repeat_ms)
Configure key auto-repeat timing for the canvas.
int host_view_canvas_elem_get_bounds(uint32_t elem_id, int16_t *x, int16_t *y, uint16_t *w, uint16_t *h)
Bounding box of an element's recorded commands, offset applied.
int host_view_canvas_elem_end(void)
Stop recording draw calls into an element.
int host_view_canvas_draw_text_aligned(int16_t x, int16_t y, int16_t w, const char *text, uint8_t align)
Draw text within a horizontal box.
int host_view_canvas_set_footer(const char *hint)
Override the footer hint of the canvas.
int host_view_canvas_draw_text(int16_t x, int16_t y, const char *text)
Draw text at (x, y) using the current text size/colour.
int host_view_canvas_set_shade(uint8_t shade)
Set the fill ink for subsequent filled shapes (rect, circle, triangle).
int host_view_canvas_remove_widget(uint32_t widget_id)
Remove a widget previously added to the canvas.
int host_text_pick_font_that_fits(const char *text, int16_t max_width_px, const uint8_t *candidates, uint32_t count, uint8_t *out_font_id)
Pick the largest HOST_FONT_* whose rendered text fits within max_width_px. Candidates are evaluated i...
int host_view_canvas_add_text(uint32_t widget_id, uint16_t max_len, const char *initial)
Add a T9 text input widget bound to widget_id.
int host_view_canvas_set_text(uint32_t widget_id, const char *text)
Set the text of a text-input widget.
int host_view_canvas_elem_set_z(uint32_t elem_id, int8_t z)
Set an element's replay layer (z-order).
int host_view_canvas_draw_triangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, bool filled)
Draw a triangle outline or filled triangle through three points.
int host_view_canvas_set_anim_policy(uint8_t refresh_policy, uint8_t max_fps)
Configure host-driven animation pacing for the current canvas.
int host_view_canvas_set_long_press_action(uint32_t action_id)
Set the action id fired on a canvas long-press.
int host_view_canvas_draw_line(int16_t x0, int16_t y0, int16_t x1, int16_t y1)
Draw a line between two points.
int host_view_canvas_set_value(uint32_t widget_id, int32_t value)
Set the integer value of a slider widget.
int host_view_canvas_get_body_size(uint16_t *w, uint16_t *h)
Read the drawable body region (excluding header/footer).
int host_view_canvas_commit(bool full_refresh)
Flush draw state to the panel.
int host_view_canvas_add_slider(uint32_t widget_id, int32_t min, int32_t max, int32_t initial, int32_t step)
Add an integer slider widget bound to widget_id.
int host_view_canvas_elem_clear(uint32_t elem_id)
Drop only an element's recorded draw commands, keeping the element.
int host_view_canvas_draw_sprite(int16_t x, int16_t y, uint32_t sprite)
Record a draw of a sprite's current frame at (x, y).
int host_display_draw_rect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color)
Draw a rectangle outline.
bool host_display_is_busy(void)
True while the panel is processing a previous refresh.
int host_display_draw_pixel(int16_t x, int16_t y, uint16_t color)
Set a single pixel.
uint16_t host_display_get_backlight(void)
Current backlight level (0 when no display is available).
int host_display_draw_line(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color)
Draw a line between two points.
uint16_t host_display_width(void)
Display width in pixels.
int host_display_set_backlight(uint16_t level)
Set the display backlight level (0 = off .. panel maximum, e.g. 1023). Applied live; NOT persisted to...
int host_display_flush(uint8_t refresh_mode)
Push the framebuffer to the panel using the given refresh mode.
int host_display_fill_rect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color)
Draw a filled rectangle.
int host_display_draw_text(int16_t x, int16_t y, const char *text, uint8_t size, uint16_t color)
Draw text using the default GFX font.
uint16_t host_display_height(void)
Display height in pixels.
int host_display_clear(void)
Clear the framebuffer to background.
int host_ui_set_inactivity(uint32_t timeout_ms, uint32_t action_id)
Arm an inactivity timer for the plugin's current view.
int host_ui_pop(void)
Pop the topmost view.
int host_ui_set_view_lifecycle(uint32_t hide_action_id, uint32_t show_action_id)
Register hide/show callbacks for the plugin's current top view.
int host_ui_remove_list_item(uint16_t index)
Remove the list row at index (partial redraw).
int host_ui_acquire_exclusive(void)
Claim exclusive UI ownership (block other plugins from pushing views).
int host_ui_push_time(const char *title, uint8_t h, uint8_t m, uint32_t action_id)
Show a time-of-day picker.
int host_ui_repaint(void)
Force a repaint of the current view.
int host_ui_set_view_empty(const char *text)
Override the empty-state text shown by an empty list view.
int host_ui_push_message(const char *text, uint8_t icon, uint32_t duration_ms)
Show a blocking message view that auto-dismisses after duration_ms.
int host_ui_view_markdown(const uint8_t *data, uint32_t len)
Render and show Markdown from an in-memory (UTF-8) buffer. No capability required; the buffer is boun...
int host_ui_push_t9_input(const char *title, const char *initial, uint16_t max_len, uint32_t action_id)
Show a T9-style text entry.
int host_ui_push_date(const char *title, uint8_t d, uint8_t m, uint16_t y, uint32_t action_id)
Show a date picker.
int host_ui_push_info(const char *title, const char *body)
Show a scrollable info screen with title and body.
int host_ui_release_exclusive(void)
Release a previously acquired exclusive UI lock.
int host_ui_consume_input_text(char *out, size_t out_size)
Read text input committed by the most recent input view.
int host_ui_consume_input_int(int32_t *out)
Read integer input committed by the most recent input view.
int host_ui_push_context_menu(const char *title, const ui_item_t *items, uint16_t count, uint32_t select_action_id)
Show a context menu. At most 8 items (ContextMenuView::MAX_ITEMS); the menu is scrollable and shows 4...
int host_ui_push_confirm(const char *text, uint8_t icon, uint32_t action_id)
Show a Y/N confirmation.
int host_ui_push_slider(const char *title, int32_t min, int32_t max, int32_t init, int32_t step, const char *unit, uint32_t action_id)
Show an integer slider.
int host_ui_push_color_picker(uint8_t initial_r, uint8_t initial_g, uint8_t initial_b, uint32_t action_id)
Show an RGB color picker.
int host_ui_push_toast(const char *text, uint8_t icon, uint16_t duration_ms)
Show a transient toast overlay.
int host_ui_insert_list_item(uint16_t index, const ui_item_t *item)
Insert a list row at index (partial redraw).
int host_ui_push_pin_entry(const char *title, uint8_t max_len, uint8_t max_attempts, uint32_t action_id)
Show a numeric PIN entry.
int host_ui_pop_to_plugin(void)
Pop back to the plugin's first view.
int host_ui_push_list(const char *title, const ui_item_t *items, uint16_t count, uint32_t select_action_id, uint32_t menu_action_id)
Show a list view.
int host_ui_push_password(const char *title, const char *initial, uint16_t max_len, uint32_t action_id)
Show a password entry (masked T9).
int host_ui_update_list_item(uint16_t index, const ui_item_t *item)
Update one list row in place (partial redraw).
int host_ui_view_image(const uint8_t *data, uint32_t len)
Decode and show an image (PNG/JPEG) from an in-memory buffer, dithered. No capability required; the b...
int host_ui_wink(uint8_t count, uint16_t period_ms)
Blink the backlight as a visual identification signal.
int host_ui_replace_list(const char *title, const ui_item_t *items, uint16_t count, uint32_t select_action_id, uint32_t menu_action_id)
Replace the plugin's top list view in place; falls back to push when none.
int host_ui_set_view_footer(const char *hint)
Override the footer hint of the plugin's current top view.
int host_browser_open(const char *url)
Open a URL in the badge browser (enters the browser and loads it). No capability required.
int host_usb_cdc_write(const uint8_t *data, size_t len)
Write raw bytes to the USB-CDC TX stream.
int host_vcard_received_count(void)
Number of received vCards in the store.
int host_vcard_received_add(const char *vcard, size_t len)
Store a new received vCard.
int host_vcard_received_display(uint16_t index, char *out, size_t out_size)
Copy the display name of the received vCard at sorted position index into out (for list rows).
int host_vcard_set_own(const char *vcard, size_t len)
Set / replace the badge's own vCard.
int host_vcard_received_update(uint16_t index, const char *vcard, size_t len)
Overwrite the received vCard at sorted position index.
int host_vcard_get_own(char *out, size_t out_size)
Copy the badge's own vCard text into out.
int host_vcard_received_delete(uint16_t index)
Delete the received vCard at sorted position index.
int host_vcard_received_get(uint16_t index, char *out, size_t out_size)
Copy the received vCard at sorted position index into out.
int host_fs_view_markdown(const char *name)
Render and show one of the plugin's own Markdown files in the scrollable text viewer.
int host_fs_view_image(const char *name)
Decode and show one of the plugin's own image files (PNG/JPEG) on the e-paper, dithered and scaled to...
int host_fs_view(const char *name)
Open one of the plugin's own files in a scrollable on-screen text viewer (same as opening the file in...
int host_fs_size(const char *name, size_t *out)
Write the byte size of name to *out.
int host_fs_read(const char *name, uint8_t *buf, size_t *len)
Read name into buf.
int host_fs_remove(const char *name)
Delete name.
int host_fs_write(const char *name, const uint8_t *data, size_t len)
Create or overwrite name with len bytes.
int host_fs_list(char *out, size_t *out_len)
Enumerate the plugin's own files.
bool host_wifi_scan_done(void)
True when the scan started by host_wifi_start_scan has finished.
int host_wifi_scan_results(wifi_scan_result_t *out, size_t *count)
Read results from the last completed scan.
int host_wifi_mac(uint8_t out[6])
Read the station MAC address.
int host_wifi_request(uint32_t timeout_ms)
Request the shared WiFi radio and wait up to timeout_ms for join.
int host_wifi_ip(char *out, size_t out_size)
Copy the current IPv4 address as dotted decimal into out.
bool host_wifi_is_connected(void)
True when WiFi STA is associated and has an IP.
int host_wifi_release(void)
Release the WiFi radio held by this plugin.
int8_t host_wifi_rssi(void)
Current AP signal strength in dBm.
int host_wifi_start_scan(void)
Start an asynchronous WiFi scan.
int host_wifi_ssid(char *out, size_t out_size)
Copy the currently joined SSID into out.
CDC Badge OS plugin host API - canonical C ABI contract.
#define HOST_OK
Definition host_api.h:37
#define HOST_ERR_INVALID_ARG
Definition host_api.h:39
#define HOST_ERR_NO_MEMORY
Definition host_api.h:43
std::unique_ptr< T[], CapsFreeDeleter > PsramUniquePtr
Definition Raii.h:44
PsramUniquePtr< T > psramAlloc(std::size_t count) noexcept
Allocate count elements of T in PSRAM (8-bit capable region).
Definition Raii.h:51
static int32_t w_host_surface_draw_triangle(wasm_exec_env_t, uint32_t s, int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint32_t filled)
static int32_t w_host_ble_scan_done(wasm_exec_env_t)
static int32_t w_host_view_canvas_clear_ex(wasm_exec_env_t, uint32_t flags)
static int32_t w_host_base32_encode(wasm_exec_env_t, const uint8_t *in, uint32_t in_len, char *out, uint32_t out_size)
static int32_t w_host_view_canvas_clear(wasm_exec_env_t)
static int32_t w_host_nvs_set_blob(wasm_exec_env_t, const char *key, const uint8_t *buf, uint32_t len)
static int32_t w_host_view_canvas_set_value(wasm_exec_env_t, uint32_t widget_id, int32_t value)
static int32_t w_host_ui_update_list_item(wasm_exec_env_t exec_env, uint32_t index, const ui_item_t *item)
static int32_t w_host_ble_send_indication(wasm_exec_env_t, uint32_t ch, const uint8_t *data, uint32_t len)
static int32_t w_host_event_unsubscribe(wasm_exec_env_t, uint32_t sub)
static int32_t w_host_msg_register_handler(wasm_exec_env_t, const char *mime, uint32_t aid)
static int32_t w_host_ecc_generate(wasm_exec_env_t, const char *name, uint32_t curve)
static int32_t w_host_display_clear(wasm_exec_env_t)
static int32_t w_host_is_battery_low(wasm_exec_env_t)
static int32_t w_host_ui_push_toast(wasm_exec_env_t, const char *t, uint32_t icon, uint32_t ms)
static int32_t w_host_surface_draw_text(wasm_exec_env_t, uint32_t s, int32_t x, int32_t y, const char *text)
static uint32_t w_host_pixel_strip_length(wasm_exec_env_t)
static int32_t w_host_hex_encode(wasm_exec_env_t, const uint8_t *in, uint32_t in_len, char *out, uint32_t out_size)
static int32_t w_host_ble_unregister_service(wasm_exec_env_t, uint32_t h)
static int32_t w_host_i2c_read(wasm_exec_env_t, uint32_t bus, uint32_t addr, uint8_t *data, uint32_t len)
static int32_t w_host_ui_pop_to_plugin(wasm_exec_env_t)
static int32_t w_host_str_to_display(wasm_exec_env_t, const char *in, char *out, uint32_t out_size, uint32_t target)
static int32_t w_host_vcard_received_count(wasm_exec_env_t)
static int32_t w_host_msg_unregister_handler(wasm_exec_env_t, const char *mime)
static int32_t w_host_ecc_import(wasm_exec_env_t exec_env, const char *name, const uint8_t *priv, uint32_t curve)
static int32_t w_host_view_canvas_elem_clear(wasm_exec_env_t, uint32_t elem_id)
static int32_t w_host_anim_blink(wasm_exec_env_t, uint32_t elem_id, uint32_t period_ms, uint32_t count, uint32_t done_aid)
static int32_t w_host_surface_set_text_size(wasm_exec_env_t, uint32_t s, uint32_t size)
static int32_t w_host_surface_vline(wasm_exec_env_t, uint32_t s, int32_t x, int32_t y, int32_t h)
static bool wbuf_ok(wasm_exec_env_t env, const void *ptr, size_t len)
static int32_t w_host_ble_consume_read(wasm_exec_env_t, uint8_t *buf, uint32_t size)
static int32_t w_host_vcard_received_update(wasm_exec_env_t, uint32_t index, const char *vcard, uint32_t len)
static int32_t w_host_get_firmware_version(wasm_exec_env_t, char *out, uint32_t out_size)
static int32_t w_host_se_chip_id(wasm_exec_env_t exec_env, uint8_t *serial, uint32_t *len)
static int32_t w_host_vcard_set_own(wasm_exec_env_t, const char *vcard, uint32_t len)
static int32_t w_host_sprite_set_scale(wasm_exec_env_t, uint32_t sprite, uint32_t scale)
static int32_t w_host_ui_push_t9_input(wasm_exec_env_t, const char *title, const char *initial, uint32_t max_len, uint32_t action_id)
static int32_t w_host_image_render(wasm_exec_env_t exec_env, const uint8_t *data, uint32_t len, uint32_t target_w, uint8_t *out, uint32_t out_size, uint16_t *stride_out, uint16_t *height_out)
static int32_t w_host_sprite_play(wasm_exec_env_t, uint32_t sprite, uint32_t mode, uint32_t frame_ms, uint32_t repeat, uint32_t done_aid)
static int32_t w_host_ui_repaint(wasm_exec_env_t)
static int32_t w_host_ble_discover(wasm_exec_env_t, uint32_t conn, const uint8_t *uuid, uint32_t aid)
static int32_t w_host_vcard_received_display(wasm_exec_env_t, uint32_t index, char *out, uint32_t out_size)
static int32_t w_host_view_canvas_draw_circle(wasm_exec_env_t, int32_t x, int32_t y, int32_t r, uint32_t filled)
static int32_t w_host_key_consume_next(wasm_exec_env_t, uint8_t *out)
static int32_t w_host_view_canvas_set_long_press_action(wasm_exec_env_t, uint32_t action_id)
static int32_t w_host_ui_remove_list_item(wasm_exec_env_t, uint32_t index)
static int32_t w_host_surface_draw_bitmap(wasm_exec_env_t, uint32_t s, int32_t x, int32_t y, int32_t w, int32_t h, const uint8_t *data, uint32_t len)
static int32_t w_host_vcard_received_delete(wasm_exec_env_t, uint32_t index)
static int32_t w_host_ble_consume_write(wasm_exec_env_t, uint32_t ch, uint8_t *buf, uint32_t size)
static int32_t w_host_wifi_ssid(wasm_exec_env_t, char *out, uint32_t sz)
static uint32_t w_host_display_width(wasm_exec_env_t)
static int32_t w_host_sha256(wasm_exec_env_t exec_env, const uint8_t *data, uint32_t len, uint8_t *out)
static int32_t w_host_ui_replace_list(wasm_exec_env_t exec_env, const char *title, const ui_item_t *items, uint32_t count, uint32_t sel, uint32_t menu)
static int32_t w_host_nvs_erase(wasm_exec_env_t, const char *key)
static int32_t w_host_gpio_pwm_start(wasm_exec_env_t, uint32_t pin, uint32_t freq, uint32_t duty)
static int32_t w_host_view_canvas_draw_round_rect(wasm_exec_env_t, int32_t x, int32_t y, int32_t w, int32_t h, int32_t r, uint32_t filled)
static int32_t w_host_net_listen(wasm_exec_env_t, uint32_t port, uint32_t action_id)
static int32_t w_host_ble_device_name(wasm_exec_env_t, char *out, uint32_t size)
static int32_t w_host_ui_set_view_footer(wasm_exec_env_t, const char *hint)
static int32_t w_host_sprite_create_from_image(wasm_exec_env_t, const uint8_t *data, uint32_t len, uint32_t target_w, uint32_t frame_h)
static int32_t w_host_view_canvas_elem_remove(wasm_exec_env_t, uint32_t elem_id)
static int32_t w_host_ui_insert_list_item(wasm_exec_env_t exec_env, uint32_t index, const ui_item_t *item)
static int32_t w_host_view_canvas_elem_begin(wasm_exec_env_t, uint32_t elem_id)
static int32_t w_host_msg_send_interactive(wasm_exec_env_t, const char *mime, const uint8_t *data, uint32_t len, uint32_t flags)
static int32_t w_host_view_canvas_draw_pixel(wasm_exec_env_t, int32_t x, int32_t y)
static int32_t w_host_pixel_strip_fill(wasm_exec_env_t, uint32_t r, uint32_t g, uint32_t b)
static int32_t w_host_ble_write_char(wasm_exec_env_t, uint32_t conn, uint32_t vh, const uint8_t *data, uint32_t len, uint32_t wr)
static int32_t w_host_aes_gcm_encrypt(wasm_exec_env_t exec_env, const uint8_t *key, const uint8_t *iv, const uint8_t *aad, uint32_t aad_len, const uint8_t *pt, uint32_t pt_len, uint8_t *ct, uint8_t *tag)
static int32_t w_host_qr_render_bitmap(wasm_exec_env_t exec_env, const char *data, uint32_t max_version, uint32_t ecc, uint32_t scale, uint32_t quiet, uint8_t *out, uint32_t out_size, uint16_t *stride_out, uint16_t *height_out)
static cdc::core::PsramUniquePtr< NativeSymbol > s_symbols_ram
static int32_t w_host_view_canvas_draw_triangle(wasm_exec_env_t, int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint32_t filled)
static int32_t w_host_nvs_set_str(wasm_exec_env_t, const char *key, const char *value)
static int32_t w_host_ui_push_password(wasm_exec_env_t, const char *title, const char *initial, uint32_t max_len, uint32_t action_id)
static int32_t w_host_ble_scan_start(wasm_exec_env_t, uint32_t dur)
static int32_t w_host_nvs_get_str(wasm_exec_env_t, const char *key, char *buf, uint32_t buf_size)
static int32_t w_host_aes_gcm_decrypt(wasm_exec_env_t exec_env, const uint8_t *key, const uint8_t *iv, const uint8_t *aad, uint32_t aad_len, const uint8_t *ct, uint32_t ct_len, const uint8_t *tag, uint8_t *pt)
static int32_t w_host_adc_read(wasm_exec_env_t exec_env, uint32_t pin, uint16_t *raw, uint16_t *mv)
static int32_t w_host_pixel_strip_ready(wasm_exec_env_t)
static int32_t w_host_ui_view_markdown(wasm_exec_env_t env, const uint8_t *data, uint32_t len)
static int32_t w_host_view_canvas_add_text(wasm_exec_env_t, uint32_t widget_id, uint32_t max_len, const char *initial)
static int32_t w_host_ecc_pubkey(wasm_exec_env_t exec_env, const char *name, uint8_t *pub, uint32_t curve)
static int32_t w_host_vcard_received_get(wasm_exec_env_t, uint32_t index, char *out, uint32_t out_size)
static int32_t w_host_view_canvas_set_focus(wasm_exec_env_t, uint32_t widget_id)
static int32_t w_host_wifi_is_connected(wasm_exec_env_t)
static int32_t w_host_http_set_header(wasm_exec_env_t, int32_t h, const char *k, const char *v)
static int32_t w_host_ble_subscribe(wasm_exec_env_t, uint32_t conn, uint32_t cccd, uint32_t aid)
static int32_t w_host_fs_view(wasm_exec_env_t, const char *name)
static int32_t w_host_lockscreen_register_action(wasm_exec_env_t, const char *label_key, uint32_t action_id)
static uint32_t w_host_battery_pct(wasm_exec_env_t)
static uint32_t w_host_battery_mv(wasm_exec_env_t)
static int32_t w_host_ext_feature_consume(wasm_exec_env_t, uint8_t *buf, uint32_t buf_size, char *feature_out, uint32_t feature_size)
static int32_t w_host_lockscreen_alert(wasm_exec_env_t, const char *text, uint32_t icon, uint32_t action_id)
static int32_t w_host_is_usb_connected(wasm_exec_env_t)
static int32_t w_host_gpio_pwm_stop(wasm_exec_env_t, uint32_t pin)
void unregister_host_imports()
Unregister the imports (called from PluginManager::deinit()).
static int32_t w_host_wifi_release(wasm_exec_env_t)
static int32_t w_host_surface_create(wasm_exec_env_t, uint32_t w, uint32_t h)
static int32_t w_host_gpio_write(wasm_exec_env_t, uint32_t pin, int32_t level)
static int32_t w_host_sprite_get_frame(wasm_exec_env_t exec_env, uint32_t sprite, uint16_t *out)
static int32_t w_host_gpio_read(wasm_exec_env_t exec_env, uint32_t pin, int32_t *out)
static int32_t w_host_nvs_get_blob(wasm_exec_env_t, const char *key, uint8_t *buf, uint32_t buf_size)
static int32_t w_host_pixel_strip_set(wasm_exec_env_t, uint32_t idx, uint32_t r, uint32_t g, uint32_t b)
static int32_t w_host_socket_close(wasm_exec_env_t, int32_t h)
static int32_t w_host_anim_state(wasm_exec_env_t, uint32_t handle)
static int32_t w_host_view_canvas_set_text_color(wasm_exec_env_t, uint32_t inverted)
static int32_t w_host_qr_measure(wasm_exec_env_t exec_env, const char *data, uint32_t max_version, uint32_t ecc, uint16_t *out_modules)
static int32_t w_host_set_resident(wasm_exec_env_t, int32_t resident)
static int32_t w_host_ble_scan_results(wasm_exec_env_t exec_env, void *out, uint32_t *count)
static int32_t w_host_anim_start(wasm_exec_env_t exec_env, const host_anim_t *cfg)
static int32_t w_host_vcard_get_own(wasm_exec_env_t, char *out, uint32_t out_size)
static uint32_t w_host_i18n_current_language(wasm_exec_env_t)
static int32_t w_host_view_canvas_push(wasm_exec_env_t, const char *title, uint32_t key_action_id, uint32_t widget_action_id)
static int32_t w_host_random(wasm_exec_env_t, uint8_t *buf, uint32_t len)
static int32_t w_host_rmem_name_used(wasm_exec_env_t, const char *name)
static void w_host_log(wasm_exec_env_t, uint32_t level, const char *tag, const char *msg)
static int32_t w_host_surface_draw_pixel(wasm_exec_env_t, uint32_t s, int32_t x, int32_t y)
static int32_t w_host_view_canvas_set_footer(wasm_exec_env_t, const char *hint)
static uint32_t w_host_cpu_load(wasm_exec_env_t)
static int32_t w_host_display_is_busy(wasm_exec_env_t)
static int32_t w_host_ble_consume_discovery(wasm_exec_env_t exec_env, void *out, uint32_t *count)
static int32_t w_host_pixel_strip_deinit(wasm_exec_env_t)
static int32_t w_host_fs_size(wasm_exec_env_t, const char *name)
static void w_host_log_hex(wasm_exec_env_t, const char *tag, const char *label, const uint8_t *data, uint32_t len)
static int64_t w_host_unix_time(wasm_exec_env_t)
static int32_t w_host_ui_push_color_picker(wasm_exec_env_t, uint32_t r, uint32_t g, uint32_t b, uint32_t action_id)
static int32_t w_host_ecdsa_sign(wasm_exec_env_t exec_env, const char *name, const uint8_t *msg, uint32_t len, uint8_t *sig)
static int32_t w_host_gpio_release(wasm_exec_env_t, uint32_t pin)
static int32_t w_host_surface_set_font(wasm_exec_env_t, uint32_t s, uint32_t font_id)
static int32_t w_host_http_read_chunk(wasm_exec_env_t, int32_t h, uint8_t *buf, uint32_t buf_size)
static int32_t w_host_ext_feature_use(wasm_exec_env_t, const char *feature, const uint8_t *data, uint32_t len, uint32_t status_aid)
static int32_t w_host_rmem_write_named(wasm_exec_env_t, const char *name, const uint8_t *buf, uint32_t len)
static int32_t w_host_view_canvas_get_body_size(wasm_exec_env_t exec_env, uint16_t *w, uint16_t *h)
static int32_t w_host_ble_on_write_complete(wasm_exec_env_t, uint32_t aid)
static int32_t w_host_ui_push_time(wasm_exec_env_t, const char *title, uint32_t h, uint32_t m, uint32_t action_id)
static int32_t w_host_se_fw_version(wasm_exec_env_t exec_env, uint8_t *riscv, uint8_t *spect)
static int32_t w_host_view_canvas_draw_line(wasm_exec_env_t, int32_t x0, int32_t y0, int32_t x1, int32_t y1)
static int32_t w_host_display_set_backlight(wasm_exec_env_t, uint32_t level)
static int32_t w_host_view_canvas_commit(wasm_exec_env_t, uint32_t full_refresh)
static int32_t w_host_surface_destroy(wasm_exec_env_t, uint32_t s)
static int32_t w_host_ui_wink(wasm_exec_env_t, uint32_t count, uint32_t period_ms)
static int32_t w_host_http_close(wasm_exec_env_t, int32_t h)
static int32_t w_host_view_canvas_get_text(wasm_exec_env_t, uint32_t widget_id, char *out, uint32_t cap)
static int32_t w_host_ui_set_view_empty(wasm_exec_env_t, const char *text)
static int32_t w_host_surface_export_jpg(wasm_exec_env_t exec_env, uint32_t s, uint32_t quality, uint8_t *out, uint32_t out_size, uint32_t *len_out)
static int32_t w_host_display_flush(wasm_exec_env_t, uint32_t mode)
static int32_t w_host_ext_feature_register_handler(wasm_exec_env_t, const char *feature, uint32_t aid)
static int32_t w_host_base32_decode(wasm_exec_env_t, const char *in, uint32_t in_len, uint8_t *out, uint32_t out_size)
static int32_t w_host_ui_pop(wasm_exec_env_t)
static int32_t w_host_surface_clear(wasm_exec_env_t, uint32_t s)
static int32_t w_host_view_canvas_marquee(wasm_exec_env_t, int32_t x, int32_t y, int32_t window_w, const char *text, uint32_t step_px, uint32_t frame_ms)
static int32_t w_host_ui_push_date(wasm_exec_env_t, const char *title, uint32_t d, uint32_t m, uint32_t y, uint32_t action_id)
static int32_t w_host_view_canvas_elem_end(wasm_exec_env_t)
static int32_t w_host_eddsa_sign(wasm_exec_env_t exec_env, const char *name, const uint8_t *msg, uint32_t len, uint8_t *sig)
static int32_t w_host_view_canvas_elem_set_offset(wasm_exec_env_t, uint32_t elem_id, int32_t ox, int32_t oy)
static int32_t w_host_browser_open(wasm_exec_env_t, const char *url)
static int32_t w_host_view_canvas_set_key_repeat(wasm_exec_env_t, uint32_t initial_ms, uint32_t repeat_ms)
static int32_t w_host_view_canvas_set_shade(wasm_exec_env_t, uint32_t shade)
static int32_t w_host_surface_draw_circle(wasm_exec_env_t, uint32_t s, int32_t x, int32_t y, int32_t r, uint32_t filled)
static int32_t w_host_anim_active_count(wasm_exec_env_t)
static int32_t w_host_view_canvas_draw_bitmap(wasm_exec_env_t env, int32_t x, int32_t y, int32_t w, int32_t h, const uint8_t *data, uint32_t len)
static int32_t w_host_is_battery_critical(wasm_exec_env_t)
static int32_t w_host_ui_push_info(wasm_exec_env_t, const char *title, const char *body)
static int32_t w_host_ui_release_exclusive(wasm_exec_env_t)
static int32_t w_host_get_build_profile(wasm_exec_env_t, char *out, uint32_t out_size)
static int32_t w_host_view_canvas_draw_rect(wasm_exec_env_t, int32_t x, int32_t y, int32_t w, int32_t h, uint32_t filled)
static int32_t w_host_ble_register_service(wasm_exec_env_t exec_env, void *def, void *chars, uint32_t num)
static int32_t w_host_usb_cdc_write(wasm_exec_env_t, const uint8_t *data, uint32_t len)
static int32_t w_host_sprite_set_mask(wasm_exec_env_t, uint32_t sprite, const uint8_t *mask, uint32_t len)
static int32_t w_host_surface_draw_sprite(wasm_exec_env_t, uint32_t s, int32_t x, int32_t y, uint32_t sprite)
static int32_t w_host_ble_connect(wasm_exec_env_t, const uint8_t *addr, uint32_t type)
static int32_t w_host_fs_read(wasm_exec_env_t, const char *name, uint8_t *buf, uint32_t buf_size)
static int32_t w_host_surface_export(wasm_exec_env_t exec_env, uint32_t s, uint8_t *out, uint32_t out_size, uint16_t *stride_out)
static int32_t w_host_view_canvas_draw_text_aligned(wasm_exec_env_t, int32_t x, int32_t y, int32_t w, const char *text, uint32_t align)
static uint32_t w_host_power_source(wasm_exec_env_t)
static int32_t w_host_sprite_set_flags(wasm_exec_env_t, uint32_t sprite, uint32_t flags)
static int32_t w_host_rmem_read_named(wasm_exec_env_t, const char *name, uint8_t *buf, uint32_t buf_size)
static int32_t w_host_ui_set_view_lifecycle(wasm_exec_env_t, uint32_t hide_action_id, uint32_t show_action_id)
static int32_t w_host_gpio_set_pull(wasm_exec_env_t, uint32_t pin, uint32_t pull)
static int32_t w_host_wifi_request(wasm_exec_env_t, uint32_t t)
static int32_t w_host_i18n_tr_core(wasm_exec_env_t, const char *k, char *o, uint32_t c)
static int32_t w_host_view_canvas_get_value(wasm_exec_env_t exec_env, uint32_t widget_id, int32_t *out)
static int32_t w_host_ble_rssi(wasm_exec_env_t)
static int32_t w_host_ecc_delete(wasm_exec_env_t, const char *name)
static int32_t w_host_nvs_set_u32(wasm_exec_env_t, const char *key, uint32_t value)
static int32_t w_host_ble_disconnect(wasm_exec_env_t, uint32_t conn)
static int32_t w_host_rmem_erase_named(wasm_exec_env_t, const char *name)
static int32_t w_host_fs_list(wasm_exec_env_t, char *out, uint32_t out_size)
static int32_t w_host_view_canvas_draw_text(wasm_exec_env_t, int32_t x, int32_t y, const char *text)
static int32_t w_host_socket_write(wasm_exec_env_t, int32_t h, const uint8_t *data, uint32_t len, uint32_t timeout)
static int32_t w_host_pixel_strip_refresh(wasm_exec_env_t)
static int32_t w_host_display_fill_rect(wasm_exec_env_t, int32_t x, int32_t y, int32_t w, int32_t h, uint32_t color)
static int32_t w_host_fs_remove(wasm_exec_env_t, const char *name)
static int32_t w_host_display_draw_rect(wasm_exec_env_t, int32_t x, int32_t y, int32_t w, int32_t h, uint32_t color)
static int32_t w_host_text_pick_font_that_fits(wasm_exec_env_t, const char *text, int32_t max_width_px, const uint8_t *candidates, uint32_t count, uint8_t *out_font_id)
static int32_t w_host_hmac_sha256(wasm_exec_env_t exec_env, const uint8_t *key, uint32_t klen, const uint8_t *data, uint32_t dlen, uint8_t *out)
static int32_t w_host_view_canvas_elem_set_z(wasm_exec_env_t, uint32_t elem_id, int32_t z)
static int32_t w_host_wifi_mac(wasm_exec_env_t exec_env, uint8_t *out)
static uint64_t w_host_uptime_ms(wasm_exec_env_t)
static int32_t w_host_ecc_exists(wasm_exec_env_t, const char *name)
static int32_t w_host_view_canvas_add_slider(wasm_exec_env_t, uint32_t widget_id, int32_t min, int32_t max, int32_t initial, int32_t step)
static int32_t w_host_base64_encode(wasm_exec_env_t, const uint8_t *in, uint32_t in_len, char *out, uint32_t out_size)
static int32_t w_host_ui_push_list(wasm_exec_env_t exec_env, const char *title, const ui_item_t *items, uint32_t count, uint32_t sel, uint32_t menu)
static int32_t w_host_ext_feature_available(wasm_exec_env_t, const char *feature)
static int32_t w_host_sao_eeprom_read(wasm_exec_env_t, uint32_t off, uint8_t *buf, uint32_t len)
static int32_t w_host_hex_decode(wasm_exec_env_t, const char *in, uint32_t in_len, uint8_t *out, uint32_t out_size)
static int32_t w_host_ui_acquire_exclusive(wasm_exec_env_t)
static int32_t w_host_timezone_offset(wasm_exec_env_t)
static int32_t w_host_view_canvas_set_text(wasm_exec_env_t, uint32_t widget_id, const char *text)
static int32_t w_host_fs_write(wasm_exec_env_t, const char *name, const uint8_t *data, uint32_t len)
static int32_t w_host_surface_set_shade(wasm_exec_env_t, uint32_t s, uint32_t shade)
static int32_t w_host_surface_draw_round_rect(wasm_exec_env_t, uint32_t s, int32_t x, int32_t y, int32_t w, int32_t h, int32_t r, uint32_t filled)
static int32_t w_host_view_canvas_get_focus(wasm_exec_env_t exec_env, uint32_t *out)
static int32_t w_host_i18n_tr_key(wasm_exec_env_t, const char *k, char *o, uint32_t c)
static int32_t w_host_view_canvas_set_ink(wasm_exec_env_t, uint32_t white)
static uint32_t w_host_http_content_length(wasm_exec_env_t, int32_t h)
static int32_t w_host_ble_is_enabled(wasm_exec_env_t)
static int32_t w_host_event_subscribe(wasm_exec_env_t, uint32_t mask, uint32_t action_id)
static int32_t w_host_pixel_strip_clear(wasm_exec_env_t)
static int32_t w_host_gpio_set_direction(wasm_exec_env_t, uint32_t pin, uint32_t dir)
static int32_t w_host_ui_push_confirm(wasm_exec_env_t, const char *text, uint32_t icon, uint32_t action_id)
static int32_t w_host_net_close(wasm_exec_env_t, uint32_t port)
static int32_t w_host_view_canvas_vline(wasm_exec_env_t, int32_t x, int32_t y, int32_t h)
static int32_t w_host_surface_hline(wasm_exec_env_t, uint32_t s, int32_t x, int32_t y, int32_t w)
static int32_t w_host_view_canvas_hline(wasm_exec_env_t, int32_t x, int32_t y, int32_t w)
static int32_t w_host_socket_read(wasm_exec_env_t, int32_t h, uint8_t *out, uint32_t cap, uint32_t timeout)
static int32_t w_host_display_draw_line(wasm_exec_env_t, int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t color)
static int32_t w_host_lockscreen_unregister_action(wasm_exec_env_t)
static int32_t w_host_view_canvas_set_text_size(wasm_exec_env_t, uint32_t size)
static int32_t w_host_display_draw_pixel(wasm_exec_env_t, int32_t x, int32_t y, uint32_t color)
static void w_host_set_sleep_inhibit(wasm_exec_env_t, uint32_t on)
static int32_t w_host_surface_draw_rect(wasm_exec_env_t, uint32_t s, int32_t x, int32_t y, int32_t w, int32_t h, uint32_t filled)
static int32_t w_host_ble_read_char(wasm_exec_env_t, uint32_t conn, uint32_t vh, uint32_t aid)
static int32_t w_host_surface_measure_text(wasm_exec_env_t exec_env, uint32_t s, const char *text, uint16_t *out_w, uint16_t *out_h)
static int32_t w_host_ui_push_slider(wasm_exec_env_t, const char *title, int32_t min, int32_t max, int32_t init, int32_t step, const char *unit, uint32_t action_id)
static int32_t w_host_sprite_create_from_surface(wasm_exec_env_t, uint32_t surface, uint32_t w, uint32_t h, uint32_t frames)
static uint32_t w_host_display_get_backlight(wasm_exec_env_t)
static uint32_t w_host_ble_get_mtu(wasm_exec_env_t, uint32_t conn)
static int32_t w_host_fs_view_markdown(wasm_exec_env_t, const char *name)
static int32_t w_host_gpio_pwm_set_duty(wasm_exec_env_t, uint32_t pin, uint32_t duty)
static int32_t w_host_surface_set_text_color(wasm_exec_env_t, uint32_t s, uint32_t inverted)
static uint32_t w_host_rmem_slot_size(wasm_exec_env_t)
static int32_t w_host_view_canvas_set_font(wasm_exec_env_t, uint32_t font_id)
static int32_t w_host_ui_push_pin_entry(wasm_exec_env_t, const char *title, uint32_t max_len, uint32_t max_attempts, uint32_t action_id)
static int32_t w_host_nvs_get_u32(wasm_exec_env_t exec_env, const char *key, uint32_t *out)
static int32_t w_host_ble_send_notification(wasm_exec_env_t, uint32_t ch, const uint8_t *data, uint32_t len)
static int32_t w_host_fs_view_image(wasm_exec_env_t, const char *name)
static int32_t w_host_view_canvas_elem_show(wasm_exec_env_t, uint32_t elem_id, uint32_t visible)
static int32_t w_host_sprite_stop(wasm_exec_env_t, uint32_t sprite)
static int32_t w_host_ext_feature_result(wasm_exec_env_t, int32_t status_code)
static int32_t w_host_surface_draw_text_aligned(wasm_exec_env_t, uint32_t s, int32_t x, int32_t y, int32_t w, const char *text, uint32_t align)
static int32_t w_host_ble_consume_notification(wasm_exec_env_t exec_env, uint16_t *vh_out, uint8_t *buf, uint32_t size)
static int32_t w_host_nvs_list_keys(wasm_exec_env_t exec_env, char *out, uint32_t *out_len)
static const NativeSymbol s_symbols[]
static int32_t w_host_ble_mac(wasm_exec_env_t exec_env, uint8_t *out)
static int32_t w_host_sprite_set_frame_durations(wasm_exec_env_t exec_env, uint32_t sprite, const uint16_t *ms, uint32_t count)
static int32_t w_host_display_draw_text(wasm_exec_env_t, int32_t x, int32_t y, const char *text, uint32_t size, uint32_t color)
static int32_t w_host_wifi_scan_done(wasm_exec_env_t)
static int32_t w_host_http_status(wasm_exec_env_t, int32_t h)
static int32_t w_host_http_perform(wasm_exec_env_t, int32_t h)
static int32_t w_host_wifi_scan_results(wasm_exec_env_t exec_env, void *out, uint32_t *count)
static int32_t w_host_i2c_write(wasm_exec_env_t, uint32_t bus, uint32_t addr, const uint8_t *data, uint32_t len)
static int32_t w_host_sprite_destroy(wasm_exec_env_t, uint32_t sprite)
static int32_t w_host_i2c_scan(wasm_exec_env_t exec_env, uint32_t bus, uint8_t *found, uint32_t *count)
static int32_t w_host_anim_pause(wasm_exec_env_t, uint32_t handle, uint32_t paused)
static int32_t w_host_view_canvas_remove_widget(wasm_exec_env_t, uint32_t widget_id)
static int32_t w_host_view_canvas_set_anim_policy(wasm_exec_env_t, uint32_t policy, uint32_t max_fps)
static int32_t w_host_is_time_set(wasm_exec_env_t)
static int32_t w_host_msg_send(wasm_exec_env_t exec_env, const uint8_t *addr, uint32_t addr_type, const char *mime, const uint8_t *data, uint32_t len, uint32_t flags)
static int32_t w_host_image_info(wasm_exec_env_t exec_env, const uint8_t *data, uint32_t len, uint16_t *out_w, uint16_t *out_h)
static int32_t w_host_local_time(wasm_exec_env_t exec_env, void *out)
static int32_t w_host_msg_consume(wasm_exec_env_t, uint8_t *buf, uint32_t buf_size, char *mime_out, uint32_t mime_size)
static int32_t w_host_http_open(wasm_exec_env_t, uint32_t method, const char *url, uint32_t timeout)
static int32_t w_host_view_canvas_elem_get_offset(wasm_exec_env_t exec_env, uint32_t elem_id, int16_t *ox, int16_t *oy)
static int32_t w_host_view_canvas_elem_get_bounds(wasm_exec_env_t exec_env, uint32_t elem_id, int16_t *x, int16_t *y, uint16_t *w, uint16_t *h)
static uint32_t w_host_display_height(wasm_exec_env_t)
static int32_t w_host_i2c_write_read(wasm_exec_env_t, uint32_t bus, uint32_t addr, const uint8_t *wr, uint32_t wr_len, uint8_t *rd, uint32_t rd_len)
static int32_t w_host_view_canvas_elem_move(wasm_exec_env_t, uint32_t elem_id, int32_t dx, int32_t dy)
static int32_t w_host_ui_push_message(wasm_exec_env_t, const char *t, uint32_t icon, uint32_t ms)
static int32_t w_host_sprite_create(wasm_exec_env_t, uint32_t w, uint32_t h, uint32_t frames, const uint8_t *data, uint32_t len)
static int32_t w_host_random_strict(wasm_exec_env_t, uint8_t *buf, uint32_t len)
static uint32_t w_host_charge_status(wasm_exec_env_t)
static int32_t w_host_i18n_tr_meta(wasm_exec_env_t, const char *f, char *o, uint32_t c)
static int32_t w_host_ui_consume_input_int(wasm_exec_env_t exec_env, int32_t *out)
static int32_t w_host_ui_consume_input_text(wasm_exec_env_t, char *out, uint32_t out_size)
static int32_t w_host_sao_eeprom_write(wasm_exec_env_t, uint32_t off, const uint8_t *buf, uint32_t len)
static int32_t w_host_ble_subscribe_char(wasm_exec_env_t, uint32_t conn, uint32_t vh, uint32_t aid)
static int32_t w_host_event_publish(wasm_exec_env_t, uint32_t subtype, uint32_t value)
static int32_t w_host_pixel_strip_init(wasm_exec_env_t, uint32_t gpio, uint32_t num, uint32_t format)
static uint32_t w_host_ble_conn_handle(wasm_exec_env_t)
bool register_host_imports()
Register the "cdc" import namespace with WAMR.
static int32_t w_host_cmd_consume(wasm_exec_env_t, char *out, uint32_t out_size)
static int32_t w_host_ui_set_inactivity(wasm_exec_env_t, uint32_t timeout_ms, uint32_t action_id)
static int32_t w_host_feature_enabled(wasm_exec_env_t, uint32_t feature_id)
static int32_t w_host_anim_cancel(wasm_exec_env_t, uint32_t handle)
static int32_t w_host_nvs_erase_all(wasm_exec_env_t)
static int32_t w_host_http_set_body(wasm_exec_env_t, int32_t h, const uint8_t *body, uint32_t len)
static int32_t w_host_vcard_received_add(wasm_exec_env_t, const char *vcard, uint32_t len)
static int32_t w_host_wifi_rssi(wasm_exec_env_t)
static int32_t w_host_key_pressed(wasm_exec_env_t, uint32_t key)
static int32_t w_host_ui_view_image(wasm_exec_env_t env, const uint8_t *data, uint32_t len)
static int32_t w_host_socket_open(wasm_exec_env_t, uint32_t proto, const char *host, uint32_t port, uint32_t timeout)
static int32_t w_host_surface_draw_line(wasm_exec_env_t, uint32_t s, int32_t x0, int32_t y0, int32_t x1, int32_t y1)
static int32_t w_host_sprite_set_frame(wasm_exec_env_t, uint32_t sprite, uint32_t frame)
static int32_t w_host_wifi_start_scan(wasm_exec_env_t)
static int32_t w_host_view_canvas_draw_sprite(wasm_exec_env_t, int32_t x, int32_t y, uint32_t sprite)
static int32_t w_host_wifi_ip(wasm_exec_env_t, char *out, uint32_t sz)
static int32_t w_host_net_accept(wasm_exec_env_t)
static int32_t w_host_ui_push_context_menu(wasm_exec_env_t exec_env, const char *title, const ui_item_t *items, uint32_t count, uint32_t sel)
static int32_t w_host_view_canvas_add_button(wasm_exec_env_t, uint32_t widget_id)
static int32_t w_host_base64_decode(wasm_exec_env_t, const char *in, uint32_t in_len, uint8_t *out, uint32_t out_size)
static int32_t w_host_str_to_utf8(wasm_exec_env_t, const char *in, char *out, uint32_t out_size)
One characteristic of a plugin GATT service (peripheral role).
Definition host_api.h:534
One characteristic discovered on a connected peer (central role).
Definition host_api.h:559
One device from a central scan.
Definition host_api.h:551
A plugin GATT service definition (peripheral role). Always primary.
Definition host_api.h:543
Tween description for host_anim_start(); zero-init unused fields.
Definition host_api.h:1500
const char * label
Definition host_api.h:824