From 79ea1ac08836e8c50e0748d285461354c8d7712a Mon Sep 17 00:00:00 2001 From: Dominic Clifton Date: Thu, 18 Sep 2014 21:58:36 +0100 Subject: [PATCH 1/3] Store colors in flash, copy to ram and use from ram. Store mode colors as color ids instead of duplicating the color data. Later, this will allow configurable colors as the colors can be copied to the master config and used from that without any ram penalty. --- src/main/io/ledstrip.c | 258 +++++++++++++++++++++++++---------------- 1 file changed, 155 insertions(+), 103 deletions(-) diff --git a/src/main/io/ledstrip.c b/src/main/io/ledstrip.c index 9cd848978..58edbee56 100644 --- a/src/main/io/ledstrip.c +++ b/src/main/io/ledstrip.c @@ -47,7 +47,7 @@ #include "io/ledstrip.h" -static bool configured = false; +static bool ledStripInitialised = false; static failsafe_t* failsafe; #if MAX_LED_STRIP_LENGTH > WS2811_LED_STRIP_LENGTH @@ -57,29 +57,150 @@ static failsafe_t* failsafe; //#define USE_LED_ANIMATION // H S V -#define LED_WHITE { 0, 255, 255} #define LED_BLACK { 0, 0, 0} +#define LED_WHITE { 0, 255, 255} #define LED_RED { 0, 0, 255} #define LED_ORANGE { 30, 0, 255} #define LED_YELLOW { 60, 0, 255} #define LED_LIME_GREEN { 90, 0, 255} #define LED_GREEN {120, 0, 255} +#define LED_MINT_GREEN {150, 0, 255} #define LED_CYAN {180, 0, 255} #define LED_LIGHT_BLUE {210, 0, 255} #define LED_BLUE {240, 0, 255} -#define LED_DARK_MAGENTA {300, 0, 128} -#define LED_PINK {300, 0, 255} #define LED_DARK_VIOLET {270, 0, 255} +#define LED_MAGENTA {300, 0, 255} #define LED_DEEP_PINK {330, 0, 255} -const hsvColor_t hsv_black = LED_BLACK; -const hsvColor_t hsv_white = LED_WHITE; -const hsvColor_t hsv_red = LED_RED; -const hsvColor_t hsv_orange = LED_ORANGE; -const hsvColor_t hsv_green = LED_GREEN; -const hsvColor_t hsv_blue = LED_BLUE; -const hsvColor_t hsv_lightBlue = LED_LIGHT_BLUE; -const hsvColor_t hsv_limeGreen = LED_LIME_GREEN; +const hsvColor_t hsv_black = LED_BLACK; +const hsvColor_t hsv_white = LED_WHITE; +const hsvColor_t hsv_red = LED_RED; +const hsvColor_t hsv_orange = LED_ORANGE; +const hsvColor_t hsv_yellow = LED_YELLOW; +const hsvColor_t hsv_limeGreen = LED_LIME_GREEN; +const hsvColor_t hsv_green = LED_GREEN; +const hsvColor_t hsv_mintGreen = LED_MINT_GREEN; +const hsvColor_t hsv_cyan = LED_CYAN; +const hsvColor_t hsv_lightBlue = LED_LIGHT_BLUE; +const hsvColor_t hsv_blue = LED_BLUE; +const hsvColor_t hsv_darkViolet = LED_DARK_VIOLET; +const hsvColor_t hsv_magenta = LED_MAGENTA; +const hsvColor_t hsv_deepPink = LED_DEEP_PINK; + +#define LED_DIRECTION_COUNT 6 + +#define CONFIGURABLE_COLOR_COUNT 16 + +hsvColor_t colors[CONFIGURABLE_COLOR_COUNT]; + +const hsvColor_t * const defaultColors[] = { + &hsv_black, + &hsv_white, + &hsv_red, + &hsv_orange, + &hsv_yellow, + &hsv_limeGreen, + &hsv_green, + &hsv_mintGreen, + &hsv_cyan, + &hsv_lightBlue, + &hsv_blue, + &hsv_darkViolet, + &hsv_magenta, + &hsv_deepPink +}; + + + +typedef enum { + COLOR_BLACK = 0, + COLOR_WHITE, + COLOR_RED, + COLOR_ORANGE, + COLOR_YELLOW, + COLOR_LIME_GREEN, + COLOR_GREEN, + COLOR_MINT_GREEN, + COLOR_CYAN, + COLOR_LIGHT_BLUE, + COLOR_BLUE, + COLOR_DARK_VIOLET, + COLOR_MAGENTA, + COLOR_DEEP_PINK, +} colorIds; + +typedef enum { + DIRECTION_NORTH = 0, + DIRECTION_EAST, + DIRECTION_SOUTH, + DIRECTION_WEST, + DIRECTION_UP, + DIRECTION_DOWN +} directionId_e; + +typedef struct modeColorIndexes_s { + uint8_t north; + uint8_t east; + uint8_t south; + uint8_t west; + uint8_t up; + uint8_t down; +} modeColorIndexes_t; + + +static const modeColorIndexes_t orientationModeColors = { + COLOR_WHITE, + COLOR_DARK_VIOLET, + COLOR_RED, + COLOR_DEEP_PINK, + COLOR_BLUE, + COLOR_ORANGE +}; + +static const modeColorIndexes_t headfreeModeColors = { + COLOR_LIME_GREEN, + COLOR_DARK_VIOLET, + COLOR_ORANGE, + COLOR_DEEP_PINK, + COLOR_BLUE, + COLOR_ORANGE +}; + +static const modeColorIndexes_t horizonModeColors = { + COLOR_BLUE, + COLOR_DARK_VIOLET, + COLOR_YELLOW, + COLOR_DEEP_PINK, + COLOR_BLUE, + COLOR_ORANGE +}; + +static const modeColorIndexes_t angleModeColors = { + COLOR_CYAN, + COLOR_DARK_VIOLET, + COLOR_YELLOW, + COLOR_DEEP_PINK, + COLOR_BLUE, + COLOR_ORANGE +}; + +static const modeColorIndexes_t magModeColors = { + COLOR_MINT_GREEN, + COLOR_DARK_VIOLET, + COLOR_ORANGE, + COLOR_DEEP_PINK, + COLOR_BLUE, + COLOR_ORANGE +}; + +static const modeColorIndexes_t baroModeColors = { + COLOR_LIGHT_BLUE, + COLOR_DARK_VIOLET, + COLOR_RED, + COLOR_DEEP_PINK, + COLOR_BLUE, + COLOR_ORANGE +}; uint8_t ledGridWidth; @@ -322,114 +443,32 @@ uint32_t nextWarningFlashAt = 0; #define LED_STRIP_10HZ ((1000 * 1000) / 10) #define LED_STRIP_5HZ ((1000 * 1000) / 5) -#define LED_DIRECTION_COUNT 6 - -struct modeColors_s { - hsvColor_t north; - hsvColor_t east; - hsvColor_t south; - hsvColor_t west; - hsvColor_t up; - hsvColor_t down; -}; - -typedef union { - hsvColor_t raw[LED_DIRECTION_COUNT]; - struct modeColors_s colors; -} modeColors_t; - -static const modeColors_t orientationModeColors = { - .raw = { - LED_WHITE, - LED_DARK_VIOLET, - LED_RED, - LED_DEEP_PINK, - LED_BLUE, - LED_ORANGE - } -}; - -static const modeColors_t headfreeModeColors = { - .raw = { - LED_LIME_GREEN, - LED_DARK_VIOLET, - LED_ORANGE, - LED_DEEP_PINK, - LED_BLUE, - LED_ORANGE - } -}; - -static const modeColors_t horizonModeColors = { - .raw = { - LED_BLUE, - LED_DARK_VIOLET, - LED_YELLOW, - LED_DEEP_PINK, - LED_BLUE, - LED_ORANGE - } -}; - -static const modeColors_t angleModeColors = { - .raw = { - LED_CYAN, - LED_DARK_VIOLET, - LED_YELLOW, - LED_DEEP_PINK, - LED_BLUE, - LED_ORANGE - } -}; - -static const modeColors_t magModeColors = { - .raw = { - LED_PINK, - LED_DARK_VIOLET, - LED_ORANGE, - LED_DEEP_PINK, - LED_BLUE, - LED_ORANGE - } -}; - -static const modeColors_t baroModeColors = { - .raw = { - LED_LIGHT_BLUE, - LED_DARK_VIOLET, - LED_RED, - LED_DEEP_PINK, - LED_BLUE, - LED_ORANGE - } -}; - -void applyDirectionalModeColor(const uint8_t ledIndex, const ledConfig_t *ledConfig, const modeColors_t *modeColors) +void applyDirectionalModeColor(const uint8_t ledIndex, const ledConfig_t *ledConfig, const modeColorIndexes_t *modeColors) { // apply up/down colors regardless of quadrant. if ((ledConfig->flags & LED_DIRECTION_UP)) { - setLedHsv(ledIndex, &modeColors->colors.up); + setLedHsv(ledIndex, &colors[modeColors->up]); } if ((ledConfig->flags & LED_DIRECTION_DOWN)) { - setLedHsv(ledIndex, &modeColors->colors.down); + setLedHsv(ledIndex, &colors[modeColors->down]); } // override with n/e/s/w colors to each n/s e/w half - bail at first match. if ((ledConfig->flags & LED_DIRECTION_WEST) && GET_LED_X(ledConfig) <= highestXValueForWest) { - setLedHsv(ledIndex, &modeColors->colors.west); + setLedHsv(ledIndex, &colors[modeColors->west]); } if ((ledConfig->flags & LED_DIRECTION_EAST) && GET_LED_X(ledConfig) >= lowestXValueForEast) { - setLedHsv(ledIndex, &modeColors->colors.east); + setLedHsv(ledIndex, &colors[modeColors->east]); } if ((ledConfig->flags & LED_DIRECTION_NORTH) && GET_LED_Y(ledConfig) <= highestYValueForNorth) { - setLedHsv(ledIndex, &modeColors->colors.north); + setLedHsv(ledIndex, &colors[modeColors->north]); } if ((ledConfig->flags & LED_DIRECTION_SOUTH) && GET_LED_Y(ledConfig) >= lowestYValueForSouth) { - setLedHsv(ledIndex, &modeColors->colors.south); + setLedHsv(ledIndex, &colors[modeColors->south]); } } @@ -645,7 +684,7 @@ static void applyLedAnimationLayer(void) void updateLedStrip(void) { - if (!(configured && isWS2811LedStripReady())) { + if (!(ledStripInitialised && isWS2811LedStripReady())) { return; } @@ -721,10 +760,20 @@ void updateLedStrip(void) ws2811UpdateStrip(); } +void applyDefaultColors() +{ + hsvColor_t *colorConfig = colors; + memset(colorConfig, 0, CONFIGURABLE_COLOR_COUNT * sizeof(colorConfig)); + for (uint8_t colorIndex = 0; colorIndex < CONFIGURABLE_COLOR_COUNT && colorIndex < (sizeof(defaultColors) / sizeof(defaultColors[0])); colorIndex++) { + *colorConfig++ = *defaultColors[colorIndex]; + } +} + void applyDefaultLedStripConfig(ledConfig_t *ledConfigs) { memset(ledConfigs, 0, MAX_LED_STRIP_LENGTH * sizeof(ledConfig_t)); memcpy(ledConfigs, &defaultLedStripConfig, sizeof(defaultLedStripConfig)); + reevalulateLedConfig(); } @@ -732,7 +781,10 @@ void ledStripInit(ledConfig_t *ledConfigsToUse, failsafe_t* failsafeToUse) { ledConfigs = ledConfigsToUse; failsafe = failsafeToUse; + + applyDefaultColors(); + reevalulateLedConfig(); - configured = true; + ledStripInitialised = true; } #endif From 545980c14a291ce9a87e3372748c0127756e34d5 Mon Sep 17 00:00:00 2001 From: Dominic Clifton Date: Thu, 18 Sep 2014 22:53:12 +0100 Subject: [PATCH 2/3] Move colors from ram to master config. Initialise colors only when config is reset to defaults. --- src/main/config/config.c | 4 +++- src/main/config/config_master.h | 3 +++ src/main/flight/altitudehold.c | 2 ++ src/main/io/ledstrip.c | 22 ++++++++-------------- src/main/io/ledstrip.h | 4 ++++ src/main/io/serial_cli.c | 1 + src/main/io/serial_msp.c | 3 ++- src/main/main.c | 4 ++-- src/main/mw.c | 1 + 9 files changed, 26 insertions(+), 18 deletions(-) diff --git a/src/main/config/config.c b/src/main/config/config.c index 1d51b693b..1ba0941ec 100755 --- a/src/main/config/config.c +++ b/src/main/config/config.c @@ -23,6 +23,7 @@ #include "build_config.h" +#include "common/color.h" #include "common/axis.h" #include "flight/flight.h" @@ -98,7 +99,7 @@ void mixerUseConfigs(servoParam_t *servoConfToUse, flight3DConfig_t *flight3DCon master_t masterConfig; // master config struct with data independent from profiles profile_t *currentProfile; // profile config struct -static const uint8_t EEPROM_CONF_VERSION = 78; +static const uint8_t EEPROM_CONF_VERSION = 79; static void resetAccelerometerTrims(flightDynamicsTrims_t *accelerometerTrims) { @@ -376,6 +377,7 @@ static void resetConf(void) masterConfig.customMixer[i].throttle = 0.0f; #ifdef LED_STRIP + applyDefaultColors(masterConfig.colors, CONFIGURABLE_COLOR_COUNT); applyDefaultLedStripConfig(masterConfig.ledConfigs); #endif diff --git a/src/main/config/config_master.h b/src/main/config/config_master.h index da19a719c..8344934af 100644 --- a/src/main/config/config_master.h +++ b/src/main/config/config_master.h @@ -74,7 +74,10 @@ typedef struct master_t { telemetryConfig_t telemetryConfig; +#ifdef LED_STRIP ledConfig_t ledConfigs[MAX_LED_STRIP_LENGTH]; + hsvColor_t colors[CONFIGURABLE_COLOR_COUNT]; +#endif profile_t profile[3]; // 3 separate profiles uint8_t current_profile_index; // currently loaded profile diff --git a/src/main/flight/altitudehold.c b/src/main/flight/altitudehold.c index c3b02b962..526100e86 100644 --- a/src/main/flight/altitudehold.c +++ b/src/main/flight/altitudehold.c @@ -33,6 +33,8 @@ // FIXME remove dependency on currentProfile and masterConfig globals and clean up include file list. +#include "common/color.h" + #include "flight/flight.h" #include "sensors/sensors.h" #include "sensors/acceleration.h" diff --git a/src/main/io/ledstrip.c b/src/main/io/ledstrip.c index 58edbee56..509d2634b 100644 --- a/src/main/io/ledstrip.c +++ b/src/main/io/ledstrip.c @@ -54,6 +54,8 @@ static failsafe_t* failsafe; #error "Led strip length must match driver" #endif +static hsvColor_t *colors; + //#define USE_LED_ANIMATION // H S V @@ -89,10 +91,6 @@ const hsvColor_t hsv_deepPink = LED_DEEP_PINK; #define LED_DIRECTION_COUNT 6 -#define CONFIGURABLE_COLOR_COUNT 16 - -hsvColor_t colors[CONFIGURABLE_COLOR_COUNT]; - const hsvColor_t * const defaultColors[] = { &hsv_black, &hsv_white, @@ -110,8 +108,6 @@ const hsvColor_t * const defaultColors[] = { &hsv_deepPink }; - - typedef enum { COLOR_BLACK = 0, COLOR_WHITE, @@ -760,12 +756,11 @@ void updateLedStrip(void) ws2811UpdateStrip(); } -void applyDefaultColors() +void applyDefaultColors(hsvColor_t *colors, uint8_t colorCount) { - hsvColor_t *colorConfig = colors; - memset(colorConfig, 0, CONFIGURABLE_COLOR_COUNT * sizeof(colorConfig)); - for (uint8_t colorIndex = 0; colorIndex < CONFIGURABLE_COLOR_COUNT && colorIndex < (sizeof(defaultColors) / sizeof(defaultColors[0])); colorIndex++) { - *colorConfig++ = *defaultColors[colorIndex]; + memset(colors, 0, colorCount * sizeof(colors)); + for (uint8_t colorIndex = 0; colorIndex < colorCount && colorIndex < (sizeof(defaultColors) / sizeof(defaultColors[0])); colorIndex++) { + *colors++ = *defaultColors[colorIndex]; } } @@ -777,13 +772,12 @@ void applyDefaultLedStripConfig(ledConfig_t *ledConfigs) reevalulateLedConfig(); } -void ledStripInit(ledConfig_t *ledConfigsToUse, failsafe_t* failsafeToUse) +void ledStripInit(ledConfig_t *ledConfigsToUse, hsvColor_t *colorsToUse, failsafe_t* failsafeToUse) { ledConfigs = ledConfigsToUse; + colors = colorsToUse; failsafe = failsafeToUse; - applyDefaultColors(); - reevalulateLedConfig(); ledStripInitialised = true; } diff --git a/src/main/io/ledstrip.h b/src/main/io/ledstrip.h index 4425801b1..a01aa3bf5 100644 --- a/src/main/io/ledstrip.h +++ b/src/main/io/ledstrip.h @@ -53,7 +53,11 @@ typedef struct ledConfig_s { extern uint8_t ledCount; +#define CONFIGURABLE_COLOR_COUNT 16 + + bool parseLedStripConfig(uint8_t ledIndex, const char *config); void updateLedStrip(void); +void applyDefaultColors(hsvColor_t *colors, uint8_t colorCount); void applyDefaultLedStripConfig(ledConfig_t *ledConfig); void generateLedConfig(uint8_t ledIndex, char *ledConfigBuffer, size_t bufferSize); diff --git a/src/main/io/serial_cli.c b/src/main/io/serial_cli.c index 77cdf7c38..b93f2099a 100644 --- a/src/main/io/serial_cli.c +++ b/src/main/io/serial_cli.c @@ -28,6 +28,7 @@ #include "build_config.h" #include "common/axis.h" +#include "common/color.h" #include "common/typeconversion.h" #include "drivers/system.h" diff --git a/src/main/io/serial_msp.c b/src/main/io/serial_msp.c index c8e11134d..ef2f11ee7 100755 --- a/src/main/io/serial_msp.c +++ b/src/main/io/serial_msp.c @@ -25,8 +25,9 @@ #include "platform.h" -#include "common/maths.h" #include "common/axis.h" +#include "common/color.h" +#include "common/maths.h" #include "drivers/system.h" #include "drivers/accgyro.h" diff --git a/src/main/main.c b/src/main/main.c index d5feb7b5f..457dd9e5f 100755 --- a/src/main/main.c +++ b/src/main/main.c @@ -91,7 +91,7 @@ void navigationInit(gpsProfile_t *initialGpsProfile, pidProfile_t *pidProfile); bool sensorsAutodetect(sensorAlignmentConfig_t *sensorAlignmentConfig, uint16_t gyroLpf, uint8_t accHardwareToUse, int16_t magDeclinationFromConfig); void imuInit(void); void displayInit(void); -void ledStripInit(ledConfig_t *ledConfigsToUse, failsafe_t* failsafeToUse); +void ledStripInit(ledConfig_t *ledConfigsToUse, hsvColor_t *colorsToUse, failsafe_t* failsafeToUse); void loop(void); // FIXME bad naming - this appears to be for some new board that hasn't been made available yet. @@ -245,7 +245,7 @@ void init(void) #ifdef LED_STRIP if (feature(FEATURE_LED_STRIP)) { ws2811LedStripInit(); - ledStripInit(masterConfig.ledConfigs, failsafe); + ledStripInit(masterConfig.ledConfigs, masterConfig.colors, failsafe); } #endif diff --git a/src/main/mw.c b/src/main/mw.c index df311033e..8f7ca25e4 100755 --- a/src/main/mw.c +++ b/src/main/mw.c @@ -24,6 +24,7 @@ #include "common/maths.h" #include "common/axis.h" +#include "common/color.h" #include "drivers/accgyro.h" #include "drivers/light_led.h" From 4b06592ce7d857b0dfb9133403d09244560cd392 Mon Sep 17 00:00:00 2001 From: Dominic Clifton Date: Thu, 18 Sep 2014 23:04:58 +0100 Subject: [PATCH 3/3] Update ledstrip unit test. --- src/test/unit/ledstrip_unittest.cc | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/test/unit/ledstrip_unittest.cc b/src/test/unit/ledstrip_unittest.cc index f34c355a1..90d6530c7 100644 --- a/src/test/unit/ledstrip_unittest.cc +++ b/src/test/unit/ledstrip_unittest.cc @@ -19,6 +19,7 @@ #include +#include "common/color.h" #include "common/axis.h" #include "flight/flight.h" @@ -290,18 +291,27 @@ uint16_t flightModeFlags = 0; int16_t rcCommand[4]; void ws2811UpdateStrip(void) {} -void setLedColor(uint16_t index, const rgbColor24bpp_t *color) { + +void setLedValue(uint16_t index, const uint8_t value) { + UNUSED(index); + UNUSED(value); +} + +void setLedHsv(uint16_t index, const hsvColor_t *color) { UNUSED(index); UNUSED(color); } -void setLedBrightness(uint16_t index, const uint8_t scalePercent) { + +void scaleLedValue(uint16_t index, const uint8_t scalePercent) { UNUSED(index); UNUSED(scalePercent); } -void setStripColor(const rgbColor24bpp_t *color) { + +void setStripColor(const hsvColor_t *color) { UNUSED(color); } -void setStripColors(const rgbColor24bpp_t *colors) { + +void setStripColors(const hsvColor_t *colors) { UNUSED(colors); }