1use nanoserde::{DeJson, SerJson};
10
11#[derive(Copy, Clone, Debug)]
13pub struct Float32 {
14 pub(crate) category: &'static str,
15 pub(crate) name: &'static str,
16 pub(crate) default: f32,
17
18 pub(crate) min: Option<f32>,
19 pub(crate) max: Option<f32>,
20}
21
22#[derive(Clone, Debug, SerJson, DeJson)]
24pub struct Float32Variable {
25 pub(crate) default: f32,
26
27 pub(crate) min: Option<f32>,
28 pub(crate) max: Option<f32>,
29 pub(crate) current: f32,
30}
31
32#[derive(Copy, Clone, Debug)]
34pub struct Float64 {
35 pub(crate) category: &'static str,
36 pub(crate) name: &'static str,
37 pub(crate) default: f64,
38
39 pub(crate) min: Option<f64>,
40 pub(crate) max: Option<f64>,
41}
42
43#[derive(Clone, Debug, SerJson, DeJson)]
45pub struct Float64Variable {
46 pub(crate) default: f64,
47
48 pub(crate) min: Option<f64>,
49 pub(crate) max: Option<f64>,
50 pub(crate) current: f64,
51}
52
53#[cfg(test)]
54mod tests {
55 use super::{Float32, Float64};
56
57 use serial_test::serial;
58
59 const TEST_FLOAT32_1: Float32 = Float32::new("float", "float32_1", 0.1, Some(0.0), Some(1.0));
60 const TEST_FLOAT32_2: Float32 = Float32::new("float", "float32_2", 0.2, None, Some(1.0));
61 const TEST_FLOAT32_3: Float32 = Float32::new("float", "float32_3", 0.3, Some(0.0), None);
62 const TEST_FLOAT32_4: Float32 = Float32::new("float", "float32_4", 0.4, None, None);
63
64 #[test]
65 #[serial]
66 fn default_32() {
67 TEST_FLOAT32_1.register();
68 TEST_FLOAT32_2.register();
69 TEST_FLOAT32_3.register();
70 TEST_FLOAT32_4.register();
71 }
72
73 #[test]
74 #[serial]
75 fn get_32() {
76 TEST_FLOAT32_1.reset();
77 TEST_FLOAT32_2.reset();
78 TEST_FLOAT32_3.reset();
79 TEST_FLOAT32_4.reset();
80 assert_eq!(TEST_FLOAT32_1.read(), 0.1);
81 assert_eq!(TEST_FLOAT32_2.read(), 0.2);
82 assert_eq!(TEST_FLOAT32_3.read(), 0.3);
83 assert_eq!(TEST_FLOAT32_4.read(), 0.4);
84 }
85
86 #[test]
87 #[serial]
88 fn set_high_32() {
89 TEST_FLOAT32_1.write(2.0);
90 TEST_FLOAT32_2.write(2.0);
91 TEST_FLOAT32_3.write(2.0);
92 TEST_FLOAT32_4.write(2.0);
93
94 assert_eq!(TEST_FLOAT32_1.read(), 1.0);
95 assert_eq!(TEST_FLOAT32_2.read(), 1.0);
96 assert_eq!(TEST_FLOAT32_3.read(), 2.0);
97 assert_eq!(TEST_FLOAT32_4.read(), 2.0);
98 }
99
100 #[test]
101 #[serial]
102 fn set_low_32() {
103 TEST_FLOAT32_1.write(-2.0);
104 TEST_FLOAT32_2.write(-2.0);
105 TEST_FLOAT32_3.write(-2.0);
106 TEST_FLOAT32_4.write(-2.0);
107
108 assert_eq!(TEST_FLOAT32_1.read(), 0.0);
109 assert_eq!(TEST_FLOAT32_2.read(), -2.0);
110 assert_eq!(TEST_FLOAT32_3.read(), 0.0);
111 assert_eq!(TEST_FLOAT32_4.read(), -2.0);
112 }
113
114 #[test]
115 #[serial]
116 fn reset_32() {
117 TEST_FLOAT32_1.reset();
118 TEST_FLOAT32_2.reset();
119 TEST_FLOAT32_3.reset();
120 TEST_FLOAT32_4.reset();
121
122 assert_eq!(TEST_FLOAT32_1.read(), 0.1);
123 assert_eq!(TEST_FLOAT32_2.read(), 0.2);
124 assert_eq!(TEST_FLOAT32_3.read(), 0.3);
125 assert_eq!(TEST_FLOAT32_4.read(), 0.4);
126 }
127
128 const TEST_FLOAT64_1: Float64 = Float64::new("float", "float64_1", 0.1, Some(0.0), Some(1.0));
129 const TEST_FLOAT64_2: Float64 = Float64::new("float", "float64_2", 0.2, None, Some(1.0));
130 const TEST_FLOAT64_3: Float64 = Float64::new("float", "float64_3", 0.3, Some(0.0), None);
131 const TEST_FLOAT64_4: Float64 = Float64::new("float", "float64_4", 0.4, None, None);
132
133 #[test]
134 #[serial]
135 fn default_64() {
136 TEST_FLOAT64_1.register();
137 TEST_FLOAT64_2.register();
138 TEST_FLOAT64_3.register();
139 TEST_FLOAT64_4.register();
140 }
141
142 #[test]
143 #[serial]
144 fn get_64() {
145 TEST_FLOAT64_1.reset();
146 TEST_FLOAT64_2.reset();
147 TEST_FLOAT64_3.reset();
148 TEST_FLOAT64_4.reset();
149 assert_eq!(TEST_FLOAT64_1.read(), 0.1);
150 assert_eq!(TEST_FLOAT64_2.read(), 0.2);
151 assert_eq!(TEST_FLOAT64_3.read(), 0.3);
152 assert_eq!(TEST_FLOAT64_4.read(), 0.4);
153 }
154
155 #[test]
156 #[serial]
157 fn set_high_64() {
158 TEST_FLOAT64_1.write(2.0);
159 TEST_FLOAT64_2.write(2.0);
160 TEST_FLOAT64_3.write(2.0);
161 TEST_FLOAT64_4.write(2.0);
162
163 assert_eq!(TEST_FLOAT64_1.read(), 1.0);
164 assert_eq!(TEST_FLOAT64_2.read(), 1.0);
165 assert_eq!(TEST_FLOAT64_3.read(), 2.0);
166 assert_eq!(TEST_FLOAT64_4.read(), 2.0);
167 }
168
169 #[test]
170 #[serial]
171 fn set_low_64() {
172 TEST_FLOAT64_1.write(-2.0);
173 TEST_FLOAT64_2.write(-2.0);
174 TEST_FLOAT64_3.write(-2.0);
175 TEST_FLOAT64_4.write(-2.0);
176
177 assert_eq!(TEST_FLOAT64_1.read(), 0.0);
178 assert_eq!(TEST_FLOAT64_2.read(), -2.0);
179 assert_eq!(TEST_FLOAT64_3.read(), 0.0);
180 assert_eq!(TEST_FLOAT64_4.read(), -2.0);
181 }
182
183 #[test]
184 #[serial]
185 fn reset_64() {
186 TEST_FLOAT64_1.reset();
187 TEST_FLOAT64_2.reset();
188 TEST_FLOAT64_3.reset();
189 TEST_FLOAT64_4.reset();
190
191 assert_eq!(TEST_FLOAT64_1.read(), 0.1);
192 assert_eq!(TEST_FLOAT64_2.read(), 0.2);
193 assert_eq!(TEST_FLOAT64_3.read(), 0.3);
194 assert_eq!(TEST_FLOAT64_4.read(), 0.4);
195 }
196}