TestSubmodule/LOCAL/Src/Main_Processing.c

178 lines
7.0 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// Created by villuton on 17.09.2025.
//
#include <stdio.h>
#include "Main_Private.h"
#define STORAGE_DEVICE(VAR) env->storage.nvm.device.VAR
#define ADC(CH) env->adcs.tab[CH]
#define INDICATION(CH) env->indication.chanel[CH]
#define LOGGER &env->slog.logger
#define LOG_SIGN "Main_Processing"
/**
* Установка пина зарядника по каналу
* @param env
* @param chanel
* @param value
*/
void ChargerChanelSet(tMain *env, uint8_t chanel, bool value){
GpioPinSet(&env->gpios.chrgEnPins.tab[chanel], value);
}
/**
* Установка пина включения акб в цепь по каналу
* @param env
* @param chanel
* @param value
*/
void BatteryChanelSet(tMain *env, uint8_t chanel, bool value){
GpioPinSet(&env->gpios.batEnPins.tab[chanel], value);
}
/**
* Процедура установки положения пинов,
* в зависимости от того, идет сейчас проверка напряжения акб или нет
* @param env
* @param chanel
* @param check
*/
void SetPinsModeCheck(tMain *env, uint8_t chanel, bool check){
if(check == false){
ChargerChanelSet(env,chanel,true);
BatteryChanelSet(env,chanel,true);
}
else{
ChargerChanelSet(env,chanel,false);
BatteryChanelSet(env,chanel,true);
}
}
/**
* Процедура приведения данных АЦП к напряжению
* С поправкой либо на делитель, либо на калибровочный коэффициент
* @param env
* @param chanel
* @return
*/
#undef LOG_SIGN
#define LOG_SIGN "AdcToVoltage"
static float AdcToVoltage(tMain *env, uint8_t chanel){
if(STORAGE_DEVICE(chanelCalibrationFactor[chanel]) != STORAGE_CALIBRATION_FACTOR_DEFAULT){
/// Расчет через калибровочный параметр
LoggerTraceStatic(LOGGER, LOG_SIGN, "Calculation via calibration parameter")
return (float ) ADC(chanel) *
STORAGE_DEVICE(chanelCalibrationFactor[chanel]);
}
/// Расчет через коэффициент делителя
LoggerTraceStatic(LOGGER, LOG_SIGN, "Calculation using the divisor coefficient")
return (float ) ADC(chanel) *
(STORAGE_V_ADC_THRESHOLD / STORAGE_ADC_THRESHOLD) *
STORAGE_DEVICE(dividerRatio);
}
/**
* Процедура обработки переходов режимов
* в зависимости от значений считанного напряжения
* @param env
* @param value
* @param isCheck
* @return
*/
static eIndicationMod AdcChanelModeProcessing(tMain *env,float value, bool isCheck){
if(value <= STORAGE_DEVICE(voltageBatteryConnectThreshold)){
LoggerTraceStatic(LOGGER, LOG_SIGN, "The voltage is lower Battery Connect Threshold")
LoggerTraceStatic(LOGGER, LOG_SIGN, "Set mode STARTUP")
return MOD_CH_STARTUP;
}
if(value <= STORAGE_DEVICE(voltageBatteryLoadedThreshold)){
LoggerTraceStatic(LOGGER, LOG_SIGN, "The voltage is lower Battery Loader Threshold")
LoggerTraceStatic(LOGGER, LOG_SIGN, "Set mode CHARGE")
return MOD_CH_CHARGE;
}
if(value > STORAGE_DEVICE(voltageBatteryLoadedThreshold)){
LoggerTraceStatic(LOGGER, LOG_SIGN, "The voltage is higher Battery Loader Threshold")
if(isCheck != false){
LoggerTraceStatic(LOGGER, LOG_SIGN, "Is check time")
LoggerTraceStatic(LOGGER, LOG_SIGN, "Set mode OK")
return MOD_CH_OK;
} else{
LoggerTraceStatic(LOGGER, LOG_SIGN, "Is not check time")
LoggerTraceStatic(LOGGER, LOG_SIGN, "Set mode CHARGE")
return MOD_CH_CHARGE;
}
}
return MOD_CH_ERROR;
}
/**
* Процедура Обработчика данным с АЦП, включения/отключения зарядки и выставление режимов индикации
* @param env
*/
#undef LOG_SIGN
#define LOG_SIGN "Main_Processing"
void Main_Processing(tMain *env){
///Обновление таблицы данных каналов АЦП
LoggerTraceStatic(LOGGER, LOG_SIGN, "Updating the ADC channel data table")
Adcs_UpdateTab(&env->adcs);
///Проходимся в цикле по всем каналам
for (int chanel = CHRG_Ch1; chanel < CHARGER_CH_NUM; chanel++) {
env->processing.currentChanel = chanel;
char msd_buff[30] = {0};
sprintf(msd_buff,"Current Chanel: %d \n\r", chanel+1);
LoggerCnTrace(LOGGER, LOG_SIGN, msd_buff, sizeof(msd_buff))
switch (INDICATION(chanel)) {
/**
* В режиме стартапа предполагаем, что ожидаем подключения аккумулятора
* Зарядник отключен, режим постоянной проверки
*/
case MOD_CH_STARTUP:
LoggerTraceStatic(LOGGER, LOG_SIGN, "Current mod STARTUP")
SetPinsModeCheck(env,chanel,true);
INDICATION(chanel) = AdcChanelModeProcessing(env,AdcToVoltage(env, chanel), true);
/**
* В режиме зарядника возможен переход в любое из состояний, но переход в состояние "Заряжен"
* Возможен только при флаге check = true
*/
case MOD_CH_CHARGE:
LoggerTraceStatic(LOGGER, LOG_SIGN, "Current mod CHARGE")
SetPinsModeCheck(env,chanel,env->processing.check);
INDICATION(chanel) = AdcChanelModeProcessing(env,AdcToVoltage(env, chanel), env->processing.check);
/**
* Это режим состояния, говорящий, что АКБ заряжен
*/
case MOD_CH_OK:
LoggerTraceStatic(LOGGER, LOG_SIGN, "Current mod OK")
SetPinsModeCheck(env,chanel,true);
INDICATION(chanel) = AdcChanelModeProcessing(env,AdcToVoltage(env, chanel), true);
/**
* Режим ошибки, по факту сейчас не используется
*/
case MOD_CH_ERROR:
LoggerTraceStatic(LOGGER, LOG_SIGN, "Current mod ERROR")
ChargerChanelSet(env,chanel,false);
BatteryChanelSet(env,chanel,false);
default:
break;
}
}
/// Переустановка таймера и флага для отключения зарядника и проверки на заряд
if(env->processing.timer < SystemGetMs()){
LoggerTraceStatic(LOGGER, LOG_SIGN, "Timer update")
env->processing.timer = SystemGetMs() + env->processing.check != false?
STORAGE_CHARGE_TIME :
STORAGE_VERIFICATION_TIME;
env->processing.check = !env->processing.check;
}
}