538 lines
28 KiB
C
538 lines
28 KiB
C
///*
|
|
// Copyright 2017 - 2018 Danny Bokma danny@diebie.nl
|
|
// Copyright 2019 - 2020 Kevin Dionne kevin.dionne@ennoid.me
|
|
//
|
|
// This file is part of the DieBieMS/ENNOID-BMS firmware.
|
|
//
|
|
// The DieBieMS/ENNOID-BMS firmware is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// The DieBieMS/ENNOID-BMS firmware is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
// */
|
|
//
|
|
//#include "modOperationalState.h"
|
|
//
|
|
//OperationalStateTypedef modOperationalStateLastState;
|
|
//OperationalStateTypedef modOperationalStateCurrentState;
|
|
//OperationalStateTypedef modOperationalStateNewState;
|
|
//bms_fault_state modOperationalStateLastFaultState;
|
|
//bms_fault_state modOperationalStateCurrentFaultState;
|
|
//bms_fault_state modOperationalStateNewFaultState;
|
|
//modPowerElectronicsPackOperationalCellStatesTypedef packOperationalCellStateLastErrorState;
|
|
//modPowerElectronicsPackStateTypedef *modOperationalStatePackStatehandle;
|
|
//modConfigGeneralConfigStructTypedef *modOperationalStateGeneralConfigHandle;
|
|
//modStateOfChargeStructTypeDef *modOperationalStateGeneralStateOfCharge;
|
|
////nc modDisplayDataTypedef modOperationalStateDisplayData;
|
|
//uint32_t modOperationalStateChargerTimeout;
|
|
//uint32_t modOperationalStateChargedTimeout;
|
|
//uint32_t modOperationalStatePreChargeTimeout;
|
|
//uint32_t modOperationalStateStartupDelay;
|
|
//uint32_t modOperationalStateChargerDisconnectDetectDelay;
|
|
//uint32_t modOperationalStateBatteryDeadDisplayTime;
|
|
//uint32_t modOperationalStateErrorDisplayTime;
|
|
//uint32_t modOperationalStateNotUsedResetDelay;
|
|
//uint32_t modOperationalStateNotUsedTime;
|
|
//uint32_t modOperationalStatePSPDisableDelay;
|
|
//uint32_t modOperationalStateWatchDogCountdownLastTick;
|
|
//bool modOperationalStateForceOn;
|
|
//
|
|
//void modOperationalStateInit(modPowerElectronicsPackStateTypedef *packState, modConfigGeneralConfigStructTypedef *generalConfigPointer, modStateOfChargeStructTypeDef *generalStateOfCharge) {
|
|
// modOperationalStatePackStatehandle = packState;
|
|
// modOperationalStateGeneralConfigHandle = generalConfigPointer;
|
|
// modOperationalStateGeneralStateOfCharge = generalStateOfCharge;
|
|
// modOperationalStateSetAllStates(OP_STATE_INIT);
|
|
// modOperationalStateStartupDelay = HAL_GetTick();
|
|
// modOperationalStateChargerDisconnectDetectDelay = HAL_GetTick();
|
|
// packOperationalCellStateLastErrorState = PACK_STATE_NORMAL;
|
|
// modOperationalStateForceOn = false;
|
|
// //nc modDisplayInit();
|
|
//
|
|
// //Init Expansion temperature modules
|
|
// //nc driverSWADC128D818Init(modOperationalStateGeneralConfigHandle->noOfExpansionBoard, 8);
|
|
//
|
|
// modOperationalStateNotUsedTime = HAL_GetTick();
|
|
// modOperationalStateNotUsedResetDelay = HAL_GetTick();
|
|
//};
|
|
//
|
|
//void modOperationalStateTask(void) {
|
|
// switch(modOperationalStateCurrentState) {
|
|
// case OP_STATE_INIT:
|
|
// if(modPowerStateChargerDetected()) { // Check to detect charger
|
|
// switch(modOperationalStateGeneralConfigHandle->chargeEnableOperationalState){
|
|
// case opStateChargingModeCharging:
|
|
// modOperationalStateSetNewState(OP_STATE_CHARGING); // Go to charge state
|
|
// //nc modEffectChangeState(STAT_LED_POWER,STAT_FLASH); // Flash power LED when charging
|
|
// modOperationalStateChargerDisconnectDetectDelay = HAL_GetTick();
|
|
// break;
|
|
// case opStateChargingModeNormal:
|
|
// default:
|
|
// modOperationalStateSetNewState(OP_STATE_PRE_CHARGE); // Prepare to goto operational state
|
|
// //nc modEffectChangeState(STAT_LED_POWER,STAT_SET); // Turn LED on in normal operation
|
|
// break;
|
|
// }
|
|
// }else if(modPowerStateButtonPressedOnTurnon()) { // Check if button was pressen on turn-on
|
|
// modOperationalStateSetNewState(OP_STATE_PRE_CHARGE); // Prepare to goto operational state
|
|
// //nc modEffectChangeState(STAT_LED_POWER,STAT_SET); // Turn LED on in normal operation
|
|
// }else if(modOperationalStateNewState == OP_STATE_INIT){ // USB or CAN origin of turn-on
|
|
// switch(modOperationalStateGeneralConfigHandle->externalEnableOperationalState){
|
|
// case opStateExtNormal:
|
|
// modOperationalStateSetNewState(OP_STATE_PRE_CHARGE); // Prepare to goto normal operational state
|
|
// break;
|
|
// case opStateExternal:
|
|
// default:
|
|
// modOperationalStateSetNewState(OP_STATE_EXTERNAL); // Serve external control
|
|
// break;
|
|
// }
|
|
// //nc modEffectChangeState(STAT_LED_POWER,STAT_SET); // Turn LED on in normal operation
|
|
// }
|
|
//
|
|
// if(modDelayTick1ms(&modOperationalStateStartupDelay,modOperationalStateGeneralConfigHandle->displayTimeoutSplashScreen)) {// Wait for a bit than update state. Also check voltage after main fuse? followed by going to error state if blown?
|
|
// if(!modOperationalStatePackStatehandle->disChargeLCAllowed && !modPowerStateChargerDetected()) { // If discharge is not allowed
|
|
// modOperationalStateSetNewState(OP_STATE_ERROR); // Then the battery is dead
|
|
// modOperationalStateBatteryDeadDisplayTime = HAL_GetTick();
|
|
// }
|
|
// modOperationalStateUpdateStates(); // Sync states
|
|
// };
|
|
//
|
|
// //nc modDisplayShowInfo(DISP_MODE_SPLASH,modOperationalStateDisplayData);
|
|
// break;
|
|
// case OP_STATE_CHARGING:
|
|
// // If chargeAllowed = false -> operational state balancing
|
|
// if(modOperationalStatePackStatehandle->balanceActive){
|
|
// modOperationalStateSetNewState(OP_STATE_BALANCING);
|
|
// }
|
|
// modOperationalStateHandleChargerDisconnect(OP_STATE_POWER_DOWN);
|
|
// modPowerElectronicsSetCharge(true);
|
|
// if(modOperationalStatePackStatehandle->packCurrent >= 0.5f || modOperationalStatePackStatehandle->packCurrent >= modOperationalStateGeneralConfigHandle->chargerEnabledThreshold){
|
|
// modPowerElectronicsSetChargePFET(true);
|
|
// }else{
|
|
// modPowerElectronicsSetChargePFET(false);
|
|
// };
|
|
// #if (ENNOID_HV || ENNOID_LV)
|
|
// //Allow main contactors to close if load voltage is above pack voltage & below max allowed voltage, that means that the charger is connected to the load
|
|
// if(modOperationalStatePackStatehandle->packVoltage-modOperationalStatePackStatehandle->loCurrentLoadVoltage < (modOperationalStatePackStatehandle->packVoltage*0.1f) && modOperationalStatePackStatehandle->loCurrentLoadVoltage < (modOperationalStateGeneralConfigHandle->noOfCellsSeries*modOperationalStateGeneralConfigHandle->cellHardOverVoltage+10)){
|
|
// modPowerElectronicsSetDisCharge(true);
|
|
// if(modOperationalStateGeneralConfigHandle->LCUsePrecharge==forced){
|
|
// modPowerElectronicsSetPreCharge(true);
|
|
// }
|
|
// }
|
|
// #endif
|
|
// //Cooling/Heating
|
|
// if(modOperationalStatePackStatehandle->coolingAllowed )
|
|
// modPowerElectronicsSetCooling(true);
|
|
// else{
|
|
// modPowerElectronicsSetCooling(false);
|
|
// }
|
|
//
|
|
// modOperationalStateUpdateStates();
|
|
// //nc modOperationalStateDisplayData.StateOfCharge = modOperationalStateGeneralStateOfCharge->generalStateOfCharge;
|
|
// //nc modOperationalStateDisplayData.Current = fabs(modOperationalStatePackStatehandle->packCurrent);
|
|
// //nc modOperationalStateDisplayData.ChargerVoltage = fabs(modOperationalStatePackStatehandle->chargerVoltage);
|
|
// //nc modDisplayShowInfo(DISP_MODE_CHARGE,modOperationalStateDisplayData);
|
|
// break;
|
|
// case OP_STATE_PRE_CHARGE:
|
|
// // in case of timeout: disable pre charge & go to error state
|
|
// if(modOperationalStateLastState != modOperationalStateCurrentState) { // If discharge is not allowed pre-charge will not be enabled, therefore reset timeout every task call. Also reset on first entry
|
|
// modOperationalStatePreChargeTimeout = HAL_GetTick(); // Reset timeout
|
|
// modPowerElectronicsSetDisCharge(false);
|
|
// modPowerElectronicsSetCharge(false);
|
|
// }
|
|
//
|
|
// if(modOperationalStatePackStatehandle->disChargeLCAllowed || modOperationalStateForceOn)
|
|
// modPowerElectronicsSetPreCharge(true);
|
|
// else{
|
|
// modPowerElectronicsSetPreCharge(false);
|
|
// modOperationalStatePreChargeTimeout = HAL_GetTick();
|
|
// // if(modOperationalStateGeneralConfigHandle->buzzerSignalSource)
|
|
// //nc modEffectChangeStateError(STAT_BUZZER,STAT_ERROR,modOperationalStatePackStatehandle->faultState);
|
|
// // }
|
|
//
|
|
// if((modOperationalStatePackStatehandle->loCurrentLoadVoltage > modOperationalStatePackStatehandle->packVoltage*modOperationalStateGeneralConfigHandle->minimalPrechargePercentage) && (modOperationalStatePackStatehandle->disChargeLCAllowed || modOperationalStateForceOn)) {
|
|
// if(modOperationalStateForceOn) {
|
|
// modOperationalStateSetNewState(OP_STATE_FORCEON); // Goto force on
|
|
// }else{
|
|
// modOperationalStateSetNewState(OP_STATE_LOAD_ENABLED); // Goto normal load enabled operation
|
|
// }
|
|
// }else if(modDelayTick1ms(&modOperationalStatePreChargeTimeout,modOperationalStateGeneralConfigHandle->timeoutLCPreCharge)){
|
|
// if(modOperationalStateGeneralConfigHandle->LCUsePrecharge>=1){
|
|
// modOperationalStateSetNewState(OP_STATE_ERROR_PRECHARGE); // An error occured during pre charge
|
|
// modOperationalStatePackStatehandle->faultState = FAULT_CODE_PRECHARGE_TIMEOUT;
|
|
// }else
|
|
// modOperationalStateSetNewState(OP_STATE_LOAD_ENABLED); // Goto normal load enabled operation
|
|
// }
|
|
//
|
|
// modOperationalStateUpdateStates();
|
|
// break;
|
|
// case OP_STATE_LOAD_ENABLED:
|
|
// if(modPowerElectronicsSetDisCharge(true)) {
|
|
//
|
|
// if(modOperationalStateGeneralConfigHandle->LCUsePrecharge==forced){
|
|
// #if ENNOID_HV
|
|
// modPowerElectronicsSetPreCharge(true);
|
|
// #endif
|
|
// }else{
|
|
// modPowerElectronicsSetPreCharge(false);
|
|
// }
|
|
// if(modPowerStateChargerDetected()){
|
|
// modPowerElectronicsSetCharge(modOperationalStateGeneralConfigHandle->allowChargingDuringDischarge);
|
|
// if(modOperationalStatePackStatehandle->packCurrent >= 0.5f || modOperationalStatePackStatehandle->packCurrent >= modOperationalStateGeneralConfigHandle->chargerEnabledThreshold){
|
|
// modPowerElectronicsSetChargePFET(true);
|
|
// }
|
|
// }else{
|
|
// modPowerElectronicsSetCharge(false);
|
|
// modPowerElectronicsSetChargePFET(false);
|
|
// }
|
|
// }else{
|
|
// modOperationalStateSetNewState(OP_STATE_PRE_CHARGE);
|
|
// modPowerElectronicsSetDisCharge(false);
|
|
// modPowerElectronicsSetCharge(false);
|
|
// modPowerElectronicsSetChargePFET(false);
|
|
// }
|
|
//
|
|
// //nc modEffectChangeState(STAT_BUZZER,STAT_RESET);
|
|
//
|
|
// //Cooling/Heating
|
|
// if(modOperationalStatePackStatehandle->coolingAllowed )
|
|
// modPowerElectronicsSetCooling(true);
|
|
// else{
|
|
// modPowerElectronicsSetCooling(false);
|
|
// }
|
|
// //Charger detect
|
|
// if(modPowerStateChargerDetected() && !modOperationalStateGeneralConfigHandle->allowChargingDuringDischarge) {
|
|
// modOperationalStateSetNewState(OP_STATE_INIT);
|
|
// modPowerElectronicsSetDisCharge(false);
|
|
// modPowerElectronicsSetCharge(false);
|
|
// };
|
|
//
|
|
//
|
|
// // Battery is empty or battery temp is out of range?
|
|
// if(!modOperationalStatePackStatehandle->disChargeLCAllowed) {
|
|
// //modOperationalStateSetNewState(OP_STATE_ERROR);
|
|
// modPowerElectronicsSetDisCharge(false);
|
|
// modPowerElectronicsSetCharge(false);
|
|
// modOperationalStatePackStatehandle->faultState = FAULT_CODE_DISCHARGE_RETRY;
|
|
// //nc if(modOperationalStateGeneralConfigHandle->buzzerSignalSource)
|
|
// //nc modEffectChangeStateError(STAT_BUZZER,STAT_ERROR,modOperationalStatePackStatehandle->faultState);
|
|
// }
|
|
//
|
|
//
|
|
// if(fabs(modOperationalStatePackStatehandle->packCurrent) >= modOperationalStateGeneralConfigHandle->notUsedCurrentThreshold) {
|
|
// if(modDelayTick1ms(&modOperationalStateNotUsedResetDelay,1000))
|
|
// modOperationalStateNotUsedTime = HAL_GetTick();
|
|
// }else{
|
|
// modOperationalStateNotUsedResetDelay = HAL_GetTick();
|
|
// }
|
|
//
|
|
// if(modOperationalStatePowerDownDelayCheck()) {
|
|
// modOperationalStateSetNewState(OP_STATE_POWER_DOWN);
|
|
// modOperationalStatePackStatehandle->powerDownDesired = true;
|
|
// }
|
|
//
|
|
// if(modOperationalStatePackStatehandle->balanceActive) {
|
|
// if(!modOperationalStatePackStatehandle->chargeAllowed && (modOperationalStatePackStatehandle->cellVoltageMisMatch < modOperationalStateGeneralConfigHandle->maxMismatchThreshold)){
|
|
// if(modDelayTick1ms(&modOperationalStateChargedTimeout,modOperationalStateGeneralConfigHandle->timeoutChargingCompletedMinimalMismatch)) {
|
|
// modStateOfChargeVoltageEvent(EVENT_FULL);
|
|
// modOperationalStateChargedTimeout = HAL_GetTick();
|
|
// }
|
|
// }else{
|
|
// modOperationalStateChargedTimeout = HAL_GetTick();
|
|
// };
|
|
// }
|
|
//
|
|
// modOperationalStateUpdateStates();
|
|
//
|
|
// //nc modOperationalStateDisplayData.StateOfCharge = modOperationalStateGeneralStateOfCharge->generalStateOfCharge;
|
|
// //nc modOperationalStateDisplayData.Current = fabs(modOperationalStatePackStatehandle->packCurrent);
|
|
// //nc modOperationalStateDisplayData.PackVoltage = fabs(modOperationalStatePackStatehandle->packVoltage);
|
|
// //nc modOperationalStateDisplayData.HighestTemp = fabs(modOperationalStatePackStatehandle->tempBatteryHigh);
|
|
// //nc modOperationalStateDisplayData.AverageTemp = fabs(modOperationalStatePackStatehandle->tempBatteryAverage);
|
|
// //nc modOperationalStateDisplayData.LowestTemp = fabs(modOperationalStatePackStatehandle->tempBatteryLow);
|
|
// //nc modOperationalStateDisplayData.Humidity = fabs(modOperationalStatePackStatehandle->humidity);
|
|
// //nc modOperationalStateDisplayData.LowestCellVoltage = fabs(modOperationalStatePackStatehandle->cellVoltageLow);
|
|
// //nc modOperationalStateDisplayData.HighestCellVoltage = fabs(modOperationalStatePackStatehandle->cellVoltageHigh);
|
|
// //nc modOperationalStateDisplayData.DisplayStyle = modOperationalStateGeneralConfigHandle->displayStyle;
|
|
//
|
|
// //nc modDisplayShowInfo(DISP_MODE_LOAD,modOperationalStateDisplayData);
|
|
// break;
|
|
// case OP_STATE_BATTERY_DEAD:
|
|
// //nc modDisplayShowInfo(DISP_MODE_BATTERY_DEAD,modOperationalStateDisplayData);
|
|
//// if(modDelayTick1ms(&modOperationalStateBatteryDeadDisplayTime,modOperationalStateGeneralConfigHandle->displayTimeoutBatteryDead)){
|
|
//// modOperationalStateSetNewState(OP_STATE_POWER_DOWN);
|
|
//// modOperationalStatePackStatehandle->powerDownDesired = true;
|
|
//// modOperationalStatePackStatehandle->faultState = FAULT_CODE_PACK_UNDER_VOLTAGE;
|
|
//// }
|
|
// modOperationalStateUpdateStates();
|
|
// break;
|
|
// case OP_STATE_POWER_DOWN:
|
|
// if(modOperationalStateLastState != modOperationalStateCurrentState) {
|
|
// modOperationalStatePSPDisableDelay = HAL_GetTick();
|
|
// }
|
|
// modPowerElectronicsDisableAll(); // Disable all power paths
|
|
// //nc modEffectChangeState(STAT_LED_POWER,STAT_RESET); // Turn off power LED
|
|
// //nc modEffectChangeState(STAT_LED_DEBUG,STAT_RESET);
|
|
// //nc if(!modOperationalStateGeneralConfigHandle->buzzerSignalPersistant)
|
|
// //nc modEffectChangeState(STAT_BUZZER,STAT_RESET);
|
|
// modOperationalStateUpdateStates();
|
|
// //nc modDisplayShowInfo(DISP_MODE_POWEROFF,modOperationalStateDisplayData);
|
|
// if(modDelayTick1ms(&modOperationalStatePSPDisableDelay,modOperationalStateGeneralConfigHandle->powerDownDelay)) { // Wait for the power down delay time to pass
|
|
// modOperationalStateTerminateOperation(); // Disable powersupply and store SoC
|
|
// }
|
|
// break;
|
|
// case OP_STATE_EXTERNAL: // BMS is turned on by external force IE CAN or USB
|
|
// if(modOperationalStateLastState != modOperationalStateCurrentState) {
|
|
// modPowerElectronicsSetPreCharge(false);
|
|
// modPowerElectronicsSetDisCharge(false);
|
|
// modPowerElectronicsSetCharge(false);
|
|
// }
|
|
//
|
|
// modOperationalStateTerminateOperation(); // Disable power and store SoC
|
|
// //nc modDisplayShowInfo(DISP_MODE_EXTERNAL,modOperationalStateDisplayData);
|
|
//
|
|
// break;
|
|
// case OP_STATE_ERROR:
|
|
// // Go to save state and in the future -> try to handle error situation
|
|
// if(modOperationalStateLastState != modOperationalStateCurrentState)
|
|
// modOperationalStateErrorDisplayTime = HAL_GetTick();
|
|
//
|
|
// if(modDelayTick1ms(&modOperationalStateErrorDisplayTime,modOperationalStateGeneralConfigHandle->displayTimeoutBatteryError)) {
|
|
// modOperationalStateSetNewState(OP_STATE_POWER_DOWN);
|
|
// modOperationalStatePackStatehandle->powerDownDesired = true;
|
|
// }
|
|
//
|
|
// //nc modEffectChangeStateError(STAT_LED_DEBUG,STAT_ERROR,modOperationalStatePackStatehandle->faultState); // Turn flash fast on debug and power LED
|
|
// //nc modEffectChangeStateError(STAT_LED_POWER,STAT_ERROR,modOperationalStatePackStatehandle->faultState);
|
|
// if(modOperationalStateGeneralConfigHandle->buzzerSignalSource)
|
|
// //nc modEffectChangeStateError(STAT_BUZZER,STAT_ERROR,modOperationalStatePackStatehandle->faultState); // Turn flash fast on debug and power LED
|
|
// modPowerElectronicsDisableAll();
|
|
// modOperationalStateUpdateStates();
|
|
// //nc modOperationalStateDisplayData.FaultCode = modOperationalStatePackStatehandle->faultState;
|
|
// //nc modDisplayShowInfo(DISP_MODE_ERROR,modOperationalStateDisplayData);
|
|
//
|
|
// break;
|
|
// case OP_STATE_ERROR_PRECHARGE:
|
|
// // Go to save state and in the future -> try to handle error situation
|
|
// if(modOperationalStateLastState != modOperationalStateCurrentState)
|
|
// modOperationalStateErrorDisplayTime = HAL_GetTick();
|
|
//
|
|
// if(modDelayTick1ms(&modOperationalStateErrorDisplayTime,modOperationalStateGeneralConfigHandle->displayTimeoutBatteryErrorPreCharge)) {
|
|
// modOperationalStateSetNewState(OP_STATE_POWER_DOWN);
|
|
// modOperationalStatePackStatehandle->powerDownDesired = true;
|
|
// }
|
|
//
|
|
// //nc modEffectChangeState(STAT_LED_DEBUG,STAT_FLASH_FAST); // Turn flash fast on debug and power LED
|
|
// //nc modEffectChangeState(STAT_LED_POWER,STAT_FLASH_FAST); // Turn flash fast on debug and power LED
|
|
// //nc if(modOperationalStateGeneralConfigHandle->buzzerSignalSource)
|
|
// //nc modEffectChangeStateError(STAT_BUZZER,STAT_ERROR,modOperationalStatePackStatehandle->faultState);
|
|
// modPowerElectronicsDisableAll();
|
|
// modOperationalStateUpdateStates();
|
|
// //nc modDisplayShowInfo(DISP_MODE_ERROR_PRECHARGE,modOperationalStateDisplayData);
|
|
// break;
|
|
// case OP_STATE_BALANCING:
|
|
// // update timeout time for balancing and use charging manager for enable state charge input
|
|
// if(modOperationalStatePackStatehandle->packCurrent < modOperationalStateGeneralConfigHandle->chargerEnabledThreshold && modOperationalStatePackStatehandle->chargeAllowed){
|
|
// if(modDelayTick1ms(&modOperationalStateChargerTimeout,modOperationalStateGeneralConfigHandle->timeoutChargeCompleted)) {
|
|
// modOperationalStateSetAllStates(OP_STATE_CHARGED);
|
|
// modStateOfChargeVoltageEvent(EVENT_FULL);
|
|
// }
|
|
// }else{
|
|
// modOperationalStateChargerTimeout = HAL_GetTick();
|
|
// };
|
|
//
|
|
// if(!modOperationalStatePackStatehandle->chargeAllowed && (modOperationalStatePackStatehandle->cellVoltageMisMatch < modOperationalStateGeneralConfigHandle->maxMismatchThreshold)){
|
|
// if(modDelayTick1ms(&modOperationalStateChargedTimeout,modOperationalStateGeneralConfigHandle->timeoutChargingCompletedMinimalMismatch)) {
|
|
// modOperationalStateSetAllStates(OP_STATE_CHARGED);
|
|
// modStateOfChargeVoltageEvent(EVENT_FULL);
|
|
// }
|
|
// }else{
|
|
// modOperationalStateChargedTimeout = HAL_GetTick();
|
|
// };
|
|
//
|
|
// modOperationalStateHandleChargerDisconnect(OP_STATE_POWER_DOWN);
|
|
// if(modOperationalStatePackStatehandle->chargeAllowed){
|
|
// modPowerElectronicsSetCharge(true);
|
|
// if(modOperationalStatePackStatehandle->packCurrent >= 0.5f || modOperationalStatePackStatehandle->packCurrent >= modOperationalStateGeneralConfigHandle->chargerEnabledThreshold){
|
|
// modPowerElectronicsSetChargePFET(true);
|
|
// }
|
|
//
|
|
// #if (ENNOID_HV || ENNOID_LV)
|
|
// if(modOperationalStatePackStatehandle->packVoltage-modOperationalStatePackStatehandle->loCurrentLoadVoltage < (modOperationalStatePackStatehandle->packVoltage*0.1f) && modOperationalStatePackStatehandle->loCurrentLoadVoltage < (modOperationalStateGeneralConfigHandle->noOfCellsSeries*modOperationalStateGeneralConfigHandle->cellHardOverVoltage+10.0f)){
|
|
// modPowerElectronicsSetDisCharge(true);
|
|
// if(modOperationalStateGeneralConfigHandle->LCUsePrecharge==forced){
|
|
// modPowerElectronicsSetPreCharge(true);
|
|
// }
|
|
// }
|
|
// #endif
|
|
// }else{
|
|
// modPowerElectronicsSetChargePFET(false);
|
|
// modPowerElectronicsSetCharge(false);
|
|
// modPowerElectronicsSetDisCharge(false);
|
|
// modPowerElectronicsSetPreCharge(false);
|
|
// modOperationalStatePackStatehandle->faultState = FAULT_CODE_CHARGE_RETRY;
|
|
// };
|
|
//
|
|
// //Cooling/Heating
|
|
// if(modOperationalStatePackStatehandle->coolingAllowed )
|
|
// modPowerElectronicsSetCooling(true);
|
|
// else{
|
|
// modPowerElectronicsSetCooling(false);
|
|
// }
|
|
//
|
|
// modOperationalStateUpdateStates();
|
|
// //nc modOperationalStateDisplayData.StateOfCharge = modOperationalStateGeneralStateOfCharge->generalStateOfCharge;
|
|
// //nc modOperationalStateDisplayData.CellMismatch = fabs(modOperationalStatePackStatehandle->cellVoltageMisMatch);
|
|
// //nc modOperationalStateDisplayData.AverageCellVoltage = fabs(modOperationalStatePackStatehandle->cellVoltageAverage);
|
|
// //nc modDisplayShowInfo(DISP_MODE_BALANCING,modOperationalStateDisplayData);
|
|
// //nc modEffectChangeState(STAT_LED_POWER,STAT_BLINKSHORTLONG_100_20); // Indicate balancing
|
|
// break;
|
|
// case OP_STATE_CHARGED:
|
|
// modOperationalStateHandleChargerDisconnect(OP_STATE_POWER_DOWN);
|
|
// //nc modEffectChangeState(STAT_LED_POWER,STAT_BLINKSHORTLONG_1000_4); // Indicate Charged
|
|
// modOperationalStateUpdateStates();
|
|
// //nc modDisplayShowInfo(DISP_MODE_CHARGED,modOperationalStateDisplayData);
|
|
// break;
|
|
// case OP_STATE_FORCEON:
|
|
// if(modPowerElectronicsSetDisCharge(true))
|
|
// modPowerElectronicsSetPreCharge(false);
|
|
// else {
|
|
// modOperationalStateSetNewState(OP_STATE_PRE_CHARGE);
|
|
// modPowerElectronicsSetDisCharge(false);
|
|
// }
|
|
//
|
|
// if(fabs(modOperationalStatePackStatehandle->packCurrent) >= modOperationalStateGeneralConfigHandle->notUsedCurrentThreshold) {
|
|
// if(modDelayTick1ms(&modOperationalStateNotUsedResetDelay,1000))
|
|
// modOperationalStateNotUsedTime = HAL_GetTick();
|
|
// }else{
|
|
// modOperationalStateNotUsedResetDelay = HAL_GetTick();
|
|
// }
|
|
//
|
|
// if(modOperationalStatePowerDownDelayCheck()) {
|
|
// modOperationalStateSetNewFaultState(FAULT_CODE_NOT_USED_TIMEOUT);
|
|
// modOperationalStateSetNewState(OP_STATE_POWER_DOWN);
|
|
// modOperationalStatePackStatehandle->powerDownDesired = true;
|
|
// }
|
|
//
|
|
// //nc modDisplayShowInfo(DISP_MODE_FORCED_ON,modOperationalStateDisplayData);
|
|
// //nc modEffectChangeState(STAT_LED_POWER,STAT_BLINKSHORTLONG_1000_4); // Turn flash fast on debug and power LED
|
|
// modOperationalStateUpdateStates();
|
|
// break;
|
|
// default:
|
|
// modOperationalStateSetAllStates(OP_STATE_ERROR);
|
|
// break;
|
|
// };
|
|
//
|
|
// if(modPowerStateForceOnRequest()){
|
|
// modOperationalStateForceOn = true;
|
|
// modPowerElectronicsAllowForcedOn(true);
|
|
// modOperationalStateSetNewState(OP_STATE_PRE_CHARGE);
|
|
// driverSWStorageManagerEraseData();
|
|
// };
|
|
//
|
|
// // Check for power button longpress -> if so power down BMS
|
|
// if(modPowerStatePowerdownRequest()) {
|
|
// modOperationalStatePackStatehandle->powerDownDesired = true;
|
|
//
|
|
// if(modOperationalStateDelayedDisable(modOperationalStateGeneralConfigHandle->useCANDelayedPowerDown)) {
|
|
// modOperationalStateSetNewFaultState(FAULT_CODE_CAN_DELAYED_POWER_DOWN);
|
|
// modOperationalStateSetNewState(OP_STATE_POWER_DOWN);
|
|
// //nc modDisplayShowInfo(DISP_MODE_POWEROFF,modOperationalStateDisplayData);
|
|
// modOperationalStateUpdateFaultStates();
|
|
//
|
|
// }
|
|
// };
|
|
//
|
|
// // In case of extreme cellvoltages or temperatures goto error state
|
|
// if((modOperationalStatePackStatehandle->packOperationalCellState == PACK_STATE_ERROR_HARD_CELLVOLTAGE || modOperationalStatePackStatehandle->packOperationalCellState == PACK_STATE_ERROR_TEMPERATURE) && (modOperationalStatePackStatehandle->packOperationalCellState != packOperationalCellStateLastErrorState) && !modOperationalStateForceOn){
|
|
// packOperationalCellStateLastErrorState = modOperationalStatePackStatehandle->packOperationalCellState; // Meganism to make error situation only trigger once
|
|
// modOperationalStateSetNewState(OP_STATE_ERROR);
|
|
// modOperationalStateUpdateStates();
|
|
// }
|
|
//
|
|
// // In case of extreme currents goto error state
|
|
// if((modOperationalStatePackStatehandle->packOperationalCellState == PACK_STATE_ERROR_OVER_CURRENT) && (modOperationalStatePackStatehandle->packOperationalCellState != packOperationalCellStateLastErrorState)){
|
|
// packOperationalCellStateLastErrorState = modOperationalStatePackStatehandle->packOperationalCellState; // Meganism to make error situation only trigger once
|
|
// modOperationalStatePackStatehandle->faultState = FAULT_CODE_OVER_CURRENT;
|
|
// modOperationalStateSetNewState(OP_STATE_ERROR);
|
|
// modOperationalStateUpdateStates();
|
|
// }
|
|
//
|
|
//
|
|
// // Move the button pressed state to the status struct
|
|
// modOperationalStatePackStatehandle->powerOnLongButtonPress = modPowerStateGetLongButtonPressState();
|
|
//
|
|
// // Handle subtask-display to update display content
|
|
// //nc modDisplayTask();
|
|
// }
|
|
//}
|
|
//
|
|
//void modOperationalStateUpdateStates(void) {
|
|
// modOperationalStateLastState = modOperationalStateCurrentState;
|
|
// modOperationalStatePackStatehandle->operationalState = modOperationalStateCurrentState = modOperationalStateNewState;
|
|
//};
|
|
//
|
|
//void modOperationalStateSetAllStates(OperationalStateTypedef newState) {
|
|
// modOperationalStatePackStatehandle->operationalState = modOperationalStateLastState = modOperationalStateCurrentState = modOperationalStateNewState = newState;
|
|
//};
|
|
//
|
|
//void modOperationalStateSetNewState(OperationalStateTypedef newState) {
|
|
// modOperationalStateNewState = newState;
|
|
//};
|
|
//
|
|
//void modOperationalStateHandleChargerDisconnect(OperationalStateTypedef newState) {
|
|
// if(modPowerStateChargerDetected() && !((modOperationalStatePackStatehandle->packCurrent < modOperationalStateGeneralConfigHandle->chargerEnabledThreshold ) && modOperationalStatePackStatehandle->chargeDesired && modOperationalStatePackStatehandle->chargeAllowed)) {
|
|
// modOperationalStateChargerDisconnectDetectDelay = HAL_GetTick();
|
|
// }else{
|
|
// if(modDelayTick1ms(&modOperationalStateChargerDisconnectDetectDelay,modOperationalStateGeneralConfigHandle->timeoutChargerDisconnected)){
|
|
// modOperationalStateSetAllStates(newState);
|
|
// modOperationalStatePackStatehandle->powerDownDesired = true;
|
|
// }
|
|
// }
|
|
//};
|
|
//
|
|
//void modOperationalStateTerminateOperation(void) {
|
|
// // Store the state of charge data
|
|
// modStateOfChargePowerDownSave(); // Store the SoC data
|
|
//
|
|
// // Disable the power supply
|
|
// modPowerStateSetState(P_STAT_RESET); // Turn off the power
|
|
//}
|
|
//
|
|
//bool modOperationalStateDelayedDisable(bool delayedPowerDownDesired) {
|
|
// if(delayedPowerDownDesired){
|
|
// if(modOperationalStatePackStatehandle->watchDogTime){
|
|
// if(modDelayTick1ms(&modOperationalStateWatchDogCountdownLastTick,1000))
|
|
// modOperationalStatePackStatehandle->watchDogTime--;
|
|
//
|
|
// return false;
|
|
// }else{
|
|
// return true;
|
|
// }
|
|
// }else{
|
|
// return true;
|
|
// }
|
|
//}
|
|
//
|
|
//bool modOperationalStatePowerDownDelayCheck(void){
|
|
// return modDelayTick1ms(&modOperationalStateNotUsedTime,modOperationalStateGeneralConfigHandle->notUsedTimeout) && modOperationalStateGeneralConfigHandle->notUsedTimeout;
|
|
//}
|
|
//
|
|
//void modOperationalStateUpdateFaultStates(void) {
|
|
// modOperationalStateLastFaultState = modOperationalStateCurrentFaultState;
|
|
// modOperationalStatePackStatehandle->faultState = modOperationalStateCurrentFaultState = modOperationalStateNewFaultState;
|
|
//};
|
|
//
|
|
//void modOperationalStateSetAllFaultStates(bms_fault_state newFaultState) {
|
|
// modOperationalStatePackStatehandle->faultState = modOperationalStateLastFaultState = modOperationalStateCurrentFaultState = modOperationalStateNewFaultState = newFaultState;
|
|
//};
|
|
//
|
|
//void modOperationalStateSetNewFaultState(bms_fault_state newFaultState) {
|
|
// modOperationalStateNewFaultState = newFaultState;
|
|
//};
|