Zephyr Project API  3.3.0
A Scalable Open Source RTOS
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
6#ifndef INCLUDE_ZEPHYR_SYS_LINEAR_RANGE_H_
7#define INCLUDE_ZEPHYR_SYS_LINEAR_RANGE_H_
8
9#include <errno.h>
10#include <stdint.h>
11#include <stdlib.h>
12
13#include <zephyr/sys/util.h>
14
15#ifdef __cplusplus
16extern "C" {
17#endif
18
69};
70
79#define LINEAR_RANGE_INIT(_min, _step, _min_idx, _max_idx) \
80 { \
81 .min = (_min), \
82 .step = (_step), \
83 .min_idx = (_min_idx), \
84 .max_idx = (_max_idx), \
85 }
86
95{
96 return r->max_idx - r->min_idx + 1U;
97}
98
108 const struct linear_range *r, size_t r_cnt)
109{
110 uint32_t values = 0U;
111
112 for (size_t i = 0U; i < r_cnt; i++) {
113 values += linear_range_values_count(&r[i]);
114 }
115
116 return values;
117}
118
127{
128 return r->min + (int32_t)(r->step * (r->max_idx - r->min_idx));
129}
130
141static inline int linear_range_get_value(const struct linear_range *r,
142 uint16_t idx, int32_t *val)
143{
144 if ((idx < r->min_idx) || (idx > r->max_idx)) {
145 return -EINVAL;
146 }
147
148 *val = r->min + (int32_t)(r->step * (idx - r->min_idx));
149
150 return 0;
151}
152
164static inline int linear_range_group_get_value(const struct linear_range *r,
165 size_t r_cnt, uint16_t idx,
166 int32_t *val)
167{
168 int ret = -EINVAL;
169
170 for (size_t i = 0U; (ret != 0) && (i < r_cnt); i++) {
171 ret = linear_range_get_value(&r[i], idx, val);
172 }
173
174 return ret;
175}
176
192static inline int linear_range_get_index(const struct linear_range *r,
193 int32_t val, uint16_t *idx)
194{
195 if (val < r->min) {
196 *idx = r->min_idx;
197 return -ERANGE;
198 }
199
200 if (val > linear_range_get_max_value(r)) {
201 *idx = r->max_idx;
202 return -ERANGE;
203 }
204
205 if (r->step == 0U) {
206 *idx = r->min_idx;
207 } else {
208 *idx = r->min_idx + ceiling_fraction((uint32_t)(val - r->min),
209 r->step);
210 }
211
212 return 0;
213}
214
230static inline int linear_range_group_get_index(const struct linear_range *r,
231 size_t r_cnt, int32_t val,
232 uint16_t *idx)
233{
234 for (size_t i = 0U; i < r_cnt; i++) {
235 if ((val > linear_range_get_max_value(&r[i])) &&
236 (i < (r_cnt - 1U))) {
237 continue;
238 }
239
240 return linear_range_get_index(&r[i], val, idx);
241 }
242
243 return -EINVAL;
244}
245
264static inline int linear_range_get_win_index(const struct linear_range *r,
265 int32_t val_min, int32_t val_max,
266 uint16_t *idx)
267{
268 int ret;
269
270 ret = linear_range_get_index(r, val_min, idx);
271 if ((r->min + r->step * (*idx - r->min_idx)) > val_max) {
272 return -EINVAL;
273 }
274
275 return ret;
276}
277
298static inline int linear_range_group_get_win_index(const struct linear_range *r,
299 size_t r_cnt,
300 int32_t val_min,
301 int32_t val_max,
302 uint16_t *idx)
303{
304 for (size_t i = 0U; i < r_cnt; i++) {
305 if (val_min > linear_range_get_max_value(&r[i])) {
306 continue;
307 }
308
309 return linear_range_get_win_index(&r[i], val_min, val_max, idx);
310 }
311
312 return -EINVAL;
313}
314
317#ifdef __cplusplus
318}
319#endif
320
321#endif /* INCLUDE_ZEPHYR_SYS_LINEAR_RANGE_H_ */
workaround assembler barfing for ST r
Definition: asm-macro-32-bit-gnu.h:24
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:298
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:107
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:264
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:141
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:192
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:230
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:164
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:94
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:126
#define ceiling_fraction(numerator, divider)
Ceiling function applied to numerator / divider as a fraction.
Definition: util.h:247
#define EINVAL
Definition: errno.h:61
#define ERANGE
Definition: errno.h:73
static ZTEST_BMEM volatile int ret
Definition: k_float_disable.c:28
__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:60
int32_t min
Definition: linear_range.h:62
uint16_t min_idx
Definition: linear_range.h:66
uint16_t max_idx
Definition: linear_range.h:68
uint32_t step
Definition: linear_range.h:64
Misc utilities.