color cleanup and brightness

This commit is contained in:
Wolfgang Hottgenroth 2024-05-19 21:42:39 +02:00
parent 7894359f30
commit d9fd18d799
8 changed files with 126 additions and 97 deletions

View File

@ -5,6 +5,8 @@
#include "canvas.h" #include "canvas.h"
#include "spi.h" #include "spi.h"
#include "eeprom.h"
#include "../rgb-driver/colors.h"
static uint8_t canvasStorage[CANVAS_WIDTH * CANVAS_HEIGHT]; static uint8_t canvasStorage[CANVAS_WIDTH * CANVAS_HEIGHT];
@ -22,6 +24,8 @@ const canvas_t miniCanvas = {
}; };
void canvasShow() { void canvasShow() {
uint8_t brightness_offset = _brightness_offset * eepromReadBrightness();
// wait for signal waiting for data // wait for signal waiting for data
while (!(P1IN & BIT3)); while (!(P1IN & BIT3));
@ -31,14 +35,14 @@ void canvasShow() {
if ((*((canvas.canvas)+i) & 0x80) != 0) { if ((*((canvas.canvas)+i) & 0x80) != 0) {
*((canvas.canvas)+i) &= ~0x80; *((canvas.canvas)+i) &= ~0x80;
spiSendOctet(i); 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++) { for (uint8_t i = 0; i < (MINI_CANVAS_WIDTH*MINI_CANVAS_HEIGHT); i++) {
if ((*((miniCanvas.canvas)+i) & 0x80) != 0) { if ((*((miniCanvas.canvas)+i) & 0x80) != 0) {
*((miniCanvas.canvas)+i) &= ~0x80; *((miniCanvas.canvas)+i) &= ~0x80;
spiSendOctet(i + (CANVAS_HEIGHT*CANVAS_WIDTH)); spiSendOctet(i + (CANVAS_HEIGHT*CANVAS_WIDTH));
spiSendOctet(*((miniCanvas.canvas)+i)); spiSendOctet((*((miniCanvas.canvas)+i) == 0) ? 0 : (*((miniCanvas.canvas)+i) + brightness_offset));
} }
} }
spiSendOctet(0xfe); spiSendOctet(0xfe);

View File

@ -6,17 +6,16 @@
#include "buttons.h" #include "buttons.h"
#include "eeprom.h" #include "eeprom.h"
#include "display.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 bool configChanged = false;
static void configHandleFlash() { static void configHandleFlash() {
if (buttonsConfig2Pressed()) { if (buttonsConfig2Pressed()) {
configChanged = true; configChanged = true;
uint8_t color = eepromReadFlashColor() + 1; uint8_t color = eepromReadFlashColor() + 1;
if (color == _color_end) { if (color > _color_end) {
color = 0; color = 0;
} }
canvasFillRow(CANVAS_HEIGHT-1, color); 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) { void configExec(void *handle) {
static t_ConfigState configState = e_Config_Flash; static uint8_t configState = 0;
if (buttonsConfig1Pressed()) { if (buttonsConfig1Pressed()) {
configState += 1; configState += 1;
if (configState == e_Config_End) { if (configState >= sizeof(configHandler) / sizeof(configHandler[0])) {
configState = e_Config_Flash; configState = 0;
} }
miniCanvasClear(); miniCanvasClear();
canvasClear(); canvasClear();
miniCanvasSetPixel(configState, 0, _medium_red); miniCanvasSetPixel(configState, 0, _red);
} }
configHandler[configState](); configHandler[configState]();
if (configChanged) { if (configChanged) {
miniCanvasSetPixel(0, 2, _medium_red); miniCanvasSetPixel(0, 2, _red);
if (buttonsConfig4Pressed()) { if (buttonsConfig4Pressed()) {
eepromCommit(); eepromCommit();
configChanged = false; configChanged = false;
} }
} else { } else {
miniCanvasSetPixel(0, 2, _medium_green); miniCanvasSetPixel(0, 2, _green);
} }

View File

@ -3,7 +3,7 @@
#include "spi.h" #include "spi.h"
#define MAGIC 0xafff #define MAGIC 0xb000
#define HIGHSCORE_ADDR 0x00 #define HIGHSCORE_ADDR 0x00
#define DUMMY 0x00 #define DUMMY 0x00
#define CMD_READ 0b00000011 #define CMD_READ 0b00000011
@ -16,6 +16,7 @@ typedef struct {
uint16_t magic; uint16_t magic;
uint16_t highScore; uint16_t highScore;
uint8_t flashColor; uint8_t flashColor;
uint8_t brightness;
} t_configBlock; } t_configBlock;
typedef union { typedef union {
@ -59,6 +60,7 @@ void eepromInit() {
buf.v.magic = MAGIC; buf.v.magic = MAGIC;
buf.v.highScore = 0; buf.v.highScore = 0;
buf.v.flashColor = 0; buf.v.flashColor = 0;
buf.v.brightness = 0;
writeBuf(); writeBuf();
} }
} }
@ -84,3 +86,11 @@ void eepromSetFlashColor(uint8_t v) {
buf.v.flashColor = v; buf.v.flashColor = v;
} }
uint8_t eepromReadBrightness() {
return buf.v.brightness;
}
void eepromSetBrightness(uint8_t v) {
buf.v.brightness = v;
}

View File

@ -9,6 +9,8 @@ uint16_t eepromReadHighScore();
void eepromSetHighScore(uint16_t v); void eepromSetHighScore(uint16_t v);
uint8_t eepromReadFlashColor(); uint8_t eepromReadFlashColor();
void eepromSetFlashColor(uint8_t v); void eepromSetFlashColor(uint8_t v);
uint8_t eepromReadBrightness();
void eepromSetBrightness(uint8_t v);
void eepromCommit(); void eepromCommit();

View File

@ -483,6 +483,31 @@ uint8_t stoneDraw() {
return res; 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() { uint8_t stoneMoveDown() {
return move(e_MoveDown); return move(e_MoveDown);
} }

View File

@ -14,5 +14,6 @@ uint8_t stoneMoveRight();
uint8_t stoneRotateLeft(); uint8_t stoneRotateLeft();
uint8_t stoneRotateRight(); uint8_t stoneRotateRight();
void stoneDrawConfigPattern();
#endif // _SHAPES_H_ #endif // _SHAPES_H_

View File

@ -1,7 +1,5 @@
#include "colors.h" #include "colors.h"
#define DF 5
#define DF_M 3
.section ".rodata","a" .section ".rodata","a"
;; color definitions according to ;; color definitions according to
;; https://learn.sparkfun.com/tutorials/lilypad-protosnap-plus-activity-guide/3-custom-color-mixing ;; https://learn.sparkfun.com/tutorials/lilypad-protosnap-plus-activity-guide/3-custom-color-mixing
@ -9,43 +7,49 @@ colors:
.global colors .global colors
;; red, green, blue, padding ;; red, green, blue, padding
.byte 0x00, 0x00, 0x00, 0 ;; off .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 0x00>>5, 0x00>>5, 0xff>>5, 0 ;; blue
.byte 0xff>>DF, 0x80>>DF, 0x00>>DF, 0 ;; orange .byte 0x00>>5, 0xff>>5, 0x00>>5, 0 ;; green
.byte 0xff>>DF, 0x00>>DF, 0x80>>DF, 0 ;; rose .byte 0xff>>5, 0x80>>5, 0x00>>5, 0 ;; orange
.byte 0xff>>DF, 0x00>>DF, 0xff>>DF, 0 ;; magenta .byte 0x80>>5, 0x00>>5, 0xff>>5, 0 ;; violet
.byte 0x80>>DF, 0x00>>DF, 0xff>>DF, 0 ;; violet .byte 0x00>>5, 0xff>>5, 0xff>>5, 0 ;; cyan
.byte 0x00>>DF, 0x80>>DF, 0xff>>DF, 0 ;; azure .byte 0xff>>5, 0xff>>5, 0x00>>5, 0 ;; yellow
.byte 0x00>>DF, 0xff>>DF, 0xff>>DF, 0 ;; cyan .byte 0xff>>5, 0x00>>5, 0x00>>5, 0 ;; red
.byte 0x00>>DF, 0xff>>DF, 0x80>>DF, 0 ;; springgreen .byte 0xff>>5, 0xff>>5, 0xff>>5, 0 ;; white
.byte 0x80>>DF, 0xff>>DF, 0x00>>DF, 0 ;; chartreuse
.byte 0xff>>DF, 0xff>>DF, 0x00>>DF, 0 ;; yellow .byte 0x00>>4, 0x00>>4, 0xff>>4, 0 ;; blue
.byte 0xff>>DF, 0xff>>DF, 0xff>>DF, 0 ;; white .byte 0x00>>4, 0xff>>4, 0x00>>4, 0 ;; green
.byte 0xff>>DF, 0x00>>DF, 0x00>>DF, 0 ;; red .byte 0xff>>4, 0x80>>4, 0x00>>4, 0 ;; orange
.byte 0x00>>DF_M, 0x00>>DF_M, 0xff>>DF_M, 0 ;; blue .byte 0x80>>4, 0x00>>4, 0xff>>4, 0 ;; violet
.byte 0x00>>DF_M, 0xff>>DF_M, 0x00>>DF_M, 0 ;; green .byte 0x00>>4, 0xff>>4, 0xff>>4, 0 ;; cyan
.byte 0xff>>DF_M, 0x80>>DF_M, 0x00>>DF_M, 0 ;; orange .byte 0xff>>4, 0xff>>4, 0x00>>4, 0 ;; yellow
.byte 0xff>>DF_M, 0x00>>DF_M, 0x80>>DF_M, 0 ;; rose .byte 0xff>>4, 0x00>>4, 0x00>>4, 0 ;; red
.byte 0xff>>DF_M, 0x00>>DF_M, 0xff>>DF_M, 0 ;; magenta .byte 0xff>>4, 0xff>>4, 0xff>>4, 0 ;; white
.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>>3, 0x00>>3, 0xff>>3, 0 ;; blue
.byte 0x00>>DF_M, 0xff>>DF_M, 0xff>>DF_M, 0 ;; cyan .byte 0x00>>3, 0xff>>3, 0x00>>3, 0 ;; green
.byte 0x00>>DF_M, 0xff>>DF_M, 0x80>>DF_M, 0 ;; springgreen .byte 0xff>>3, 0x80>>3, 0x00>>3, 0 ;; orange
.byte 0x80>>DF_M, 0xff>>DF_M, 0x00>>DF_M, 0 ;; chartreuse .byte 0x80>>3, 0x00>>3, 0xff>>3, 0 ;; violet
.byte 0xff>>DF_M, 0xff>>DF_M, 0x00>>DF_M, 0 ;; yellow .byte 0x00>>3, 0xff>>3, 0xff>>3, 0 ;; cyan
.byte 0xff>>DF_M, 0xff>>DF_M, 0xff>>DF_M, 0 ;; white .byte 0xff>>3, 0xff>>3, 0x00>>3, 0 ;; yellow
.byte 0xff>>DF_M, 0x00>>DF_M, 0x00>>DF_M, 0 ;; red .byte 0xff>>3, 0x00>>3, 0x00>>3, 0 ;; red
.byte 0x00, 0x00, 0xff, 0 ;; blue .byte 0xff>>3, 0xff>>3, 0xff>>3, 0 ;; white
.byte 0x00, 0xff, 0x00, 0 ;; green
.byte 0xff, 0x80, 0x00, 0 ;; orange .byte 0x00>>2, 0x00>>2, 0xff>>2, 0 ;; blue
.byte 0xff, 0x00, 0x80, 0 ;; rose .byte 0x00>>2, 0xff>>2, 0x00>>2, 0 ;; green
.byte 0xff, 0x00, 0xff, 0 ;; magenta .byte 0xff>>2, 0x80>>2, 0x00>>2, 0 ;; orange
.byte 0x80, 0x00, 0xff, 0 ;; violet .byte 0x80>>2, 0x00>>2, 0xff>>2, 0 ;; violet
.byte 0x00, 0x80, 0xff, 0 ;; azure .byte 0x00>>2, 0xff>>2, 0xff>>2, 0 ;; cyan
.byte 0x00, 0xff, 0xff, 0 ;; cyan .byte 0xff>>2, 0xff>>2, 0x00>>2, 0 ;; yellow
.byte 0x00, 0xff, 0x80, 0 ;; springgreen .byte 0xff>>2, 0x00>>2, 0x00>>2, 0 ;; red
.byte 0x80, 0xff, 0x00, 0 ;; chartreuse .byte 0xff>>2, 0xff>>2, 0xff>>2, 0 ;; white
.byte 0xff, 0xff, 0x00, 0 ;; yellow
.byte 0xff, 0xff, 0xff, 0 ;; white .byte 0x00>>1, 0x00>>1, 0xff>>1, 0 ;; blue
.byte 0xff, 0x00, 0x00, 0 ;; red .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

View File

@ -2,51 +2,20 @@
#define _COLORS_H_ #define _COLORS_H_
#define _off 0x00 #define _off 0
#define _blue 0x01 #define _blue 1
#define _green 0x02 #define _green 2
#define _orange 0x03 #define _orange 3
#define _rose 0x04 #define _violet 4
#define _magenta 0x05 #define _cyan 5
#define _violet 0x06 #define _yellow 6
#define _azure 0x07 #define _red 7
#define _cyan 0x08 #define _white 8
#define _springgreen 0x09
#define _chartreuse 0x0a
#define _yellow 0x0b
#define _white 0x0c
#define _red 0x0d
#define _medium_blue 0x0e #define _brightness_offset 8
#define _medium_green 0x0f #define _brightness_shifts 5
#define _medium_orange 0x10 #define _color_end (_brightness_offset * _brightness_shifts)
#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
#endif #endif