Skip to main content
KeyOS API Reference

settings/
lib.rs

1// SPDX-FileCopyrightText: 2024 Foundation Devices, Inc. <hello@foundation.xyz>
2// SPDX-License-Identifier: GPL-3.0-or-later
3
4//! Settings server API for reading, writing, and subscribing to settings.
5
6pub 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    /// Returns the device's hardware board revision.
43    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}