led.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. #include "led.h"
  2. #include "timer.h"
  3. #include "gpio.h"
  4. #include "paras.h"
  5. #include "rtdbg.h"
  6. #if 1
  7. #define LOGD LOG_D
  8. #define LOGE LOG_E
  9. #else
  10. #define LOGD printf
  11. #define LOGE printf
  12. #endif
  13. #ifdef BOARD_EVB_ATK
  14. #define LEDR_GPIO GET_PIN(F, 9)
  15. #define LEDG_GPIO GET_PIN(F, 10)
  16. #else
  17. #define LEDR_GPIO GET_PIN(E, 6)
  18. #define LEDG_GPIO -1
  19. #endif
  20. typedef struct {
  21. int gpio;
  22. int on_level;
  23. int off_level;
  24. }led_info_t;
  25. static led_info_t led_info[LED_ID_MAX]={
  26. {LEDR_GPIO, 0, 1},
  27. {LEDG_GPIO, 0, 1},
  28. };
  29. typedef struct {
  30. int io;
  31. led_para_t para;
  32. led_info_t *info;
  33. uint32_t cnt;
  34. int tmr;
  35. }led_data_t;
  36. typedef struct {
  37. int tmr;
  38. int mode;
  39. led_data_t data[LED_ID_MAX];
  40. }led_handle_t;
  41. static led_para_t led_para[LED_MODE_MAX]={
  42. #if 0
  43. {LED_ID_GREEN, 1000,0, -1, 0}, //LED_MODE_NORMAL
  44. {LED_ID_GREEN, 300, 300, -1, 0}, //LED_MODE_UPGRADING
  45. {LED_ID_RED, 1000, 1000, 5, 0}, //LED_MODE_WARN1,
  46. {LED_ID_RED, 1000, 1000, 10, 0}, //LED_MODE_WARN2,
  47. {LED_ID_RED, 500, 500, 10, 0}, //LED_MODE_ERROR,
  48. {LED_ID_RED, 200, 200, 25, 0}, //LED_MODE_FAULT
  49. {LED_ID_RED, 50, 50, -1, 0}, //LED_MODE_FATAL
  50. #else
  51. {LED_ID_RED, 0, 1000, -1, 0}, //LED_MODE_NORMAL
  52. {LED_ID_RED, 300, 1000, -1, 0}, //LED_MODE_UPGRADING
  53. {LED_ID_RED, 500, 500, 300, 0}, //LED_MODE_WARN1,
  54. {LED_ID_RED, 333, 333, 450, 0}, //LED_MODE_WARN2,
  55. {LED_ID_RED, 500, 500, 10, 0}, //LED_MODE_ERROR,
  56. {LED_ID_RED, 200, 200, 25, 0}, //LED_MODE_FAULT
  57. {LED_ID_RED, 50, 50, -1, 0}, //LED_MODE_FATAL
  58. #endif
  59. };
  60. static led_handle_t ledHandle={0};
  61. static void led_handler(void *arg, int last)
  62. {
  63. int level;
  64. led_data_t *h=(led_data_t*)arg;
  65. if(h->para.on_ms>0 && h->para.off_ms) {
  66. h->cnt++;
  67. if(h->cnt%2) {
  68. gpio_set(h->io, h->info->off_level);
  69. }
  70. else {
  71. gpio_set(h->io, h->info->on_level);
  72. }
  73. }
  74. if(last) {
  75. timer_stop(h->tmr);
  76. if(h->para.end_on) {
  77. gpio_set(h->io, h->info->on_level);
  78. }
  79. else {
  80. gpio_set(h->io, h->info->off_level);
  81. }
  82. led_set(LED_MODE_NORMAL);
  83. }
  84. }
  85. //////////////////////////////////////////////////
  86. int led_init(void)
  87. {
  88. int i;
  89. led_handle_t *h=&ledHandle;
  90. h->tmr = timer_init();
  91. for(i=0; i<LED_ID_MAX; i++) {
  92. h->data[i].info = &led_info[i];
  93. h->data[i].cnt = 0;
  94. h->data[i].tmr = h->tmr;
  95. h->data[i].io = led_info[i].gpio;
  96. gpio_init(h->data[i].io, GPIO_OUT, led_info[i].off_level);
  97. }
  98. h->mode = -1;
  99. //led_set(LED_MODE_UPGRADING);
  100. return 0;
  101. }
  102. int led_deinit(void)
  103. {
  104. int i;
  105. led_handle_t *h=&ledHandle;
  106. timer_deinit(h->tmr);
  107. for(i=0; i<LED_ID_MAX; i++) {
  108. gpio_deinit(h->data[i].io);
  109. h->data[i].io = -1;
  110. }
  111. return 0;
  112. }
  113. int led_set(int mode)
  114. {
  115. led_handle_t *h=&ledHandle;
  116. h->mode = mode;
  117. return led_set_ex(&led_para[h->mode]);
  118. }
  119. int led_set_ex(led_para_t *para)
  120. {
  121. int r=0;
  122. led_handle_t *h=&ledHandle;
  123. misc_data_t *misc=&paras_get()->misc;
  124. if(!misc->led || !para || (para->on_ms<=0 && para->off_ms<=0) || para->times==0) {
  125. return -1;
  126. }
  127. led_data_t *ld=&h->data[para->led_id];
  128. ld->cnt = 0;
  129. ld->para = *para;
  130. if(ld->para.on_ms>0) {
  131. gpio_set(ld->io, ld->info->on_level);
  132. if(ld->para.off_ms>0) {
  133. ld->para.times *= 2;
  134. }
  135. else {
  136. ld->para.on_ms *= ld->para.times;
  137. ld->para.times = 1;
  138. }
  139. r = timer_start(h->tmr, ld->para.on_ms, ld->para.times, led_handler, ld);
  140. }
  141. else {
  142. gpio_set(ld->io, ld->info->on_level);
  143. if(ld->para.off_ms>0) {
  144. ld->para.off_ms *= ld->para.times;
  145. ld->para.times = 1;
  146. r = timer_start(h->tmr, ld->para.off_ms, ld->para.times, led_handler, ld);
  147. }
  148. }
  149. return r;
  150. }
  151. int led_reset(void)
  152. {
  153. led_handle_t *h=&ledHandle;
  154. if(h->mode==-1) {
  155. return -1;
  156. }
  157. h->mode = -1;
  158. timer_stop(h->tmr);
  159. gpio_set(h->data[LED_ID_RED].io, led_info[LED_ID_RED].off_level);
  160. return 0;
  161. }