led.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. #include "led.h"
  2. #include "timer.h"
  3. #include "gpio.h"
  4. #include "elog.h"
  5. #include "common.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. #define LEDR_GPIO 106 //PD10=96+10
  14. #define LEDG_GPIO 105 //PD9=96+9
  15. typedef struct {
  16. int gpio;
  17. int on_level;
  18. int off_level;
  19. }led_info_t;
  20. static led_info_t led_info[LED_ID_MAX]={
  21. {LEDR_GPIO, 0, 1},
  22. {LEDG_GPIO, 0, 1},
  23. };
  24. typedef struct {
  25. int io;
  26. led_para_t para;
  27. led_info_t *info;
  28. uint32_t cnt;
  29. int tmr;
  30. }led_data_t;
  31. typedef struct {
  32. int tmr;
  33. led_data_t data[LED_ID_MAX];
  34. }led_handle_t;
  35. static led_para_t led_para[LED_MODE_MAX]={
  36. {LED_ID_GREEN, 1000,1000, -1, 0}, //LED_MODE_NORMAL
  37. {LED_ID_GREEN, 300, 300, -1, 0}, //LED_MODE_UPGRADING
  38. {LED_ID_RED, 1000,1000, 5, 0}, //LED_MODE_WARN,
  39. {LED_ID_RED, 500, 500, 10, 0}, //LED_MODE_ERROR,
  40. {LED_ID_RED, 200, 200, 25, 0}, //LED_MODE_FAULT
  41. {LED_ID_RED, 50, 50, -1, 0}, //LED_MODE_FATAL
  42. };
  43. static led_handle_t ledHandle={0};
  44. static void led_handler(void *arg, int last)
  45. {
  46. int level;
  47. led_data_t *h=(led_data_t*)arg;
  48. if(h->para.on_ms>0 && h->para.off_ms) {
  49. h->cnt++;
  50. if(h->cnt%2) {
  51. gpio_set(h->io, h->info->off_level);
  52. }
  53. else {
  54. gpio_set(h->io, h->info->on_level);
  55. }
  56. }
  57. if(last) {
  58. timer_stop(h->tmr);
  59. if(h->para.end_on) {
  60. gpio_set(h->io, h->info->on_level);
  61. }
  62. else {
  63. gpio_set(h->io, h->info->off_level);
  64. }
  65. led_set(LED_MODE_NORMAL);
  66. }
  67. }
  68. //////////////////////////////////////////////////
  69. int led_init(void)
  70. {
  71. int i;
  72. led_handle_t *h=&ledHandle;
  73. h->tmr = timer_init();
  74. for(i=0; i<LED_ID_MAX; i++) {
  75. h->data[i].info = &led_info[i];
  76. h->data[i].cnt = 0;
  77. h->data[i].tmr = h->tmr;
  78. h->data[i].io = gpio_init(led_info[i].gpio, GPIO_OUT);
  79. gpio_set(h->data[i].io, led_info[i].off_level);
  80. }
  81. //led_set(LED_MODE_UPGRADING);
  82. return 0;
  83. }
  84. int led_deinit(void)
  85. {
  86. int i;
  87. led_handle_t *h=&ledHandle;
  88. timer_deinit(h->tmr);
  89. for(i=0; i<LED_ID_MAX; i++) {
  90. gpio_deinit(h->data[i].io);
  91. h->data[i].io = -1;
  92. }
  93. return 0;
  94. }
  95. int led_set(int mode)
  96. {
  97. return led_set_ex(&led_para[mode]);
  98. }
  99. int led_set_ex(led_para_t *para)
  100. {
  101. int r=0;
  102. led_handle_t *h=&ledHandle;
  103. if(!para || (para->on_ms<=0 && para->off_ms<=0) || para->times==0) {
  104. return -1;
  105. }
  106. led_data_t *ld=&h->data[para->led_id];
  107. ld->cnt = 0;
  108. ld->para = *para;
  109. if(ld->para.on_ms>0) {
  110. gpio_set(ld->io, ld->info->on_level);
  111. if(ld->para.off_ms>0) {
  112. ld->para.times *= 2;
  113. }
  114. else {
  115. ld->para.on_ms *= ld->para.times;
  116. ld->para.times = 1;
  117. }
  118. r = timer_start(h->tmr, ld->para.on_ms, ld->para.times, led_handler, ld);
  119. }
  120. else {
  121. gpio_set(ld->io, ld->info->on_level);
  122. if(ld->para.off_ms>0) {
  123. ld->para.off_ms *= ld->para.times;
  124. ld->para.times = 1;
  125. r = timer_start(h->tmr, ld->para.off_ms, ld->para.times, led_handler, ld);
  126. }
  127. }
  128. return r;
  129. }