1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#[macro_use]
pub mod register;
pub trait LowLevelDevice<I> {
fn new(interface: I) -> Self
where
Self: Sized;
fn free(self) -> I;
}
#[macro_export]
macro_rules! create_low_level_device {
(
$(#[$device_doc:meta])*
$device_name:ident {
errors: [$($error_type:ident),*],
hardware_interface_requirements: {$($hardware_interface_bound_type:tt)*},
hardware_interface_capabilities: $hardware_interface_capabilities:tt $(,)?
}
) => {
use device_driver::ll::LowLevelDevice;
use device_driver::ll::register::ConversionError;
pub trait HardwareInterface : $($hardware_interface_bound_type)* $hardware_interface_capabilities
$(#[$device_doc])*
pub struct $device_name<I: HardwareInterface> {
interface: I,
}
impl<I: HardwareInterface> $device_name<I> {
pub fn interface(&mut self) -> &mut I {
&mut self.interface
}
}
impl<I: HardwareInterface> LowLevelDevice<I> for $device_name<I> {
fn new(interface: I) -> Self
where
Self: Sized,
{
Self { interface }
}
fn free(self) -> I {
self.interface
}
}
#[derive(Debug)]
pub enum LowLevelError {
ConversionError,
$($error_type($error_type))*
}
impl<T: core::fmt::UpperHex + core::fmt::Debug> From<ConversionError<T>> for LowLevelError {
fn from(_: ConversionError<T>) -> Self {
LowLevelError::ConversionError
}
}
$(
impl From<$error_type> for LowLevelError {
fn from(val: $error_type) -> Self {
LowLevelError::$error_type(val)
}
}
)*
};
}