power.c 9.8 KB

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