Embedded Swift running on the Raspberry Pi Pico

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()
}
...
3 Likes