Zephyr API Documentation 4.4.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
linear_range.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2022, Nordic Semiconductor ASA
3 * SPDX-License-Identifier: Apache-2.0
4 */
5
11
12#ifndef INCLUDE_ZEPHYR_SYS_LINEAR_RANGE_H_
13#define INCLUDE_ZEPHYR_SYS_LINEAR_RANGE_H_
14
15#include <errno.h>
16#include <stdint.h>
17#include <stdlib.h>
18
19#include <zephyr/sys/util.h>
20
21#ifdef __cplusplus
22extern "C" {
23#endif
24
65
77
86#define LINEAR_RANGE_INIT(_min, _step, _min_idx, _max_idx) \
87 { \
88 .min = (_min), \
89 .step = (_step), \
90 .min_idx = (_min_idx), \
91 .max_idx = (_max_idx), \
92 }
93
101static inline uint32_t linear_range_values_count(const struct linear_range *r)
102{
103 return r->max_idx - r->min_idx + 1U;
104}
105
115 const struct linear_range *r, size_t r_cnt)
116{
117 uint32_t values = 0U;
118
119 for (size_t i = 0U; i < r_cnt; i++) {
120 values += linear_range_values_count(&r[i]);
121 }
122
123 return values;
124}
125
133static inline int32_t linear_range_get_max_value(const struct linear_range *r)
134{
135 return r->min + (int32_t)(r->step * (r->max_idx - r->min_idx));
136}
137
148static inline int linear_range_get_value(const struct linear_range *r,
149 uint16_t idx, int32_t *val)
150{
151 if ((idx < r->min_idx) || (idx > r->max_idx)) {
152 return -EINVAL;
153 }
154
155 *val = r->min + (int32_t)(r->step * (idx - r->min_idx));
156
157 return 0;
158}
159
171static inline int linear_range_group_get_value(const struct linear_range *r,
172 size_t r_cnt, uint16_t idx,
173 int32_t *val)
174{
175 int ret = -EINVAL;
176
177 for (size_t i = 0U; (ret != 0) && (i < r_cnt); i++) {
178 ret = linear_range_get_value(&r[i], idx, val);
179 }
180
181 return ret;
182}
183
199static inline int linear_range_get_index(const struct linear_range *r,
200 int32_t val, uint16_t *idx)
201{
202 if (val < r->min) {
203 *idx = r->min_idx;
204 return -ERANGE;
205 }
206
207 if (val > linear_range_get_max_value(r)) {
208 *idx = r->max_idx;
209 return -ERANGE;
210 }
211
212 if (r->step == 0U) {
213 *idx = r->min_idx;
214 } else {
215 *idx = r->min_idx + DIV_ROUND_UP((uint32_t)(val - r->min),
216 r->step);
217 }
218
219 return 0;
220}
221
237static inline int linear_range_group_get_index(const struct linear_range *r,
238 size_t r_cnt, int32_t val,
239 uint16_t *idx)
240{
241 for (size_t i = 0U; i < r_cnt; i++) {
242 if ((val > linear_range_get_max_value(&r[i])) &&
243 (i < (r_cnt - 1U))) {
244 continue;
245 }
246
247 return linear_range_get_index(&r[i], val, idx);
248 }
249
250 return -EINVAL;
251}
252
271static inline int linear_range_get_win_index(const struct linear_range *r,
272 int32_t val_min, int32_t val_max,
273 uint16_t *idx)
274{
276
277 if ((val_max < r->min) || (val_min > r_max)) {
278 return -EINVAL;
279 }
280
281 if (val_min < r->min) {
282 *idx = r->min_idx;
283 return -ERANGE;
284 }
285
286 if (val_max > r_max) {
287 *idx = r->max_idx;
288 return -ERANGE;
289 }
290
291 if (r->step == 0U) {
292 *idx = r->min_idx;
293 return 0;
294 }
295
296 *idx = r->min_idx + DIV_ROUND_UP((uint32_t)(val_min - r->min), r->step);
297 if ((r->min + r->step * (*idx - r->min_idx)) > val_max) {
298 return -EINVAL;
299 }
300
301 return 0;
302}
303
324static inline int linear_range_group_get_win_index(const struct linear_range *r,
325 size_t r_cnt,
326 int32_t val_min,
327 int32_t val_max,
328 uint16_t *idx)
329{
330 for (size_t i = 0U; i < r_cnt; i++) {
331 if (val_min > linear_range_get_max_value(&r[i])) {
332 continue;
333 }
334
335 return linear_range_get_win_index(&r[i], val_min, val_max, idx);
336 }
337
338 return -EINVAL;
339}
340
342
343#ifdef __cplusplus
344}
345#endif
346
347#endif /* INCLUDE_ZEPHYR_SYS_LINEAR_RANGE_H_ */
System error numbers.
static int linear_range_group_get_win_index(const struct linear_range *r, size_t r_cnt, int32_t val_min, int32_t val_max, uint16_t *idx)
Obtain index in a group given a value that must be within a window of values.
Definition linear_range.h:324
static uint32_t linear_range_group_values_count(const struct linear_range *r, size_t r_cnt)
Obtain the number of values representable by a group of linear ranges.
Definition linear_range.h:114
static int linear_range_get_win_index(const struct linear_range *r, int32_t val_min, int32_t val_max, uint16_t *idx)
Obtain index given a window of values.
Definition linear_range.h:271
static int linear_range_get_value(const struct linear_range *r, uint16_t idx, int32_t *val)
Obtain value given a linear range index.
Definition linear_range.h:148
static int linear_range_get_index(const struct linear_range *r, int32_t val, uint16_t *idx)
Obtain index given a value.
Definition linear_range.h:199
static int linear_range_group_get_index(const struct linear_range *r, size_t r_cnt, int32_t val, uint16_t *idx)
Obtain index in a group given a value.
Definition linear_range.h:237
static int linear_range_group_get_value(const struct linear_range *r, size_t r_cnt, uint16_t idx, int32_t *val)
Obtain value in a group given a linear range index.
Definition linear_range.h:171
static uint32_t linear_range_values_count(const struct linear_range *r)
Obtain the number of values representable in a linear range.
Definition linear_range.h:101
static int32_t linear_range_get_max_value(const struct linear_range *r)
Obtain the maximum value representable by a linear range.
Definition linear_range.h:133
#define DIV_ROUND_UP(n, d)
Divide and round up.
Definition util.h:348
#define EINVAL
Invalid argument.
Definition errno.h:60
#define ERANGE
Result too large.
Definition errno.h:72
#define min(a, b)
Return smaller value of two provided expressions.
Definition minmax.h:81
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
__INT32_TYPE__ int32_t
Definition stdint.h:74
__UINT16_TYPE__ uint16_t
Definition stdint.h:89
Linear range.
Definition linear_range.h:67
int32_t min
Minimum value.
Definition linear_range.h:69
uint16_t min_idx
Minimum index (must be <= maximum index).
Definition linear_range.h:73
uint16_t max_idx
Maximum index (must be >= minimum index).
Definition linear_range.h:75
uint32_t step
Step value.
Definition linear_range.h:71
Misc utilities.