From d9fd18d799127cf7a2329de52f65ba17834f6910 Mon Sep 17 00:00:00 2001 From: Wolfgang Hottgenroth Date: Sun, 19 May 2024 21:42:39 +0200 Subject: [PATCH] color cleanup and brightness --- game-ctrl/canvas.c | 8 +++-- game-ctrl/config.c | 34 ++++++++++++------ game-ctrl/eeprom.c | 12 ++++++- game-ctrl/eeprom.h | 2 ++ game-ctrl/shapes.c | 25 +++++++++++++ game-ctrl/shapes.h | 1 + rgb-driver/colors.S | 86 ++++++++++++++++++++++++--------------------- rgb-driver/colors.h | 55 +++++++---------------------- 8 files changed, 126 insertions(+), 97 deletions(-) diff --git a/game-ctrl/canvas.c b/game-ctrl/canvas.c index 561e9b0..dea272a 100644 --- a/game-ctrl/canvas.c +++ b/game-ctrl/canvas.c @@ -5,6 +5,8 @@ #include "canvas.h" #include "spi.h" +#include "eeprom.h" +#include "../rgb-driver/colors.h" static uint8_t canvasStorage[CANVAS_WIDTH * CANVAS_HEIGHT]; @@ -22,6 +24,8 @@ const canvas_t miniCanvas = { }; void canvasShow() { + uint8_t brightness_offset = _brightness_offset * eepromReadBrightness(); + // wait for signal waiting for data while (!(P1IN & BIT3)); @@ -31,14 +35,14 @@ void canvasShow() { if ((*((canvas.canvas)+i) & 0x80) != 0) { *((canvas.canvas)+i) &= ~0x80; spiSendOctet(i); - spiSendOctet(*((canvas.canvas)+i)); + spiSendOctet((*((canvas.canvas)+i) == 0) ? 0 : (*((canvas.canvas)+i) + brightness_offset)); } } for (uint8_t i = 0; i < (MINI_CANVAS_WIDTH*MINI_CANVAS_HEIGHT); i++) { if ((*((miniCanvas.canvas)+i) & 0x80) != 0) { *((miniCanvas.canvas)+i) &= ~0x80; spiSendOctet(i + (CANVAS_HEIGHT*CANVAS_WIDTH)); - spiSendOctet(*((miniCanvas.canvas)+i)); + spiSendOctet((*((miniCanvas.canvas)+i) == 0) ? 0 : (*((miniCanvas.canvas)+i) + brightness_offset)); } } spiSendOctet(0xfe); diff --git a/game-ctrl/config.c b/game-ctrl/config.c index f0cb167..76bf159 100644 --- a/game-ctrl/config.c +++ b/game-ctrl/config.c @@ -6,17 +6,16 @@ #include "buttons.h" #include "eeprom.h" #include "display.h" +#include "shapes.h" -typedef enum { e_Config_Flash, e_Config_ResetHighscore, e_Config_End } t_ConfigState; - static bool configChanged = false; static void configHandleFlash() { if (buttonsConfig2Pressed()) { configChanged = true; uint8_t color = eepromReadFlashColor() + 1; - if (color == _color_end) { + if (color > _color_end) { color = 0; } canvasFillRow(CANVAS_HEIGHT-1, color); @@ -34,33 +33,48 @@ static void configHandleResetHighScore() { } } -void (*configHandler[])(void) = { configHandleFlash, configHandleResetHighScore }; +static void configHandleBrightness() { + displaySetValue(eepromReadBrightness()); + + if (buttonsConfig2Pressed()) { + configChanged = true; + uint8_t brightness = eepromReadBrightness() + 1; + if (brightness > _brightness_shifts) { + brightness = 0; + } + eepromSetBrightness(brightness); + + stoneDrawConfigPattern(); + } +} + +void (*configHandler[])(void) = { configHandleFlash, configHandleResetHighScore, configHandleBrightness }; void configExec(void *handle) { - static t_ConfigState configState = e_Config_Flash; + static uint8_t configState = 0; if (buttonsConfig1Pressed()) { configState += 1; - if (configState == e_Config_End) { - configState = e_Config_Flash; + if (configState >= sizeof(configHandler) / sizeof(configHandler[0])) { + configState = 0; } miniCanvasClear(); canvasClear(); - miniCanvasSetPixel(configState, 0, _medium_red); + miniCanvasSetPixel(configState, 0, _red); } configHandler[configState](); if (configChanged) { - miniCanvasSetPixel(0, 2, _medium_red); + miniCanvasSetPixel(0, 2, _red); if (buttonsConfig4Pressed()) { eepromCommit(); configChanged = false; } } else { - miniCanvasSetPixel(0, 2, _medium_green); + miniCanvasSetPixel(0, 2, _green); } diff --git a/game-ctrl/eeprom.c b/game-ctrl/eeprom.c index d2b9982..1c8adf8 100644 --- a/game-ctrl/eeprom.c +++ b/game-ctrl/eeprom.c @@ -3,7 +3,7 @@ #include "spi.h" -#define MAGIC 0xafff +#define MAGIC 0xb000 #define HIGHSCORE_ADDR 0x00 #define DUMMY 0x00 #define CMD_READ 0b00000011 @@ -16,6 +16,7 @@ typedef struct { uint16_t magic; uint16_t highScore; uint8_t flashColor; + uint8_t brightness; } t_configBlock; typedef union { @@ -59,6 +60,7 @@ void eepromInit() { buf.v.magic = MAGIC; buf.v.highScore = 0; buf.v.flashColor = 0; + buf.v.brightness = 0; writeBuf(); } } @@ -84,3 +86,11 @@ void eepromSetFlashColor(uint8_t v) { buf.v.flashColor = v; } +uint8_t eepromReadBrightness() { + return buf.v.brightness; +} + +void eepromSetBrightness(uint8_t v) { + buf.v.brightness = v; +} + diff --git a/game-ctrl/eeprom.h b/game-ctrl/eeprom.h index 1e1222a..dde1b9e 100644 --- a/game-ctrl/eeprom.h +++ b/game-ctrl/eeprom.h @@ -9,6 +9,8 @@ uint16_t eepromReadHighScore(); void eepromSetHighScore(uint16_t v); uint8_t eepromReadFlashColor(); void eepromSetFlashColor(uint8_t v); +uint8_t eepromReadBrightness(); +void eepromSetBrightness(uint8_t v); void eepromCommit(); diff --git a/game-ctrl/shapes.c b/game-ctrl/shapes.c index 9be8844..1e8e503 100644 --- a/game-ctrl/shapes.c +++ b/game-ctrl/shapes.c @@ -483,6 +483,31 @@ uint8_t stoneDraw() { return res; } +static void stoneJustDraw(uint8_t x, uint8_t y, shape_t shape) { + canvasSetPixel(x + motions[shape].draw[0].x, + y + motions[shape].draw[0].y, + motions[shape].color); + canvasSetPixel(x + motions[shape].draw[1].x, + y + motions[shape].draw[1].y, + motions[shape].color); + canvasSetPixel(x + motions[shape].draw[2].x, + y + motions[shape].draw[2].y, + motions[shape].color); + canvasSetPixel(x + motions[shape].draw[3].x, + y + motions[shape].draw[3].y, + motions[shape].color); +} + +void stoneDrawConfigPattern() { + stoneJustDraw(1, 0, e_I); + stoneJustDraw(3, 4, e_O); + stoneJustDraw(4, 7, e_T); + stoneJustDraw(5, 10, e_Z); + stoneJustDraw(1, 12, e_S); + stoneJustDraw(5, 15, e_L); + stoneJustDraw(1, 17, e_J); +} + uint8_t stoneMoveDown() { return move(e_MoveDown); } diff --git a/game-ctrl/shapes.h b/game-ctrl/shapes.h index a34e1cb..4381632 100644 --- a/game-ctrl/shapes.h +++ b/game-ctrl/shapes.h @@ -14,5 +14,6 @@ uint8_t stoneMoveRight(); uint8_t stoneRotateLeft(); uint8_t stoneRotateRight(); +void stoneDrawConfigPattern(); #endif // _SHAPES_H_ diff --git a/rgb-driver/colors.S b/rgb-driver/colors.S index ad591dc..e171f1a 100644 --- a/rgb-driver/colors.S +++ b/rgb-driver/colors.S @@ -1,7 +1,5 @@ #include "colors.h" -#define DF 5 -#define DF_M 3 .section ".rodata","a" ;; color definitions according to ;; https://learn.sparkfun.com/tutorials/lilypad-protosnap-plus-activity-guide/3-custom-color-mixing @@ -9,43 +7,49 @@ colors: .global colors ;; red, green, blue, padding .byte 0x00, 0x00, 0x00, 0 ;; off - .byte 0x00>>DF, 0x00>>DF, 0xff>>DF, 0 ;; blue - .byte 0x00>>DF, 0xff>>DF, 0x00>>DF, 0 ;; green - .byte 0xff>>DF, 0x80>>DF, 0x00>>DF, 0 ;; orange - .byte 0xff>>DF, 0x00>>DF, 0x80>>DF, 0 ;; rose - .byte 0xff>>DF, 0x00>>DF, 0xff>>DF, 0 ;; magenta - .byte 0x80>>DF, 0x00>>DF, 0xff>>DF, 0 ;; violet - .byte 0x00>>DF, 0x80>>DF, 0xff>>DF, 0 ;; azure - .byte 0x00>>DF, 0xff>>DF, 0xff>>DF, 0 ;; cyan - .byte 0x00>>DF, 0xff>>DF, 0x80>>DF, 0 ;; springgreen - .byte 0x80>>DF, 0xff>>DF, 0x00>>DF, 0 ;; chartreuse - .byte 0xff>>DF, 0xff>>DF, 0x00>>DF, 0 ;; yellow - .byte 0xff>>DF, 0xff>>DF, 0xff>>DF, 0 ;; white - .byte 0xff>>DF, 0x00>>DF, 0x00>>DF, 0 ;; red - .byte 0x00>>DF_M, 0x00>>DF_M, 0xff>>DF_M, 0 ;; blue - .byte 0x00>>DF_M, 0xff>>DF_M, 0x00>>DF_M, 0 ;; green - .byte 0xff>>DF_M, 0x80>>DF_M, 0x00>>DF_M, 0 ;; orange - .byte 0xff>>DF_M, 0x00>>DF_M, 0x80>>DF_M, 0 ;; rose - .byte 0xff>>DF_M, 0x00>>DF_M, 0xff>>DF_M, 0 ;; magenta - .byte 0x80>>DF_M, 0x00>>DF_M, 0xff>>DF_M, 0 ;; violet - .byte 0x00>>DF_M, 0x80>>DF_M, 0xff>>DF_M, 0 ;; azure - .byte 0x00>>DF_M, 0xff>>DF_M, 0xff>>DF_M, 0 ;; cyan - .byte 0x00>>DF_M, 0xff>>DF_M, 0x80>>DF_M, 0 ;; springgreen - .byte 0x80>>DF_M, 0xff>>DF_M, 0x00>>DF_M, 0 ;; chartreuse - .byte 0xff>>DF_M, 0xff>>DF_M, 0x00>>DF_M, 0 ;; yellow - .byte 0xff>>DF_M, 0xff>>DF_M, 0xff>>DF_M, 0 ;; white - .byte 0xff>>DF_M, 0x00>>DF_M, 0x00>>DF_M, 0 ;; red - .byte 0x00, 0x00, 0xff, 0 ;; blue - .byte 0x00, 0xff, 0x00, 0 ;; green - .byte 0xff, 0x80, 0x00, 0 ;; orange - .byte 0xff, 0x00, 0x80, 0 ;; rose - .byte 0xff, 0x00, 0xff, 0 ;; magenta - .byte 0x80, 0x00, 0xff, 0 ;; violet - .byte 0x00, 0x80, 0xff, 0 ;; azure - .byte 0x00, 0xff, 0xff, 0 ;; cyan - .byte 0x00, 0xff, 0x80, 0 ;; springgreen - .byte 0x80, 0xff, 0x00, 0 ;; chartreuse - .byte 0xff, 0xff, 0x00, 0 ;; yellow - .byte 0xff, 0xff, 0xff, 0 ;; white - .byte 0xff, 0x00, 0x00, 0 ;; red + + .byte 0x00>>5, 0x00>>5, 0xff>>5, 0 ;; blue + .byte 0x00>>5, 0xff>>5, 0x00>>5, 0 ;; green + .byte 0xff>>5, 0x80>>5, 0x00>>5, 0 ;; orange + .byte 0x80>>5, 0x00>>5, 0xff>>5, 0 ;; violet + .byte 0x00>>5, 0xff>>5, 0xff>>5, 0 ;; cyan + .byte 0xff>>5, 0xff>>5, 0x00>>5, 0 ;; yellow + .byte 0xff>>5, 0x00>>5, 0x00>>5, 0 ;; red + .byte 0xff>>5, 0xff>>5, 0xff>>5, 0 ;; white + + .byte 0x00>>4, 0x00>>4, 0xff>>4, 0 ;; blue + .byte 0x00>>4, 0xff>>4, 0x00>>4, 0 ;; green + .byte 0xff>>4, 0x80>>4, 0x00>>4, 0 ;; orange + .byte 0x80>>4, 0x00>>4, 0xff>>4, 0 ;; violet + .byte 0x00>>4, 0xff>>4, 0xff>>4, 0 ;; cyan + .byte 0xff>>4, 0xff>>4, 0x00>>4, 0 ;; yellow + .byte 0xff>>4, 0x00>>4, 0x00>>4, 0 ;; red + .byte 0xff>>4, 0xff>>4, 0xff>>4, 0 ;; white + + .byte 0x00>>3, 0x00>>3, 0xff>>3, 0 ;; blue + .byte 0x00>>3, 0xff>>3, 0x00>>3, 0 ;; green + .byte 0xff>>3, 0x80>>3, 0x00>>3, 0 ;; orange + .byte 0x80>>3, 0x00>>3, 0xff>>3, 0 ;; violet + .byte 0x00>>3, 0xff>>3, 0xff>>3, 0 ;; cyan + .byte 0xff>>3, 0xff>>3, 0x00>>3, 0 ;; yellow + .byte 0xff>>3, 0x00>>3, 0x00>>3, 0 ;; red + .byte 0xff>>3, 0xff>>3, 0xff>>3, 0 ;; white + + .byte 0x00>>2, 0x00>>2, 0xff>>2, 0 ;; blue + .byte 0x00>>2, 0xff>>2, 0x00>>2, 0 ;; green + .byte 0xff>>2, 0x80>>2, 0x00>>2, 0 ;; orange + .byte 0x80>>2, 0x00>>2, 0xff>>2, 0 ;; violet + .byte 0x00>>2, 0xff>>2, 0xff>>2, 0 ;; cyan + .byte 0xff>>2, 0xff>>2, 0x00>>2, 0 ;; yellow + .byte 0xff>>2, 0x00>>2, 0x00>>2, 0 ;; red + .byte 0xff>>2, 0xff>>2, 0xff>>2, 0 ;; white + + .byte 0x00>>1, 0x00>>1, 0xff>>1, 0 ;; blue + .byte 0x00>>1, 0xff>>1, 0x00>>1, 0 ;; green + .byte 0xff>>1, 0x80>>1, 0x00>>1, 0 ;; orange + .byte 0x80>>1, 0x00>>1, 0xff>>1, 0 ;; violet + .byte 0x00>>1, 0xff>>1, 0xff>>1, 0 ;; cyan + .byte 0xff>>1, 0xff>>1, 0x00>>1, 0 ;; yellow + .byte 0xff>>1, 0x00>>1, 0x00>>1, 0 ;; red + .byte 0xff>>1, 0xff>>1, 0xff>>1, 0 ;; white diff --git a/rgb-driver/colors.h b/rgb-driver/colors.h index e516866..42f4452 100644 --- a/rgb-driver/colors.h +++ b/rgb-driver/colors.h @@ -2,51 +2,20 @@ #define _COLORS_H_ -#define _off 0x00 +#define _off 0 -#define _blue 0x01 -#define _green 0x02 -#define _orange 0x03 -#define _rose 0x04 -#define _magenta 0x05 -#define _violet 0x06 -#define _azure 0x07 -#define _cyan 0x08 -#define _springgreen 0x09 -#define _chartreuse 0x0a -#define _yellow 0x0b -#define _white 0x0c -#define _red 0x0d +#define _blue 1 +#define _green 2 +#define _orange 3 +#define _violet 4 +#define _cyan 5 +#define _yellow 6 +#define _red 7 +#define _white 8 -#define _medium_blue 0x0e -#define _medium_green 0x0f -#define _medium_orange 0x10 -#define _medium_rose 0x11 -#define _medium_magenta 0x12 -#define _medium_violet 0x13 -#define _medium_azure 0x14 -#define _medium_cyan 0x15 -#define _medium_springgreen 0x16 -#define _medium_chartreuse 0x17 -#define _medium_yellow 0x18 -#define _medium_white 0x19 -#define _medium_red 0x1a - -#define _dazzling_blue 0x1b -#define _dazzling_green 0x1c -#define _dazzling_orange 0x1d -#define _dazzling_rose 0x1e -#define _dazzling_magenta 0x1f -#define _dazzling_violet 0x20 -#define _dazzling_azure 0x21 -#define _dazzling_cyan 0x22 -#define _dazzling_springgreen 0x23 -#define _dazzling_chartreuse 0x24 -#define _dazzling_yellow 0x25 -#define _dazzling_white 0x26 -#define _dazzling_red 0x27 - -#define _color_end 0x28 +#define _brightness_offset 8 +#define _brightness_shifts 5 +#define _color_end (_brightness_offset * _brightness_shifts) #endif