//
// Created by villuton on 25.08.2025.
//

#ifndef CHARGER_CHARGERCONFIG_H
#define CHARGER_CHARGERCONFIG_H

/**
 * Нумерация каналов
 * для формирования массивов значений
 * и пинов управления
 */
typedef enum {
    CHRG_Ch1 = 0,
    CHRG_Ch2,
    CHRG_Ch3,
    CHRG_Ch4,
    CHRG_Ch5,
    CHRG_Ch6,
    CHRG_Ch7,
    CHRG_Ch8,
    CHRG_Ch9,
    CHRG_Ch10,
}eChargerChannels;


/**
 * Количество каналов
 */
#define CHARGER_CH_NUM 10

/**
 * ADCS
 */
#define ADCS_ADCx                            ADC1
#define ADCS_ADC_BUFF_SIZE                   CHARGER_CH_NUM
#define ADCS_CRM_ADCx_PERIPH_CLOCK           CRM_ADC1_PERIPH_CLOCK
#define ADCS_ADCx_ORDINARY_TRIG_SOFTWARE     ADC12_ORDINARY_TRIG_SOFTWARE
#define ADCS_ADC_DMAx_CHANNELx               DMA1_CHANNEL1
#define ADCS_ADC_DMAx_Channelx_IRQn          DMA1_Channel1_IRQn
#define ADCS_ADC_CRM_DMAx_PERIPH_CLOCK       CRM_DMA1_PERIPH_CLOCK

/**
 * GPIOS
 */
#define GPIOS_NUM CHARGER_CH_NUM

/**
 * SERIAL
 */



/**
 * INDICATION
 */
#define INDICATION_CHANEL_NUM CHARGER_CH_NUM
#define INDICATION_MOD_NUM 4
#define INDICATION_THREAD_DELAY_MS 20


/**
 * STORAGE FLASH AND RUNTIME VARIABLES
 */
/**
 * Про расчет напряжения аккумулятора
 * И приведения значения АЦП к реальному напряжению на входе
 *
 * V_in (0…4 В) ──R1──┬───R2─── GND
 *                    │
 *                    └─── к АЦП (V_adc = 0…3,3 В)
 *
 * Приведение данных ацп к напряжению
 * V_adc = adc_data * 3.3f / 4095.0f
 *
 * Формула соотношения входного напряжения к выходному
 * на делителях
 * V_adc = V_in * R1 / (R1 + R2)
 * V_in = V_adc * (R1 + R2) / R1
 *
 * Вариант с пересчетом коэффициента и калибровки
 * K = V_in_cal / ADC
 * V_in_cal = ADC * K
 *
 * Для расчета будут два варианта, по умолчанию
 * будет пересчет на делителях, для этого будем использовать посчитанный коэффициент,
 * в нашем случае
 * V_adc = adc_data * 3.3f / 4095.0f
 * R1 = 51KOm R2 = 51KOm =>
 * V_in = V_adc * (51 + 51)/51 =>
 * V_in = V_adc * 2
 * То есть коэффициент на делителях будет 2
 * По умолчанию будут
 *
 * Второй вариант - расчет калибровочного коэффициента
 * с выставленным напряжением на входе АКБ
 * По умолчанию будет 4 Вольта, значение
 * А калибровочные коэффициенты 0, чтобы брать в расчет
 * Соотношение делителя и приведение от данных ацп к напряжению
 */

/// Количество значений калибровочных коэффициентов для каналов в стореде
#define STORAGE_CALIB_CHANEL_NUM CHARGER_CH_NUM

/// Напряжение, которое подаем для калибровки
#define STORAGE_V_REFERENCE_DEFAULT 4.0

/// Калибровочный коэффициент по умолчанию, если значение 0, то расчет ведется по соотношению делителя напряжения
#define STORAGE_CALIBRATION_FACTOR_DEFAULT 0.0

/// Напряжение на входе АКБ относится как два напряжения на входе ADC
#define STORAGE_V_DIVIDER_RATIO_DEFAULT 2.0

/// Напряжение, при котором считаем, что аккумулятор подключен
#define STORAGE_V_BAT_CONNECT 0.5

/// Напряжение, при котором считаем, что аккумулятор заряжен
#define STORAGE_V_BAT_LOADED 4.0

/// Верхнее значение напряжение на АЦП
#define STORAGE_V_ADC_THRESHOLD 3.3f

/// Верхнее значение 12 разрядов АЦП
#define STORAGE_ADC_THRESHOLD 4095.0f

/// Время проверки значения напряжения на каналах АЦП во время зарядки
#define STORAGE_VERIFICATION_TIME 100
/// Время зарядки, напряжение проверяется только на факт отключения АКБ
#define STORAGE_CHARGE_TIME 1000


/**
 * MAIN
 */
/// Задержка основного потока
#define MAIN_THREAD_DELAY_MS 10

#endif //CHARGER_CHARGERCONFIG_H
