This commit is contained in:
cfif 2025-06-02 13:26:39 +03:00
commit 77e3614822
3 changed files with 513 additions and 0 deletions

334
PowerManagment.c Normal file
View File

@ -0,0 +1,334 @@
//
// Created by ilya on 25.03.24.
//
#include "PowerManagment.h"
#include "SystemDelayInterface.h"
#include "Adc.h"
#include "PwmSim7600e.h"
#include "CmsisRtosThreadUtils.h"
#include "ext_telematica.h"
#include "CanPorts.h"
#include "Gpios.h"
#define LOG_SIGN "Главн."
#define LOGGER &env->slog->logger
void Pwm_GsmAndGnssStartup(tPowerManagement *env) {
PwmSim7600e_Startup(&env->powerSusystem->sim7600);
}
bool Pwm_GsmAndGnssShutDown(tPowerManagement *env) {
return PwmSim7600e_ShutDown(&env->powerSusystem->sim7600);
}
void Pwm_BatteryOn(tPowerManagement *env) {
GpioPinEnable(&env->powerSusystem->battery.enable);
}
void Pwm_AmpOn(tPowerManagement *env) {
env->powerSusystem->SpekTestPower.speakTestAcsess = false;
GpioPinEnable(&env->powerSusystem->audio.resetAmp);
}
void Pwm_AmpOff(tPowerManagement *env) {
env->powerSusystem->SpekTestPower.speakTestAcsess = true;
GpioPinDisable(&env->powerSusystem->audio.resetAmp);
}
void Pwm_BatteryOff(tPowerManagement *env) {
GpioPinDisable(&env->powerSusystem->battery.enable);
}
void Pwm_StandbyOn(tPowerManagement *env) {
GpioPinEnable(&env->powerSusystem->main.standby);
GpioPinDisable(&env->powerSusystem->main.Power12V);
}
void Pwm_StandbyOff(tPowerManagement *env) {
GpioPinDisable(&env->powerSusystem->main.standby);
GpioPinDisable(&env->powerSusystem->main.Power12V);
}
void Pwm_Rs485Enable(tPowerManagement *env) {
GpioPinEnable(&env->powerSusystem->PowerRS485);
}
void Pwm_Rs485Disable(tPowerManagement *env) {
GpioPinDisable(&env->powerSusystem->PowerRS485);
}
void Pwm_PowerSavingEnable(tPowerManagement *env) {
// Pwm_GsmAndGnssShutdown(env);
// Pwm_MuteAmpOn(env);
// Pwm_BipShutdown(env);
Pwm_ChargeDisable(env);
}
void Pwm_PowerSavingDisable(tPowerManagement *env) {
// Pwm_GsmAndGnssStartup(env);
// Pwm_MuteAmpOff(env);
// Pwm_GsmAndBipStartUp(env);
// Mma_AudioTestSetMode(&env->power,1);
Pwm_ChargeEnable(env);
}
//void Pwm_MuteAmpOff(tPowerManagement *env) {
// tAudioPower *audio = &env->pins->audio;
// env->pins->SpekTestPower.speakTestAcsess = false;
//
// GpioPinDisable(&audio->mute);
// LoggerTraceStatic(LOGGER, LOG_SIGN, "Сигнал MUTE усилитель отключен")
//}
void Pwm_MuteAmpOn(tPowerManagement *env) {
tAudioPower *audio = &env->powerSusystem->audio;
env->powerSusystem->SpekTestPower.speakTestAcsess = true;
// GpioPinEnable(&audio->mute);
LoggerTraceStatic(LOGGER, LOG_SIGN, "Сигнал MUTE усилитель поднят")
}
bool Pwm_GetMuteInCarState(tPowerManagement *env) {
bool pos, neg;
pos=GpioPinGet(&env->powerSusystem->main.muteP);
neg=GpioPinGet(&env->powerSusystem->main.muteN);
if (*env->positiveMute) {
if((pos==true)&&(neg==false)){
return true;
} else{
return false;
}
} else {
if((pos==false)&&(neg==true)){
return true;
} else{
return false;
}
}
}
void Pwm_Shutdown(tPowerManagement *env) {
if (EXT_ENV_ADR_TELE.META_EXT_ENV_TELE) {
EXT_ENV_ADR_TELE.tele_func(env, TELE_MODULE_SHUTDOWN);
}
Pwm_GsmAndGnssShutDown(env);
LoggerInfoStatic(&env->slog->logger, LOG_SIGN, "Завершение работы")
LoggerInfoStatic(LOGGER, LOG_SIGN, "Отключение питания через 4 с")
SystemDelayMs(4000);
Pwm_Blackout(env);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Питание осталось, обратите внимание!!")
LoggerInfoStatic(LOGGER, LOG_SIGN, "Возможно произошло повторное включение пользователем")
SystemDelayMs(500);
nvic_system_reset();
//BootJumpToAddress(0x8000000);
LoggerErrorStatic(LOGGER, LOG_SIGN, "Этой строчки не должно быть! Критическая ошибка!")
}
bool Pwm_GetSosButtonState(tPowerManagement *env) {
return GpioPinGet(env->sosButtonPin);
}
bool Pwm_GetServiseButtonState(tPowerManagement *env) {
return GpioPinGet(env->serviceButtonPin);
}
void Pwm_SetEcallSignalOutInCar(tPowerManagement *env, bool value) {
if (value) {
if (EXT_ENV_ADR_TELE.META_EXT_ENV_TELE)
EXT_ENV_ADR_TELE.tele_func(NULL, TELE_MODULE_MUTE_ON);
GpioPinEnable(&env->powerSusystem->main.ecallOut);
} else {
if (EXT_ENV_ADR_TELE.META_EXT_ENV_TELE)
EXT_ENV_ADR_TELE.tele_func(NULL, TELE_MODULE_MUTE_OFF);
GpioPinDisable(&env->powerSusystem->main.ecallOut);
}
}
void Pwm_SetServiseSignalOutInCar(tPowerManagement *env, bool value) {
if (value) {
if (EXT_ENV_ADR_TELE.META_EXT_ENV_TELE)
EXT_ENV_ADR_TELE.tele_func(NULL, TELE_MODULE_MUTE_ON);
GpioPinEnable(&env->powerSusystem->main.garage);
} else {
if (EXT_ENV_ADR_TELE.META_EXT_ENV_TELE)
EXT_ENV_ADR_TELE.tele_func(NULL, TELE_MODULE_MUTE_OFF);
GpioPinDisable(&env->powerSusystem->main.garage);
}
}
void Pwm_SetPMuteInCar(tPowerManagement *env, bool value) {
if (value) {
if (EXT_ENV_ADR_TELE.META_EXT_ENV_TELE)
EXT_ENV_ADR_TELE.tele_func(NULL, TELE_MODULE_MUTE_ON);
GpioPinEnable(&env->powerSusystem->main.muteP);
} else {
if (EXT_ENV_ADR_TELE.META_EXT_ENV_TELE)
EXT_ENV_ADR_TELE.tele_func(NULL, TELE_MODULE_MUTE_OFF);
GpioPinDisable(&env->powerSusystem->main.muteP);
}
}
void Pwm_SetNMuteInCar(tPowerManagement *env, bool value) {
if (value) {
if (EXT_ENV_ADR_TELE.META_EXT_ENV_TELE)
EXT_ENV_ADR_TELE.tele_func(NULL, TELE_MODULE_MUTE_ON);
GpioPinEnable(&env->powerSusystem->main.muteN);
} else {
if (EXT_ENV_ADR_TELE.META_EXT_ENV_TELE)
EXT_ENV_ADR_TELE.tele_func(NULL, TELE_MODULE_MUTE_OFF);
GpioPinDisable(&env->powerSusystem->main.muteN);
}
}
void Pwm_SetMuteInCar(tPowerManagement *env, bool value) {
///*Мьют переделан , теперь поднимаются линии muteN muteP не зависимо от настройки в стородже
if (value) {
if (EXT_ENV_ADR_TELE.META_EXT_ENV_TELE)
EXT_ENV_ADR_TELE.tele_func(NULL, TELE_MODULE_MUTE_ON);
GpioPinEnable(&env->powerSusystem->main.muteN);
GpioPinEnable(&env->powerSusystem->main.muteP);
} else {
if (EXT_ENV_ADR_TELE.META_EXT_ENV_TELE)
EXT_ENV_ADR_TELE.tele_func(NULL, TELE_MODULE_MUTE_OFF);
GpioPinDisable(&env->powerSusystem->main.muteP);
GpioPinDisable(&env->powerSusystem->main.muteN);
}
}
void Pwm_ChargeEnable(tPowerManagement *env) {
env->currentChargeState = true;
GpioPinEnable(&env->powerSusystem->battery.charge);
}
void Pwm_ChargeDisable(tPowerManagement *env) {
env->currentChargeState = false;
GpioPinDisable(&env->powerSusystem->battery.charge);
}
void Pwm_LNA_setMode(tPowerManagement *env, bool state) {
// if (state == true) {
// GpioPinEnable(&env->pins->main.inAnt);
// } else {
// GpioPinDisable(&env->pins->main.inAnt);
// }
}
void Pwm_CanStandby(tPowerManagement *env) {
GpioPinSet(&env->powerSusystem->canStandby.can1_standby, false);
GpioPinSet(&env->powerSusystem->canStandby.can2_standby, false);
}
void Pwm_OnDeviceInit(tPowerManagement *env) {
Pwm_StandbyOn(env);
Pwm_BatteryOn(env);
Pwm_Rs485Enable(env);
// Pwm_GsmAndGnssStartup(env);
Pwm_SetMuteInCar(env, false);
Pwm_AmpOn(env);
Pwm_CanStandby(env);
GpioPinDisable(&env->powerSusystem->main.garage);
GpioPinDisable(&env->powerSusystem->main.ecallOut);
}
void Pwm_Blackout(tPowerManagement *env) {
Pwm_ChargeDisable(env);
Pwm_BatteryOff(env);
Pwm_StandbyOff(env);
}
void Pwm_Init(
tPowerManagement *env,
tPowerSusystem *powerSusystem,
tAdcIO *batteryIo,
tAdc *boardVoltage,
bool *positiveMute,
tLoggerToSerialPort *slog,
tGpioPin *sosButtonPin,
tGpioPin *serviceButtonPin
) {
env->sosButtonPin = sosButtonPin;
env->serviceButtonPin = serviceButtonPin;
env->slog = slog;
env->powerSusystem = powerSusystem;
env->powerSusystem->boardPower.boardVoltage = boardVoltage;
env->powerSusystem->boardPower.boardVoltageTimer = 0;
env->powerSusystem->boardPower.currentBoardVoltage = 0;
env->powerSusystem->SpekTestPower.lastTestTime = 0;
env->shutdownDelay = 60000;
env->powerSusystem->battery.batteryIo = batteryIo;
env->powerSusystem->battery.batTestTimer = 0;
env->positiveMute = positiveMute;
env->logger = NULL;
env->interAntBufVal = true;
//Инициализируем поток
InitThreadAtrStatic(&env->threadPwr.attr, "Pwm", env->threadPwr.controlBlock, env->threadPwr.stack, osPriorityNormal);
env->threadPwr.id = 0;
env->currentIgnState = true;
env->mux_accessPwrMan = osMutexNew(NULL);
}
static _Noreturn void Pwm_Thread(tPowerManagement *env) {
Pwm_ChargeEnable(env);
for (;;) {
bool ignition = GpioPinGet(&env->powerSusystem->main.ignition);
if (ignition) {
env->lastIgnEnabled = SystemGetMs();
}
if (osMutexAcquire(env->mux_accessPwrMan, 100) == osOK) {
env->powerSusystem->boardPower.currentBoardVoltage = AdcGet(&env->powerSusystem->boardPower.boardVoltage->vccIo, 1000);
env->powerSusystem->boardPower.currentBoardVoltageOfSerbisePO = env->powerSusystem->boardPower.currentBoardVoltage;
if (env->powerSusystem->battery.batTestTimer < SystemGetMs()) {
GpioPinSet(&env->powerSusystem->battery.charge,false);
SystemDelayMs(300);
env->powerSusystem->battery.currentBatVoltage = AdcGet(env->powerSusystem->battery.batteryIo, 1000);
SystemDelayMs(300);
if (env->powerSusystem->battery.currentBatVoltage < 1000) {
env->powerSusystem->battery.currentBatVoltage = 0;
}
GpioPinSet(&env->powerSusystem->battery.charge,true);
env->powerSusystem->battery.batTestTimer = SystemGetMs()+5000;
}
osMutexRelease(env->mux_accessPwrMan);
}
SystemDelayMs(100);
}
}
void PowerManagement_StartThread(tPowerManagement *env) {
if (!env->threadPwr.id) {
env->threadPwr.id = osThreadNew((osThreadFunc_t) (Pwm_Thread), (void *) (env), &env->threadPwr.attr);
} else {
osThreadResume(env->threadPwr.id);
}
}
bool Pwm_IsShutdownRequired(tPowerManagement *env) {
uint32_t thisTime = SystemGetMs();
uint32_t time = env->lastIgnEnabled + env->shutdownDelay;
if(time < thisTime){
return true;
} else {
return false;
}
}

