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
85namespace {
86int translate_and_call(wasm_exec_env_t exec_env, const char* title, const ui_item_t* items,
87 uint32_t count, uint32_t sel, uint32_t menu, bool replace)
88{
89 if (count == 0 || !items) {
90 return replace ? host_ui_replace_list(title, items, 0, sel, menu)
91 : host_ui_push_list (title, items, 0, sel, menu);
92 }
93 wasm_module_inst_t inst = wasm_runtime_get_module_inst(exec_env);
95 if (!wasm_runtime_validate_native_addr(inst, const_cast<ui_item_t*>(items),
96 static_cast<uint64_t>(count) * sizeof(ui_item_t)))
98 auto native = cdc::core::psramAlloc<ui_item_t>(count);
99 if (!native) return HOST_ERR_NO_MEMORY;
100 for (uint32_t i = 0; i < count; ++i) {
101 native[i] = items[i];
102 uint32_t off = static_cast<uint32_t>(reinterpret_cast<uintptr_t>(items[i].label));
103 if (off != 0 && wasm_runtime_validate_app_str_addr(inst, off)) {
104 native[i].label = static_cast<const char*>(wasm_runtime_addr_app_to_native(inst, off));
105 } else {
106 native[i].label = "";
107 }
108 }
109 return replace ? host_ui_replace_list(title, native.get(), static_cast<uint16_t>(count), sel, menu)
110 : host_ui_push_list (title, native.get(), static_cast<uint16_t>(count), sel, menu);
111}
112} // namespace
113
114static int32_t w_host_ui_push_list(wasm_exec_env_t exec_env, const char* title, const ui_item_t* items,
115 uint32_t count, uint32_t sel, uint32_t menu)
116{
117 return translate_and_call(exec_env, title, items, count, sel, menu, false);
118}
119
120static int32_t w_host_ui_replace_list(wasm_exec_env_t exec_env, const char* title, const ui_item_t* items,
121 uint32_t count, uint32_t sel, uint32_t menu)
122{
123 return translate_and_call(exec_env, title, items, count, sel, menu, true);
124}
125
126static int32_t w_host_ui_set_view_footer(wasm_exec_env_t, const char* hint)
127{
128 return host_ui_set_view_footer(hint);
129}
130
131static int32_t w_host_ui_set_view_empty(wasm_exec_env_t, const char* text)
132{
133 return host_ui_set_view_empty(text);
134}
135
136static int32_t w_host_ui_set_view_lifecycle(wasm_exec_env_t, uint32_t hide_action_id,
137 uint32_t show_action_id)
138{
139 return host_ui_set_view_lifecycle(hide_action_id, show_action_id);
140}
141
142static int32_t w_host_ui_update_list_item(wasm_exec_env_t exec_env, uint32_t index,
143 const ui_item_t* item)
144{
145 if (!item) return HOST_ERR_INVALID_ARG;
146 wasm_module_inst_t inst = wasm_runtime_get_module_inst(exec_env);
147 if (!wasm_runtime_validate_native_addr(inst, const_cast<ui_item_t*>(item), sizeof(ui_item_t)))
149 ui_item_t native = *item;
150 uint32_t off = static_cast<uint32_t>(reinterpret_cast<uintptr_t>(item->label));
151 if (off != 0 && wasm_runtime_validate_app_str_addr(inst, off)) {
152 native.label = static_cast<const char*>(wasm_runtime_addr_app_to_native(inst, off));
153 } else {
154 native.label = "";
155 }
156 return host_ui_update_list_item(static_cast<uint16_t>(index), &native);
157}
158
159static int32_t w_host_ui_insert_list_item(wasm_exec_env_t exec_env, uint32_t index,
160 const ui_item_t* item)
161{
162 if (!item) return HOST_ERR_INVALID_ARG;
163 wasm_module_inst_t inst = wasm_runtime_get_module_inst(exec_env);
164 if (!wasm_runtime_validate_native_addr(inst, const_cast<ui_item_t*>(item), sizeof(ui_item_t)))
166 ui_item_t native = *item;
167 uint32_t off = static_cast<uint32_t>(reinterpret_cast<uintptr_t>(item->label));
168 if (off != 0 && wasm_runtime_validate_app_str_addr(inst, off)) {
169 native.label = static_cast<const char*>(wasm_runtime_addr_app_to_native(inst, off));
170 } else {
171 native.label = "";
172 }
173 return host_ui_insert_list_item(static_cast<uint16_t>(index), &native);
174}
175
176static int32_t w_host_ui_remove_list_item(wasm_exec_env_t, uint32_t index)
177{
178 return host_ui_remove_list_item(static_cast<uint16_t>(index));
179}
180
181static int32_t w_host_ui_push_context_menu(wasm_exec_env_t exec_env, const char* title,
182 const ui_item_t* items, uint32_t count, uint32_t sel)
183{
184 if (count == 0 || !items) return host_ui_push_context_menu(title, items, 0, sel);
185 wasm_module_inst_t inst = wasm_runtime_get_module_inst(exec_env);
186 constexpr uint32_t kMaxItems = cdc::ui::ContextMenuView::MAX_ITEMS;
187 if (count > kMaxItems) count = kMaxItems;
188 if (!wasm_runtime_validate_native_addr(inst, const_cast<ui_item_t*>(items),
189 static_cast<uint64_t>(count) * sizeof(ui_item_t)))
191 ui_item_t native[kMaxItems];
192 for (uint32_t i = 0; i < count; ++i) {
193 native[i] = items[i];
194 uint32_t off = static_cast<uint32_t>(reinterpret_cast<uintptr_t>(items[i].label));
195 if (off != 0 && wasm_runtime_validate_app_str_addr(inst, off)) {
196 native[i].label = static_cast<const char*>(wasm_runtime_addr_app_to_native(inst, off));
197 } else {
198 native[i].label = "";
199 }
200 }
201 return host_ui_push_context_menu(title, native, static_cast<uint16_t>(count), sel);
202}
203
204static int32_t w_host_ui_pop(wasm_exec_env_t) { return host_ui_pop(); }
205static int32_t w_host_ui_pop_to_plugin(wasm_exec_env_t) { return host_ui_pop_to_plugin(); }
206static int32_t w_host_ui_repaint(wasm_exec_env_t) { return host_ui_repaint(); }
207static int32_t w_host_ui_wink(wasm_exec_env_t, uint32_t count, uint32_t period_ms)
208{ return host_ui_wink(static_cast<uint8_t>(count), static_cast<uint16_t>(period_ms)); }
209
210static int32_t w_host_ui_push_t9_input(wasm_exec_env_t, const char* title, const char* initial,
211 uint32_t max_len, uint32_t action_id)
212{ return host_ui_push_t9_input(title, initial, static_cast<uint16_t>(max_len), action_id); }
213
214static int32_t w_host_ui_push_password(wasm_exec_env_t, const char* title, const char* initial,
215 uint32_t max_len, uint32_t action_id)
216{ return host_ui_push_password(title, initial, static_cast<uint16_t>(max_len), action_id); }
217
218static int32_t w_host_ui_push_pin_entry(wasm_exec_env_t, const char* title, uint32_t max_len,
219 uint32_t max_attempts, uint32_t action_id)
220{ return host_ui_push_pin_entry(title, static_cast<uint8_t>(max_len),
221 static_cast<uint8_t>(max_attempts), action_id); }
222
223static int32_t w_host_ui_push_slider(wasm_exec_env_t, const char* title, int32_t min, int32_t max,
224 int32_t init, int32_t step, const char* unit, uint32_t action_id)
225{ return host_ui_push_slider(title, min, max, init, step, unit, action_id); }
226
227static int32_t w_host_ui_push_color_picker(wasm_exec_env_t, uint32_t r, uint32_t g,
228 uint32_t b, uint32_t action_id)
229{ return host_ui_push_color_picker(static_cast<uint8_t>(r), static_cast<uint8_t>(g),
230 static_cast<uint8_t>(b), action_id); }
231
232static int32_t w_host_ui_consume_input_text(wasm_exec_env_t, char* out, uint32_t out_size)
233{ return host_ui_consume_input_text(out, out_size); }
234
235static int32_t w_host_ui_consume_input_int(wasm_exec_env_t exec_env, int32_t* out)
236{
237 if (!wbuf_ok(exec_env, out, sizeof(int32_t))) return HOST_ERR_INVALID_ARG;
238 return host_ui_consume_input_int(out);
239}
240
241// -- Canvas view -----------------------------------------------------------
242
243static int32_t w_host_view_canvas_push(wasm_exec_env_t, const char* title,
244 uint32_t key_action_id, uint32_t widget_action_id)
245{ return host_view_canvas_push(title, key_action_id, widget_action_id); }
246
247static int32_t w_host_view_canvas_get_body_size(wasm_exec_env_t exec_env, uint16_t* w, uint16_t* h)
248{
249 if (!wbuf_ok(exec_env, w, sizeof(uint16_t)) || !wbuf_ok(exec_env, h, sizeof(uint16_t)))
252}
253
254static int32_t w_host_view_canvas_set_footer(wasm_exec_env_t, const char* hint)
255{ return host_view_canvas_set_footer(hint); }
256
257static int32_t w_host_view_canvas_clear(wasm_exec_env_t)
258{ return host_view_canvas_clear(); }
259
260static int32_t w_host_view_canvas_set_text_size(wasm_exec_env_t, uint32_t size)
261{ return host_view_canvas_set_text_size(static_cast<uint8_t>(size)); }
262
263static int32_t w_host_view_canvas_set_text_color(wasm_exec_env_t, uint32_t inverted)
264{ return host_view_canvas_set_text_color(inverted != 0); }
265
266static int32_t w_host_view_canvas_set_font(wasm_exec_env_t, uint32_t font_id)
267{ return host_view_canvas_set_font(static_cast<uint8_t>(font_id)); }
268
269static int32_t w_host_text_pick_font_that_fits(wasm_exec_env_t, const char* text, int32_t max_width_px,
270 const uint8_t* candidates, uint32_t count,
271 uint8_t* out_font_id)
272{
273 return host_text_pick_font_that_fits(text, static_cast<int16_t>(max_width_px),
274 candidates, count, out_font_id);
275}
276
277static int32_t w_host_view_canvas_draw_text(wasm_exec_env_t, int32_t x, int32_t y, const char* text)
278{ return host_view_canvas_draw_text(static_cast<int16_t>(x), static_cast<int16_t>(y), text); }
279
280static int32_t w_host_view_canvas_draw_text_aligned(wasm_exec_env_t, int32_t x, int32_t y,
281 int32_t w, const char* text, uint32_t align)
282{ return host_view_canvas_draw_text_aligned(static_cast<int16_t>(x), static_cast<int16_t>(y),
283 static_cast<int16_t>(w), text,
284 static_cast<uint8_t>(align)); }
285
286static int32_t w_host_view_canvas_draw_rect(wasm_exec_env_t, int32_t x, int32_t y,
287 int32_t w, int32_t h, uint32_t filled)
288{ return host_view_canvas_draw_rect(static_cast<int16_t>(x), static_cast<int16_t>(y),
289 static_cast<int16_t>(w), static_cast<int16_t>(h),
290 filled != 0); }
291
292static int32_t w_host_view_canvas_invert_rect(wasm_exec_env_t, int32_t x, int32_t y,
293 int32_t w, int32_t h)
294{ return host_view_canvas_invert_rect(static_cast<int16_t>(x), static_cast<int16_t>(y),
295 static_cast<int16_t>(w), static_cast<int16_t>(h)); }
296
297static int32_t w_host_view_canvas_hline(wasm_exec_env_t, int32_t x, int32_t y, int32_t w)
298{ return host_view_canvas_hline(static_cast<int16_t>(x), static_cast<int16_t>(y),
299 static_cast<int16_t>(w)); }
300
301static int32_t w_host_view_canvas_vline(wasm_exec_env_t, int32_t x, int32_t y, int32_t h)
302{ return host_view_canvas_vline(static_cast<int16_t>(x), static_cast<int16_t>(y),
303 static_cast<int16_t>(h)); }
304
305static int32_t w_host_view_canvas_commit(wasm_exec_env_t, uint32_t full_refresh)
306{ return host_view_canvas_commit(full_refresh != 0); }
307
308static int32_t w_host_view_canvas_add_slider(wasm_exec_env_t, uint32_t widget_id,
309 int32_t min, int32_t max, int32_t initial, int32_t step)
310{ return host_view_canvas_add_slider(widget_id, min, max, initial, step); }
311
312static int32_t w_host_view_canvas_add_text(wasm_exec_env_t, uint32_t widget_id,
313 uint32_t max_len, const char* initial)
314{ return host_view_canvas_add_text(widget_id, static_cast<uint16_t>(max_len), initial); }
315
316static int32_t w_host_view_canvas_add_button(wasm_exec_env_t, uint32_t widget_id)
317{ return host_view_canvas_add_button(widget_id); }
318
319static int32_t w_host_view_canvas_remove_widget(wasm_exec_env_t, uint32_t widget_id)
320{ return host_view_canvas_remove_widget(widget_id); }
321
322static int32_t w_host_view_canvas_set_value(wasm_exec_env_t, uint32_t widget_id, int32_t value)
323{ return host_view_canvas_set_value(widget_id, value); }
324
325static int32_t w_host_view_canvas_get_value(wasm_exec_env_t exec_env, uint32_t widget_id, int32_t* out)
326{
327 if (!wbuf_ok(exec_env, out, sizeof(int32_t))) return HOST_ERR_INVALID_ARG;
328 return host_view_canvas_get_value(widget_id, out);
329}
330
331static int32_t w_host_view_canvas_set_text(wasm_exec_env_t, uint32_t widget_id, const char* text)
332{ return host_view_canvas_set_text(widget_id, text); }
333
334static int32_t w_host_view_canvas_get_text(wasm_exec_env_t, uint32_t widget_id,
335 char* out, uint32_t cap)
336{ return host_view_canvas_get_text(widget_id, out, cap); }
337
338static int32_t w_host_view_canvas_set_focus(wasm_exec_env_t, uint32_t widget_id)
339{ return host_view_canvas_set_focus(widget_id); }
340
341static int32_t w_host_view_canvas_get_focus(wasm_exec_env_t exec_env, uint32_t* out)
342{
343 if (!wbuf_ok(exec_env, out, sizeof(uint32_t))) return HOST_ERR_INVALID_ARG;
344 return host_view_canvas_get_focus(out);
345}
346
347static int32_t w_host_view_canvas_set_key_repeat(wasm_exec_env_t, uint32_t initial_ms, uint32_t repeat_ms)
348{ return host_view_canvas_set_key_repeat(static_cast<uint16_t>(initial_ms),
349 static_cast<uint16_t>(repeat_ms)); }
350
351static int32_t w_host_view_canvas_set_long_press_action(wasm_exec_env_t, uint32_t action_id)
352{ return host_view_canvas_set_long_press_action(action_id); }
353
354// -- I18n -------------------------------------------------------------------
355
356static 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); }
357static 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); }
358static 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); }
359static uint32_t w_host_i18n_current_language(wasm_exec_env_t) { return host_i18n_current_language(); }
360
361// -- NVS --------------------------------------------------------------------
362
363static int32_t w_host_nvs_get_blob(wasm_exec_env_t, const char* key, uint8_t* buf, uint32_t buf_size)
364{
365 size_t len = buf_size;
366 int rc = host_nvs_get_blob(key, buf, &len);
367 return rc == HOST_OK ? static_cast<int32_t>(len) : rc;
368}
369
370static int32_t w_host_nvs_set_blob(wasm_exec_env_t, const char* key, const uint8_t* buf, uint32_t len)
371{ return host_nvs_set_blob(key, buf, len); }
372
373static int32_t w_host_nvs_get_u32(wasm_exec_env_t exec_env, const char* key, uint32_t* out)
374{
375 if (!wbuf_ok(exec_env, out, sizeof(uint32_t))) return HOST_ERR_INVALID_ARG;
376 return host_nvs_get_u32(key, out);
377}
378
379static int32_t w_host_nvs_set_u32(wasm_exec_env_t, const char* key, uint32_t value)
380{ return host_nvs_set_u32(key, value); }
381
382static int32_t w_host_nvs_get_str(wasm_exec_env_t, const char* key, char* buf, uint32_t buf_size)
383{ return host_nvs_get_str(key, buf, buf_size); }
384
385static int32_t w_host_nvs_set_str(wasm_exec_env_t, const char* key, const char* value)
386{ return host_nvs_set_str(key, value); }
387
388static int32_t w_host_nvs_erase(wasm_exec_env_t, const char* key) { return host_nvs_erase(key); }
389
390// -- vFAT (sandboxed plugin file storage) -----------------------------------
391
392static int32_t w_host_fs_write(wasm_exec_env_t, const char* name, const uint8_t* data, uint32_t len)
393{ return host_fs_write(name, data, len); }
394
395static int32_t w_host_fs_read(wasm_exec_env_t, const char* name, uint8_t* buf, uint32_t buf_size)
396{
397 size_t len = buf_size;
398 int rc = host_fs_read(name, buf, &len);
399 return rc == HOST_OK ? static_cast<int32_t>(len) : rc;
400}
401
402static int32_t w_host_fs_remove(wasm_exec_env_t, const char* name) { return host_fs_remove(name); }
403
404static int32_t w_host_fs_size(wasm_exec_env_t, const char* name)
405{
406 size_t sz = 0;
407 int rc = host_fs_size(name, &sz);
408 return rc == HOST_OK ? static_cast<int32_t>(sz) : rc;
409}
410
411static int32_t w_host_fs_list(wasm_exec_env_t, char* out, uint32_t out_size)
412{
413 size_t len = out_size;
414 int rc = host_fs_list(out, &len);
415 return rc == HOST_OK ? static_cast<int32_t>(len) : rc;
416}
417
418static int32_t w_host_fs_view(wasm_exec_env_t, const char* name) { return host_fs_view(name); }
419
420// -- Crypto -----------------------------------------------------------------
421
422static int32_t w_host_random(wasm_exec_env_t, uint8_t* buf, uint32_t len)
423{ return host_random(buf, len); }
424
425static int32_t w_host_sha256(wasm_exec_env_t exec_env, const uint8_t* data, uint32_t len, uint8_t* out)
426{
427 if (!wbuf_ok(exec_env, out, 32)) return HOST_ERR_INVALID_ARG;
428 return host_sha256(data, len, out);
429}
430
431static int32_t w_host_hmac_sha256(wasm_exec_env_t exec_env, const uint8_t* key, uint32_t klen,
432 const uint8_t* data, uint32_t dlen, uint8_t* out)
433{
434 if (!wbuf_ok(exec_env, out, 32)) return HOST_ERR_INVALID_ARG;
435 return host_hmac_sha256(key, klen, data, dlen, out);
436}
437
438static int32_t w_host_base32_encode(wasm_exec_env_t, const uint8_t* in, uint32_t in_len, char* out, uint32_t out_size)
439{ return host_base32_encode(in, in_len, out, out_size); }
440
441static int32_t w_host_base32_decode(wasm_exec_env_t, const char* in, uint32_t in_len, uint8_t* out, uint32_t out_size)
442{ return host_base32_decode(in, in_len, out, out_size); }
443
444static int32_t w_host_hex_encode(wasm_exec_env_t, const uint8_t* in, uint32_t in_len, char* out, uint32_t out_size)
445{ return host_hex_encode(in, in_len, out, out_size); }
446
447// -- HTTP -------------------------------------------------------------------
448
449static int32_t w_host_http_open(wasm_exec_env_t, uint32_t method, const char* url, uint32_t timeout)
450{ return host_http_open(static_cast<uint8_t>(method), url, timeout); }
451
452static int32_t w_host_http_set_header(wasm_exec_env_t, int32_t h, const char* k, const char* v)
453{ return host_http_set_header(h, k, v); }
454
455static int32_t w_host_http_set_body(wasm_exec_env_t, int32_t h, const uint8_t* body, uint32_t len)
456{ return host_http_set_body(h, body, len); }
457
458static int32_t w_host_http_perform(wasm_exec_env_t, int32_t h) { return host_http_perform(h); }
459static int32_t w_host_http_status(wasm_exec_env_t, int32_t h) { return host_http_status(h); }
460static int32_t w_host_http_close (wasm_exec_env_t, int32_t h) { return host_http_close(h); }
461
462static int32_t w_host_http_read_chunk(wasm_exec_env_t, int32_t h, uint8_t* buf, uint32_t buf_size)
463{
464 size_t out_len = 0;
465 int rc = host_http_read_chunk(h, buf, buf_size, &out_len);
466 return rc == HOST_OK ? static_cast<int32_t>(out_len) : rc;
467}
468
469// -- Socket -----------------------------------------------------------------
470
471static int32_t w_host_socket_open(wasm_exec_env_t, uint32_t proto, const char* host,
472 uint32_t port, uint32_t timeout)
473{ return host_socket_open(static_cast<uint8_t>(proto), host,
474 static_cast<uint16_t>(port), timeout); }
475
476static int32_t w_host_socket_write(wasm_exec_env_t, int32_t h, const uint8_t* data,
477 uint32_t len, uint32_t timeout)
478{ return host_socket_write(h, data, len, timeout); }
479
480static int32_t w_host_socket_read(wasm_exec_env_t, int32_t h, uint8_t* out,
481 uint32_t cap, uint32_t timeout)
482{ return host_socket_read(h, out, cap, timeout); }
483
484static int32_t w_host_socket_close(wasm_exec_env_t, int32_t h) { return host_socket_close(h); }
485
486// -- WiFi -------------------------------------------------------------------
487
488static int32_t w_host_wifi_request(wasm_exec_env_t, uint32_t t) { return host_wifi_request(t); }
489static int32_t w_host_wifi_release(wasm_exec_env_t) { return host_wifi_release(); }
490static int32_t w_host_wifi_is_connected(wasm_exec_env_t) { return host_wifi_is_connected(); }
491static int32_t w_host_wifi_ssid(wasm_exec_env_t, char* out, uint32_t sz)
492{ return host_wifi_ssid(out, sz); }
493static int32_t w_host_wifi_ip(wasm_exec_env_t, char* out, uint32_t sz)
494{ return host_wifi_ip(out, sz); }
495
496// -- SecureElement ----------------------------------------------------------
497
498static int32_t w_host_rmem_read_named(wasm_exec_env_t, const char* name,
499 uint8_t* buf, uint32_t buf_size)
500{
501 size_t len = buf_size;
502 int rc = host_rmem_read_named(name, buf, &len);
503 return rc == HOST_OK ? static_cast<int32_t>(len) : rc;
504}
505
506static int32_t w_host_rmem_write_named(wasm_exec_env_t, const char* name,
507 const uint8_t* buf, uint32_t len)
508{ return host_rmem_write_named(name, buf, len); }
509
510static int32_t w_host_rmem_erase_named(wasm_exec_env_t, const char* name)
511{ return host_rmem_erase_named(name); }
512
513static int32_t w_host_rmem_name_used(wasm_exec_env_t, const char* name)
514{ return host_rmem_name_used(name) ? 1 : 0; }
515
516static uint32_t w_host_rmem_slot_size(wasm_exec_env_t)
517{ return host_rmem_slot_size(); }
518
519static int32_t w_host_ecc_generate(wasm_exec_env_t, const char* name, uint32_t curve)
520{ return host_ecc_generate(name, static_cast<uint8_t>(curve)); }
521static int32_t w_host_ecc_import(wasm_exec_env_t exec_env, const char* name, const uint8_t* priv, uint32_t curve)
522{
523 if (!wbuf_ok(exec_env, priv, 32)) return HOST_ERR_INVALID_ARG;
524 return host_ecc_import(name, priv, static_cast<uint8_t>(curve));
525}
526static int32_t w_host_ecc_pubkey(wasm_exec_env_t exec_env, const char* name, uint8_t* pub, uint32_t curve)
527{
528 if (!wbuf_ok(exec_env, pub, 64)) return HOST_ERR_INVALID_ARG;
529 return host_ecc_pubkey(name, pub, static_cast<uint8_t>(curve));
530}
531static int32_t w_host_ecc_delete(wasm_exec_env_t, const char* name)
532{ return host_ecc_delete(name); }
533static int32_t w_host_ecc_exists(wasm_exec_env_t, const char* name)
534{ return host_ecc_exists(name) ? 1 : 0; }
535static 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)
536{
537 if (!wbuf_ok(exec_env, sig, 64)) return HOST_ERR_INVALID_ARG;
538 return host_ecdsa_sign(name, msg, len, sig);
539}
540static 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)
541{
542 if (!wbuf_ok(exec_env, sig, 64)) return HOST_ERR_INVALID_ARG;
543 return host_eddsa_sign(name, msg, len, sig);
544}
545
546// -- EventBus ---------------------------------------------------------------
547
548static int32_t w_host_event_subscribe(wasm_exec_env_t, uint32_t mask, uint32_t action_id)
549{ return host_event_subscribe(mask, action_id); }
550static int32_t w_host_event_unsubscribe(wasm_exec_env_t, uint32_t sub) { return host_event_unsubscribe(sub); }
551
552// -- GPIO -------------------------------------------------------------------
553
554static int32_t w_host_gpio_set_direction(wasm_exec_env_t, uint32_t pin, uint32_t dir)
555{ return host_gpio_set_direction(static_cast<uint8_t>(pin), static_cast<uint8_t>(dir)); }
556static int32_t w_host_gpio_set_pull(wasm_exec_env_t, uint32_t pin, uint32_t pull)
557{ return host_gpio_set_pull(static_cast<uint8_t>(pin), static_cast<uint8_t>(pull)); }
558static int32_t w_host_gpio_write(wasm_exec_env_t, uint32_t pin, int32_t level)
559{ return host_gpio_write(static_cast<uint8_t>(pin), level != 0); }
560static int32_t w_host_gpio_read(wasm_exec_env_t exec_env, uint32_t pin, int32_t* out)
561{
562 if (!wbuf_ok(exec_env, out, sizeof(int32_t))) return HOST_ERR_INVALID_ARG;
563 bool level = false;
564 int rc = host_gpio_read(static_cast<uint8_t>(pin), &level);
565 if (rc == HOST_OK) *out = level ? 1 : 0;
566 return rc;
567}
568static int32_t w_host_gpio_release(wasm_exec_env_t, uint32_t pin)
569{ return host_gpio_release(static_cast<uint8_t>(pin)); }
570static int32_t w_host_gpio_pwm_start(wasm_exec_env_t, uint32_t pin, uint32_t freq, uint32_t duty)
571{ return host_gpio_pwm_start(static_cast<uint8_t>(pin), freq, static_cast<uint16_t>(duty)); }
572static int32_t w_host_gpio_pwm_stop(wasm_exec_env_t, uint32_t pin)
573{ return host_gpio_pwm_stop(static_cast<uint8_t>(pin)); }
574
575// -- Date/Time + System info ------------------------------------------------
576
577static int32_t w_host_ui_push_date(wasm_exec_env_t, const char* title, uint32_t d,
578 uint32_t m, uint32_t y, uint32_t action_id)
579{ return host_ui_push_date(title, static_cast<uint8_t>(d), static_cast<uint8_t>(m),
580 static_cast<uint16_t>(y), action_id); }
581
582static int32_t w_host_ui_push_time(wasm_exec_env_t, const char* title, uint32_t h,
583 uint32_t m, uint32_t action_id)
584{ return host_ui_push_time(title, static_cast<uint8_t>(h), static_cast<uint8_t>(m), action_id); }
585
586static int32_t w_host_get_firmware_version(wasm_exec_env_t, char* out, uint32_t out_size)
587{ return host_get_firmware_version(out, out_size); }
588
589static int32_t w_host_str_to_display(wasm_exec_env_t, const char* in, char* out,
590 uint32_t out_size, uint32_t target)
591{ return host_str_to_display(in, out, out_size, target); }
592
593static int32_t w_host_str_to_utf8(wasm_exec_env_t, const char* in, char* out, uint32_t out_size)
594{ return host_str_to_utf8(in, out, out_size); }
595
596static int32_t w_host_get_build_profile(wasm_exec_env_t, char* out, uint32_t out_size)
597{ return host_get_build_profile(out, out_size); }
598
599static int32_t w_host_feature_enabled(wasm_exec_env_t, uint32_t feature_id)
600{ return host_feature_enabled(static_cast<uint16_t>(feature_id)) ? 1 : 0; }
601
602static uint32_t w_host_cpu_load(wasm_exec_env_t) { return host_cpu_load(); }
603
604static int32_t w_host_cmd_consume(wasm_exec_env_t, char* out, uint32_t out_size)
605{ return host_cmd_consume(out, out_size); }
606
607// -- Message transfer --
608static int32_t w_host_msg_register_handler(wasm_exec_env_t, const char* mime, uint32_t aid)
609{ return host_msg_register_handler(mime, aid); }
610static int32_t w_host_msg_unregister_handler(wasm_exec_env_t, const char* mime)
611{ return host_msg_unregister_handler(mime); }
612static int32_t w_host_msg_consume(wasm_exec_env_t, uint8_t* buf, uint32_t buf_size,
613 char* mime_out, uint32_t mime_size)
614{ return host_msg_consume(buf, buf_size, mime_out, mime_size); }
615static int32_t w_host_msg_send_interactive(wasm_exec_env_t, const char* mime,
616 const uint8_t* data, uint32_t len)
617{ return host_msg_send_interactive(mime, data, len); }
618static int32_t w_host_msg_send(wasm_exec_env_t exec_env, const uint8_t* addr, uint32_t addr_type,
619 const char* mime, const uint8_t* data, uint32_t len)
620{
621 // addr is a bare '*' (WAMR validates only 1 byte) -> re-validate all 6 bytes.
622 if (!wbuf_ok(exec_env, addr, 6)) return HOST_ERR_INVALID_ARG;
623 return host_msg_send(addr, static_cast<uint8_t>(addr_type), mime, data, len);
624}
625
626static int32_t w_host_ui_acquire_exclusive(wasm_exec_env_t) { return host_ui_acquire_exclusive(); }
627static int32_t w_host_ui_release_exclusive(wasm_exec_env_t) { return host_ui_release_exclusive(); }
628static int32_t w_host_ui_set_inactivity(wasm_exec_env_t, uint32_t timeout_ms, uint32_t action_id)
629{ return host_ui_set_inactivity(timeout_ms, action_id); }
630
631// -- Pixel strip ------------------------------------------------------------
632
633static int32_t w_host_pixel_strip_init(wasm_exec_env_t, uint32_t gpio, uint32_t num, uint32_t format)
634{ return host_pixel_strip_init(static_cast<uint8_t>(gpio),
635 static_cast<uint16_t>(num),
636 static_cast<uint8_t>(format)); }
637static int32_t w_host_pixel_strip_deinit(wasm_exec_env_t) { return host_pixel_strip_deinit(); }
638static int32_t w_host_pixel_strip_set(wasm_exec_env_t, uint32_t idx,
639 uint32_t r, uint32_t g, uint32_t b)
640{ return host_pixel_strip_set(static_cast<uint16_t>(idx),
641 static_cast<uint8_t>(r),
642 static_cast<uint8_t>(g),
643 static_cast<uint8_t>(b)); }
644static int32_t w_host_pixel_strip_fill(wasm_exec_env_t, uint32_t r, uint32_t g, uint32_t b)
645{ return host_pixel_strip_fill(static_cast<uint8_t>(r),
646 static_cast<uint8_t>(g),
647 static_cast<uint8_t>(b)); }
648static int32_t w_host_pixel_strip_clear (wasm_exec_env_t) { return host_pixel_strip_clear(); }
649static int32_t w_host_pixel_strip_refresh(wasm_exec_env_t) { return host_pixel_strip_refresh(); }
650static uint32_t w_host_pixel_strip_length(wasm_exec_env_t) { return host_pixel_strip_length(); }
651static int32_t w_host_pixel_strip_ready (wasm_exec_env_t) { return host_pixel_strip_ready() ? 1 : 0; }
652
653// -- Lockscreen quick-action -----------------------------------------------
654
655static int32_t w_host_lockscreen_register_action(wasm_exec_env_t,
656 const char* label_key,
657 uint32_t action_id)
658{ return host_lockscreen_register_action(label_key, action_id); }
659
660static int32_t w_host_lockscreen_unregister_action(wasm_exec_env_t)
662
663static int32_t w_host_lockscreen_alert(wasm_exec_env_t, const char* text,
664 uint32_t icon, uint32_t action_id)
665{ return host_lockscreen_alert(text, static_cast<uint8_t>(icon), action_id); }
666
667// -- Additional crypto ------------------------------------------------------
668
669static int32_t w_host_random_strict(wasm_exec_env_t, uint8_t* buf, uint32_t len)
670{ return host_random_strict(buf, len); }
671static int32_t w_host_base64_encode(wasm_exec_env_t, const uint8_t* in, uint32_t in_len, char* out, uint32_t out_size)
672{ return host_base64_encode(in, in_len, out, out_size); }
673static int32_t w_host_base64_decode(wasm_exec_env_t, const char* in, uint32_t in_len, uint8_t* out, uint32_t out_size)
674{ return host_base64_decode(in, in_len, out, out_size); }
675static int32_t w_host_hex_decode(wasm_exec_env_t, const char* in, uint32_t in_len, uint8_t* out, uint32_t out_size)
676{ return host_hex_decode(in, in_len, out, out_size); }
677static int32_t w_host_aes_gcm_encrypt(wasm_exec_env_t exec_env, const uint8_t* key, const uint8_t* iv,
678 const uint8_t* aad, uint32_t aad_len,
679 const uint8_t* pt, uint32_t pt_len, uint8_t* ct, uint8_t* tag)
680{
681 if (!wbuf_ok(exec_env, key, 32) || !wbuf_ok(exec_env, iv, 12) ||
682 !wbuf_ok(exec_env, ct, pt_len) || !wbuf_ok(exec_env, tag, 16))
684 return host_aes_gcm_encrypt(key, iv, aad, aad_len, pt, pt_len, ct, tag);
685}
686static int32_t w_host_aes_gcm_decrypt(wasm_exec_env_t exec_env, const uint8_t* key, const uint8_t* iv,
687 const uint8_t* aad, uint32_t aad_len,
688 const uint8_t* ct, uint32_t ct_len, const uint8_t* tag, uint8_t* pt)
689{
690 if (!wbuf_ok(exec_env, key, 32) || !wbuf_ok(exec_env, iv, 12) ||
691 !wbuf_ok(exec_env, tag, 16) || !wbuf_ok(exec_env, pt, ct_len))
693 return host_aes_gcm_decrypt(key, iv, aad, aad_len, ct, ct_len, tag, pt);
694}
695
696// -- Additional time / logging / nvs / sysinfo ------------------------------
697
698static int32_t w_host_local_time(wasm_exec_env_t exec_env, void* out)
699{
700 if (!wbuf_ok(exec_env, out, sizeof(struct host_tm))) return HOST_ERR_INVALID_ARG;
701 return host_local_time(reinterpret_cast<struct host_tm*>(out));
702}
703
704static void w_host_log_hex(wasm_exec_env_t, const char* tag, const char* label,
705 const uint8_t* data, uint32_t len)
706{ host_log_hex(tag, label, data, len); }
707
708static int32_t w_host_nvs_erase_all(wasm_exec_env_t) { return host_nvs_erase_all(); }
709static int32_t w_host_nvs_list_keys(wasm_exec_env_t exec_env, char* out, uint32_t* out_len)
710{
711 if (!wbuf_ok(exec_env, out_len, sizeof(uint32_t))) return HOST_ERR_INVALID_ARG;
712 size_t len = *out_len;
713 if (!wbuf_ok(exec_env, out, len)) return HOST_ERR_INVALID_ARG;
714 int rc = host_nvs_list_keys(out, &len);
715 *out_len = static_cast<uint32_t>(len);
716 return rc;
717}
718
719// -- Additional wifi --------------------------------------------------------
720
721static int32_t w_host_wifi_mac(wasm_exec_env_t exec_env, uint8_t* out)
722{ return wbuf_ok(exec_env, out, 6) ? host_wifi_mac(out) : HOST_ERR_INVALID_ARG; }
723static int32_t w_host_wifi_rssi(wasm_exec_env_t) { return host_wifi_rssi(); }
724static int32_t w_host_wifi_start_scan(wasm_exec_env_t) { return host_wifi_start_scan(); }
725static int32_t w_host_wifi_scan_done(wasm_exec_env_t) { return host_wifi_scan_done() ? 1 : 0; }
726static int32_t w_host_wifi_scan_results(wasm_exec_env_t exec_env, void* out, uint32_t* count)
727{
728 if (!wbuf_ok(exec_env, count, sizeof(uint32_t))) return HOST_ERR_INVALID_ARG;
729 size_t c = *count;
730 size_t cap = c > 32 ? 32 : c; // host clamps to IWifiController::MAX_SCAN_RESULTS (32)
731 if (!wbuf_ok(exec_env, out, cap * sizeof(wifi_scan_result_t))) return HOST_ERR_INVALID_ARG;
732 int rc = host_wifi_scan_results(reinterpret_cast<wifi_scan_result_t*>(out), &c);
733 *count = static_cast<uint32_t>(c);
734 return rc;
735}
736
737// -- Additional gpio / adc / i2c / sao --------------------------------------
738
739static int32_t w_host_gpio_pwm_set_duty(wasm_exec_env_t, uint32_t pin, uint32_t duty)
740{ return host_gpio_pwm_set_duty(static_cast<uint8_t>(pin), static_cast<uint16_t>(duty)); }
741static int32_t w_host_adc_read(wasm_exec_env_t exec_env, uint32_t pin, uint16_t* raw, uint16_t* mv)
742{
743 if (!wbuf_ok(exec_env, raw, sizeof(uint16_t)) || !wbuf_ok(exec_env, mv, sizeof(uint16_t)))
745 return host_adc_read(static_cast<uint8_t>(pin), raw, mv);
746}
747
748static int32_t w_host_i2c_write(wasm_exec_env_t, uint32_t bus, uint32_t addr, const uint8_t* data, uint32_t len)
749{ return host_i2c_write(static_cast<uint8_t>(bus), static_cast<uint8_t>(addr), data, len); }
750static int32_t w_host_i2c_read(wasm_exec_env_t, uint32_t bus, uint32_t addr, uint8_t* data, uint32_t len)
751{ return host_i2c_read(static_cast<uint8_t>(bus), static_cast<uint8_t>(addr), data, len); }
752static int32_t w_host_i2c_write_read(wasm_exec_env_t, uint32_t bus, uint32_t addr,
753 const uint8_t* wr, uint32_t wr_len, uint8_t* rd, uint32_t rd_len)
754{ return host_i2c_write_read(static_cast<uint8_t>(bus), static_cast<uint8_t>(addr), wr, wr_len, rd, rd_len); }
755static int32_t w_host_i2c_scan(wasm_exec_env_t exec_env, uint32_t bus, uint8_t* found, uint32_t* count)
756{
757 if (!wbuf_ok(exec_env, count, sizeof(uint32_t))) return HOST_ERR_INVALID_ARG;
758 size_t c = *count;
759 size_t cap = c > 112 ? 112 : c; // host probes I2C addresses 0x08..0x77 (<=112)
760 if (!wbuf_ok(exec_env, found, cap)) return HOST_ERR_INVALID_ARG;
761 int rc = host_i2c_scan(static_cast<uint8_t>(bus), found, &c);
762 *count = static_cast<uint32_t>(c);
763 return rc;
764}
765static int32_t w_host_sao_eeprom_read(wasm_exec_env_t, uint32_t off, uint8_t* buf, uint32_t len)
766{ return host_sao_eeprom_read(static_cast<uint16_t>(off), buf, len); }
767static int32_t w_host_sao_eeprom_write(wasm_exec_env_t, uint32_t off, const uint8_t* buf, uint32_t len)
768{ return host_sao_eeprom_write(static_cast<uint16_t>(off), buf, len); }
769
770// -- Additional http / event / secure element ------------------------------
771
772static uint32_t w_host_http_content_length(wasm_exec_env_t, int32_t h)
773{ return static_cast<uint32_t>(host_http_content_length(h)); }
774
775static int32_t w_host_event_publish(wasm_exec_env_t, uint32_t subtype, uint32_t value)
776{ return host_event_publish(subtype, value); }
777
778static int32_t w_host_se_chip_id(wasm_exec_env_t exec_env, uint8_t* serial, uint32_t* len)
779{
780 if (!wbuf_ok(exec_env, len, sizeof(uint32_t))) return HOST_ERR_INVALID_ARG;
781 size_t l = *len;
782 size_t cap = l > 16 ? 16 : l; // getChipId writes at most sizeof(ser_num) = 16 bytes
783 if (!wbuf_ok(exec_env, serial, cap)) return HOST_ERR_INVALID_ARG;
784 int rc = host_se_chip_id(serial, &l);
785 *len = static_cast<uint32_t>(l);
786 return rc;
787}
788static int32_t w_host_se_fw_version(wasm_exec_env_t exec_env, uint8_t* riscv, uint8_t* spect)
789{
790 if (!wbuf_ok(exec_env, riscv, 4) || !wbuf_ok(exec_env, spect, 4)) return HOST_ERR_INVALID_ARG;
791 return host_se_fw_version(riscv, spect);
792}
793
794// -- Display (low-level GFX) ------------------------------------------------
795
796static uint32_t w_host_display_width(wasm_exec_env_t) { return host_display_width(); }
797static uint32_t w_host_display_height(wasm_exec_env_t) { return host_display_height(); }
798static int32_t w_host_display_clear(wasm_exec_env_t) { return host_display_clear(); }
799static int32_t w_host_display_draw_pixel(wasm_exec_env_t, int32_t x, int32_t y, uint32_t color)
800{ return host_display_draw_pixel(static_cast<int16_t>(x), static_cast<int16_t>(y), static_cast<uint16_t>(color)); }
801static 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)
802{ return host_display_draw_line(static_cast<int16_t>(x0), static_cast<int16_t>(y0),
803 static_cast<int16_t>(x1), static_cast<int16_t>(y1), static_cast<uint16_t>(color)); }
804static 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)
805{ return host_display_draw_rect(static_cast<int16_t>(x), static_cast<int16_t>(y),
806 static_cast<int16_t>(w), static_cast<int16_t>(h), static_cast<uint16_t>(color)); }
807static 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)
808{ return host_display_fill_rect(static_cast<int16_t>(x), static_cast<int16_t>(y),
809 static_cast<int16_t>(w), static_cast<int16_t>(h), static_cast<uint16_t>(color)); }
810static 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)
811{ return host_display_draw_text(static_cast<int16_t>(x), static_cast<int16_t>(y), text,
812 static_cast<uint8_t>(size), static_cast<uint16_t>(color)); }
813static int32_t w_host_display_flush(wasm_exec_env_t, uint32_t mode) { return host_display_flush(static_cast<uint8_t>(mode)); }
814static int32_t w_host_display_is_busy(wasm_exec_env_t) { return host_display_is_busy() ? 1 : 0; }
815
816// -- Keypad / USB -----------------------------------------------------------
817
818static int32_t w_host_key_pressed(wasm_exec_env_t, uint32_t key) { return host_key_pressed(static_cast<uint8_t>(key)) ? 1 : 0; }
819static int32_t w_host_key_consume_next(wasm_exec_env_t, uint8_t* out) { return host_key_consume_next(out); }
820static 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); }
821
822// -- BLE --------------------------------------------------------------------
823
824static int32_t w_host_ble_is_enabled(wasm_exec_env_t) { return host_ble_is_enabled() ? 1 : 0; }
825static int32_t w_host_ble_mac(wasm_exec_env_t exec_env, uint8_t* out)
826{ return wbuf_ok(exec_env, out, 6) ? host_ble_mac(out) : HOST_ERR_INVALID_ARG; }
827static int32_t w_host_ble_device_name(wasm_exec_env_t, char* out, uint32_t size) { return host_ble_device_name(out, size); }
828static int32_t w_host_ble_rssi(wasm_exec_env_t) { return host_ble_rssi(); }
829
830static int32_t w_host_ble_register_service(wasm_exec_env_t exec_env, void* def, void* chars, uint32_t num)
831{
832 size_t nchars = num > 6 ? 6 : num; // host rejects num > MAX_PLUGIN_CHARS (6)
833 if (!wbuf_ok(exec_env, def, sizeof(ble_service_def_t)) ||
834 !wbuf_ok(exec_env, chars, nchars * sizeof(ble_char_def_t)))
836 return host_ble_register_service(reinterpret_cast<ble_service_def_t*>(def),
837 reinterpret_cast<ble_char_def_t*>(chars), num);
838}
839static int32_t w_host_ble_unregister_service(wasm_exec_env_t, uint32_t h) { return host_ble_unregister_service(h); }
840static int32_t w_host_ble_send_notification(wasm_exec_env_t, uint32_t ch, const uint8_t* data, uint32_t len)
841{ return host_ble_send_notification(ch, data, len); }
842static int32_t w_host_ble_send_indication(wasm_exec_env_t, uint32_t ch, const uint8_t* data, uint32_t len)
843{ return host_ble_send_indication(ch, data, len); }
844static int32_t w_host_ble_consume_write(wasm_exec_env_t, uint32_t ch, uint8_t* buf, uint32_t size)
845{ return host_ble_consume_write(ch, buf, size); }
846
847static int32_t w_host_ble_scan_start(wasm_exec_env_t, uint32_t dur) { return host_ble_scan_start(dur); }
848static int32_t w_host_ble_scan_done(wasm_exec_env_t) { return host_ble_scan_done() ? 1 : 0; }
849static int32_t w_host_ble_scan_results(wasm_exec_env_t exec_env, void* out, uint32_t* count)
850{
851 if (!wbuf_ok(exec_env, count, sizeof(uint32_t))) return HOST_ERR_INVALID_ARG;
852 size_t c = *count;
853 size_t cap = c > 32 ? 32 : c; // host clamps to 32 scan results
854 if (!wbuf_ok(exec_env, out, cap * sizeof(ble_scan_result_t))) return HOST_ERR_INVALID_ARG;
855 int rc = host_ble_scan_results(reinterpret_cast<ble_scan_result_t*>(out), &c);
856 *count = static_cast<uint32_t>(c);
857 return rc;
858}
859static int32_t w_host_ble_connect(wasm_exec_env_t, const uint8_t* addr, uint32_t type)
860{ return host_ble_connect(addr, static_cast<uint8_t>(type)); }
861static uint32_t w_host_ble_conn_handle(wasm_exec_env_t) { return host_ble_conn_handle(); }
862static int32_t w_host_ble_disconnect(wasm_exec_env_t, uint32_t conn) { return host_ble_disconnect(conn); }
863static int32_t w_host_ble_discover(wasm_exec_env_t, uint32_t conn, const uint8_t* uuid, uint32_t aid)
864{ return host_ble_discover(conn, uuid, aid); }
865static int32_t w_host_ble_consume_discovery(wasm_exec_env_t exec_env, void* out, uint32_t* count)
866{
867 if (!wbuf_ok(exec_env, count, sizeof(uint32_t))) return HOST_ERR_INVALID_ARG;
868 size_t c = *count;
869 size_t cap = c > 8 ? 8 : c; // host clamps to MAX_DISC_CHARS (8)
870 if (!wbuf_ok(exec_env, out, cap * sizeof(ble_remote_char_t))) return HOST_ERR_INVALID_ARG;
871 int rc = host_ble_consume_discovery(reinterpret_cast<ble_remote_char_t*>(out), &c);
872 *count = static_cast<uint32_t>(c);
873 return rc;
874}
875static int32_t w_host_ble_read_char(wasm_exec_env_t, uint32_t conn, uint32_t vh, uint32_t aid)
876{ return host_ble_read_char(conn, static_cast<uint16_t>(vh), aid); }
877static int32_t w_host_ble_consume_read(wasm_exec_env_t, uint8_t* buf, uint32_t size)
878{ return host_ble_consume_read(buf, size); }
879static int32_t w_host_ble_write_char(wasm_exec_env_t, uint32_t conn, uint32_t vh,
880 const uint8_t* data, uint32_t len, uint32_t wr)
881{ return host_ble_write_char(conn, static_cast<uint16_t>(vh), data, len, static_cast<uint8_t>(wr)); }
882static int32_t w_host_ble_subscribe(wasm_exec_env_t, uint32_t conn, uint32_t cccd, uint32_t aid)
883{ return host_ble_subscribe(conn, static_cast<uint16_t>(cccd), aid); }
884static int32_t w_host_ble_consume_notification(wasm_exec_env_t exec_env, uint16_t* vh_out, uint8_t* buf, uint32_t size)
885{
886 if (!wbuf_ok(exec_env, vh_out, sizeof(uint16_t))) return HOST_ERR_INVALID_ARG;
887 return host_ble_consume_notification(vh_out, buf, size);
888}
889
890// -- Symbol table -----------------------------------------------------------
891
892static const NativeSymbol s_symbols[] = {
893 W("host_log", w_host_log, "(i$$)"),
894 W("host_uptime_ms", w_host_uptime_ms, "()I"),
895 W("host_unix_time", w_host_unix_time, "()I"),
896 W("host_is_time_set", w_host_is_time_set, "()i"),
897 W("host_timezone_offset", w_host_timezone_offset, "()i"),
898
899 W("host_battery_mv", w_host_battery_mv, "()i"),
900 W("host_battery_pct", w_host_battery_pct, "()i"),
901 W("host_is_usb_connected", w_host_is_usb_connected, "()i"),
902 W("host_power_source", w_host_power_source, "()i"),
903 W("host_charge_status", w_host_charge_status, "()i"),
904 W("host_is_battery_low", w_host_is_battery_low, "()i"),
905 W("host_is_battery_critical",w_host_is_battery_critical,"()i"),
906 W("host_set_sleep_inhibit", w_host_set_sleep_inhibit, "(i)"),
907
908 W("host_ui_push_toast", w_host_ui_push_toast, "($ii)i"),
909 W("host_ui_push_message", w_host_ui_push_message, "($ii)i"),
910 W("host_ui_push_info", w_host_ui_push_info, "($$)i"),
911 W("host_ui_push_confirm", w_host_ui_push_confirm, "($ii)i"),
912 W("host_ui_push_list", w_host_ui_push_list, "($*~ii)i"),
913 W("host_ui_replace_list", w_host_ui_replace_list, "($*~ii)i"),
914 W("host_ui_set_view_footer", w_host_ui_set_view_footer, "($)i"),
915 W("host_ui_update_list_item", w_host_ui_update_list_item, "(i*)i"),
916 W("host_ui_insert_list_item", w_host_ui_insert_list_item, "(i*)i"),
917 W("host_ui_remove_list_item", w_host_ui_remove_list_item, "(i)i"),
918 W("host_ui_set_view_empty", w_host_ui_set_view_empty, "($)i"),
919 W("host_ui_set_view_lifecycle", w_host_ui_set_view_lifecycle, "(ii)i"),
920 W("host_ui_push_context_menu", w_host_ui_push_context_menu, "($*~i)i"),
921 W("host_ui_push_t9_input", w_host_ui_push_t9_input, "($$ii)i"),
922 W("host_ui_push_password", w_host_ui_push_password, "($$ii)i"),
923 W("host_ui_push_pin_entry", w_host_ui_push_pin_entry, "($iii)i"),
924 W("host_ui_push_slider", w_host_ui_push_slider, "($iiii$i)i"),
925 W("host_ui_push_color_picker", w_host_ui_push_color_picker, "(iiii)i"),
926 W("host_ui_consume_input_text", w_host_ui_consume_input_text, "(*~)i"),
927 W("host_ui_consume_input_int", w_host_ui_consume_input_int, "(*)i"),
928 W("host_ui_pop", w_host_ui_pop, "()i"),
929 W("host_ui_pop_to_plugin", w_host_ui_pop_to_plugin, "()i"),
930 W("host_ui_repaint", w_host_ui_repaint, "()i"),
931 W("host_ui_wink", w_host_ui_wink, "(ii)i"),
932
933 W("host_view_canvas_push", w_host_view_canvas_push, "($ii)i"),
934 W("host_view_canvas_get_body_size", w_host_view_canvas_get_body_size, "(**)i"),
935 W("host_view_canvas_set_footer", w_host_view_canvas_set_footer, "($)i"),
936 W("host_view_canvas_clear", w_host_view_canvas_clear, "()i"),
937 W("host_view_canvas_set_text_size", w_host_view_canvas_set_text_size, "(i)i"),
938 W("host_view_canvas_set_text_color",w_host_view_canvas_set_text_color,"(i)i"),
939 W("host_view_canvas_set_font", w_host_view_canvas_set_font, "(i)i"),
940 W("host_text_pick_font_that_fits", w_host_text_pick_font_that_fits, "($i*~*)i"),
941 W("host_view_canvas_draw_text", w_host_view_canvas_draw_text, "(ii$)i"),
942 W("host_view_canvas_draw_text_aligned", w_host_view_canvas_draw_text_aligned, "(iii$i)i"),
943 W("host_view_canvas_draw_rect", w_host_view_canvas_draw_rect, "(iiiii)i"),
944 W("host_view_canvas_invert_rect", w_host_view_canvas_invert_rect, "(iiii)i"),
945 W("host_view_canvas_hline", w_host_view_canvas_hline, "(iii)i"),
946 W("host_view_canvas_vline", w_host_view_canvas_vline, "(iii)i"),
947 W("host_view_canvas_commit", w_host_view_canvas_commit, "(i)i"),
948 W("host_view_canvas_add_slider", w_host_view_canvas_add_slider, "(iiiii)i"),
949 W("host_view_canvas_add_text", w_host_view_canvas_add_text, "(ii$)i"),
950 W("host_view_canvas_add_button", w_host_view_canvas_add_button, "(i)i"),
951 W("host_view_canvas_remove_widget", w_host_view_canvas_remove_widget, "(i)i"),
952 W("host_view_canvas_set_value", w_host_view_canvas_set_value, "(ii)i"),
953 W("host_view_canvas_get_value", w_host_view_canvas_get_value, "(i*)i"),
954 W("host_view_canvas_set_text", w_host_view_canvas_set_text, "(i$)i"),
955 W("host_view_canvas_get_text", w_host_view_canvas_get_text, "(i*~)i"),
956 W("host_view_canvas_set_focus", w_host_view_canvas_set_focus, "(i)i"),
957 W("host_view_canvas_get_focus", w_host_view_canvas_get_focus, "(*)i"),
958 W("host_view_canvas_set_key_repeat",w_host_view_canvas_set_key_repeat,"(ii)i"),
959 W("host_view_canvas_set_long_press_action",w_host_view_canvas_set_long_press_action,"(i)i"),
960
961 W("host_i18n_tr_key", w_host_i18n_tr_key, "($*~)i"),
962 W("host_i18n_tr_meta", w_host_i18n_tr_meta, "($*~)i"),
963 W("host_i18n_tr_core", w_host_i18n_tr_core, "($*~)i"),
964 W("host_i18n_current_language", w_host_i18n_current_language, "()i"),
965
966 W("host_nvs_get_blob", w_host_nvs_get_blob, "($*~)i"),
967 W("host_nvs_set_blob", w_host_nvs_set_blob, "($*~)i"),
968 W("host_nvs_get_u32", w_host_nvs_get_u32, "($*)i"),
969 W("host_nvs_set_u32", w_host_nvs_set_u32, "($i)i"),
970 W("host_nvs_get_str", w_host_nvs_get_str, "($*~)i"),
971 W("host_nvs_set_str", w_host_nvs_set_str, "($$)i"),
972 W("host_nvs_erase", w_host_nvs_erase, "($)i"),
973
974 W("host_fs_write", w_host_fs_write, "($*~)i"),
975 W("host_fs_read", w_host_fs_read, "($*~)i"),
976 W("host_fs_remove", w_host_fs_remove, "($)i"),
977 W("host_fs_size", w_host_fs_size, "($)i"),
978 W("host_fs_list", w_host_fs_list, "(*~)i"),
979 W("host_fs_view", w_host_fs_view, "($)i"),
980
981 W("host_random", w_host_random, "(*~)i"),
982 W("host_sha256", w_host_sha256, "(*~*)i"),
983 W("host_hmac_sha256", w_host_hmac_sha256, "(*~*~*)i"),
984 W("host_base32_encode", w_host_base32_encode, "(*~*~)i"),
985 W("host_base32_decode", w_host_base32_decode, "(*~*~)i"),
986 W("host_hex_encode", w_host_hex_encode, "(*~*~)i"),
987
988 W("host_http_open", w_host_http_open, "(i$i)i"),
989 W("host_http_set_header", w_host_http_set_header, "(i$$)i"),
990 W("host_http_set_body", w_host_http_set_body, "(i*~)i"),
991 W("host_http_perform", w_host_http_perform, "(i)i"),
992 W("host_http_status", w_host_http_status, "(i)i"),
993 W("host_http_read_chunk", w_host_http_read_chunk, "(i*~)i"),
994 W("host_http_close", w_host_http_close, "(i)i"),
995
996 W("host_socket_open", w_host_socket_open, "(i$ii)i"),
997 W("host_socket_write", w_host_socket_write, "(i*~i)i"),
998 W("host_socket_read", w_host_socket_read, "(i*~i)i"),
999 W("host_socket_close", w_host_socket_close, "(i)i"),
1000
1001 W("host_wifi_request", w_host_wifi_request, "(i)i"),
1002 W("host_wifi_release", w_host_wifi_release, "()i"),
1003 W("host_wifi_is_connected", w_host_wifi_is_connected, "()i"),
1004 W("host_wifi_ssid", w_host_wifi_ssid, "(*~)i"),
1005 W("host_wifi_ip", w_host_wifi_ip, "(*~)i"),
1006
1007 W("host_rmem_read_named", w_host_rmem_read_named, "($*~)i"),
1008 W("host_rmem_write_named", w_host_rmem_write_named, "($*~)i"),
1009 W("host_rmem_erase_named", w_host_rmem_erase_named, "($)i"),
1010 W("host_rmem_name_used", w_host_rmem_name_used, "($)i"),
1011 W("host_rmem_slot_size", w_host_rmem_slot_size, "()i"),
1012 W("host_ecc_generate", w_host_ecc_generate, "($i)i"),
1013 W("host_ecc_import", w_host_ecc_import, "($*i)i"),
1014 W("host_ecc_pubkey", w_host_ecc_pubkey, "($*i)i"),
1015 W("host_ecc_delete", w_host_ecc_delete, "($)i"),
1016 W("host_ecc_exists", w_host_ecc_exists, "($)i"),
1017 W("host_ecdsa_sign", w_host_ecdsa_sign, "($*~*)i"),
1018 W("host_eddsa_sign", w_host_eddsa_sign, "($*~*)i"),
1019
1020 W("host_event_subscribe", w_host_event_subscribe, "(ii)i"),
1021 W("host_event_unsubscribe", w_host_event_unsubscribe, "(i)i"),
1022
1023 W("host_gpio_set_direction", w_host_gpio_set_direction, "(ii)i"),
1024 W("host_gpio_set_pull", w_host_gpio_set_pull, "(ii)i"),
1025 W("host_gpio_write", w_host_gpio_write, "(ii)i"),
1026 W("host_gpio_read", w_host_gpio_read, "(i*)i"),
1027 W("host_gpio_release", w_host_gpio_release, "(i)i"),
1028 W("host_gpio_pwm_start", w_host_gpio_pwm_start, "(iii)i"),
1029 W("host_gpio_pwm_stop", w_host_gpio_pwm_stop, "(i)i"),
1030
1031 W("host_ui_push_date", w_host_ui_push_date, "($iiii)i"),
1032 W("host_ui_push_time", w_host_ui_push_time, "($iii)i"),
1033
1034 W("host_get_firmware_version", w_host_get_firmware_version, "(*~)i"),
1035 W("host_str_to_display", w_host_str_to_display, "($*~i)i"),
1036 W("host_str_to_utf8", w_host_str_to_utf8, "($*~)i"),
1037 W("host_get_build_profile", w_host_get_build_profile, "(*~)i"),
1038 W("host_feature_enabled", w_host_feature_enabled, "(i)i"),
1039 W("host_cpu_load", w_host_cpu_load, "()i"),
1040 W("host_cmd_consume", w_host_cmd_consume, "(*~)i"),
1041
1042 W("host_msg_register_handler", w_host_msg_register_handler, "($i)i"),
1043 W("host_msg_unregister_handler", w_host_msg_unregister_handler, "($)i"),
1044 W("host_msg_consume", w_host_msg_consume, "(*~*~)i"),
1045 W("host_msg_send_interactive", w_host_msg_send_interactive, "($*~)i"),
1046 W("host_msg_send", w_host_msg_send, "(*i$*~)i"),
1047
1048 W("host_ui_acquire_exclusive", w_host_ui_acquire_exclusive, "()i"),
1049 W("host_ui_release_exclusive", w_host_ui_release_exclusive, "()i"),
1050 W("host_ui_set_inactivity", w_host_ui_set_inactivity, "(ii)i"),
1051
1052 W("host_pixel_strip_init", w_host_pixel_strip_init, "(iii)i"),
1053 W("host_pixel_strip_deinit", w_host_pixel_strip_deinit, "()i"),
1054 W("host_pixel_strip_set", w_host_pixel_strip_set, "(iiii)i"),
1055 W("host_pixel_strip_fill", w_host_pixel_strip_fill, "(iii)i"),
1056 W("host_pixel_strip_clear", w_host_pixel_strip_clear, "()i"),
1057 W("host_pixel_strip_refresh", w_host_pixel_strip_refresh, "()i"),
1058 W("host_pixel_strip_length", w_host_pixel_strip_length, "()i"),
1059 W("host_pixel_strip_ready", w_host_pixel_strip_ready, "()i"),
1060
1061 W("host_lockscreen_register_action", w_host_lockscreen_register_action, "($i)i"),
1062 W("host_lockscreen_unregister_action", w_host_lockscreen_unregister_action, "()i"),
1063 W("host_lockscreen_alert", w_host_lockscreen_alert, "($ii)i"),
1064
1065 W("host_random_strict", w_host_random_strict, "(*~)i"),
1066 W("host_base64_encode", w_host_base64_encode, "(*~*~)i"),
1067 W("host_base64_decode", w_host_base64_decode, "(*~*~)i"),
1068 W("host_hex_decode", w_host_hex_decode, "(*~*~)i"),
1069 W("host_aes_gcm_encrypt", w_host_aes_gcm_encrypt, "(***~*~**)i"),
1070 W("host_aes_gcm_decrypt", w_host_aes_gcm_decrypt, "(***~*~**)i"),
1071
1072 W("host_local_time", w_host_local_time, "(*)i"),
1073 W("host_log_hex", w_host_log_hex, "($$*~)"),
1074 W("host_nvs_erase_all", w_host_nvs_erase_all, "()i"),
1075 W("host_nvs_list_keys", w_host_nvs_list_keys, "(**)i"),
1076
1077 W("host_wifi_mac", w_host_wifi_mac, "(*)i"),
1078 W("host_wifi_rssi", w_host_wifi_rssi, "()i"),
1079 W("host_wifi_start_scan", w_host_wifi_start_scan, "()i"),
1080 W("host_wifi_scan_done", w_host_wifi_scan_done, "()i"),
1081 W("host_wifi_scan_results", w_host_wifi_scan_results, "(**)i"),
1082
1083 W("host_gpio_pwm_set_duty", w_host_gpio_pwm_set_duty, "(ii)i"),
1084 W("host_adc_read", w_host_adc_read, "(i**)i"),
1085 W("host_i2c_write", w_host_i2c_write, "(ii*~)i"),
1086 W("host_i2c_read", w_host_i2c_read, "(ii*~)i"),
1087 W("host_i2c_write_read", w_host_i2c_write_read, "(ii*~*~)i"),
1088 W("host_i2c_scan", w_host_i2c_scan, "(i**)i"),
1089 W("host_sao_eeprom_read", w_host_sao_eeprom_read, "(i*~)i"),
1090 W("host_sao_eeprom_write", w_host_sao_eeprom_write, "(i*~)i"),
1091
1092 W("host_http_content_length",w_host_http_content_length,"(i)i"),
1093 W("host_event_publish", w_host_event_publish, "(ii)i"),
1094 W("host_se_chip_id", w_host_se_chip_id, "(**)i"),
1095 W("host_se_fw_version", w_host_se_fw_version, "(**)i"),
1096
1097 W("host_display_width", w_host_display_width, "()i"),
1098 W("host_display_height", w_host_display_height, "()i"),
1099 W("host_display_clear", w_host_display_clear, "()i"),
1100 W("host_display_draw_pixel", w_host_display_draw_pixel, "(iii)i"),
1101 W("host_display_draw_line", w_host_display_draw_line, "(iiiii)i"),
1102 W("host_display_draw_rect", w_host_display_draw_rect, "(iiiii)i"),
1103 W("host_display_fill_rect", w_host_display_fill_rect, "(iiiii)i"),
1104 W("host_display_draw_text", w_host_display_draw_text, "(ii$ii)i"),
1105 W("host_display_flush", w_host_display_flush, "(i)i"),
1106 W("host_display_is_busy", w_host_display_is_busy, "()i"),
1107
1108 W("host_key_pressed", w_host_key_pressed, "(i)i"),
1109 W("host_key_consume_next", w_host_key_consume_next, "(*)i"),
1110 W("host_usb_cdc_write", w_host_usb_cdc_write, "(*~)i"),
1111
1112 W("host_ble_is_enabled", w_host_ble_is_enabled, "()i"),
1113 W("host_ble_mac", w_host_ble_mac, "(*)i"),
1114 W("host_ble_device_name", w_host_ble_device_name, "(*~)i"),
1115 W("host_ble_rssi", w_host_ble_rssi, "()i"),
1116 W("host_ble_register_service", w_host_ble_register_service, "(**i)i"),
1117 W("host_ble_unregister_service",w_host_ble_unregister_service,"(i)i"),
1118 W("host_ble_send_notification", w_host_ble_send_notification, "(i*~)i"),
1119 W("host_ble_send_indication", w_host_ble_send_indication, "(i*~)i"),
1120 W("host_ble_consume_write", w_host_ble_consume_write, "(i*~)i"),
1121 W("host_ble_scan_start", w_host_ble_scan_start, "(i)i"),
1122 W("host_ble_scan_done", w_host_ble_scan_done, "()i"),
1123 W("host_ble_scan_results", w_host_ble_scan_results, "(**)i"),
1124 W("host_ble_connect", w_host_ble_connect, "(*i)i"),
1125 W("host_ble_conn_handle", w_host_ble_conn_handle, "()i"),
1126 W("host_ble_disconnect", w_host_ble_disconnect, "(i)i"),
1127 W("host_ble_discover", w_host_ble_discover, "(i*i)i"),
1128 W("host_ble_consume_discovery", w_host_ble_consume_discovery, "(**)i"),
1129 W("host_ble_read_char", w_host_ble_read_char, "(iii)i"),
1130 W("host_ble_consume_read", w_host_ble_consume_read, "(*~)i"),
1131 W("host_ble_write_char", w_host_ble_write_char, "(ii*~i)i"),
1132 W("host_ble_subscribe", w_host_ble_subscribe, "(iii)i"),
1133 W("host_ble_consume_notification", w_host_ble_consume_notification, "(**~)i"),
1134};
1135
1137
1139{
1140 const uint32_t n = sizeof(s_symbols) / sizeof(s_symbols[0]);
1141 if (!s_symbols_ram) {
1143 if (!s_symbols_ram) {
1144 plg_log_error("WAMR: PSRAM alloc for host symbol table failed");
1145 return false;
1146 }
1147 std::memcpy(s_symbols_ram.get(), s_symbols, sizeof(s_symbols));
1148 }
1149 if (!wasm_runtime_register_natives("cdc", s_symbols_ram.get(), n)) {
1150 plg_log_error("WAMR: register_natives(\"cdc\") failed");
1151 return false;
1152 }
1153 char buf[64];
1154 std::snprintf(buf, sizeof(buf), "WAMR: %u host imports registered", static_cast<unsigned>(n));
1155 plg_log_info(buf);
1156 return true;
1157}
1158
1160{
1161 if (s_symbols_ram) wasm_runtime_unregister_natives("cdc", s_symbols_ram.get());
1162}
1163
1164} // 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]
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
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.
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_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_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_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_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_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_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)
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)
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_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_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_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_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_get_value(uint32_t widget_id, int32_t *out)
Read the integer value of a slider widget.
int host_view_canvas_invert_rect(int16_t x, int16_t y, int16_t w, int16_t h)
Invert all pixels inside the rectangle.
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.
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_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_add_button(uint32_t widget_id)
Add a focusable button widget bound to widget_id.
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_set_key_repeat(uint16_t initial_ms, uint16_t repeat_ms)
Configure key auto-repeat timing for the canvas.
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_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_set_long_press_action(uint32_t action_id)
Set the action id fired on a canvas long-press.
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_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.
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_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_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.
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_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_usb_cdc_write(const uint8_t *data, size_t len)
Write raw bytes to the USB-CDC TX stream.
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_ble_scan_done(wasm_exec_env_t)
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 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_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 bool wbuf_ok(wasm_exec_env_t env, const void *ptr, size_t len)
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)
static int32_t w_host_ble_consume_read(wasm_exec_env_t, uint8_t *buf, uint32_t size)
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_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_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_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_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_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_ui_insert_list_item(wasm_exec_env_t exec_env, uint32_t index, const ui_item_t *item)
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 cdc::core::PsramUniquePtr< NativeSymbol > s_symbols_ram
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_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_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_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_gpio_write(wasm_exec_env_t, uint32_t pin, int32_t level)
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_view_canvas_set_text_color(wasm_exec_env_t, uint32_t inverted)
static int32_t w_host_ble_scan_results(wasm_exec_env_t exec_env, void *out, uint32_t *count)
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_msg_send_interactive(wasm_exec_env_t, const char *mime, const uint8_t *data, uint32_t len)
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_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_http_read_chunk(wasm_exec_env_t, int32_t h, uint8_t *buf, uint32_t buf_size)
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_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_commit(wasm_exec_env_t, uint32_t full_refresh)
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_display_flush(wasm_exec_env_t, uint32_t mode)
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_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_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_set_key_repeat(wasm_exec_env_t, uint32_t initial_ms, uint32_t repeat_ms)
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_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_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_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_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_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_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 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_view_canvas_vline(wasm_exec_env_t, int32_t x, int32_t y, int32_t h)
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_ble_read_char(wasm_exec_env_t, uint32_t conn, uint32_t vh, uint32_t aid)
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_gpio_pwm_set_duty(wasm_exec_env_t, uint32_t pin, uint32_t duty)
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_ble_consume_notification(wasm_exec_env_t exec_env, uint16_t *vh_out, uint8_t *buf, uint32_t size)
static int32_t w_host_view_canvas_invert_rect(wasm_exec_env_t, int32_t x, int32_t y, int32_t w, int32_t h)
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_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_i2c_scan(wasm_exec_env_t exec_env, uint32_t bus, uint8_t *found, uint32_t *count)
static int32_t w_host_view_canvas_remove_widget(wasm_exec_env_t, uint32_t widget_id)
static int32_t w_host_is_time_set(wasm_exec_env_t)
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 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_ui_push_message(wasm_exec_env_t, const char *t, uint32_t icon, uint32_t ms)
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_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_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_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_socket_open(wasm_exec_env_t, uint32_t proto, const char *host, uint32_t port, uint32_t timeout)
static int32_t w_host_wifi_start_scan(wasm_exec_env_t)
static int32_t w_host_wifi_ip(wasm_exec_env_t, char *out, uint32_t sz)
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:480
One characteristic discovered on a connected peer (central role).
Definition host_api.h:505
One device from a central scan.
Definition host_api.h:497
A plugin GATT service definition (peripheral role). Always primary.
Definition host_api.h:489
const char * label
Definition host_api.h:727