ws2812.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. #include "hal/ws2812.h"
  2. #include "ets_sys.h"
  3. #include "osapi.h"
  4. #include "gpio.h"
  5. #include "math.h"
  6. #define LEDUPDATEDELAY 60
  7. // LOCAL const
  8. LOCAL uint8_t pulseBuffer[100] = { 127, 135, 143, 151, 159, 166, 174, 181, 188,
  9. 195, 202, 208, 214, 220, 225, 230, 235, 239,
  10. 242, 246, 248, 250, 252, 253, 254, 255, 254,
  11. 253, 252, 250, 248, 246, 242, 239, 235, 230,
  12. 225, 220, 214, 208, 202, 195, 188, 181, 174,
  13. 166, 159, 151, 143, 135, 127, 119, 111, 103,
  14. 95, 88, 80, 73, 66, 59, 52, 46, 40, 34, 29,
  15. 24, 19, 15, 12, 8, 6, 4, 2, 1, 0, 0, 0, 1, 2,
  16. 4, 6, 8, 12, 15, 19, 24, 29, 34, 40, 46, 52,
  17. 59, 66, 73, 80, 88, 95, 103, 111, 119};
  18. // LOCAL uint8_t pulseBuffer[100] = { 50, 53, 56, 59, 62, 65, 68, 71,
  19. // 74, 76, 79, 81, 84, 86, 88, 90,
  20. // 92, 93, 95, 96, 97, 98, 99, 99,
  21. // 99, 100, 99, 99, 99, 98, 97, 96,
  22. // 95, 93, 92, 90, 88, 86, 84, 81,
  23. // 79, 76, 74, 71, 68, 65, 62, 59,
  24. // 56, 53, 50, 46, 43, 40, 37, 34,
  25. // 31, 28, 25, 23, 20, 18, 15, 13,
  26. // 11, 9, 7, 6, 4, 3, 2, 1, 0, 0,
  27. // 0, 0, 0, 0, 0, 1, 2, 3, 4, 6,
  28. // 7, 9, 11, 13, 15, 18, 20, 23,
  29. // 25, 28, 31, 34, 37, 40, 43, 46};
  30. // uint8_t pulseBuffer[100] = {68, 75, 83, 90, 99, 107, 116, 126,
  31. // 135, 145, 155, 165, 175, 184, 194,
  32. // 203, 212, 220, 228, 235, 240, 245,
  33. // 249, 252, 254, 255, 254, 252, 249,
  34. // 245, 240, 235, 228, 220, 212, 203,
  35. // 194, 184, 175, 165, 155, 145, 135,
  36. // 126, 116, 107, 99, 90, 83, 75, 68,
  37. // 61, 55, 50, 44, 39, 35, 30, 27, 23,
  38. // 20, 17, 14, 12, 10, 8, 6, 5, 3, 2,
  39. // 2, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2,
  40. // 3, 5, 6, 8, 10, 12, 14, 17, 20, 23,
  41. // 27, 30, 35, 39, 44, 50, 55, 61};
  42. // LOCAL uint8_t pulseBuffer[100] = {26, 29, 32, 35, 38, 42, 45, 49,
  43. // 53, 57, 60, 64, 68, 72, 76, 79,
  44. // 83, 86, 89, 92, 94, 96, 97, 99,
  45. // 99, 100, 99, 99, 97, 96, 94, 92,
  46. // 89, 86, 83, 79, 76, 72, 68, 64,
  47. // 60, 57, 53, 49, 45, 42, 38, 35,
  48. // 32, 29, 26, 24, 21, 19, 17, 15,
  49. // 13, 12, 10, 9, 7, 6, 5, 4, 4,
  50. // 3, 2, 2, 1, 1, 0, 0, 0, 0, 0,
  51. // 0, 0, 0, 0, 0, 0, 1, 1, 2, 2,
  52. // 3, 4, 4, 5, 6, 7, 9, 10, 12,
  53. // 13, 15, 17, 19, 21, 24};
  54. LOCAL uint8_t ledState;
  55. LOCAL os_timer_t statLEDTimer;
  56. //#define GPIO_OUTPUT_SET(gpio_no, bit_value)
  57. // gpio_output_set(bit_value<<gpio_no, ((~bit_value)&0x01)<<gpio_no, 1<<gpio_no,0)
  58. static void send_ws_0(void)
  59. {
  60. uint8_t time;
  61. #if WS2811_COMPATIBLE
  62. time = 7; while(time--) WRITE_PERI_REG( PERIPHS_GPIO_BASEADDR + GPIO_ID_PIN(WSGPIO), 1 );
  63. time = 28; while(time--) WRITE_PERI_REG( PERIPHS_GPIO_BASEADDR + GPIO_ID_PIN(WSGPIO), 0 );
  64. #else
  65. // time = 6; while(time--) WRITE_PERI_REG( PERIPHS_GPIO_BASEADDR + GPIO_ID_PIN(WSGPIO), 1 );
  66. // time = 10; while(time--) WRITE_PERI_REG( PERIPHS_GPIO_BASEADDR + GPIO_ID_PIN(WSGPIO), 0 );
  67. //os_printf("Hola\r\n");
  68. time = 6; while(time--) GPIO_REG_WRITE(GPIO_OUT_W1TS_ADDRESS, BIT(WSGPIO));
  69. time = 10; while(time--) GPIO_REG_WRITE(GPIO_OUT_W1TC_ADDRESS, BIT(WSGPIO));
  70. #endif
  71. }
  72. static void send_ws_1(void)
  73. {
  74. uint8_t time;
  75. #if WS2811_COMPATIBLE
  76. time = 15; while(time--) WRITE_PERI_REG( PERIPHS_GPIO_BASEADDR + GPIO_ID_PIN(WSGPIO), 1 );
  77. time = 16; while(time--) WRITE_PERI_REG( PERIPHS_GPIO_BASEADDR + GPIO_ID_PIN(WSGPIO), 0 );
  78. #else
  79. // time = 10; while(time--) WRITE_PERI_REG( PERIPHS_GPIO_BASEADDR + GPIO_ID_PIN(WSGPIO), 1 );
  80. // time = 6; while(time--) WRITE_PERI_REG( PERIPHS_GPIO_BASEADDR + GPIO_ID_PIN(WSGPIO), 0 );
  81. time = 10; while(time--) GPIO_REG_WRITE(GPIO_OUT_W1TS_ADDRESS, BIT(WSGPIO));
  82. time = 6; while(time--) GPIO_REG_WRITE(GPIO_OUT_W1TC_ADDRESS, BIT(WSGPIO));
  83. //os_printf("Hermosa\r\n");
  84. #endif
  85. }
  86. // void ws2812_outBuffer( uint8_t * buffer, uint16_t length )
  87. // {
  88. // ETS_INTR_LOCK(); // why is this different than a normal disable interupts again?
  89. // uint16_t i;
  90. // GPIO_OUTPUT_SET(GPIO_ID_PIN(WSGPIO), 0); // set gpio as output (redundent?)
  91. //
  92. //
  93. // for( i = 0; i < length; i++ )
  94. // {
  95. // uint8_t mask = 0x80;
  96. // uint8_t byte = buffer[i];
  97. // while (mask)
  98. // {
  99. // if( byte & mask ) send_ws_1(); else send_ws_0();
  100. // mask >>= 1;
  101. // }
  102. // }
  103. //
  104. // ETS_INTR_LOCK();
  105. // }
  106. //
  107. // void updateLED(void)
  108. // {
  109. // uint8_t outBuffer[3] = {0, 0, 0};
  110. // uint8_t ledValue = pulseBuffer[ledState];
  111. //
  112. // if (sysCfg.module_state.searching == TRUE)
  113. // {
  114. // outBuffer[0] = ledValue;
  115. // }
  116. // else if (sysCfg.module_state.connected == TRUE)
  117. // {
  118. // outBuffer[2] = ledValue;
  119. // }
  120. // else
  121. // {
  122. // outBuffer[1] = ledValue;
  123. // }
  124. // ws2812_outBuffer(outBuffer, sizeof(outBuffer));
  125. // ledState++;
  126. // if (ledState == sizeof(pulseBuffer))
  127. // ledState = 0;
  128. // }
  129. //
  130. // void ws2812_shutdown(void)
  131. // {
  132. // os_timer_disarm(&statLEDTimer);
  133. // uint8_t i, outBuf[3] = {0x00, 0x00, 0x00};
  134. // for(i=0;i<6;i++)
  135. // {
  136. // outBuf[1] = outBuf[1] ^ 0xFF;
  137. // ws2812_outBuffer(outBuf, sizeof(outBuf));
  138. // os_delay_us(500000);
  139. // }
  140. // }
  141. //
  142. // void ws2812_init(void)
  143. // {
  144. // sin(0);
  145. // ledState = 0;
  146. // uint8_t initBuffer[3] = {0x00, 0x00, 0x00};
  147. // ws2812_outBuffer(initBuffer, sizeof(initBuffer));
  148. // os_timer_disarm(&statLEDTimer); // disarm health publish timer
  149. // os_timer_setfn(&statLEDTimer, (os_timer_func_t *)updateLED, NULL); // attach function for health publish
  150. // os_timer_arm(&statLEDTimer, LEDUPDATEDELAY, 1); // activate health packet timer
  151. // }