123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268 |
- /**
- * @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!
- *************************************************************************/
|