pub struct MemoryMapped { address: *mut T, } impl MemoryMapped { pub const fn new(address: usize) -> Self { MemoryMapped { address: address as *mut T, } } pub fn get(&self) -> T { unsafe { self.address.read_volatile() } } pub fn set(&self, val: T) { unsafe { self.address.write_volatile(val) } } } pub struct MemoryMapped1DArray { array: *mut [T; N], } #[allow(dead_code)] impl MemoryMapped1DArray { pub const fn new(address: usize) -> Self { MemoryMapped1DArray { array: address as *mut [T; N], } } pub fn get(&self, n: usize) -> T { unsafe { (&mut (*self.array)[n] as *mut T).read_volatile() } } pub fn set(&self, n: usize, val: T) { unsafe { (&mut (*self.array)[n] as *mut T).write_volatile(val) } } } pub struct MemoryMapped2DArray { array: *mut [[T; X]; Y], } impl MemoryMapped2DArray { pub const fn new(address: usize) -> Self { MemoryMapped2DArray { array: address as *mut [[T; X]; Y], } } pub fn get(&self, x: usize, y: usize) -> T { unsafe { (&mut (*self.array)[y][x] as *mut T).read_volatile() } } pub fn set(&self, x: usize, y: usize, val: T) { unsafe { (&mut (*self.array)[y][x] as *mut T).write_volatile(val) } } }