169
PowerManagment.h Normal file
View File

@ -0,0 +1,169 @@
//
// Created by ilya on 25.03.24.
//
#ifndef SMART_COMPONENTS_POWERMANAGMENT_H
#define SMART_COMPONENTS_POWERMANAGMENT_H
#include <SerialPorts.h>
#include "GpioPin.h"
#include "UserInput.h"
#include "UserIndication.h"
#include "SpiPorts.h"
#include "Adc.h"
#include "LoggerInterface.h"
#include "PwmSim7600e.h"
#include "LoggerToSerialPort.h"
//#include "Amplifier.h"
#define PM_SHUTDOWN_DELAY 15000
typedef struct {
tGpioPin resetAmp;
} tAudioPower;
typedef struct {
tGpioPin ignition;
tGpioPin standby;
tGpioPin garage;
tGpioPin ecallOut;
tGpioPin muteP;
tGpioPin muteN;
tGpioPin inAnt;
tGpioPin Power12V;
} tMainPower;
typedef struct {
tGpioPin can1_standby;
tGpioPin can2_standby;
} tCanStandby;
typedef struct {
tGpioPin enable;
tGpioPin charge;
tAdcIO *batteryIo;
uint16_t currentBatVoltage;
uint64_t batTestTimer;
} tBatteryPower;
typedef struct {
tGpioPin PowerCheckSpkOn;
tGpioPin PowerTestSpkIn;
bool speakTestAcsess;
uint16_t lastTestTime;
} tSpekTestPower;
typedef struct {
tAdc *boardVoltage;
uint16_t currentBoardVoltage;
uint16_t currentBoardVoltageOfSerbisePO;
uint32_t boardVoltageTimer;
} tBoardPower;
typedef struct {
tSpekTestPower SpekTestPower;
tGpioPin PowerRS485;
tGpioPin usb;
tAudioPower audio;
tBatteryPower battery;
tMainPower main;
tSim7600ePower sim7600;
tCanStandby canStandby;
tBoardPower boardPower;
} tPowerSusystem;
typedef struct {
bool interAntBufVal;
tLoggerInterface *logger;
tPowerSusystem *powerSusystem;
bool *positiveMute;
uint32_t shutdownDelay;
uint32_t lastIgnEnabled;
bool currentChargeState;
bool currentPwrSaveState;
bool currentIgnState;
bool (*resetAmpLvl) (void *env);
tLoggerToSerialPort *slog;
osMutexId_t mux_accessPwrMan;
tGpioPin *sosButtonPin;
tGpioPin *serviceButtonPin;
struct {
osThreadId_t id;
uint32_t stack[256];
StaticTask_t controlBlock;
osThreadAttr_t attr;
} threadPwr;
} tPowerManagement;
#define PowerManagementProviderSetAmplVol(ENV) (ENV)->resetAmpLvl((ENV)->ampEnv)
void Pwm_Init(
tPowerManagement *env,
tPowerSusystem *powerSusystem,
tAdcIO *batteryIo,
tAdc *boardVoltag,
bool *positiveMute,
tLoggerToSerialPort *slog,
tGpioPin *sosButtonPin,
tGpioPin *serviceButtonPin
);
void PowerManagement_StartThread(tPowerManagement *env);
void Pwm_OnDeviceInit(tPowerManagement *env);
bool Pwm_IsShutdownRequired(tPowerManagement *env);
void Pwm_Blackout(tPowerManagement *env);
//void Pwm_MuteAmpOff(tPowerManagement *env);
void Pwm_AmpOn(tPowerManagement *env);
void Pwm_AmpOff(tPowerManagement *env);
void Pwm_ChargeDisable(tPowerManagement *env);
void Pwm_ChargeEnable(tPowerManagement *env);
void Pwm_LNA_setMode(tPowerManagement *env, bool state);
//void Pwm_MuteAmpOn(tPowerManagement *env);
void Pwm_PowerSavingEnable(tPowerManagement *env);
void Pwm_PowerSavingDisable(tPowerManagement *env);
void Pwm_SetMuteInCar(tPowerManagement *env, bool value);
void Pwm_BipShutdown(tPowerManagement *env);
void Pwm_GsmAndBipStartUp(tPowerManagement *env);
void Pwm_GsmAndGnssStartup(tPowerManagement *env);
bool Pwm_GsmAndGnssShutDown(tPowerManagement *env);
void Pwm_Rs485Disable(tPowerManagement *env);
bool Pwm_GetMuteInCarState(tPowerManagement *env);
void Pwm_Shutdown(tPowerManagement *env);
void Pwm_SetPMuteInCar(tPowerManagement *env, bool value);
void Pwm_SetNMuteInCar(tPowerManagement *env, bool value);
void Pwm_SetEcallSignalOutInCar(tPowerManagement *env, bool value);
void Pwm_SetServiseSignalOutInCar(tPowerManagement *env, bool value);
bool Pwm_GetSosButtonState(tPowerManagement *env);
bool Pwm_GetServiseButtonState(tPowerManagement *env);
#endif //SMART_COMPONENTS_POWERMANAGMENT_H

10
modular.json Normal file
View File

@ -0,0 +1,10 @@
{
"cmake": {
"inc_dirs": [
"./"
],
"srcs": [
"./**.c"
]
}
}