1pub mod global {
7 pub use crate::types::{inner::*, BoardRevision};
8}
9
10mod macros;
11pub mod messages;
12mod types;
13
14use messages::*;
15use server::{CheckedConn, CheckedPermissions, MessageAllowed};
16
17#[macro_export]
18macro_rules! use_api {
19 ($settings:path, $server:path) => {
20 mod settings_permissions {
21 use settings::messages::*;
22 use $server as server;
23 pub use $settings as settings;
24 #[derive(Clone, Default, server::Permissions)]
25 #[server_name = "os/settings"]
26 pub struct SettingsPermissions;
27 }
28 type SettingsApi =
29 settings_permissions::settings::SettingsApi<settings_permissions::SettingsPermissions>;
30 };
31 () => {
32 settings::use_api!(settings, server);
33 };
34}
35
36#[derive(Debug, Default, Clone)]
37pub struct SettingsApi<P: CheckedPermissions> {
38 pub(crate) conn: CheckedConn<P>,
39}
40
41impl<P: CheckedPermissions> SettingsApi<P> {
42 pub fn get_board_revision(&self) -> global::BoardRevision
44 where
45 P: MessageAllowed<GetBoardRevision>,
46 {
47 self.conn.send_blocking_scalar(GetBoardRevision)
48 }
49
50 pub fn get_prime_color(&self) -> global::SystemTheme
51 where
52 P: MessageAllowed<GetPrimeColor>,
53 {
54 self.conn.send_blocking_scalar(GetPrimeColor)
55 }
56
57 pub fn flush_settings(&self)
58 where
59 P: MessageAllowed<FlushAll>,
60 {
61 self.conn.send_scalar(FlushAll { force: true })
62 }
63
64 pub fn wait_for_onboarding_complete(&self)
65 where
66 P: 'static,
67 P: MessageAllowed<SubscribeOnboardingStatus>,
68 {
69 server::listen(WaitForOnboarding(self.clone()));
70 }
71
72 pub fn lookup_timezone(&self, name: String, offset_minutes: i32) -> global::TimeZone
73 where
74 P: MessageAllowed<LookupTimeZone>,
75 {
76 self.conn.send_blocking_archive(LookupTimeZone { name, offset_minutes })
77 }
78}
79
80pub struct WaitForOnboarding<P: CheckedPermissions>(pub SettingsApi<P>);
81
82impl<P: CheckedPermissions> server::ServerMessages for WaitForOnboarding<P> {
83 const NAME: &'static str = "";
84
85 fn messages() -> &'static [server::MessageDef<Self>]
86 where
87 Self: Sized,
88 {
89 &[]
90 }
91}
92
93impl<P: CheckedPermissions> server::Server for WaitForOnboarding<P>
94where
95 P: MessageAllowed<SubscribeOnboardingStatus>,
96{
97 fn on_start(&mut self, context: &mut server::ServerContext<Self>) {
98 self.0.server_subscribe_onboarding_status(context);
99 }
100}
101
102impl<P: CheckedPermissions> server::ArchiveEventHandler<global::OnboardingStatus> for WaitForOnboarding<P>
103where
104 P: MessageAllowed<SubscribeOnboardingStatus>,
105{
106 fn handle(
107 &mut self,
108 msg: server::Owned<global::OnboardingStatus>,
109 _sender: xous::PID,
110 context: &mut server::ServerContext<Self>,
111 ) {
112 if msg.is_complete() {
113 context.shutdown();
114 }
115 }
116}