diff --git a/include/globals.h b/include/globals.h index 8d57f1dd..35adfb7e 100644 --- a/include/globals.h +++ b/include/globals.h @@ -5,7 +5,9 @@ #include // Time functions +#ifdef HAS_RTC #include +#endif #include // std::set for unified array functions diff --git a/include/led.h b/include/led.h index 6bbef12d..4bf4c0d8 100644 --- a/include/led.h +++ b/include/led.h @@ -1,9 +1,12 @@ #ifndef _LED_H #define _LED_H -#ifdef RGB_LED_COUNT -#include +#ifdef HAS_RGB_LED +#define FASTLED_INTERNAL +#include +#include "libpax_helpers.h" #endif + #ifdef HAS_LORA #include "lorawan.h" #endif @@ -12,39 +15,26 @@ #define RGB_LED_COUNT 1 #endif -// value for HSL color -// see http://www.workwithcolor.com/blue-color-hue-range-01.htm -#define COLOR_RED 0 -#define COLOR_ORANGE 30 -#define COLOR_ORANGE_YELLOW 45 -#define COLOR_YELLOW 60 -#define COLOR_YELLOW_GREEN 90 -#define COLOR_GREEN 120 -#define COLOR_GREEN_CYAN 165 -#define COLOR_CYAN 180 -#define COLOR_CYAN_BLUE 210 -#define COLOR_BLUE 240 -#define COLOR_BLUE_MAGENTA 275 -#define COLOR_MAGENTA 300 -#define COLOR_PINK 350 -#define COLOR_WHITE 360 -#define COLOR_NONE 999 - -struct RGBColor { - uint8_t R; - uint8_t G; - uint8_t B; -}; - enum led_states { LED_OFF, LED_ON }; +enum colors { + COLOR_WHITE = 0xFFFFFF, + COLOR_NONE = 0x000000, + COLOR_CYAN = 0x00FFFF, + COLOR_BLUE = 0x0000FF, + COLOR_GREEN = 0x008000, + COLOR_YELLOW = 0xFFFF00, + COLOR_ORANGE = 0xFFA500, + COLOR_RED = 0xFF0000, + COLOR_PINK = 0xFFC0CB +}; + extern TaskHandle_t ledLoopTask; -// Exported Functions -void rgb_set_color(uint16_t hue); -void blink_LED(uint16_t set_color, uint16_t set_blinkduration); +void rgb_led_init(void); +void rgb_set_color(uint32_t color); void ledLoop(void *parameter); -void switch_LED(uint8_t state); -void switch_LED1(uint8_t state); +void switch_LED(led_states state); +void switch_LED1(led_states state); #endif \ No newline at end of file diff --git a/include/sdcard.h b/include/sdcard.h index 1f2b0bca..4b1145eb 100644 --- a/include/sdcard.h +++ b/include/sdcard.h @@ -33,6 +33,10 @@ #elif HAS_SDCARD == 2 // MMC interface #include "driver/sdmmc_host.h" +#ifndef SDCARD_SLOTCONFIG +#define SDCARD_SLOTCONFIG SDMMC_SLOT_CONFIG_DEFAULT() +#endif + #ifndef SDCARD_SLOTWIDTH #define SDCARD_SLOTWIDTH 1 #endif diff --git a/platformio_orig.ini b/platformio_orig.ini index e2005bc5..979933bf 100644 --- a/platformio_orig.ini +++ b/platformio_orig.ini @@ -67,7 +67,7 @@ lib_deps_display = lib_deps_ledmatrix = seeed-studio/Ultrathin_LED_Matrix @ ^1.0.0 lib_deps_rgbled = - https://github.com/RoboticsBrno/SmartLeds.git + fastled/FastLED @ ^3.5.0 lib_deps_gps = mikalhart/TinyGPSPlus @ ^1.0.3 lib_deps_sensors = diff --git a/src/hal/eboxtube.h b/src/hal/eboxtube.h index e95b6940..7d2f5b86 100644 --- a/src/hal/eboxtube.h +++ b/src/hal/eboxtube.h @@ -15,7 +15,7 @@ #define HAS_LED (22) // Green LED on board #define RGB_LED_COUNT 1 // we have 1 LED -#define HAS_RGB_LED SmartLed rgb_led(LED_WS2812, RGB_LED_COUNT, GPIO_NUM_2) // WS2812B RGB LED on board +#define HAS_RGB_LED FastLED.addLeds(leds, RGB_LED_COUNT); #define HAS_BUTTON (0) // button "FLASH" on board #define DISABLE_BROWNOUT 1 // comment out if you want to keep brownout feature diff --git a/src/hal/fipy.h b/src/hal/fipy.h index f904d716..dd8a5da5 100644 --- a/src/hal/fipy.h +++ b/src/hal/fipy.h @@ -13,7 +13,8 @@ #define CFG_sx1272_radio 1 #define HAS_LED NOT_A_PIN // FiPy has no on board LED, so we use RGB LED -#define HAS_RGB_LED SmartLed rgb_led(LED_WS2812, 1, GPIO_NUM_0) // WS2812B RGB LED on GPIO0 +#define RGB_LED_COUNT 1 // we have 1 LED +#define HAS_RGB_LED FastLED.addLeds(leds, RGB_LED_COUNT); #define BOARD_HAS_PSRAM // use extra 4MB extern RAM // Pins for LORA chip SPI interface, reset line and interrupt lines diff --git a/src/hal/generic.h b/src/hal/generic.h index 26d465e3..ef691330 100644 --- a/src/hal/generic.h +++ b/src/hal/generic.h @@ -72,7 +72,8 @@ #define HAS_LED (21) // on board LED #define HAS_BUTTON (39) // on board button -#define HAS_RGB_LED SmartLed rgb_led(LED_WS2812, 1, GPIO_NUM_0) // WS2812B RGB LED on GPIO0 +#define RGB_LED_COUNT 1 // we have 1 LED +#define HAS_RGB_LED FastLED.addLeds(leds, RGB_LED_COUNT); // GPS settings #define HAS_GPS 1 // use on board GPS diff --git a/src/hal/lolin32litelora.h b/src/hal/lolin32litelora.h index d3ae2133..232f9adb 100644 --- a/src/hal/lolin32litelora.h +++ b/src/hal/lolin32litelora.h @@ -17,7 +17,8 @@ //#define MY_DISPLAY_FLIP 1 // uncomment this for rotated display #define HAS_LED 22 // ESP32 GPIO12 (pin22) On Board LED (set to NOT_A_PIN to disable) #define LED_ACTIVE_LOW 1 // Onboard LED is active when pin is LOW -#define HAS_RGB_LED SmartLed rgb_led(LED_WS2812, 1, GPIO_NUM_13) // ESP32 GPIO13 (pin13) On Board Shield WS2812B RGB LED +#define RGB_LED_COUNT 1 // we have 1 LED +#define HAS_RGB_LED FastLED.addLeds(leds, RGB_LED_COUNT); #define HAS_BUTTON 15 // ESP32 GPIO15 (pin15) Button is on the LoraNode32 shield #define BUTTON_PULLUP 1 // Button need pullup instead of default pulldown diff --git a/src/hal/lolin32lora.h b/src/hal/lolin32lora.h index 15cdb331..c53aaf47 100644 --- a/src/hal/lolin32lora.h +++ b/src/hal/lolin32lora.h @@ -18,7 +18,8 @@ #define HAS_LED NOT_A_PIN // Led os on same pin as Lora SS pin, to avoid problems, we don't use it #define LED_ACTIVE_LOW 1 // Onboard LED is active when pin is LOW // Anyway shield is on over the LoLin32 board, so we won't be able to see this LED -#define HAS_RGB_LED SmartLed rgb_led(LED_WS2812, 1, GPIO_NUM_13) // ESP32 GPIO13 (pin13) On Board Shield WS2812B RGB LED +#define RGB_LED_COUNT 1 // we have 1 LED +#define HAS_RGB_LED FastLED.addLeds(leds, RGB_LED_COUNT); #define HAS_BUTTON 15 // ESP32 GPIO15 (pin15) Button is on the LoraNode32 shield #define BUTTON_PULLUP 1 // Button need pullup instead of default pulldown diff --git a/src/hal/lopy.h b/src/hal/lopy.h index e196ee1a..0946c046 100644 --- a/src/hal/lopy.h +++ b/src/hal/lopy.h @@ -12,7 +12,8 @@ #define HAS_LORA 1 // comment out if device shall not send data via LoRa #define CFG_sx1272_radio 1 #define HAS_LED NOT_A_PIN // LoPy4 has no on board mono LED, we use on board RGB LED -#define HAS_RGB_LED SmartLed rgb_led(LED_WS2812, 1, GPIO_NUM_0) // WS2812B RGB LED on GPIO0 (P2) +#define RGB_LED_COUNT 1 // we have 1 LED +#define HAS_RGB_LED FastLED.addLeds(leds, RGB_LED_COUNT); // Note: Pins for LORA chip SPI interface come from board file pins_arduino.h diff --git a/src/hal/lopy4.h b/src/hal/lopy4.h index 0c5999f0..cb960fa7 100644 --- a/src/hal/lopy4.h +++ b/src/hal/lopy4.h @@ -21,7 +21,8 @@ #define CFG_sx1276_radio 1 #define HAS_LED NOT_A_PIN // LoPy4 has no on board mono LED, we use on board RGB LED #define RGB_LED_COUNT 1 // we have 1 LEDs -#define HAS_RGB_LED SmartLed rgb_led(LED_WS2812, RGB_LED_COUNT, GPIO_NUM_0) // WS2812B RGB LED on GPIO0 (P2) +#define RGB_LED_COUNT 1 // we have 1 LED +#define HAS_RGB_LED FastLED.addLeds(leds, RGB_LED_COUNT); #define BOARD_HAS_PSRAM // use extra 4MB extern RAM // Note: Pins for LORA chip SPI interface come from board file pins_arduino.h diff --git a/src/hal/m5fire.h b/src/hal/m5fire.h index 156cd494..16d3b2cb 100644 --- a/src/hal/m5fire.h +++ b/src/hal/m5fire.h @@ -33,7 +33,8 @@ #define HAS_LED NOT_A_PIN // no on board LED (?) #define RGB_LED_COUNT 10 -#define HAS_RGB_LED SmartLed rgb_led(LED_SK6812, RGB_LED_COUNT, GPIO_NUM_15) // LED_SK6812 RGB LED on GPIO15 +#define RGB_LED_COUNT 1 // we have 1 LED +#define HAS_RGB_LED FastLED.addLeds(leds, RGB_LED_COUNT); #define HAS_BUTTON (39) // on board button A // power management settings diff --git a/src/hal/octopus32.h b/src/hal/octopus32.h index b7de8b12..6b5b66c4 100644 --- a/src/hal/octopus32.h +++ b/src/hal/octopus32.h @@ -22,7 +22,8 @@ #define HAS_LED 13 // ESP32 GPIO12 (pin22) On Board LED //#define LED_ACTIVE_LOW 1 // Onboard LED is active when pin is LOW -//#define HAS_RGB_LED SmartLed rgb_led(LED_WS2812, 1, GPIO_NUM_13) // ESP32 GPIO13 (pin13) On Board Shield WS2812B RGB LED +//#define RGB_LED_COUNT 1 // we have 1 LED +//#define HAS_RGB_LED FastLED.addLeds(leds, RGB_LED_COUNT); //#define HAS_BUTTON 15 // ESP32 GPIO15 (pin15) Button is on the LoraNode32 shield //#define BUTTON_PULLUP 1 // Button need pullup instead of default pulldown diff --git a/src/led.cpp b/src/led.cpp index ecd5b99a..ee6c7e29 100644 --- a/src/led.cpp +++ b/src/led.cpp @@ -2,94 +2,36 @@ #include "globals.h" #include "led.h" -led_states LEDState = LED_OFF; // LED state global for state machine +static led_states LEDState = LED_OFF; // LED state global for state machine led_states previousLEDState = LED_ON; // This will force LED to be off at boot since State is OFF TaskHandle_t ledLoopTask; -uint16_t LEDColor = COLOR_NONE, LEDBlinkDuration = 0; // state machine variables -unsigned long LEDBlinkStarted = 0; // When (in millis() led blink started) +uint32_t LEDColor = COLOR_NONE, LEDBlinkDuration = 0; // state machine variables +static unsigned long LEDBlinkStarted = + 0; // When (in millis() led blink started) #ifdef HAS_RGB_LED - -// RGB Led instance -HAS_RGB_LED; - -float rgb_CalcColor(float p, float q, float t) { - if (t < 0.0f) - t += 1.0f; - if (t > 1.0f) - t -= 1.0f; - - if (t < 1.0f / 6.0f) - return p + (q - p) * 6.0f * t; - - if (t < 0.5f) - return q; - - if (t < 2.0f / 3.0f) - return p + ((q - p) * (2.0f / 3.0f - t) * 6.0f); - - return p; -} - -// ------------------------------------------------------------------------ -// Hue, Saturation, Lightness color members -// HslColor using H, S, L values (0.0 - 1.0) -// L should be limited to between (0.0 - 0.5) -// ------------------------------------------------------------------------ -RGBColor rgb_hsl2rgb(float h, float s, float l) { - RGBColor RGB_color; - float r; - float g; - float b; - - if (s == 0.0f || l == 0.0f) { - r = g = b = l; // achromatic or black - } else { - float q = l < 0.5f ? l * (1.0f + s) : l + s - (l * s); - float p = 2.0f * l - q; - r = rgb_CalcColor(p, q, h + 1.0f / 3.0f); - g = rgb_CalcColor(p, q, h); - b = rgb_CalcColor(p, q, h - 1.0f / 3.0f); - } - - RGB_color.R = (uint8_t)(r * 255.0f); - RGB_color.G = (uint8_t)(g * 255.0f); - RGB_color.B = (uint8_t)(b * 255.0f); - - return RGB_color; -} - -void rgb_set_color(uint16_t hue) { - if (hue == COLOR_NONE) { - // set Off - for (int i = 0; i < RGB_LED_COUNT; i++) - rgb_led[i] = Rgb(0, 0, 0); - } else { - // see http://www.workwithcolor.com/blue-color-hue-range-01.htm - // H (is color from 0..360) should be between 0.0 and 1.0 - // S is saturation keep it to 1 - // L is brightness should be between 0.0 and 0.5 - // cfg.rgblum is between 0 and 100 (percent) - RGBColor target = rgb_hsl2rgb(hue / 360.0f, 1.0f, 0.005f * cfg.rgblum); - // uint32_t color = target.R<<16 | target.G<<8 | target.B; - for (int i = 0; i < RGB_LED_COUNT; i++) - rgb_led[i] = Rgb(target.R, target.G, target.B); - } - // Show - rgb_led.show(); -} - -#else - -// No RGB LED empty functions -void rgb_set_color(uint16_t hue) {} - +CRGB leds[RGB_LED_COUNT]; #endif -void switch_LED(uint8_t state) { +void rgb_set_color(uint32_t color) { +#ifdef HAS_RGB_LED + for (int i = 0; i < RGB_LED_COUNT; i++) + leds[i] = CRGB(color); + FastLED.show(); +#endif +} + +void rgb_led_init(void) { +#ifdef HAS_RGB_LED + HAS_RGB_LED; + rgb_set_color(COLOR_NONE); +#endif +} + +void switch_LED(led_states state) { #if (HAS_LED != NOT_A_PIN) if (state == LED_ON) { // switch LED on @@ -109,7 +51,7 @@ void switch_LED(uint8_t state) { #endif } -void switch_LED1(uint8_t state) { +void switch_LED1(led_states state) { #ifdef HAS_TWO_LED if (state == LED_ON) { // switch LED on @@ -129,14 +71,6 @@ void switch_LED1(uint8_t state) { #endif // HAS_TWO_LED } -void blink_LED(uint16_t set_color, uint16_t set_blinkduration) { -#if (HAS_LED != NOT_A_PIN) || defined(HAS_RGB_LED) - LEDColor = set_color; // set color for RGB LED - LEDBlinkDuration = set_blinkduration; // duration - LEDBlinkStarted = millis(); // Time Start here - LEDState = LED_ON; // Let main set LED on -#endif -} #if (HAS_LED != NOT_A_PIN) || defined(HAS_RGB_LED) @@ -215,4 +149,4 @@ void ledLoop(void *parameter) { } // while(1) }; // ledloop() -#endif // #if (HAS_LED != NOT_A_PIN) || defined(HAS_RGB_LED) +#endif // #if (HAS_LED != NOT_A_PIN) || defined(HAS_RGB_LED) \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 00a8bf2e..a1af483c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -201,26 +201,26 @@ void setup() { #endif // initialize leds +#ifdef HAS_RGB_LED + rgb_led_init(); + strcat_P(features, " RGB"); +#endif + #if (HAS_LED != NOT_A_PIN) pinMode(HAS_LED, OUTPUT); strcat_P(features, " LED"); - #ifdef LED_POWER_SW pinMode(LED_POWER_SW, OUTPUT); digitalWrite(LED_POWER_SW, LED_POWER_ON); #endif - #ifdef HAS_TWO_LED pinMode(HAS_TWO_LED, OUTPUT); strcat_P(features, " LED2"); #endif - -// use LED for power display if we have additional RGB LED, else for status +// use simple LED for power display if we have additional RGB LED, else for status #ifdef HAS_RGB_LED switch_LED(LED_ON); - strcat_P(features, " RGB"); #endif - #endif // HAS_LED #if (HAS_LED != NOT_A_PIN) || defined(HAS_RGB_LED) diff --git a/src/sdcard.cpp b/src/sdcard.cpp index d4c23e46..54414233 100644 --- a/src/sdcard.cpp +++ b/src/sdcard.cpp @@ -132,7 +132,7 @@ bool sdcard_init(bool create) { // has these signals. // Default config for SDMMC_HOST_DEFAULT (4-bit bus width, slot 1) // https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/sdmmc_host.html - sdmmc_slot_config_t slot_config = SDMMC_SLOT_CONFIG_DEFAULT(); + sdmmc_slot_config_t slot_config = SDCARD_SLOTCONFIG; // Set 1-line or 4-line SD mode (default is 1-line) slot_config.width = SDCARD_SLOTWIDTH;