3
0
mirror of https://git.kernel.org/pub/scm/network/wireless/iwd.git synced 2024-11-21 13:29:25 +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:
James Prestwood 2024-11-19 06:24:23 -08:00 committed by Denis Kenzior
parent fc2965649c
commit bb57d61add
2 changed files with 41 additions and 0 deletions

View File

@ -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;

View File

@ -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);