/* * @file utils.cpp * @brief Utility functions implementation * * Created: 21.09.2025 * Author: ThePetrovich * * Copyright YKSA - Sakha Aerospace Systems, LLC. * See the LICENSE file for details. * * SPDX-License-Identifier: BSD-3-Clause */ #include "utils.h" #include "config.h" #include uint16_t calculate_crc16_xmodem(uint8_t *data, uint16_t len) { uint16_t crc = 0; uint8_t i; while (len--) { crc ^= (uint16_t)(*data++) << 8; for (i = 0; i < 8; i++) { if (crc & 0x8000) { crc = (crc << 1) ^ 0x1021; } else { crc <<= 1; } } } return crc; } int16_t adc_to_temperature_c(uint16_t adc_value) { // MCP9700: 500 mV at 0°C, 10 mV per degree, vref = 3.0V // Result in 0.1°C units return (int16_t)((adc_value * ADC_VREF_MV / ADC_RESOLUTION - TEMP_SENSOR_OFFSET_MV)); } uint16_t adc_to_voltage_mv(uint16_t adc_value) { return (uint16_t)(adc_value * VOLTAGE_MV_PER_STEP); } uint16_t read_adc_oversampled(uint8_t pin, uint8_t samples) { uint32_t sum = 0; uint8_t shift = ((samples == 64) ? 3 : (samples == 16) ? 2 : (samples == 4) ? 1 : 0); for (uint8_t i = 0; i < samples; i++) { sum += analogRead(pin); } return (uint16_t)(sum >> shift); }