I ended up implementing a terrible (I don't know what I am doing) solution to provide posix_memalign
and atomic primitives. There might be a better way to implement the functions (maybe using mutex or hardware_sync)
This is how I am using the string support to display a button using LVGL and update the label when I click on it
...
var count: Int = 0
func buttonEventHandler(_ event: UnsafeMutablePointer<lv_event_t>?) {
guard let event = event else {
print("Event is null")
return
}
if lv_event_get_code(event) == LV_EVENT_CLICKED {
print_memory_stats()
print("Event Clicked")
guard let button = lv_event_get_target(event)?.assumingMemoryBound(to: lv_obj_t.self) else {
print("Failed to get button")
return
}
guard let label = lv_obj_get_child(button, 0) else {
print("Failed to get label")
return
}
count += 1
let labelText = "Counter: \(count)"
labelText.withCString { cString in
lv_label_set_text(label, cString)
}
print("Label text updated")
//lv_obj_invalidate(label)
}
}
func lvExampleButton() {
print("Creating Button")
let button = lv_button_create(lv_screen_active())
lv_obj_align(button, lv_align_t(LV_ALIGN_CENTER.rawValue), 0, -40)
let label = lv_label_create(button)
let myString: StaticString = "Click Meeee!"
myString.withUTF8Buffer { buffer in
lv_label_set_text(label, buffer.baseAddress)
}
lv_obj_center(label)
lv_obj_add_event_cb(
button,
{ event in
buttonEventHandler(event)
},
LV_EVENT_ALL,
nil
)
print("Button Created, printing stats")
print_memory_stats()
}
...