firmware for my Touchscreen E-Paper Input Module for Framework Laptop 16
0

Configure Feed

Select the types of activity you want to include in your feed.

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}