power.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. /**
  2. * @file Power.c
  3. * @author Wang, Zhiyu(wangzy49@midea.com)
  4. * @brief Power of ebike
  5. * @version 0.1
  6. * @date 2021-09-29
  7. *
  8. * @copyright Copyright (c) 2021
  9. *
  10. */
  11. /************************************************************************
  12. Beginning of File, do not put anything above here except notes
  13. Compiler Directives:
  14. *************************************************************************/
  15. #include "typedefine.h"
  16. #include "power.h"
  17. #include "can.h"
  18. #include "api.h"
  19. #include "board_config.h"
  20. #include "Customization.h"
  21. /******************************
  22. *
  23. * Parameter
  24. *
  25. ******************************/
  26. POWER_OUT power_stPowStateOut = POWER_OUT_DEFAULT;
  27. static POWER_COF power_stPowStateCof = POWER_COF_DEFAULT;
  28. ULONG AutoPowerOffTimeCnt = 0;
  29. ULONG PowerOffDTimeOut = 0;
  30. /***************************************************************
  31. Function: power_voPowerInit;
  32. Description: cadence frequency get initialization
  33. Call by: functions in main loop;
  34. Input Variables: N/A
  35. Output/Return Variables: N/A
  36. Subroutine Call: N/A;
  37. Reference: N/A
  38. ****************************************************************/
  39. void power_voPowerInit(void)
  40. {
  41. power_stPowStateOut.powerstate = POWER_START;
  42. power_stPowStateOut.blPowerShutdownFlg = FALSE;
  43. power_stPowStateOut.blPowerStartupFlg = FALSE;
  44. power_stPowStateOut.uwPowerOn2OffCnt = 0;
  45. power_stPowStateOut.uwPowerShutdnCnt = 0;
  46. power_stPowStateOut.uwPowerStartupCnt = 0;
  47. power_stPowStateCof.uwPowerStartTouchTimeCnt = POWER_START_TOUCHING_TIME / POWER_START_TIMERUNIT;
  48. power_stPowStateCof.uwPowerShutTouchTimeCnt = POWER_SHUT_TOUCHING_TIME / POWER_SHUT_TIMERUNIT;
  49. power_stPowStateCof.uwPowerStartEndCnt = POWER_START_FULLYON_TIME / POWER_START_TIMERUNIT;
  50. power_stPowStateCof.uwPowerShutEndCnt = POWER_SHUT_FULLYOFF_TIME / POWER_SHUT_TIMERUNIT;
  51. power_stPowStateCof.uwPowerOn2OffTimeCnt = POWER_ON2OFF_TIME / POWER_SHUT_TIMERUNIT;
  52. }
  53. /***************************************************************
  54. Function: power_voPowerManagement;
  55. Description: cadence frequency get initialization
  56. Call by: functions in main loop;
  57. Input Variables: N/A
  58. Output/Return Variables: N/A
  59. Subroutine Call: N/A;
  60. Reference: N/A
  61. ****************************************************************/
  62. void power_voPowerManagement(UWORD uwPowerPara, ULONG SysTickCnt, ULONG OBC_ButtonSetTimeCnt, UWORD uwTorqueIn, UWORD CadenceIn, UWORD BikeSpeed, BOOL EESaveFinishFlg, BOOL ParaSaveEEFlg) /* parasoft-suppress METRICS-28 "本项目圈复杂度无法更改,后续避免" */
  63. {
  64. ULONG ulAutoPowerOffDelayTime;
  65. ULONG ulPowerStartDelayTime;
  66. ULONG ulPowerOFFDelayTime;
  67. UBYTE keyState;
  68. ulPowerStartDelayTime = (ULONG)(power_stPowStateCof.uwPowerStartTouchTimeCnt + ((uwPowerPara & 0xF000)>>12) * 200);//ms
  69. ulPowerOFFDelayTime = (ULONG)(power_stPowStateCof.uwPowerShutTouchTimeCnt + ((uwPowerPara & 0x0F00)>>8) * 200);//ms
  70. ulAutoPowerOffDelayTime = (ULONG)((uwPowerPara & 0x00FF) * 60);//s
  71. keyState = iGpio_Read(HW_GPIO_POWERSTATE_PIN);
  72. switch(power_stPowStateOut.powerstate)
  73. {
  74. case POWER_START: // 电源键按下,超过1s进入POWER ON
  75. {
  76. if(keyState != 0)
  77. {
  78. power_stPowStateOut.uwPowerStartupCnt++;
  79. if (power_stPowStateOut.uwPowerStartupCnt == ulPowerStartDelayTime)
  80. {
  81. iGpio_Write(HW_GPIO_POWERLOCK_PIN,ApiGpio_HighLevel);
  82. power_stPowStateOut.powerstate = POWER_ON;
  83. power_stPowStateOut.uwPowerOn2OffCnt = 0;
  84. }
  85. }
  86. AutoPowerOffTimeCnt = SysTickCnt;
  87. break;
  88. }
  89. case POWER_ON: // 3s后,检测PC0按键是否弹起,PC0弹起后进入POWER_ON_END
  90. {
  91. power_stPowStateOut.uwPowerOn2OffCnt++;
  92. if (power_stPowStateOut.uwPowerOn2OffCnt >= power_stPowStateCof.uwPowerOn2OffTimeCnt)
  93. {
  94. if(keyState == 0)
  95. {
  96. power_stPowStateOut.powerstate = POWER_ON_END;
  97. power_stPowStateOut.blPowerStartupFlg = TRUE;
  98. power_stPowStateOut.uwPowerShutdnCnt = 0;
  99. AutoPowerOffTimeCnt = SysTickCnt;
  100. }
  101. }
  102. break;
  103. }
  104. case POWER_ON_END: // 电源键按下进入POWER_OFF,或待机设定时候后自动进入POWER_OFF
  105. {
  106. //The key pushed down for "uwPowerShutTouchTimeCnt" to POWER_OFF
  107. #if(GIANT_ENABLE == 1)
  108. keyState = 0;
  109. #endif
  110. if (keyState != 0)
  111. {
  112. power_stPowStateOut.uwPowerShutdnCnt++;
  113. if (power_stPowStateOut.uwPowerShutdnCnt >= ulPowerOFFDelayTime)
  114. {
  115. power_stPowStateOut.powerstate = POWER_OFF;
  116. power_stPowStateOut.blPowerStartupFlg = FALSE;
  117. //Send power off command
  118. SendData(ID_MC_BC, MODE_REPORT, 0x1808, (uint8_t *)"SHUTDOWN");
  119. }
  120. }
  121. else
  122. {
  123. power_stPowStateOut.uwPowerShutdnCnt = 0;
  124. }
  125. //Do not auto power off
  126. if(ulAutoPowerOffDelayTime == 0)
  127. {
  128. AutoPowerOffTimeCnt = SysTickCnt;
  129. }
  130. //Stand for ulAutoPowerOffDelayTime seconds to POWER_OFF
  131. #if(GIANT_ENABLE == 1)
  132. AutoPowerOffTimeCnt = SysTickCnt;
  133. #endif
  134. if((uwTorqueIn < 20) && (CadenceIn < 5) && (BikeSpeed < 10) && ((SysTickCnt - OBC_ButtonSetTimeCnt) > 1000))
  135. {
  136. if(SysTickCnt - AutoPowerOffTimeCnt > ulAutoPowerOffDelayTime * 1000) //unit s
  137. {
  138. power_stPowStateOut.powerstate = POWER_OFF;
  139. power_stPowStateOut.blPowerStartupFlg = FALSE;
  140. //Send power off command
  141. SendData(ID_MC_BC, MODE_REPORT, 0x1808, (uint8_t *)"SHUTDOWN");
  142. }
  143. }
  144. else
  145. {
  146. AutoPowerOffTimeCnt = SysTickCnt;
  147. }
  148. break;
  149. }
  150. case POWER_OFF: // 关机处理,等待数据存储完成,关闭LOCK
  151. {
  152. if(0 == PowerOffDTimeOut)
  153. {
  154. PowerOffDTimeOut = SysTickCnt;
  155. }
  156. //Finish save and wait 1s, or delay for 3s
  157. if (((EESaveFinishFlg == TRUE) && (ParaSaveEEFlg == FALSE) && ((SysTickCnt - PowerOffDTimeOut) > 1000)) ||
  158. ((SysTickCnt - PowerOffDTimeOut) > 3000))
  159. {
  160. power_stPowStateOut.powerstate = POWER_OFF_END;
  161. power_stPowStateOut.blPowerShutdownFlg = TRUE;
  162. power_stPowStateOut.uwPowerShutdnCnt = 0;
  163. iGpio_Write(HW_GPIO_POWERLOCK_PIN,ApiGpio_LowLevel);
  164. }
  165. break;
  166. }
  167. case POWER_OFF_END:
  168. {
  169. break;
  170. }
  171. case POWER_RESET:
  172. {
  173. //Finish save and wait 1s, or delay for 3s
  174. __set_FAULTMASK(1);//关闭所有中断
  175. NVIC_SystemReset();
  176. break;
  177. }
  178. default:break;
  179. }
  180. }
  181. /***************************************************************
  182. Function: power_voPowerOnManagement;
  183. Description: cadence frequency get initialization
  184. Call by: functions in main loop;
  185. Input Variables: N/A
  186. Output/Return Variables: N/A
  187. Subroutine Call: N/A;
  188. Reference: N/A
  189. ****************************************************************/
  190. // static void power_voPowerOnManagement(void)
  191. // {
  192. // if(power_stPowStateOut.powerstate == POWER_ON && GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_0) != RESET)
  193. // {
  194. // power_stPowStateOut.uwPowerStartupCnt++;
  195. // if(power_stPowStateOut.uwPowerStartupCnt == power_stPowStateCof.uwPowerStartTouchTimeCnt)
  196. // {
  197. // IO_POWERLOCK_ON;
  198. // }
  199. // else if (power_stPowStateOut.uwPowerStartupCnt == power_stPowStateCof.uwPowerStartEndCnt + power_stPowStateCof.uwPowerStartTouchTimeCnt)
  200. // {
  201. // power_stPowStateOut.powerstate = POWER_ON_END;
  202. // power_stPowStateOut.blPowerStartupFlg = TRUE;
  203. // power_stPowStateOut.uwPowerStartupCnt = 0;
  204. // power_stPowStateOut.uwPowerOn2OffCnt = 0;
  205. // }
  206. // }
  207. // if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_0) == RESET)
  208. // {
  209. // power_stPowStateOut.uwPowerStartupCnt = 0;
  210. // power_stPowStateOut.uwPowerShutdnCnt = 0;
  211. // }
  212. // }
  213. /***************************************************************
  214. Function: power_voPowerOffManagement;
  215. Description: cadence frequency get initialization
  216. Call by: functions in main loop;
  217. Input Variables: N/A
  218. Output/Return Variables: N/A
  219. Subroutine Call: N/A;
  220. Reference: N/A
  221. ****************************************************************/
  222. // static void power_voPowerOffManagement(void)
  223. // {
  224. // if(power_stPowStateOut.powerstate == POWER_ON_END)
  225. // {
  226. // if(power_stPowStateOut.uwPowerOn2OffCnt < power_stPowStateCof.uwPowerOn2OffTimeCnt)
  227. // {
  228. // power_stPowStateOut.uwPowerOn2OffCnt ++;
  229. // }
  230. // }
  231. // if(power_stPowStateOut.powerstate == POWER_ON_END && power_stPowStateOut.uwPowerOn2OffCnt == power_stPowStateCof.uwPowerOn2OffTimeCnt &&
  232. // GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_0) != RESET)
  233. // {
  234. // power_stPowStateOut.uwPowerShutdnCnt++;
  235. // if(power_stPowStateOut.uwPowerShutdnCnt == power_stPowStateCof.uwPowerShutTouchTimeCnt)
  236. // {
  237. // power_stPowStateOut.powerstate = POWER_OFF;
  238. // power_stPowStateOut.blPowerStartupFlg = FALSE;
  239. // power_stPowStateOut.uwPowerShutdnCnt = 0;
  240. // }
  241. // }
  242. // else if(power_stPowStateOut.powerstate == POWER_OFF)
  243. // {
  244. // power_stPowStateOut.uwPowerShutdnCnt++;
  245. // if(power_stPowStateOut.uwPowerShutdnCnt == power_stPowStateCof.uwPowerShutEndCnt)
  246. // {
  247. // power_stPowStateOut.powerstate = POWER_OFF_END;
  248. // power_stPowStateOut.blPowerShutdownFlg = TRUE;
  249. // power_stPowStateOut.uwPowerShutdnCnt = 0;
  250. // IO_POWERLOCK_OFF;
  251. // }
  252. // }
  253. // if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_0) == RESET)
  254. // {
  255. // power_stPowStateOut.powerstate = POWER_ON_END;
  256. // power_stPowStateOut.uwPowerStartupCnt = 0;
  257. // power_stPowStateOut.uwPowerShutdnCnt = 0;
  258. // }
  259. // }
  260. /*************************************************************************
  261. End of this File (EOF)!
  262. Do not put anything after this part!
  263. *************************************************************************/