firmware for my Touchscreen E-Paper Input Module for Framework Laptop 16
1use core::mem::MaybeUninit;
2use crate::syscall;
3use crate::syscall::SyscallNumber;
4
5#[cfg(feature = "critical-section-impl")]
6use once_cell::sync::OnceCell;
7
8#[repr(usize)]
9#[derive(Copy, Clone, Debug, Eq, PartialEq)]
10#[cfg_attr(feature = "defmt", derive(defmt::Format))]
11pub enum MiscSyscall {
12 GetSerial = 0,
13 LogMessage = 1,
14}
15
16impl TryFrom<usize> for MiscSyscall {
17 type Error = ();
18
19 fn try_from(value: usize) -> Result<Self, Self::Error> {
20 match value {
21 x if x == MiscSyscall::GetSerial as usize => Ok(MiscSyscall::GetSerial),
22 x if x == MiscSyscall::LogMessage as usize => Ok(MiscSyscall::LogMessage),
23 _ => Err(()),
24 }
25 }
26}
27
28#[repr(usize)]
29#[derive(Copy, Clone, Debug, Eq, PartialEq)]
30#[cfg_attr(feature = "defmt", derive(defmt::Format))]
31pub enum LogLevel {
32 Trace = 0,
33 Debug = 1,
34 Info = 2,
35 Warn = 3,
36 Error = 4,
37}
38
39impl TryFrom<usize> for LogLevel {
40 type Error = ();
41
42 fn try_from(value: usize) -> Result<Self, ()> {
43 match value {
44 x if x == LogLevel::Trace as usize => Ok(LogLevel::Trace),
45 x if x == LogLevel::Info as usize => Ok(LogLevel::Info),
46 x if x == LogLevel::Debug as usize => Ok(LogLevel::Debug),
47 x if x == LogLevel::Warn as usize => Ok(LogLevel::Warn),
48 x if x == LogLevel::Error as usize => Ok(LogLevel::Error),
49 _ => Err(()),
50 }
51 }
52}
53
54pub fn get_serial_raw() -> [u8; 16] {
55 let mut buf: MaybeUninit<[u8; 16]> = MaybeUninit::uninit();
56 let ptr = buf.as_mut_ptr();
57
58 unsafe {
59 syscall!(
60 SyscallNumber::Misc,
61 in MiscSyscall::GetSerial,
62 in ptr,
63 );
64
65 buf.assume_init()
66 }
67}
68
69#[cfg(feature = "critical-section-impl")]
70static SERIAL: OnceCell<[u8; 16]> = OnceCell::new();
71
72#[cfg(feature = "critical-section-impl")]
73pub fn get_serial() -> &'static str {
74 if SERIAL.get().is_none() {
75 SERIAL.set(get_serial_raw()).unwrap();
76 }
77
78 unsafe {
79 core::str::from_utf8_unchecked(SERIAL.get().unwrap())
80 }
81}
82
83
84pub fn log(message: &str, level: LogLevel) {
85 let len = message.len();
86 let ptr = message.as_ptr();
87
88 unsafe {
89 syscall!(
90 SyscallNumber::Misc,
91 in MiscSyscall::LogMessage,
92 in level,
93 in len,
94 in ptr,
95 );
96 }
97}
98
99pub fn trace(message: &str) {
100 log(message, LogLevel::Trace);
101}
102
103pub fn debug(message: &str) {
104 log(message, LogLevel::Debug);
105}
106
107pub fn info(message: &str) {
108 log(message, LogLevel::Info);
109}
110
111pub fn warn(message: &str) {
112 log(message, LogLevel::Warn);
113}
114
115pub fn error(message: &str) {
116 log(message, LogLevel::Error);
117}