diff options
| author | dmlunar <root@lunar.sh> | 2025-01-22 16:47:21 +0200 |
|---|---|---|
| committer | dmlunar <root@lunar.sh> | 2025-10-15 23:42:50 +0200 |
| commit | 729f2a2c3ebfb2612d873caf453a1d7ca02180d9 (patch) | |
| tree | 7bab2fcc0c7f50eab3013348697bc06ddd71d551 /firmware/src/util.c | |
| download | varpa-729f2a2c3ebfb2612d873caf453a1d7ca02180d9.tar.gz varpa-729f2a2c3ebfb2612d873caf453a1d7ca02180d9.zip | |
varpa: initial public commit
Diffstat (limited to 'firmware/src/util.c')
| -rw-r--r-- | firmware/src/util.c | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/firmware/src/util.c b/firmware/src/util.c new file mode 100644 index 0000000..af6ffed --- /dev/null +++ b/firmware/src/util.c @@ -0,0 +1,152 @@ +/** + * + * Author: Dylan Muller + * Copyright (c) 2025 + * All rights reserved. + * + * - Commercial/IP use prohibited. + * - Attribution required. + * See License.txt + * + */ + +#include "util.h" + +#include <stdio.h> +#include <avr/pgmspace.h> + +extern int __heap_start, *__brkval; + +const uint16_t fw_pwr_gradient[] = { 249, 356, 374, 388, 400, 402, 435, 460, 500, 553 }; +const int16_t fw_pwr_intercept[] = { -5418, -3810, -3602, -3431, -3289, -3261, -2877, -2601, -2189, -1725 }; +const uint16_t fw_pwr_threshold[] = { 1288, 1548, 1704, 1812, 1897, 1967, 2164, 2301, 2411, 2505 }; + +uint8_t util_volt_to_count( + uint16_t volt, + uint16_t* count +) +{ + uint8_t bits = 0x0; + uint32_t x = 0x0; + uint32_t y = 0x0; + uint16_t i = 0x0; + + bits = UTIL_CONV_BITS; + + if (volt > UTIL_SYSTEM_VOLT) + { + return 1; + } + + for (i = 0; i < bits; i++) + { + x |= UTIL_CONV_BIT(i); + } + + y = ((uint32_t)volt) * x; + y /= UTIL_SYSTEM_VOLT; + + *count = (uint16_t)y; + return 0; +} + +uint8_t util_count_to_volt( + uint16_t count, + uint16_t* volt +) +{ + uint8_t bits = 0x0; + uint32_t x = 0x0; + uint32_t y = 0x0; + uint16_t i = 0x0; + + bits = UTIL_CONV_BITS; + + for (i = 0; i < bits; i++) + { + x |= UTIL_CONV_BIT(i); + } + + if (count > x) + { + return 1; + } + + y = ((uint32_t)count) * UTIL_SYSTEM_VOLT; + y /= x; + + *volt = (uint16_t)y; + return 0; +} + +int8_t util_count_to_pwr( + uint16_t count, + int16_t* cpwr +) +{ + uint32_t x = 0x0; + int16_t y = 0x0; + uint16_t slope = 0x0; + int16_t intercept = 0x0; + uint16_t i = 0; + + uint8_t pwr_cal_size = sizeof(fw_pwr_gradient) / sizeof(uint16_t); + uint8_t pwr_last_element = pwr_cal_size - 1; + + if(count >= fw_pwr_threshold[pwr_last_element]) + { + slope = fw_pwr_gradient[pwr_last_element]; + intercept = fw_pwr_intercept[pwr_last_element]; + } + else if (count <= fw_pwr_threshold[0]) + { + slope = fw_pwr_gradient[0]; + intercept = fw_pwr_intercept[0]; + } + else + { + for(i = 0; i < pwr_cal_size; i++) + { + if(count < fw_pwr_threshold[i]) + { + slope = fw_pwr_gradient[i]; + intercept = fw_pwr_intercept[i]; + break; + } + } + } + + x = (((uint32_t)count * 1000) / slope); + y = (int16_t)x; + + y = y + intercept; + *cpwr = y; + + return 0; +} + +void util_print_pwr( + int16_t cpwr +) +{ + int16_t integer_part = cpwr / 100; + + int16_t fractional_part = cpwr % 100; + + if (fractional_part < 0) { + fractional_part = -fractional_part; + } + + printf("%d.%02d dBm\n", integer_part, fractional_part); +} + +uint16_t util_get_free_mem(void) +{ + uint16_t free_mem; + if ((int)__brkval == 0) { + free_mem = (int)&free_mem - (int)&__heap_start; + } else { + free_mem = (int)&free_mem - (int)__brkval; + } + return free_mem; +} |
