Dawn Framework 1.0
Universal data acquisition framework for embedded systems
limits.cxx
1// dawn/src/io/limits.cxx
2//
3// SPDX-License-Identifier: Apache-2.0
4//
5
6#include "dawn/io/limits.hxx"
7
8#include <cmath>
9#include <cstdint>
10#include <cstring>
11
12using namespace dawn;
13
14static size_t limitsDtypeSize(uint8_t dtype)
15{
16 int sz;
17
18 if (dtype == SObjectId::DTYPE_ANY)
19 {
20 return sizeof(uint32_t);
21 }
22
24 if (sz <= 0)
25 {
26 return sizeof(uint32_t);
27 }
28
29 return (size_t)sz;
30}
31
32static size_t limitsWordsPerValue(uint8_t dtype)
33{
34 size_t dsize = limitsDtypeSize(dtype);
35 (void)dsize;
36
37 return 1;
38}
39
40int CIOLimits::bind(uint8_t id, uint8_t dtype, size_t words, const uint32_t *data)
41{
42 if (data == nullptr || words == 0)
43 {
44 return -EINVAL;
45 }
46
47 if (nWords == 0)
48 {
49 nWords = words;
50 cfgDtype = dtype;
51 }
52 else
53 {
54 if (nWords != words || cfgDtype != dtype)
55 {
56 return -EINVAL;
57 }
58 }
59
60 switch (id)
61 {
62 case CFG_LIMIT_MIN:
63 {
64 minData = data;
65 return OK;
66 }
67 case CFG_LIMIT_MAX:
68 {
69 maxData = data;
70 return OK;
71 }
72 case CFG_LIMIT_STEP:
73 {
74 stepData = data;
75 return OK;
76 }
77 default:
78 {
79 return -EINVAL;
80 }
81 }
82}
83
84int CIOLimits::validate(const uint32_t *data, size_t words, uint8_t dtype) const
85{
86 size_t items;
87 size_t step_words;
88 size_t i;
89
90 if (!isConfigured())
91 {
92 return OK;
93 }
94
95 if (data == nullptr || minData == nullptr || maxData == nullptr || stepData == nullptr)
96 {
97 return -EINVAL;
98 }
99
100 if (dtype != cfgDtype)
101 {
102 return -EINVAL;
103 }
104
105 if (words != nWords)
106 {
107 return -EINVAL;
108 }
109
110 step_words = limitsWordsPerValue(dtype);
111 if (step_words == 0 || words % step_words != 0)
112 {
113 return -EINVAL;
114 }
115
116 items = words / step_words;
117
118 for (i = 0; i < items; i++)
119 {
120 switch (dtype)
121 {
122#if defined(CONFIG_DAWN_DTYPE_BOOL) || defined(CONFIG_DAWN_DTYPE_UINT8) || \
123 defined(CONFIG_DAWN_DTYPE_UINT16) || defined(CONFIG_DAWN_DTYPE_UINT32) || \
124 defined(CONFIG_DAWN_DTYPE_CHAR)
125# ifdef CONFIG_DAWN_DTYPE_BOOL
127# endif
128# ifdef CONFIG_DAWN_DTYPE_UINT8
130# endif
131# ifdef CONFIG_DAWN_DTYPE_UINT16
133# endif
134# ifdef CONFIG_DAWN_DTYPE_UINT32
136# endif
137# ifdef CONFIG_DAWN_DTYPE_CHAR
139# endif
140 {
141 uint32_t v;
142 uint32_t min;
143 uint32_t max;
144 uint32_t step;
145 size_t off = i * step_words;
146
147 v = data[i];
148 min = minData[off];
149 max = maxData[off];
150 step = stepData[off];
151
152 if (v < min || v > max)
153 {
154 return -ERANGE;
155 }
156
157 if (step > 0 && ((v - min) % step) != 0)
158 {
159 return -ERANGE;
160 }
161
162 break;
163 }
164#endif
165
166#if defined(CONFIG_DAWN_DTYPE_INT8) || defined(CONFIG_DAWN_DTYPE_INT16) || \
167 defined(CONFIG_DAWN_DTYPE_INT32)
168# ifdef CONFIG_DAWN_DTYPE_INT8
170# endif
171# ifdef CONFIG_DAWN_DTYPE_INT16
173# endif
174# ifdef CONFIG_DAWN_DTYPE_INT32
176# endif
177 {
178 int32_t v;
179 int32_t min;
180 int32_t max;
181 int32_t step;
182 int32_t min32;
183 int32_t max32;
184 int32_t step32;
185 size_t off = i * step_words;
186
187 std::memcpy(&v, &data[i], sizeof(v));
188
189 std::memcpy(&min32, &minData[off], sizeof(min32));
190 std::memcpy(&max32, &maxData[off], sizeof(max32));
191 std::memcpy(&step32, &stepData[off], sizeof(step32));
192 min = min32;
193 max = max32;
194 step = step32;
195
196 if (v < min || v > max)
197 {
198 return -ERANGE;
199 }
200
201 if (step > 0 && ((v - min) % step) != 0)
202 {
203 return -ERANGE;
204 }
205
206 break;
207 }
208#endif
209
210#if defined(CONFIG_DAWN_DTYPE_B16) || defined(CONFIG_DAWN_DTYPE_UB16)
211# ifdef CONFIG_DAWN_DTYPE_B16
213# endif
214# ifdef CONFIG_DAWN_DTYPE_UB16
216# endif
217 {
218 int32_t v;
219 int32_t min;
220 int32_t max;
221 int32_t step;
222 size_t off = i * step_words;
223
224 std::memcpy(&v, &data[i], sizeof(v));
225 std::memcpy(&min, &minData[off], sizeof(min));
226 std::memcpy(&max, &maxData[off], sizeof(max));
227 std::memcpy(&step, &stepData[off], sizeof(step));
228
229 if (v < min || v > max)
230 {
231 return -ERANGE;
232 }
233
234 if (step > 0 && ((v - min) % step) != 0)
235 {
236 return -ERANGE;
237 }
238
239 break;
240 }
241#endif
242
243#ifdef CONFIG_DAWN_DTYPE_FLOAT
245 {
246 float v;
247 float min;
248 float max;
249 float step;
250 float rem;
251 float eps;
252 size_t off = i * step_words;
253
254 v = SObjectCfg::cfgToF(data[i]);
255 min = SObjectCfg::cfgToF(minData[off]);
256 max = SObjectCfg::cfgToF(maxData[off]);
257 step = SObjectCfg::cfgToF(stepData[off]);
258
259 if (v < min || v > max)
260 {
261 return -ERANGE;
262 }
263
264 if (step > 0.0f)
265 {
266 rem = std::fmod(v - min, step);
267 eps = step * 1e-6f;
268
269 if (!(std::fabs(rem) <= eps || std::fabs(rem - step) <= eps))
270 {
271 return -ERANGE;
272 }
273 }
274
275 break;
276 }
277#endif
278
279 default:
280 {
281 return -ENOTSUP;
282 }
283 }
284 }
285
286 return OK;
287}
bool isConfigured() const
Check whether any limits are configured.
Definition limits.hxx:77
int validate(const uint32_t *data, size_t words, uint8_t dtype) const
Validate payload against configured limits.
Definition limits.hxx:177
@ CFG_LIMIT_STEP
Step limit words.
Definition limits.hxx:34
@ CFG_LIMIT_MIN
Minimum limit words.
Definition limits.hxx:32
@ CFG_LIMIT_MAX
Maximum limit words.
Definition limits.hxx:33
int bind(uint8_t id, uint8_t dtype, size_t words, const uint32_t *data)
Bind one limit config item.
Definition limits.hxx:164
static float cfgToF(ObjectCfgData_t x)
Convert ObjectCfgData_t to float.
Out-of-tree user-extension hooks for Dawn.
Definition bindable.hxx:13
EObjectDataType
Data types supported by Dawn framework.
Definition objectid.hxx:61
@ DTYPE_FLOAT
IEEE 754 single-precision floating point (32-bit).
Definition objectid.hxx:112
@ DTYPE_INT32
Signed 32-bit integer (-2147483648 to 2147483647).
Definition objectid.hxx:92
@ DTYPE_UINT8
Unsigned 8-bit integer (0 to 255).
Definition objectid.hxx:80
@ DTYPE_INT16
Signed 16-bit integer (-32768 to 32767).
Definition objectid.hxx:84
@ DTYPE_INT8
Signed 8-bit integer (-128 to 127).
Definition objectid.hxx:76
@ DTYPE_ANY
Wildcard data type (matches any actual type).
Definition objectid.hxx:68
@ DTYPE_UINT16
Unsigned 16-bit integer (0 to 65535).
Definition objectid.hxx:88
@ DTYPE_UB16
Unsigned 16.16 fixed-point (32-bit).
Definition objectid.hxx:132
@ DTYPE_CHAR
Character/string type (null-terminated, 4-byte aligned).
Definition objectid.hxx:144
@ DTYPE_UINT32
Unsigned 32-bit integer (0 to 4294967295).
Definition objectid.hxx:96
@ DTYPE_BOOL
Boolean data type (stored in 32-bit container).
Definition objectid.hxx:72
@ DTYPE_B16
Signed 16.16 fixed-point (32-bit).
Definition objectid.hxx:128
static int getDtypeSize_(const EObjectDataType dtype)
Get byte size for a specific data type.
Definition objectid.cxx:12