From 3121557afdca48363cef0a732d541726f8ae9eea Mon Sep 17 00:00:00 2001 From: fruchti Date: Thu, 16 Jul 2020 22:04:54 +0200 Subject: [PATCH] Add basic gradient output --- build-number.txt | 2 +- src/animation.c | 305 ++++++++++++++++++++++++++++++++++++++++++++++- src/animation.h | 8 ++ src/main.c | 55 +-------- src/main.h | 1 + 5 files changed, 315 insertions(+), 56 deletions(-) diff --git a/build-number.txt b/build-number.txt index 54ea97e..55bd0ac 100644 --- a/build-number.txt +++ b/build-number.txt @@ -1 +1 @@ -310 +333 diff --git a/src/animation.c b/src/animation.c index a97e30d..377fe82 100644 --- a/src/animation.c +++ b/src/animation.c @@ -1,8 +1,311 @@ #include "animation.h" +#include "light_sensor.h" const unsigned int Animation_LEDOrder[LED_COUNT] = { 19, 27, 21, 13, 0, 4, 24, 8, 12, 15, 6, 5, 28, 29, 17, 3, 18, 26, 22, 10, 16, 20, 30, 1, 25, 2, 14, 31, 7, 11, 9, 23 -}; \ No newline at end of file +}; + +const LED_Colour_t Animation_ColourLUT[] = +{ + { .r = 255, .g = 51, .b = 51 }, + { .r = 255, .g = 51, .b = 56 }, + { .r = 255, .g = 51, .b = 61 }, + { .r = 255, .g = 51, .b = 65 }, + { .r = 255, .g = 51, .b = 70 }, + { .r = 255, .g = 51, .b = 75 }, + { .r = 255, .g = 51, .b = 80 }, + { .r = 255, .g = 51, .b = 85 }, + { .r = 255, .g = 51, .b = 89 }, + { .r = 255, .g = 51, .b = 94 }, + { .r = 255, .g = 51, .b = 99 }, + { .r = 255, .g = 51, .b = 104 }, + { .r = 255, .g = 51, .b = 109 }, + { .r = 255, .g = 51, .b = 113 }, + { .r = 255, .g = 51, .b = 118 }, + { .r = 255, .g = 51, .b = 123 }, + { .r = 255, .g = 51, .b = 128 }, + { .r = 255, .g = 51, .b = 133 }, + { .r = 255, .g = 51, .b = 137 }, + { .r = 255, .g = 51, .b = 142 }, + { .r = 255, .g = 51, .b = 147 }, + { .r = 255, .g = 51, .b = 152 }, + { .r = 255, .g = 51, .b = 157 }, + { .r = 255, .g = 51, .b = 161 }, + { .r = 255, .g = 51, .b = 166 }, + { .r = 255, .g = 51, .b = 171 }, + { .r = 255, .g = 51, .b = 176 }, + { .r = 255, .g = 51, .b = 181 }, + { .r = 255, .g = 51, .b = 185 }, + { .r = 255, .g = 51, .b = 190 }, + { .r = 255, .g = 51, .b = 195 }, + { .r = 255, .g = 51, .b = 200 }, + { .r = 255, .g = 51, .b = 205 }, + { .r = 255, .g = 51, .b = 209 }, + { .r = 255, .g = 51, .b = 214 }, + { .r = 255, .g = 51, .b = 219 }, + { .r = 255, .g = 51, .b = 224 }, + { .r = 255, .g = 51, .b = 229 }, + { .r = 255, .g = 51, .b = 233 }, + { .r = 255, .g = 51, .b = 238 }, + { .r = 255, .g = 51, .b = 243 }, + { .r = 255, .g = 51, .b = 248 }, + { .r = 255, .g = 51, .b = 253 }, + { .r = 253, .g = 51, .b = 255 }, + { .r = 248, .g = 51, .b = 255 }, + { .r = 243, .g = 51, .b = 255 }, + { .r = 238, .g = 51, .b = 255 }, + { .r = 233, .g = 51, .b = 255 }, + { .r = 229, .g = 51, .b = 255 }, + { .r = 224, .g = 51, .b = 255 }, + { .r = 219, .g = 51, .b = 255 }, + { .r = 214, .g = 51, .b = 255 }, + { .r = 209, .g = 51, .b = 255 }, + { .r = 205, .g = 51, .b = 255 }, + { .r = 200, .g = 51, .b = 255 }, + { .r = 195, .g = 51, .b = 255 }, + { .r = 190, .g = 51, .b = 255 }, + { .r = 185, .g = 51, .b = 255 }, + { .r = 181, .g = 51, .b = 255 }, + { .r = 176, .g = 51, .b = 255 }, + { .r = 171, .g = 51, .b = 255 }, + { .r = 166, .g = 51, .b = 255 }, + { .r = 161, .g = 51, .b = 255 }, + { .r = 157, .g = 51, .b = 255 }, + { .r = 152, .g = 51, .b = 255 }, + { .r = 147, .g = 51, .b = 255 }, + { .r = 142, .g = 51, .b = 255 }, + { .r = 137, .g = 51, .b = 255 }, + { .r = 133, .g = 51, .b = 255 }, + { .r = 128, .g = 51, .b = 255 }, + { .r = 123, .g = 51, .b = 255 }, + { .r = 118, .g = 51, .b = 255 }, + { .r = 113, .g = 51, .b = 255 }, + { .r = 109, .g = 51, .b = 255 }, + { .r = 104, .g = 51, .b = 255 }, + { .r = 99, .g = 51, .b = 255 }, + { .r = 94, .g = 51, .b = 255 }, + { .r = 89, .g = 51, .b = 255 }, + { .r = 85, .g = 51, .b = 255 }, + { .r = 80, .g = 51, .b = 255 }, + { .r = 75, .g = 51, .b = 255 }, + { .r = 70, .g = 51, .b = 255 }, + { .r = 65, .g = 51, .b = 255 }, + { .r = 61, .g = 51, .b = 255 }, + { .r = 56, .g = 51, .b = 255 }, + { .r = 51, .g = 51, .b = 255 }, + { .r = 51, .g = 56, .b = 255 }, + { .r = 51, .g = 61, .b = 255 }, + { .r = 51, .g = 65, .b = 255 }, + { .r = 51, .g = 70, .b = 255 }, + { .r = 51, .g = 75, .b = 255 }, + { .r = 51, .g = 80, .b = 255 }, + { .r = 51, .g = 85, .b = 255 }, + { .r = 51, .g = 89, .b = 255 }, + { .r = 51, .g = 94, .b = 255 }, + { .r = 51, .g = 99, .b = 255 }, + { .r = 51, .g = 104, .b = 255 }, + { .r = 51, .g = 109, .b = 255 }, + { .r = 51, .g = 113, .b = 255 }, + { .r = 51, .g = 118, .b = 255 }, + { .r = 51, .g = 123, .b = 255 }, + { .r = 51, .g = 128, .b = 255 }, + { .r = 51, .g = 133, .b = 255 }, + { .r = 51, .g = 137, .b = 255 }, + { .r = 51, .g = 142, .b = 255 }, + { .r = 51, .g = 147, .b = 255 }, + { .r = 51, .g = 152, .b = 255 }, + { .r = 51, .g = 157, .b = 255 }, + { .r = 51, .g = 161, .b = 255 }, + { .r = 51, .g = 166, .b = 255 }, + { .r = 51, .g = 171, .b = 255 }, + { .r = 51, .g = 176, .b = 255 }, + { .r = 51, .g = 181, .b = 255 }, + { .r = 51, .g = 185, .b = 255 }, + { .r = 51, .g = 190, .b = 255 }, + { .r = 51, .g = 195, .b = 255 }, + { .r = 51, .g = 200, .b = 255 }, + { .r = 51, .g = 205, .b = 255 }, + { .r = 51, .g = 209, .b = 255 }, + { .r = 51, .g = 214, .b = 255 }, + { .r = 51, .g = 219, .b = 255 }, + { .r = 51, .g = 224, .b = 255 }, + { .r = 51, .g = 229, .b = 255 }, + { .r = 51, .g = 233, .b = 255 }, + { .r = 51, .g = 238, .b = 255 }, + { .r = 51, .g = 243, .b = 255 }, + { .r = 51, .g = 248, .b = 255 }, + { .r = 51, .g = 253, .b = 255 }, + { .r = 51, .g = 255, .b = 253 }, + { .r = 51, .g = 255, .b = 248 }, + { .r = 51, .g = 255, .b = 243 }, + { .r = 51, .g = 255, .b = 238 }, + { .r = 51, .g = 255, .b = 233 }, + { .r = 51, .g = 255, .b = 229 }, + { .r = 51, .g = 255, .b = 224 }, + { .r = 51, .g = 255, .b = 219 }, + { .r = 51, .g = 255, .b = 214 }, + { .r = 51, .g = 255, .b = 209 }, + { .r = 51, .g = 255, .b = 205 }, + { .r = 51, .g = 255, .b = 200 }, + { .r = 51, .g = 255, .b = 195 }, + { .r = 51, .g = 255, .b = 190 }, + { .r = 51, .g = 255, .b = 185 }, + { .r = 51, .g = 255, .b = 181 }, + { .r = 51, .g = 255, .b = 176 }, + { .r = 51, .g = 255, .b = 171 }, + { .r = 51, .g = 255, .b = 166 }, + { .r = 51, .g = 255, .b = 161 }, + { .r = 51, .g = 255, .b = 157 }, + { .r = 51, .g = 255, .b = 152 }, + { .r = 51, .g = 255, .b = 147 }, + { .r = 51, .g = 255, .b = 142 }, + { .r = 51, .g = 255, .b = 137 }, + { .r = 51, .g = 255, .b = 133 }, + { .r = 51, .g = 255, .b = 128 }, + { .r = 51, .g = 255, .b = 123 }, + { .r = 51, .g = 255, .b = 118 }, + { .r = 51, .g = 255, .b = 113 }, + { .r = 51, .g = 255, .b = 109 }, + { .r = 51, .g = 255, .b = 104 }, + { .r = 51, .g = 255, .b = 99 }, + { .r = 51, .g = 255, .b = 94 }, + { .r = 51, .g = 255, .b = 89 }, + { .r = 51, .g = 255, .b = 85 }, + { .r = 51, .g = 255, .b = 80 }, + { .r = 51, .g = 255, .b = 75 }, + { .r = 51, .g = 255, .b = 70 }, + { .r = 51, .g = 255, .b = 65 }, + { .r = 51, .g = 255, .b = 61 }, + { .r = 51, .g = 255, .b = 56 }, + { .r = 51, .g = 255, .b = 51 }, + { .r = 56, .g = 255, .b = 51 }, + { .r = 61, .g = 255, .b = 51 }, + { .r = 65, .g = 255, .b = 51 }, + { .r = 70, .g = 255, .b = 51 }, + { .r = 75, .g = 255, .b = 51 }, + { .r = 80, .g = 255, .b = 51 }, + { .r = 85, .g = 255, .b = 51 }, + { .r = 89, .g = 255, .b = 51 }, + { .r = 94, .g = 255, .b = 51 }, + { .r = 99, .g = 255, .b = 51 }, + { .r = 104, .g = 255, .b = 51 }, + { .r = 109, .g = 255, .b = 51 }, + { .r = 113, .g = 255, .b = 51 }, + { .r = 118, .g = 255, .b = 51 }, + { .r = 123, .g = 255, .b = 51 }, + { .r = 128, .g = 255, .b = 51 }, + { .r = 133, .g = 255, .b = 51 }, + { .r = 137, .g = 255, .b = 51 }, + { .r = 142, .g = 255, .b = 51 }, + { .r = 147, .g = 255, .b = 51 }, + { .r = 152, .g = 255, .b = 51 }, + { .r = 157, .g = 255, .b = 51 }, + { .r = 161, .g = 255, .b = 51 }, + { .r = 166, .g = 255, .b = 51 }, + { .r = 171, .g = 255, .b = 51 }, + { .r = 176, .g = 255, .b = 51 }, + { .r = 181, .g = 255, .b = 51 }, + { .r = 185, .g = 255, .b = 51 }, + { .r = 190, .g = 255, .b = 51 }, + { .r = 195, .g = 255, .b = 51 }, + { .r = 200, .g = 255, .b = 51 }, + { .r = 205, .g = 255, .b = 51 }, + { .r = 209, .g = 255, .b = 51 }, + { .r = 214, .g = 255, .b = 51 }, + { .r = 219, .g = 255, .b = 51 }, + { .r = 224, .g = 255, .b = 51 }, + { .r = 229, .g = 255, .b = 51 }, + { .r = 233, .g = 255, .b = 51 }, + { .r = 238, .g = 255, .b = 51 }, + { .r = 243, .g = 255, .b = 51 }, + { .r = 248, .g = 255, .b = 51 }, + { .r = 253, .g = 255, .b = 51 }, + { .r = 255, .g = 253, .b = 51 }, + { .r = 255, .g = 248, .b = 51 }, + { .r = 255, .g = 243, .b = 51 }, + { .r = 255, .g = 238, .b = 51 }, + { .r = 255, .g = 233, .b = 51 }, + { .r = 255, .g = 229, .b = 51 }, + { .r = 255, .g = 224, .b = 51 }, + { .r = 255, .g = 219, .b = 51 }, + { .r = 255, .g = 214, .b = 51 }, + { .r = 255, .g = 209, .b = 51 }, + { .r = 255, .g = 205, .b = 51 }, + { .r = 255, .g = 200, .b = 51 }, + { .r = 255, .g = 195, .b = 51 }, + { .r = 255, .g = 190, .b = 51 }, + { .r = 255, .g = 185, .b = 51 }, + { .r = 255, .g = 181, .b = 51 }, + { .r = 255, .g = 176, .b = 51 }, + { .r = 255, .g = 171, .b = 51 }, + { .r = 255, .g = 166, .b = 51 }, + { .r = 255, .g = 161, .b = 51 }, + { .r = 255, .g = 157, .b = 51 }, + { .r = 255, .g = 152, .b = 51 }, + { .r = 255, .g = 147, .b = 51 }, + { .r = 255, .g = 142, .b = 51 }, + { .r = 255, .g = 137, .b = 51 }, + { .r = 255, .g = 133, .b = 51 }, + { .r = 255, .g = 128, .b = 51 }, + { .r = 255, .g = 123, .b = 51 }, + { .r = 255, .g = 118, .b = 51 }, + { .r = 255, .g = 113, .b = 51 }, + { .r = 255, .g = 109, .b = 51 }, + { .r = 255, .g = 104, .b = 51 }, + { .r = 255, .g = 99, .b = 51 }, + { .r = 255, .g = 94, .b = 51 }, + { .r = 255, .g = 89, .b = 51 }, + { .r = 255, .g = 85, .b = 51 }, + { .r = 255, .g = 80, .b = 51 }, + { .r = 255, .g = 75, .b = 51 }, + { .r = 255, .g = 70, .b = 51 }, + { .r = 255, .g = 65, .b = 51 }, + { .r = 255, .g = 61, .b = 51 }, + { .r = 255, .g = 56, .b = 51 }, +}; + +LED_Colour_t Animation_GetColour(unsigned int step, unsigned int brightness) +{ + const unsigned int lut_size = sizeof(Animation_ColourLUT) + / sizeof(LED_Colour_t); + + unsigned int index = step * lut_size / ANIMATION_STEPS; + + LED_Colour_t colour = Animation_ColourLUT[index]; + + colour.r = ((unsigned int)colour.r * brightness) + >> ANIMATION_BRIGHTNESS_BITS; + colour.g = ((unsigned int)colour.g * brightness) + >> ANIMATION_BRIGHTNESS_BITS; + colour.b = ((unsigned int)colour.b * brightness) + >> ANIMATION_BRIGHTNESS_BITS; + + return colour; +} + +void Animation_DrawGradient(unsigned int step_bottom, unsigned int step_top, + unsigned int brightness) +{ + for(int i = 0; i < LED_COUNT; i++) + { + unsigned int step = ((LED_COUNT - 1 - i) * step_bottom + i * step_top) + / (LED_COUNT - 1); + LED_PixelData[Animation_LEDOrder[i]] = Animation_GetColour(step, + brightness); + } +} + +void Animation_Poll(void) +{ + if(!LED_FrameFlag) + { + return; + } + LED_FrameFlag = false; + Animation_DrawGradient(60000, 50000, + ANIMATION_MAX_BRIGHTNESS * LightSensor_RelativeBrightness); + LED_Commit(); +} \ No newline at end of file diff --git a/src/animation.h b/src/animation.h index e3f28fc..7b28abb 100644 --- a/src/animation.h +++ b/src/animation.h @@ -2,4 +2,12 @@ #include "led.h" +#define ANIMATION_STEPS 65535 +#define ANIMATION_BRIGHTNESS_BITS \ + 16 +#define ANIMATION_MAX_BRIGHTNESS \ + (1 << ANIMATION_BRIGHTNESS_BITS) + extern const unsigned int Animation_LEDOrder[LED_COUNT]; + +void Animation_Poll(void); \ No newline at end of file diff --git a/src/main.c b/src/main.c index 781c397..9c10a4a 100644 --- a/src/main.c +++ b/src/main.c @@ -13,64 +13,11 @@ int main(void) LED_Init(); - unsigned int counter = 0; - const unsigned int blink_period = 1000; - const unsigned int group_size = 6; while(1) { __WFI(); LightSensor_Poll(); - - if(LED_FrameFlag) - { - memset(LED_PixelData, 0, sizeof(LED_PixelData)); - - for(unsigned int i = 0; i < LED_COUNT; i++) - { - uint8_t brightness = 0; - if((counter / blink_period) <= (i % group_size)) - { - if(counter / (blink_period / 2) % 2) - { - brightness = 30; - } - } - - switch(i / group_size) - { - case 0: - LED_PixelData[i].r = brightness; - break; - case 1: - LED_PixelData[i].g = brightness; - break; - case 2: - LED_PixelData[i].b = brightness; - break; - case 3: - LED_PixelData[i].r = brightness; - LED_PixelData[i].g = brightness; - break; - case 4: - LED_PixelData[i].g = brightness; - LED_PixelData[i].b = brightness; - break; - case 5: - LED_PixelData[i].b = brightness; - LED_PixelData[i].r = brightness; - break; - } - - counter++; - if(counter > blink_period * (group_size + 2)) - { - counter = 0; - } - } - - LED_FrameFlag = false; - LED_Commit(); - } + Animation_Poll(); } return 0; diff --git a/src/main.h b/src/main.h index 48ce191..3b978d4 100644 --- a/src/main.h +++ b/src/main.h @@ -6,6 +6,7 @@ #include "buildid.h" #include "led.h" #include "light_sensor.h" +#include "animation.h" int main(void);