mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-11-22 06:29: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;
|
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 {
|
struct scan_freq_set {
|
||||||
uint16_t channels_2ghz;
|
uint16_t channels_2ghz;
|
||||||
struct l_uintset *channels_5ghz;
|
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));
|
~((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);
|
typedef void (*scan_freq_set_func_t)(uint32_t freq, void *userdata);
|
||||||
|
|
||||||
struct scan_freq_set *scan_freq_set_new(void);
|
struct scan_freq_set *scan_freq_set_new(void);
|
||||||
|
Loading…
Reference in New Issue
Block a user