led.c 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. #include "led.h"
  2. #include "timer.h"
  3. #include "gpio.h"
  4. #include "elog.h"
  5. #include "common.h"
  6. #include "paras.h"
  7. #if 1
  8. #define LOGD log_d
  9. #define LOGE log_e
  10. #else
  11. #define LOGD printf
  12. #define LOGE printf
  13. #endif
  14. #if (CHIP_TYPE == CHIP_T113s)
  15. #define LEDR_GPIO (192 + 9 )
  16. #define LEDG_GPIO (192 + 10 )
  17. #else
  18. #define LEDR_GPIO 106 //PD10=96+10
  19. #define LEDG_GPIO 105 //PD9=96+9
  20. #endif
  21. typedef struct {
  22. int gpio;
  23. int on_level;
  24. int off_level;
  25. }led_info_t;
  26. static led_info_t led_info[LED_ID_MAX]={
  27. {LEDR_GPIO, 0, 1},
  28. {LEDG_GPIO, 0, 1},
  29. };
  30. typedef struct {
  31. int io;
  32. led_para_t para;
  33. led_info_t *info;
  34. uint32_t cnt;
  35. int tmr;
  36. }led_data_t;
  37. typedef struct {
  38. int tmr;
  39. int mode;
  40. led_data_t data[LED_ID_MAX];
  41. }led_handle_t;
  42. static led_para_t led_para[LED_MODE_MAX]={
  43. #if 0
  44. {LED_ID_GREEN, 1000,0, -1, 0}, //LED_MODE_NORMAL
  45. {LED_ID_GREEN, 300, 300, -1, 0}, //LED_MODE_UPGRADING
  46. {LED_ID_RED, 1000, 1000, 5, 0}, //LED_MODE_WARN1,
  47. {LED_ID_RED, 1000, 1000, 10, 0}, //LED_MODE_WARN2,
  48. {LED_ID_RED, 500, 500, 10, 0}, //LED_MODE_ERROR,
  49. {LED_ID_RED, 200, 200, 25, 0}, //LED_MODE_FAULT
  50. {LED_ID_RED, 50, 50, -1, 0}, //LED_MODE_FATAL
  51. #else
  52. {LED_ID_RED, 0, 1000, -1, 0}, //LED_MODE_NORMAL
  53. {LED_ID_RED, 300, 1000, -1, 0}, //LED_MODE_UPGRADING
  54. {LED_ID_RED, 500, 500, 300, 0}, //LED_MODE_WARN1,
  55. {LED_ID_RED, 333, 333, 450, 0}, //LED_MODE_WARN2,
  56. {LED_ID_RED, 500, 500, 10, 0}, //LED_MODE_ERROR,
  57. {LED_ID_RED, 200, 200, 25, 0}, //LED_MODE_FAULT
  58. {LED_ID_RED, 50, 50, -1, 0}, //LED_MODE_FATAL
  59. #endif
  60. };
  61. static led_handle_t ledHandle={0};
  62. static inline MiscInfo_t* get_misc(void)
  63. {
  64. return &__globalDeviceManage._globalDevInfo.misc;
  65. }
  66. static void led_handler(void *arg, int last)
  67. {
  68. int level;
  69. led_data_t *h=(led_data_t*)arg;
  70. if(h->para.on_ms>0 && h->para.off_ms) {
  71. h->cnt++;
  72. if(h->cnt%2) {
  73. gpio_set(h->io, h->info->off_level);
  74. }
  75. else {
  76. gpio_set(h->io, h->info->on_level);
  77. }
  78. }
  79. if(last) {
  80. timer_stop(h->tmr);
  81. if(h->para.end_on) {
  82. gpio_set(h->io, h->info->on_level);
  83. }
  84. else {
  85. gpio_set(h->io, h->info->off_level);
  86. }
  87. //led_set(LED_MODE_NORMAL);
  88. }
  89. }
  90. //////////////////////////////////////////////////
  91. int led_init(void)
  92. {
  93. int i;
  94. led_handle_t *h=&ledHandle;
  95. MiscInfo_t* misc=get_misc();
  96. led_para[LED_MODE_WARN1].off_ms = misc->interval;
  97. led_para[LED_MODE_WARN1].on_ms = misc->interval;
  98. led_para[LED_MODE_WARN1].times = misc->interval > 0 ? (misc->duption * 1000) / (misc->interval * 2) : 0;
  99. led_para[LED_MODE_WARN2].off_ms = misc->interval;
  100. led_para[LED_MODE_WARN2].on_ms = misc->interval;
  101. led_para[LED_MODE_WARN2].times = misc->interval > 0 ? (misc->duption * 1000) / (misc->interval * 2) : 0;
  102. h->tmr = timer_init();
  103. for(i=0; i<LED_ID_MAX; i++) {
  104. h->data[i].info = &led_info[i];
  105. h->data[i].cnt = 0;
  106. h->data[i].tmr = h->tmr;
  107. h->data[i].io = gpio_init(led_info[i].gpio, GPIO_OUT);
  108. gpio_set(h->data[i].io, led_info[i].off_level);
  109. }
  110. h->mode = -1;
  111. //led_set(LED_MODE_UPGRADING);
  112. return 0;
  113. }
  114. int led_deinit(void)
  115. {
  116. int i;
  117. led_handle_t *h=&ledHandle;
  118. timer_deinit(h->tmr);
  119. for(i=0; i<LED_ID_MAX; i++) {
  120. gpio_deinit(h->data[i].io);
  121. h->data[i].io = -1;
  122. }
  123. return 0;
  124. }
  125. int led_set(int mode)
  126. {
  127. led_handle_t *h=&ledHandle;
  128. h->mode = mode;
  129. return led_set_ex(&led_para[h->mode]);
  130. }
  131. int led_set_ex(led_para_t *para)
  132. {
  133. int r=0;
  134. led_handle_t *h=&ledHandle;
  135. MiscInfo_t* misc=get_misc();
  136. if(!misc->led || !para || (para->on_ms<=0 && para->off_ms<=0) || para->times==0) {
  137. return -1;
  138. }
  139. led_data_t *ld=&h->data[para->led_id];
  140. ld->cnt = 0;
  141. ld->para = *para;
  142. if(ld->para.on_ms>0) {
  143. gpio_set(ld->io, ld->info->on_level);
  144. if(ld->para.off_ms>0) {
  145. ld->para.times *= 2;
  146. }
  147. else {
  148. ld->para.on_ms *= ld->para.times;
  149. ld->para.times = 1;
  150. }
  151. r = timer_start(h->tmr, ld->para.on_ms, ld->para.times, led_handler, ld);
  152. }
  153. else {
  154. gpio_set(ld->io, ld->info->on_level);
  155. if(ld->para.off_ms>0) {
  156. ld->para.off_ms *= ld->para.times;
  157. ld->para.times = 1;
  158. r = timer_start(h->tmr, ld->para.off_ms, ld->para.times, led_handler, ld);
  159. }
  160. }
  161. return r;
  162. }
  163. int led_reset(void)
  164. {
  165. led_handle_t *h=&ledHandle;
  166. if(h->mode==-1) {
  167. return -1;
  168. }
  169. h->mode = -1;
  170. timer_stop(h->tmr);
  171. gpio_set(h->data[LED_ID_RED].io, led_info[LED_ID_RED].off_level);
  172. return 0;
  173. }
  174. int led_set_val(web_led_t *para)
  175. {
  176. MiscInfo_t* misc=get_misc();
  177. if(para->enable)
  178. {
  179. misc->led = 1;
  180. }else
  181. {
  182. misc->led = 0;
  183. }
  184. // misc->led_on = para->on;
  185. // misc->led_off = para->off;
  186. // misc->led_count = para->time;
  187. misc->interval = para->interval;
  188. misc->duption = para->duption;
  189. led_para[LED_MODE_WARN1].off_ms = misc->interval;
  190. led_para[LED_MODE_WARN1].on_ms = misc->interval;
  191. led_para[LED_MODE_WARN1].times = misc->interval > 0 ? (misc->duption * 1000) / (misc->interval * 2) : 0;
  192. led_para[LED_MODE_WARN2].off_ms = misc->interval;
  193. led_para[LED_MODE_WARN2].on_ms = misc->interval;
  194. led_para[LED_MODE_WARN2].times = misc->interval > 0 ? (misc->duption * 1000) / (misc->interval * 2) : 0;
  195. paras_save();
  196. return 0;
  197. }
  198. // int led_get_val(web_led_t *para)
  199. // {
  200. // if(!para)
  201. // return -1;
  202. // MiscInfo_t* misc=get_misc();
  203. // para->enable = misc->led;
  204. // para->on = misc->led_on;
  205. // para->off = misc->led_off;
  206. // para->time = misc->led_count;
  207. // return 0;
  208. // }