Skip to content

Commit

Permalink
[WIP] Update state in serial message callback
Browse files Browse the repository at this point in the history
  • Loading branch information
paulyoung committed Jun 8, 2024
1 parent 6392370 commit c08550e
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 0 deletions.
5 changes: 5 additions & 0 deletions api/system/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,11 @@ required-features = ["sys/entry-point", "sys/lang-items"]
name = "set-serial-message-callback"
crate-type = ["dylib", "staticlib"]
path = "examples/set-serial-message-callback.rs"

[[example]]
name = "update-state-in-serial-message-callback"
crate-type = ["dylib", "staticlib"]
path = "examples/update-state-in-serial-message-callback.rs"
required-features = ["sys/entry-point", "sys/lang-items"]

[package.metadata.playdate]
Expand Down
2 changes: 2 additions & 0 deletions api/system/examples/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ cargo playdate run -p=playdate-system --example=handler-boxed --features=sys/lan
cargo playdate run -p=playdate-system --example=handler-pinned --features=sys/lang-items,sys/entry-point

cargo playdate run -p=playdate-system --example=set-serial-message-callback --features=sys/lang-items,sys/entry-point

cargo playdate run -p=playdate-system --example=update-state-in-serial-message-callback --features=sys/lang-items,sys/entry-point
```

More information how to use [cargo-playdate][] in help: `cargo playdate --help`.
Expand Down
65 changes: 65 additions & 0 deletions api/system/examples/update-state-in-serial-message-callback.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
#![no_std]
extern crate alloc;

#[macro_use]
extern crate sys;
extern crate playdate_system as system;

use alloc::string::String;
use core::ptr::NonNull;

use sys::EventLoopCtrl;
use sys::ffi::*;
use system::System;
use system::event::SystemEventExt as _;
use system::prelude::*;

struct State {
latest_message: Option<String>,
}

impl State {
fn new() -> Self { Self { latest_message: None } }

/// System event handler
fn event(&'static mut self, event: SystemEvent) -> EventLoopCtrl {
match event {
SystemEvent::Init => {
System::Default().set_serial_message_callback(Some(|msg| {
self.latest_message = Some(msg);
}));

self.set_update_handler();

println!("Game init complete");
},
_ => {},
}
EventLoopCtrl::Continue
}
}

impl Update for State {
fn update(&mut self) -> UpdateCtrl {
if let Some(latest_message) = self.latest_message.clone() {
println!("Latest message: {:#?}", latest_message);
}
UpdateCtrl::Continue
}
}

/// Entry point
#[no_mangle]
pub fn event_handler(_api: NonNull<PlaydateAPI>, event: SystemEvent, _sim_key_code: u32) -> EventLoopCtrl {
pub static mut STATE: Option<State> = None;

if unsafe { STATE.is_none() } {
let state = State::new();
unsafe { STATE = Some(state) }
}

unsafe { STATE.as_mut().expect("impossible").event(event) }
}

// Needed for debug build
ll_symbols!();

0 comments on commit c08550e

Please sign in to comment.