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#[derive(Debug, Clone, Copy, core::default::Default)]
13pub struct Default;
14impl Api for Default {}
15
16
17#[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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}