|
@@ -13,7 +13,6 @@
|
|
|
* Driver does support other led device. Maybe look at supporting in future.
|
|
|
* The VU refresh rate has been decreaced (100->75) to optimize animation of spin dial. Could make
|
|
|
* configurable like text scrolling (or use the same value)
|
|
|
- * Look at reserving a status led within the effects. (may require nvs setting for center or end position)
|
|
|
* Artwork function, but not released as very buggy and not really practical
|
|
|
*/
|
|
|
|
|
@@ -22,12 +21,17 @@
|
|
|
#include "esp_log.h"
|
|
|
|
|
|
#include "globdefs.h"
|
|
|
+#include "monitor.h"
|
|
|
#include "led_strip.h"
|
|
|
#include "platform_config.h"
|
|
|
#include "led_vu.h"
|
|
|
|
|
|
static const char *TAG = "led_vu";
|
|
|
|
|
|
+static void (*battery_handler_chain)(float value, int cells);
|
|
|
+static void battery_svc(float value, int cells);
|
|
|
+static int battery_status = 0;
|
|
|
+
|
|
|
#define LED_VU_STACK_SIZE (3*1024)
|
|
|
|
|
|
#define LED_VU_PEAK_HOLD 6U
|
|
@@ -36,6 +40,9 @@ static const char *TAG = "led_vu";
|
|
|
#define LED_VU_DEFAULT_LENGTH 19
|
|
|
#define LED_VU_MAX_LENGTH 255
|
|
|
|
|
|
+#define LED_VU_STATUS_GREEN 75
|
|
|
+#define LED_VU_STATUS_RED 25
|
|
|
+
|
|
|
#define max(a,b) (((a) > (b)) ? (a) : (b))
|
|
|
|
|
|
struct led_strip_t* led_display = NULL;
|
|
@@ -47,7 +54,7 @@ static EXT_RAM_ATTR struct {
|
|
|
int vu_length;
|
|
|
int vu_start_l;
|
|
|
int vu_start_r;
|
|
|
- int vu_odd;
|
|
|
+ int vu_status;
|
|
|
} strip;
|
|
|
|
|
|
static int led_addr(int pos ) {
|
|
@@ -56,6 +63,13 @@ static int led_addr(int pos ) {
|
|
|
return pos;
|
|
|
}
|
|
|
|
|
|
+static void battery_svc(float value, int cells) {
|
|
|
+ battery_status = battery_level_svc();
|
|
|
+ ESP_LOGI(TAG, "Called for battery service with volt:%f cells:%d status:%d", value, cells, battery_status);
|
|
|
+
|
|
|
+ if (battery_handler_chain) battery_handler_chain(value, cells);
|
|
|
+}
|
|
|
+
|
|
|
/****************************************************************************************
|
|
|
* Initialize the led vu strip if configured.
|
|
|
*
|
|
@@ -81,14 +95,26 @@ void led_vu_init()
|
|
|
ESP_LOGI(TAG, "led_vu configuration invalid");
|
|
|
goto done;
|
|
|
}
|
|
|
+
|
|
|
+ battery_handler_chain = battery_handler_svc;
|
|
|
+ battery_handler_svc = battery_svc;
|
|
|
+ battery_status = battery_level_svc();
|
|
|
|
|
|
if (strip.length > LED_VU_MAX_LENGTH) strip.length = LED_VU_MAX_LENGTH;
|
|
|
- // initialize vu settings
|
|
|
- //strip.vu_length = (strip.length % 2) ? strip.length / 2 : (strip.length - 1) / 2;
|
|
|
- strip.vu_length = (strip.length - 1) / 2;
|
|
|
- strip.vu_start_l = strip.vu_length;
|
|
|
- strip.vu_start_r = strip.vu_start_l + 1;
|
|
|
- strip.vu_odd = strip.length - 1;
|
|
|
+ // initialize vu meter settings
|
|
|
+ if (strip.length < 10) {
|
|
|
+ // single bar for small strips
|
|
|
+ strip.vu_length = strip.length;
|
|
|
+ strip.vu_start_l = 0;
|
|
|
+ strip.vu_start_r = strip.vu_start_l;
|
|
|
+ strip.vu_status = 0;
|
|
|
+ } else {
|
|
|
+ strip.vu_length = (strip.length - 1) / 2;
|
|
|
+ strip.vu_start_l = (strip.length % 2) ? strip.vu_length -1 : strip.vu_length;
|
|
|
+ strip.vu_start_r = strip.vu_length + 1;
|
|
|
+ strip.vu_status = strip.vu_length;
|
|
|
+ }
|
|
|
+ ESP_LOGI(TAG, "vu meter using length:%d left:%d right:%d status:%d", strip.vu_length, strip.vu_start_l, strip.vu_start_r, strip.vu_status);
|
|
|
|
|
|
// create driver configuration
|
|
|
led_strip_config.rgb_led_type = RGB_LED_TYPE_WS2812;
|
|
@@ -296,7 +322,11 @@ void led_vu_display(int vu_l, int vu_r, int bright, bool comet) {
|
|
|
static int decay_r = 0;
|
|
|
if (!led_display) return;
|
|
|
|
|
|
-
|
|
|
+ // single bar
|
|
|
+ if (strip.vu_start_l == strip.vu_start_r) {
|
|
|
+ vu_r = (vu_l + vu_r) / 2;
|
|
|
+ vu_l = 0;
|
|
|
+ }
|
|
|
|
|
|
// scale vu samples to length
|
|
|
vu_l = vu_l * strip.vu_length / bright;
|
|
@@ -357,6 +387,14 @@ void led_vu_display(int vu_l, int vu_r, int bright, bool comet) {
|
|
|
g = (g < step) ? 0 : g - step;
|
|
|
}
|
|
|
|
|
|
+ // show battery status
|
|
|
+ if (battery_status > LED_VU_STATUS_GREEN)
|
|
|
+ led_strip_set_pixel_rgb(led_display, strip.vu_status, 0, bright, 0);
|
|
|
+ else if (battery_status > LED_VU_STATUS_RED)
|
|
|
+ led_strip_set_pixel_rgb(led_display, strip.vu_status, bright/2, bright/2, 0);
|
|
|
+ else if (battery_status > 0)
|
|
|
+ led_strip_set_pixel_rgb(led_display, strip.vu_status, bright, 0, 0);
|
|
|
+
|
|
|
led_strip_show(led_display);
|
|
|
}
|
|
|
|