power.c 9.8 KB

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