mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-11-21 22:09:23 +01:00
util: add util_linear_map
This has been needed elsewhere but generally shortcuts could be taken mapping with ranges starting/ending with zero. This is a more general linear mapping utility to map values between any two ranges.
This commit is contained in:
parent
fc2965649c
commit
bb57d61add
30
src/util.c
30
src/util.c
@ -312,6 +312,36 @@ bool util_ip_prefix_tohl(const char *ip, uint8_t *prefix_out,
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Linearly maps @value (expected to be within range @a_start and @a_end) to
|
||||
* a new value between @b_start and @b_end.
|
||||
*
|
||||
* Returns: false if
|
||||
* @value is not between @a_start and @a_end
|
||||
* @a_start/@a_end or @b_start/@b_end are equal.
|
||||
*/
|
||||
bool util_linear_map(double value, double a_start, double a_end,
|
||||
double b_start, double b_end, double *mapped_value)
|
||||
{
|
||||
/* Check value is within a's range */
|
||||
if (a_start < a_end) {
|
||||
if (value < a_start || value > a_end)
|
||||
return false;
|
||||
} else if (a_start > a_end) {
|
||||
if (value > a_start || value < a_end)
|
||||
return false;
|
||||
} else
|
||||
return false;
|
||||
|
||||
if (b_start == b_end)
|
||||
return false;
|
||||
|
||||
*mapped_value = b_start + (((b_end - b_start) / (a_end - a_start)) *
|
||||
(value - a_start));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
struct scan_freq_set {
|
||||
uint16_t channels_2ghz;
|
||||
struct l_uintset *channels_5ghz;
|
||||
|
11
src/util.h
11
src/util.h
@ -106,6 +106,17 @@ static inline bool util_ip_subnet_match(uint8_t prefix_len,
|
||||
~((1u << (8 - (prefix_len % 8))) - 1));
|
||||
}
|
||||
|
||||
/*
|
||||
* Linearly maps (interpolates) 'value' from range 'a' to range 'b'
|
||||
*
|
||||
* Fails if:
|
||||
* - value is not between a and b
|
||||
* - a_start == a_end
|
||||
* - b_start == b_end
|
||||
*/
|
||||
bool util_linear_map(double value, double a_start, double a_end,
|
||||
double b_start, double b_end, double *mapped_value);
|
||||
|
||||
typedef void (*scan_freq_set_func_t)(uint32_t freq, void *userdata);
|
||||
|
||||
struct scan_freq_set *scan_freq_set_new(void);
|
||||
|
Loading…
Reference in New Issue
Block a user