playdate_controls/
api.rs

1use core::ffi::c_float;
2use core::ffi::c_int;
3use core::ptr::NonNull;
4
5use sys::ffi::PDButtons;
6use sys::ffi::PDPeripherals;
7use sys::ffi::playdate_sys;
8
9/// Default system peripherals api end-point, ZST.
10///
11/// All calls approximately costs ~3 derefs.
12#[derive(Debug, Clone, Copy, core::default::Default)]
13pub struct Default;
14impl Api for Default {}
15
16
17/// Cached system peripherals api end-point.
18///
19/// Stores one reference, so size on stack is eq `usize`.
20///
21/// All calls approximately costs ~1 deref.
22#[derive(Clone, Copy)]
23#[cfg_attr(feature = "bindings-derive-debug", derive(Debug))]
24pub struct Cache(&'static playdate_sys);
25
26impl core::default::Default for Cache {
27	fn default() -> Self { Self(api!(system)) }
28}
29
30impl From<*const playdate_sys> for Cache {
31	#[inline(always)]
32	fn from(ptr: *const playdate_sys) -> Self { Self(unsafe { ptr.as_ref() }.expect("system")) }
33}
34
35impl From<&'static playdate_sys> for Cache {
36	#[inline(always)]
37	fn from(r: &'static playdate_sys) -> Self { Self(r) }
38}
39
40impl From<NonNull<playdate_sys>> for Cache {
41	#[inline(always)]
42	fn from(ptr: NonNull<playdate_sys>) -> Self { Self(unsafe { ptr.as_ref() }) }
43}
44
45impl From<&'_ NonNull<playdate_sys>> for Cache {
46	#[inline(always)]
47	fn from(ptr: &NonNull<playdate_sys>) -> Self { Self(unsafe { ptr.as_ref() }) }
48}
49
50impl From<system::api::Cache> for Cache {
51	#[inline(always)]
52	fn from(api: system::api::Cache) -> Self { Self(api.as_inner()) }
53}
54
55
56impl Api for Cache {
57	#[inline(always)]
58	fn set_peripherals_enabled(&self) -> unsafe extern "C" fn(mask: PDPeripherals) {
59		self.0.setPeripheralsEnabled.expect("setPeripheralsEnabled")
60	}
61
62	#[inline(always)]
63	fn get_button_state(
64		&self)
65		-> unsafe extern "C" fn(current: *mut PDButtons, pushed: *mut PDButtons, released: *mut PDButtons) {
66		self.0.getButtonState.expect("getButtonState")
67	}
68
69	#[inline(always)]
70	fn get_accelerometer(
71		&self)
72		-> unsafe extern "C" fn(out_x: *mut c_float, out_y: *mut c_float, out_z: *mut c_float) {
73		self.0.getAccelerometer.expect("getAccelerometer")
74	}
75
76	#[inline(always)]
77	fn get_crank_change(&self) -> unsafe extern "C" fn() -> c_float {
78		self.0.getCrankChange.expect("getCrankChange")
79	}
80
81	#[inline(always)]
82	fn get_crank_angle(&self) -> unsafe extern "C" fn() -> c_float { self.0.getCrankAngle.expect("getCrankAngle") }
83
84	#[inline(always)]
85	fn is_crank_docked(&self) -> unsafe extern "C" fn() -> c_int { self.0.isCrankDocked.expect("isCrankDocked") }
86
87	#[inline(always)]
88	fn set_crank_sounds_disabled(&self) -> unsafe extern "C" fn(flag: c_int) -> c_int {
89		self.0.setCrankSoundsDisabled.expect("setCrankSoundsDisabled")
90	}
91}
92
93
94impl Api for system::api::Default {}
95
96impl Api for system::api::Cache {
97	#[inline(always)]
98	fn set_peripherals_enabled(&self) -> unsafe extern "C" fn(mask: PDPeripherals) {
99		self.as_inner()
100		    .setPeripheralsEnabled
101		    .expect("setPeripheralsEnabled")
102	}
103
104	#[inline(always)]
105	fn get_button_state(
106		&self)
107		-> unsafe extern "C" fn(current: *mut PDButtons, pushed: *mut PDButtons, released: *mut PDButtons) {
108		self.as_inner().getButtonState.expect("getButtonState")
109	}
110
111	#[inline(always)]
112	fn get_accelerometer(
113		&self)
114		-> unsafe extern "C" fn(out_x: *mut c_float, out_y: *mut c_float, out_z: *mut c_float) {
115		self.as_inner().getAccelerometer.expect("getAccelerometer")
116	}
117
118	#[inline(always)]
119	fn get_crank_change(&self) -> unsafe extern "C" fn() -> c_float {
120		self.as_inner().getCrankChange.expect("getCrankChange")
121	}
122
123	#[inline(always)]
124	fn get_crank_angle(&self) -> unsafe extern "C" fn() -> c_float {
125		self.as_inner().getCrankAngle.expect("getCrankAngle")
126	}
127
128	#[inline(always)]
129	fn is_crank_docked(&self) -> unsafe extern "C" fn() -> c_int {
130		self.as_inner().isCrankDocked.expect("isCrankDocked")
131	}
132
133	#[inline(always)]
134	fn set_crank_sounds_disabled(&self) -> unsafe extern "C" fn(flag: c_int) -> c_int {
135		self.as_inner()
136		    .setCrankSoundsDisabled
137		    .expect("setCrankSoundsDisabled")
138	}
139}
140
141pub trait Api {
142	/// Returns [`sys::ffi::playdate_sys::setPeripheralsEnabled`]
143	#[doc(alias = "sys::ffi::playdate_sys::setPeripheralsEnabled")]
144	fn set_peripherals_enabled(&self) -> unsafe extern "C" fn(mask: PDPeripherals) {
145		*sys::api!(system.setPeripheralsEnabled)
146	}
147
148	/// Returns [`sys::ffi::playdate_sys::getButtonState`]
149	#[doc(alias = "sys::ffi::playdate_sys::getButtonState")]
150	fn get_button_state(
151		&self)
152		-> unsafe extern "C" fn(current: *mut PDButtons, pushed: *mut PDButtons, released: *mut PDButtons) {
153		*sys::api!(system.getButtonState)
154	}
155
156	/// Returns [`sys::ffi::playdate_sys::getAccelerometer`]
157	#[doc(alias = "sys::ffi::playdate_sys::getAccelerometer")]
158	fn get_accelerometer(
159		&self)
160		-> unsafe extern "C" fn(out_x: *mut c_float, out_y: *mut c_float, out_z: *mut c_float) {
161		*sys::api!(system.getAccelerometer)
162	}
163
164	/// Returns [`sys::ffi::playdate_sys::getCrankChange`]
165	#[doc(alias = "sys::ffi::playdate_sys::getCrankChange")]
166	fn get_crank_change(&self) -> unsafe extern "C" fn() -> c_float { *sys::api!(system.getCrankChange) }
167
168	/// Returns [`sys::ffi::playdate_sys::getCrankAngle`]
169	#[doc(alias = "sys::ffi::playdate_sys::getCrankAngle")]
170	fn get_crank_angle(&self) -> unsafe extern "C" fn() -> c_float { *sys::api!(system.getCrankAngle) }
171
172	/// Returns [`sys::ffi::playdate_sys::isCrankDocked`]
173	#[doc(alias = "sys::ffi::playdate_sys::isCrankDocked")]
174	fn is_crank_docked(&self) -> unsafe extern "C" fn() -> c_int { *sys::api!(system.isCrankDocked) }
175
176	/// Returns [`sys::ffi::playdate_sys::setCrankSoundsDisabled`]
177	#[doc(alias = "sys::ffi::playdate_sys::setCrankSoundsDisabled")]
178	fn set_crank_sounds_disabled(&self) -> unsafe extern "C" fn(flag: c_int) -> c_int {
179		*sys::api!(system.setCrankSoundsDisabled)
180	}
181}