/* * @file config.h * @brief System configuration, persisted-config struct definition, and * compile-time constants shared between modules. * * Created: 21.09.2025 * Author: ThePetrovich * * Copyright YKSA - Sakha Aerospace Systems, LLC. * See the LICENSE file for details. * * SPDX-License-Identifier: BSD-3-Clause */ #ifndef CONFIG_H #define CONFIG_H #include /* Firmware version */ #define FIRMWARE_VERSION_MAJOR 3 #define FIRMWARE_VERSION_MINOR 00 /* Serial communication */ #define SERIAL_BAUD_RATE 38400 /* Timing constants */ #define STATUS_LED_BLINK_PERIOD 500U #define MAIN_LOOP_DELAY 10 #define RSENSE_UPDATE_PERIOD 1000U /* Spectrum channel masks and counts */ #define RSENSE_CHANNEL_MASK 0x3FFU /* 10-bit channel mask */ #define RSENSE_CHANNEL_COUNT 1024 /* MCP9700 temperature sensor calibration constants */ #define MCP9700_OFFSET_MV 500L /* 500 mV at 0 °C */ #define MCP9700_SCALE_MV 10L /* 10 mV per °C */ #define ADC_OVERSAMPLING_BITS 2 /* 16x oversampling -> 2 extra bits */ #define ADC_VREF_MV 3000L /* 3.0 V reference */ #define ADC_RESOLUTION 1024L /* 10-bit ADC */ /* Voltage divider constants */ #define VOLTAGE_DIVIDER_RATIO 20.0f /* 200k and 10k resistors */ #define VOLTAGE_MV_PER_STEP 14.6484375f /* (3.0 * 20) / 4096 */ /* Default potentiometer wiper value (mid-scale, 127/255) */ #define DEFAULT_POT_VALUE 127 /* Light sensor I2C constants */ #define LSENSE_I2C_BASE_ADDR 0x38 #define LSENSE_EXPECTED_ID 0xE0 #define LSENSE_DATA_SIZE 12 /** * @brief AD5160 wiper settings for the three digital potentiometers. */ typedef struct potentiometers_t { uint8_t pot_hv; /**< HV regulator wiper. */ uint8_t pot_amp; /**< Amplifier gain wiper. */ uint8_t pot_det; /**< Detector threshold wiper. */ } __attribute__((packed)) potentiometers_t; /** * @brief ADC and temperature-sensor calibration coefficients. * Reused as the payload of #CMD_SET_CALIBRATION. */ typedef struct calibration_t { uint16_t adccal0; /**< ADC reading at GND (offset). */ uint16_t adccal3; /**< ADC reading at 3.0 V reference. */ uint16_t tempcal; /**< Temperature offset correction. */ } __attribute__((packed)) calibration_t; /** * @brief Runtime feature flags packed into a single byte. * Reused as the payload of #CMD_SET_FLAGS. */ typedef union config_flags_t { struct __attribute__((packed)) { /** Spectrum oversampling: 0/1/2/3 = 1x/4x/16x/64x. */ uint8_t spectrum_oversample_bits : 2; uint8_t reserved1 : 1; /** 0 = disable, 1 = enable temperature drift compensation. */ uint8_t temperature_drift_compensation : 1; /** ADC oversampling for temperature/voltage: 0/1/2/3 = 1x/4x/16x/64x. */ uint8_t adc_oversample_bits : 2; uint8_t reserved2 : 2; } fields; uint8_t value; } __attribute__((packed)) config_flags_t; /** * @brief Temperature drift compensation parameters. * Reused as the payload of #CMD_SET_TEMP_DRIFT_COMPENSATION. * * Drift coefficients are in pot_units/255 per °C. When @c pot_X_low equals * @c pot_X_high, drift compensation for that channel is disabled. * * Sensor → potentiometer mapping: * - temp_drift : DET_TEMP (SiPM carrier) → pot_hv * - vbias_drift : HV_TEMP (+28V supply) → pot_hv * - gain_drift : AMP_TEMP (amplifier) → pot_amp * - threshold_drift : AMP_TEMP (amplifier) → pot_det */ typedef struct temp_drift_compensation_t { int16_t temp_drift; int16_t vbias_drift; int16_t gain_drift; int16_t threshold_drift; uint32_t drift_period_ms; /**< Minimum interval between adjustments, in ms. */ uint8_t pot_hv_low; uint8_t pot_hv_high; uint8_t pot_amp_low; uint8_t pot_amp_high; uint8_t pot_det_low; uint8_t pot_det_high; } __attribute__((packed)) temp_drift_compensation_t; /** * @brief Persistent device configuration. * * Stored in EEPROM with dual-partition wear leveling (see eeprom.cpp). * The pair @c magic1 / @c magic2 (0xA5 / 0x5A) marks a partition as valid. */ typedef struct config_t { uint8_t magic1; /**< 0xA5 — valid-partition marker, byte 1. */ uint8_t magic2; /**< 0x5A — valid-partition marker, byte 2. */ potentiometers_t pots; calibration_t calibration; config_flags_t flags; temp_drift_compensation_t temp_drift_compensation; } __attribute__((packed)) config_t; extern config_t config; #endif /* CONFIG_H */