LED.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. /********************************** (C) COPYRIGHT *******************************
  2. * File Name : LED.c
  3. * Author : WCH
  4. * Version : V1.2
  5. * Date : 2022/01/18
  6. * Description :
  7. * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
  8. * SPDX-License-Identifier: Apache-2.0
  9. *******************************************************************************/
  10. /******************************************************************************/
  11. /* Í·Îļþ°üº¬ */
  12. #include "HAL.h"
  13. /* LED control structure */
  14. typedef struct
  15. {
  16. uint8_t mode; /* Operation mode */
  17. uint8_t todo; /* Blink cycles left */
  18. uint8_t onPct; /* On cycle percentage */
  19. uint16_t time; /* On/off cycle time (msec) */
  20. uint32_t next; /* Time for next change */
  21. } HalLedControl_t;
  22. typedef struct
  23. {
  24. HalLedControl_t HalLedControlTable[HAL_LED_DEFAULT_MAX_LEDS];
  25. uint8_t sleepActive;
  26. } HalLedStatus_t;
  27. /***************************************************************************************************
  28. * GLOBAL VARIABLES
  29. ***************************************************************************************************/
  30. static uint8_t HalLedState; // LED state at last set/clr/blink update
  31. static uint8_t preBlinkState; // Original State before going to blink mode
  32. // bit 0, 1, 2, 3 represent led 0, 1, 2, 3
  33. static HalLedStatus_t HalLedStatusControl;
  34. /***************************************************************************************************
  35. * LOCAL FUNCTION
  36. ***************************************************************************************************/
  37. void HalLedOnOff(uint8_t leds, uint8_t mode);
  38. /***************************************************************************************************
  39. * FUNCTIONS - API
  40. ***************************************************************************************************/
  41. /*********************************************************************
  42. * @fn HAL_LedInit
  43. *
  44. * @brief Initialize LED Service
  45. *
  46. * @return none
  47. */
  48. void HAL_LedInit(void)
  49. {
  50. /* Initialize all LEDs to OFF */
  51. LED1_DDR;
  52. HalLedSet(HAL_LED_ALL, HAL_LED_MODE_OFF);
  53. // just test
  54. HalLedBlink(HAL_LED_1, 10, 30, 4000);
  55. /* Initialize sleepActive to FALSE */
  56. HalLedStatusControl.sleepActive = FALSE;
  57. }
  58. /*********************************************************************
  59. * @fn HalLedSet
  60. *
  61. * @brief Turn ON/OFF/TOGGLE given LEDs
  62. *
  63. * @param led - bit mask value of leds to be turned ON/OFF/TOGGLE
  64. * @param mode - BLINK, FLASH, TOGGLE, ON, OFF
  65. *
  66. * @return 0
  67. */
  68. uint8_t HalLedSet(uint8_t leds, uint8_t mode)
  69. {
  70. uint8_t led;
  71. HalLedControl_t *sts;
  72. switch(mode)
  73. {
  74. case HAL_LED_MODE_BLINK:
  75. {
  76. /* Default blink, 1 time, D% duty cycle */
  77. HalLedBlink(leds, 1, HAL_LED_DEFAULT_DUTY_CYCLE, HAL_LED_DEFAULT_FLASH_TIME);
  78. break;
  79. }
  80. case HAL_LED_MODE_FLASH:
  81. {
  82. /* Default flash, N times, D% duty cycle */
  83. HalLedBlink(leds, HAL_LED_DEFAULT_FLASH_COUNT, HAL_LED_DEFAULT_DUTY_CYCLE, HAL_LED_DEFAULT_FLASH_TIME);
  84. break;
  85. }
  86. case HAL_LED_MODE_ON:
  87. case HAL_LED_MODE_OFF:
  88. case HAL_LED_MODE_TOGGLE:
  89. {
  90. led = HAL_LED_1;
  91. leds &= HAL_LED_ALL;
  92. sts = HalLedStatusControl.HalLedControlTable;
  93. while(leds)
  94. {
  95. if(leds & led)
  96. {
  97. if(mode != HAL_LED_MODE_TOGGLE)
  98. {
  99. sts->mode = mode; /* ON or OFF */
  100. }
  101. else
  102. {
  103. sts->mode ^= HAL_LED_MODE_ON; /* Toggle */
  104. }
  105. HalLedOnOff(led, sts->mode);
  106. leds ^= led;
  107. }
  108. led <<= 1;
  109. sts++;
  110. }
  111. break;
  112. }
  113. default:
  114. break;
  115. }
  116. return (0);
  117. }
  118. /*********************************************************************
  119. * @fn HalLedBlink
  120. *
  121. * @brief Blink the leds
  122. *
  123. * @param led - bit mask value of leds to be turned ON/OFF/TOGGLE
  124. * @param numBlinks - number of blinks
  125. * @param percent - the percentage in each period where the led will be on
  126. * @param period - length of each cycle in milliseconds
  127. *
  128. * @return none
  129. */
  130. void HalLedBlink(uint8_t leds, uint8_t numBlinks, uint8_t percent, uint16_t period)
  131. {
  132. uint8_t led;
  133. HalLedControl_t *sts;
  134. if(leds && percent && period)
  135. {
  136. if(percent < 100)
  137. {
  138. led = HAL_LED_1;
  139. leds &= HAL_LED_ALL;
  140. sts = HalLedStatusControl.HalLedControlTable;
  141. while(leds)
  142. {
  143. if(leds & led)
  144. {
  145. /* Store the current state of the led before going to blinking */
  146. preBlinkState |= (led & HalLedState);
  147. sts->mode = HAL_LED_MODE_OFF; /* Stop previous blink */
  148. sts->time = period; /* Time for one on/off cycle */
  149. sts->onPct = percent; /* % of cycle LED is on */
  150. sts->todo = numBlinks; /* Number of blink cycles */
  151. if(!numBlinks)
  152. {
  153. sts->mode |= HAL_LED_MODE_FLASH; /* Continuous */
  154. }
  155. sts->next = TMOS_GetSystemClock(); /* Start now */
  156. sts->mode |= HAL_LED_MODE_BLINK; /* Enable blinking */
  157. leds ^= led;
  158. }
  159. led <<= 1;
  160. sts++;
  161. }
  162. tmos_start_task(halTaskID, LED_BLINK_EVENT, 0);
  163. }
  164. else
  165. {
  166. HalLedSet(leds, HAL_LED_MODE_ON); /* >= 100%, turn on */
  167. }
  168. }
  169. else
  170. {
  171. HalLedSet(leds, HAL_LED_MODE_OFF); /* No on time, turn off */
  172. }
  173. }
  174. /*********************************************************************
  175. * @fn HalLedUpdate
  176. *
  177. * @brief Update leds to work with blink
  178. *
  179. * @return none
  180. */
  181. void HalLedUpdate(void)
  182. {
  183. uint8_t led, pct, leds;
  184. uint16_t next, wait;
  185. uint32_t time;
  186. HalLedControl_t *sts;
  187. next = 0;
  188. led = HAL_LED_1;
  189. leds = HAL_LED_ALL;
  190. sts = HalLedStatusControl.HalLedControlTable;
  191. /* Check if sleep is active or not */
  192. if(!HalLedStatusControl.sleepActive)
  193. {
  194. while(leds)
  195. {
  196. if(leds & led)
  197. {
  198. if(sts->mode & HAL_LED_MODE_BLINK)
  199. {
  200. time = TMOS_GetSystemClock();
  201. if(time >= sts->next)
  202. {
  203. if(sts->mode & HAL_LED_MODE_ON)
  204. {
  205. pct = 100 - sts->onPct; /* Percentage of cycle for off */
  206. sts->mode &= ~HAL_LED_MODE_ON; /* Say it's not on */
  207. HalLedOnOff(led, HAL_LED_MODE_OFF); /* Turn it off */
  208. if(!(sts->mode & HAL_LED_MODE_FLASH))
  209. {
  210. if(sts->todo != 0xff)
  211. {
  212. sts->todo--; /* Not continuous, reduce count */
  213. }
  214. if(!sts->todo)
  215. {
  216. sts->mode ^= HAL_LED_MODE_BLINK; /* No more blinks */
  217. }
  218. }
  219. }
  220. else
  221. {
  222. pct = sts->onPct; /* Percentage of cycle for on */
  223. sts->mode |= HAL_LED_MODE_ON; /* Say it's on */
  224. HalLedOnOff(led, HAL_LED_MODE_ON); /* Turn it on */
  225. }
  226. if(sts->mode & HAL_LED_MODE_BLINK)
  227. {
  228. wait = (((uint32_t)pct * (uint32_t)sts->time) / 100);
  229. sts->next = time + wait;
  230. }
  231. else
  232. {
  233. /* no more blink, no more wait */
  234. wait = 0;
  235. /* After blinking, set the LED back to the state before it blinks */
  236. HalLedSet(led, ((preBlinkState & led) != 0) ? HAL_LED_MODE_ON : HAL_LED_MODE_OFF);
  237. /* Clear the saved bit */
  238. preBlinkState &= (led ^ 0xFF);
  239. }
  240. }
  241. else
  242. {
  243. wait = sts->next - time; /* Time left */
  244. }
  245. if(!next || (wait && (wait < next)))
  246. {
  247. next = wait;
  248. }
  249. }
  250. leds ^= led;
  251. }
  252. led <<= 1;
  253. sts++;
  254. }
  255. if(next)
  256. {
  257. tmos_start_task(halTaskID, LED_BLINK_EVENT, next); /* Schedule event */
  258. }
  259. }
  260. }
  261. /*********************************************************************
  262. * @fn HalLedOnOff
  263. *
  264. * @brief Turns specified LED ON or OFF
  265. *
  266. * @param led - LED bit mask
  267. * @param mode - LED_ON,LED_OFF,
  268. *
  269. * @return none
  270. */
  271. void HalLedOnOff(uint8_t leds, uint8_t mode)
  272. {
  273. if(leds & HAL_LED_1)
  274. {
  275. if(mode == HAL_LED_MODE_ON)
  276. {
  277. HAL_TURN_ON_LED1();
  278. }
  279. else
  280. {
  281. HAL_TURN_OFF_LED1();
  282. }
  283. }
  284. if(leds & HAL_LED_2)
  285. {
  286. if(mode == HAL_LED_MODE_ON)
  287. {
  288. HAL_TURN_ON_LED2();
  289. }
  290. else
  291. {
  292. HAL_TURN_OFF_LED2();
  293. }
  294. }
  295. if(leds & HAL_LED_3)
  296. {
  297. if(mode == HAL_LED_MODE_ON)
  298. {
  299. HAL_TURN_ON_LED3();
  300. }
  301. else
  302. {
  303. HAL_TURN_OFF_LED3();
  304. }
  305. }
  306. if(leds & HAL_LED_4)
  307. {
  308. if(mode == HAL_LED_MODE_ON)
  309. {
  310. HAL_TURN_ON_LED4();
  311. }
  312. else
  313. {
  314. HAL_TURN_OFF_LED4();
  315. }
  316. }
  317. /* Remember current state */
  318. if(mode)
  319. {
  320. HalLedState |= leds;
  321. }
  322. else
  323. {
  324. HalLedState &= (leds ^ 0xFF);
  325. }
  326. }
  327. /***************************************************************************************************
  328. * @fn HalGetLedState
  329. *
  330. * @brief Dim LED2 - Dim (set level) of LED2
  331. *
  332. * @return led state
  333. */
  334. uint8_t HalLedGetState()
  335. {
  336. return HalLedState;
  337. }
  338. /******************************** endfile @ led ******************************/