/** * @file Power.c * @author Wang, Zhiyu(wangzy49@midea.com) * @brief Power of ebike * @version 0.1 * @date 2021-09-29 * * @copyright Copyright (c) 2021 * */ /************************************************************************ Beginning of File, do not put anything above here except notes Compiler Directives: *************************************************************************/ #include "typedefine.h" #include "power.h" #include "can.h" #include "api.h" #include "board_config.h" /****************************** * * Parameter * ******************************/ POWER_OUT power_stPowStateOut = POWER_OUT_DEFAULT; static POWER_COF power_stPowStateCof = POWER_COF_DEFAULT; ULONG AutoPowerOffTimeCnt = 0; ULONG PowerOffDTimeOut = 0; /*************************************************************** Function: power_voPowerInit; Description: cadence frequency get initialization Call by: functions in main loop; Input Variables: N/A Output/Return Variables: N/A Subroutine Call: N/A; Reference: N/A ****************************************************************/ void power_voPowerInit(void) { power_stPowStateOut.powerstate = POWER_START; power_stPowStateOut.blPowerShutdownFlg = FALSE; power_stPowStateOut.blPowerStartupFlg = FALSE; power_stPowStateOut.uwPowerOn2OffCnt = 0; power_stPowStateOut.uwPowerShutdnCnt = 0; power_stPowStateOut.uwPowerStartupCnt = 0; power_stPowStateCof.uwPowerStartTouchTimeCnt = POWER_START_TOUCHING_TIME / POWER_START_TIMERUNIT; power_stPowStateCof.uwPowerShutTouchTimeCnt = POWER_SHUT_TOUCHING_TIME / POWER_SHUT_TIMERUNIT; power_stPowStateCof.uwPowerStartEndCnt = POWER_START_FULLYON_TIME / POWER_START_TIMERUNIT; power_stPowStateCof.uwPowerShutEndCnt = POWER_SHUT_FULLYOFF_TIME / POWER_SHUT_TIMERUNIT; power_stPowStateCof.uwPowerOn2OffTimeCnt = POWER_ON2OFF_TIME / POWER_SHUT_TIMERUNIT; } /*************************************************************** Function: power_voPowerManagement; Description: cadence frequency get initialization Call by: functions in main loop; Input Variables: N/A Output/Return Variables: N/A Subroutine Call: N/A; Reference: N/A ****************************************************************/ void power_voPowerManagement(UWORD uwPowerPara, ULONG SysTickCnt, ULONG OBC_ButtonSetTimeCnt, UWORD uwTorqueIn, UWORD CadenceIn, UWORD BikeSpeed, BOOL EESaveFinishFlg, BOOL ParaSaveEEFlg) /* parasoft-suppress METRICS-28 "本项目圈复杂度无法更改,后续避免" */ { ULONG ulAutoPowerOffDelayTime; ULONG ulPowerStartDelayTime; ULONG ulPowerOFFDelayTime; ulPowerStartDelayTime = (ULONG)(power_stPowStateCof.uwPowerStartTouchTimeCnt + ((uwPowerPara & 0xF000)>>12) * 200);//ms ulPowerOFFDelayTime = (ULONG)(power_stPowStateCof.uwPowerShutTouchTimeCnt + ((uwPowerPara & 0x0F00)>>8) * 200);//ms ulAutoPowerOffDelayTime = (ULONG)((uwPowerPara & 0x00FF) * 60);//s switch(power_stPowStateOut.powerstate) { case POWER_START: // 电源键按下,超过1s进入POWER ON { if(iGpio_Read(HW_GPIO_POWERSTATE_PIN) != 0) { power_stPowStateOut.uwPowerStartupCnt++; if (power_stPowStateOut.uwPowerStartupCnt == ulPowerStartDelayTime) { iGpio_Write(HW_GPIO_POWERLOCK_PIN,ApiGpio_HighLevel); power_stPowStateOut.powerstate = POWER_ON; power_stPowStateOut.uwPowerOn2OffCnt = 0; } } AutoPowerOffTimeCnt = SysTickCnt; break; } case POWER_ON: // 3s后,检测PC0按键是否弹起,PC0弹起后进入POWER_ON_END { power_stPowStateOut.uwPowerOn2OffCnt++; if (power_stPowStateOut.uwPowerOn2OffCnt >= power_stPowStateCof.uwPowerOn2OffTimeCnt) { if(iGpio_Read(HW_GPIO_POWERSTATE_PIN) == 0) { power_stPowStateOut.powerstate = POWER_ON_END; power_stPowStateOut.blPowerStartupFlg = TRUE; power_stPowStateOut.uwPowerShutdnCnt = 0; AutoPowerOffTimeCnt = SysTickCnt; } } break; } case POWER_ON_END: // 电源键按下进入POWER_OFF,或待机设定时候后自动进入POWER_OFF { //The key pushed down for "uwPowerShutTouchTimeCnt" to POWER_OFF if (iGpio_Read(HW_GPIO_POWERSTATE_PIN) != 0) { power_stPowStateOut.uwPowerShutdnCnt++; if (power_stPowStateOut.uwPowerShutdnCnt >= ulPowerOFFDelayTime) { power_stPowStateOut.powerstate = POWER_OFF; power_stPowStateOut.blPowerStartupFlg = FALSE; PowerOffDTimeOut = SysTickCnt; //Send power off command SendData(ID_MC_BC, MODE_REPORT, 0x1808, (uint8_t *)"SHUTDOWN"); } } else { power_stPowStateOut.uwPowerShutdnCnt = 0; } //Do not auto power off if(ulAutoPowerOffDelayTime == 0) { AutoPowerOffTimeCnt = SysTickCnt; } //Stand for ulAutoPowerOffDelayTime seconds to POWER_OFF if((uwTorqueIn < 20) && (CadenceIn < 5) && (BikeSpeed < 10) && ((SysTickCnt - OBC_ButtonSetTimeCnt) > 1000)) { if(SysTickCnt - AutoPowerOffTimeCnt > ulAutoPowerOffDelayTime * 1000) //unit s { power_stPowStateOut.powerstate = POWER_OFF; power_stPowStateOut.blPowerStartupFlg = FALSE; PowerOffDTimeOut = SysTickCnt; //Send power off command SendData(ID_MC_BC, MODE_REPORT, 0x1808, (uint8_t *)"SHUTDOWN"); } } else { AutoPowerOffTimeCnt = SysTickCnt; } break; } case POWER_OFF: // 关机处理,等待数据存储完成,关闭LOCK { //Finish save and wait 1s, or delay for 3s if (((EESaveFinishFlg == TRUE) && (ParaSaveEEFlg == FALSE) && ((SysTickCnt - PowerOffDTimeOut) > 1000)) || ((SysTickCnt - PowerOffDTimeOut) > 3000)) { power_stPowStateOut.powerstate = POWER_OFF_END; power_stPowStateOut.blPowerShutdownFlg = TRUE; power_stPowStateOut.uwPowerShutdnCnt = 0; iGpio_Write(HW_GPIO_POWERLOCK_PIN,ApiGpio_LowLevel); } break; } case POWER_OFF_END: { break; } case POWER_RESET: { //Finish save and wait 1s, or delay for 3s __set_FAULTMASK(1);//关闭所有中断 NVIC_SystemReset(); break; } default:break; } } /*************************************************************** Function: power_voPowerOnManagement; Description: cadence frequency get initialization Call by: functions in main loop; Input Variables: N/A Output/Return Variables: N/A Subroutine Call: N/A; Reference: N/A ****************************************************************/ // static void power_voPowerOnManagement(void) // { // if(power_stPowStateOut.powerstate == POWER_ON && GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_0) != RESET) // { // power_stPowStateOut.uwPowerStartupCnt++; // if(power_stPowStateOut.uwPowerStartupCnt == power_stPowStateCof.uwPowerStartTouchTimeCnt) // { // IO_POWERLOCK_ON; // } // else if (power_stPowStateOut.uwPowerStartupCnt == power_stPowStateCof.uwPowerStartEndCnt + power_stPowStateCof.uwPowerStartTouchTimeCnt) // { // power_stPowStateOut.powerstate = POWER_ON_END; // power_stPowStateOut.blPowerStartupFlg = TRUE; // power_stPowStateOut.uwPowerStartupCnt = 0; // power_stPowStateOut.uwPowerOn2OffCnt = 0; // } // } // if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_0) == RESET) // { // power_stPowStateOut.uwPowerStartupCnt = 0; // power_stPowStateOut.uwPowerShutdnCnt = 0; // } // } /*************************************************************** Function: power_voPowerOffManagement; Description: cadence frequency get initialization Call by: functions in main loop; Input Variables: N/A Output/Return Variables: N/A Subroutine Call: N/A; Reference: N/A ****************************************************************/ // static void power_voPowerOffManagement(void) // { // if(power_stPowStateOut.powerstate == POWER_ON_END) // { // if(power_stPowStateOut.uwPowerOn2OffCnt < power_stPowStateCof.uwPowerOn2OffTimeCnt) // { // power_stPowStateOut.uwPowerOn2OffCnt ++; // } // } // if(power_stPowStateOut.powerstate == POWER_ON_END && power_stPowStateOut.uwPowerOn2OffCnt == power_stPowStateCof.uwPowerOn2OffTimeCnt && // GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_0) != RESET) // { // power_stPowStateOut.uwPowerShutdnCnt++; // if(power_stPowStateOut.uwPowerShutdnCnt == power_stPowStateCof.uwPowerShutTouchTimeCnt) // { // power_stPowStateOut.powerstate = POWER_OFF; // power_stPowStateOut.blPowerStartupFlg = FALSE; // power_stPowStateOut.uwPowerShutdnCnt = 0; // } // } // else if(power_stPowStateOut.powerstate == POWER_OFF) // { // power_stPowStateOut.uwPowerShutdnCnt++; // if(power_stPowStateOut.uwPowerShutdnCnt == power_stPowStateCof.uwPowerShutEndCnt) // { // power_stPowStateOut.powerstate = POWER_OFF_END; // power_stPowStateOut.blPowerShutdownFlg = TRUE; // power_stPowStateOut.uwPowerShutdnCnt = 0; // IO_POWERLOCK_OFF; // } // } // if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_0) == RESET) // { // power_stPowStateOut.powerstate = POWER_ON_END; // power_stPowStateOut.uwPowerStartupCnt = 0; // power_stPowStateOut.uwPowerShutdnCnt = 0; // } // } /************************************************************************* End of this File (EOF)! Do not put anything after this part! *************************************************************************/