2
0

muse.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. /*
  2. YOUR LICENSE
  3. */
  4. #include <string.h>
  5. #include <esp_log.h>
  6. #include <esp_types.h>
  7. #include <esp_system.h>
  8. #include <freertos/FreeRTOS.h>
  9. #include <freertos/task.h>
  10. //#include <driver/adc.h>
  11. #include "driver/rmt.h"
  12. #include "monitor.h"
  13. /////////////////////////////////////////////////////////////////
  14. //*********************** NeoPixels ***************************
  15. ////////////////////////////////////////////////////////////////
  16. #define NUM_LEDS 1
  17. #define LED_RMT_TX_CHANNEL 0
  18. #define LED_RMT_TX_GPIO 22
  19. #define BITS_PER_LED_CMD 24
  20. #define LED_BUFFER_ITEMS ((NUM_LEDS * BITS_PER_LED_CMD))
  21. // These values are determined by measuring pulse timing with logic analyzer and adjusting to match datasheet.
  22. #define T0H 14 // 0 bit high time
  23. #define T1H 52 // 1 bit high time
  24. #define TL 52 // low time for either bit
  25. #define GREEN 0xFF0000
  26. #define RED 0x00FF00
  27. #define BLUE 0x0000FF
  28. #define WHITE 0xFFFFFF
  29. #define YELLOW 0xE0F060
  30. struct led_state {
  31. uint32_t leds[NUM_LEDS];
  32. };
  33. void ws2812_control_init(void);
  34. void ws2812_write_leds(struct led_state new_state);
  35. ///////////////////////////////////////////////////////////////////
  36. static const char TAG[] = "muse";
  37. static void (*battery_handler_chain)(float value);
  38. static void battery_svc(float value);
  39. void target_init(void) {
  40. battery_handler_chain = battery_handler_svc;
  41. battery_handler_svc = battery_svc;
  42. ESP_LOGI(TAG, "Initializing for Muse");
  43. }
  44. static void battery_svc(float value) {
  45. ESP_LOGI(TAG, "Called for battery service with %f", value);
  46. // put here your code for LED according to value
  47. if (battery_handler_chain) battery_handler_chain(value);
  48. }
  49. // Battery monitoring
  50. /*
  51. static void battery(void *data)
  52. {
  53. #define VGREEN 2300
  54. #define VRED 2000
  55. #define NM 10
  56. static int val;
  57. static int V[NM];
  58. static int I=0;
  59. int S;
  60. for(int i=0;i<NM;i++)V[i]=VGREEN;
  61. vTaskDelay(1000 / portTICK_PERIOD_MS);
  62. struct led_state new_state;
  63. ws2812_control_init();
  64. // init ADC interface for battery survey
  65. adc1_config_width(ADC_WIDTH_BIT_12);
  66. adc1_config_channel_atten(ADC1_GPIO33_CHANNEL, ADC_ATTEN_DB_11);
  67. while(true)
  68. {
  69. vTaskDelay(1000 / portTICK_PERIOD_MS);
  70. V[I++] = adc1_get_raw(ADC1_GPIO33_CHANNEL);
  71. if(I >= NM)I = 0;
  72. S = 0;
  73. for(int i=0;i<NM;i++)S = S + V[i];
  74. val = S / NM;
  75. new_state.leds[0] = YELLOW;
  76. if(val > VGREEN) new_state.leds[0] = GREEN;
  77. if(val < VRED) new_state.leds[0] = RED;
  78. printf("====> %d %6x\n", val, new_state.leds[0]);
  79. ws2812_write_leds(new_state);
  80. }
  81. }
  82. */
  83. // This is the buffer which the hw peripheral will access while pulsing the output pin
  84. rmt_item32_t led_data_buffer[LED_BUFFER_ITEMS];
  85. void setup_rmt_data_buffer(struct led_state new_state);
  86. void ws2812_control_init(void)
  87. {
  88. rmt_config_t config;
  89. config.rmt_mode = RMT_MODE_TX;
  90. config.channel = LED_RMT_TX_CHANNEL;
  91. config.gpio_num = LED_RMT_TX_GPIO;
  92. config.mem_block_num = 3;
  93. config.tx_config.loop_en = false;
  94. config.tx_config.carrier_en = false;
  95. config.tx_config.idle_output_en = true;
  96. config.tx_config.idle_level = 0;
  97. config.clk_div = 2;
  98. ESP_ERROR_CHECK(rmt_config(&config));
  99. ESP_ERROR_CHECK(rmt_driver_install(config.channel, 0, 0));
  100. }
  101. void ws2812_write_leds(struct led_state new_state) {
  102. setup_rmt_data_buffer(new_state);
  103. ESP_ERROR_CHECK(rmt_write_items(LED_RMT_TX_CHANNEL, led_data_buffer, LED_BUFFER_ITEMS, false));
  104. ESP_ERROR_CHECK(rmt_wait_tx_done(LED_RMT_TX_CHANNEL, portMAX_DELAY));
  105. }
  106. void setup_rmt_data_buffer(struct led_state new_state)
  107. {
  108. for (uint32_t led = 0; led < NUM_LEDS; led++) {
  109. uint32_t bits_to_send = new_state.leds[led];
  110. uint32_t mask = 1 << (BITS_PER_LED_CMD - 1);
  111. for (uint32_t bit = 0; bit < BITS_PER_LED_CMD; bit++) {
  112. uint32_t bit_is_set = bits_to_send & mask;
  113. led_data_buffer[led * BITS_PER_LED_CMD + bit] = bit_is_set ?
  114. (rmt_item32_t){{{T1H, 1, TL, 0}}} :
  115. (rmt_item32_t){{{T0H, 1, TL, 0}}};
  116. mask >>= 1;
  117. }
  118. }
  119. }