5 Commits

Author SHA1 Message Date
d9769c6b28 other button to start config mode 2024-05-19 21:47:31 +02:00
d9fd18d799 color cleanup and brightness 2024-05-19 21:42:39 +02:00
7894359f30 flashcolor and highscore config done 2024-05-19 20:46:00 +02:00
4cb0a10617 colors 2024-05-18 23:11:00 +02:00
a92a3beb96 more colors 2024-05-18 20:38:54 +02:00
9 changed files with 151 additions and 69 deletions

View File

@ -20,10 +20,6 @@ static uint8_t buttonsMoveLeftPressed() {
return res; return res;
} }
bool isConfigMode() {
return (P2IN & BIT4);
}
bool buttonsConfig1Pressed() { bool buttonsConfig1Pressed() {
return buttonsMoveLeftPressed(); return buttonsMoveLeftPressed();
} }
@ -69,6 +65,11 @@ static uint8_t buttonsMoveDownPressed() {
return P2IN & BIT2; return P2IN & BIT2;
} }
bool isConfigMode() {
return (P2IN & BIT2);
}
void buttonsExec(void *handle) { void buttonsExec(void *handle) {
static uint32_t unmuteTimestamp; static uint32_t unmuteTimestamp;
uint32_t currentTimestamp = getSeconds(); uint32_t currentTimestamp = getSeconds();

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

@ -5,57 +5,83 @@
#include "scheduler.h" #include "scheduler.h"
#include "buttons.h" #include "buttons.h"
#include "eeprom.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 bool configChanged = false;
static void configHandleFlash() { static void configHandleFlash() {
canvasSetPixel(0, 1, eepromReadFlashColor());
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);
displaySetValue(color);
eepromSetFlashColor(color); eepromSetFlashColor(color);
} }
} }
static void configHandleResetHighScore() { static void configHandleResetHighScore() {
displaySetValue(eepromReadHighScore());
if (buttonsConfig2Pressed()) {
configChanged = true;
eepromSetHighScore(0);
}
} }
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;
static uint8_t lastConfigState = 255;
if (configState != lastConfigState) {
lastConfigState = configState;
miniCanvasClear();
canvasClear();
miniCanvasSetPixel(configState, 0, _red);
}
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;
} }
canvasClear();
canvasSetPixel(configState, 0, _red);
} }
configHandler[configState](); configHandler[configState]();
if (configChanged) { if (configChanged) {
canvasSetPixel(0, 2, _red); miniCanvasSetPixel(0, 2, _red);
if (buttonsConfig4Pressed()) { if (buttonsConfig4Pressed()) {
eepromCommit(); eepromCommit();
configChanged = false; configChanged = false;
} }
} else { } else {
canvasSetPixel(0, 2, _green); miniCanvasSetPixel(0, 2, _green);
} }
canvasShow(); canvasShow();
} }

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,40 +1,55 @@
#include "colors.h" #include "colors.h"
#define DIMM_FACTOR 5
.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
colors: colors:
.global colors .global colors
;; red, green, blue, padding ;; red, green, blue, padding
off: .byte 0x00, 0x00, 0x00, 0 ;; off
.byte 0x00, 0x00, 0x00, 0 ;; off
blue: .byte 0x00>>5, 0x00>>5, 0xff>>5, 0 ;; blue
.byte 0x00>>DIMM_FACTOR, 0x00>>DIMM_FACTOR, 0xff>>DIMM_FACTOR, 0 .byte 0x00>>5, 0xff>>5, 0x00>>5, 0 ;; green
green: .byte 0xff>>5, 0x80>>5, 0x00>>5, 0 ;; orange
.byte 0x00>>DIMM_FACTOR, 0xff>>DIMM_FACTOR, 0x00>>DIMM_FACTOR, 0 .byte 0x80>>5, 0x00>>5, 0xff>>5, 0 ;; violet
orange: .byte 0x00>>5, 0xff>>5, 0xff>>5, 0 ;; cyan
.byte 0xff>>DIMM_FACTOR, 0x80>>DIMM_FACTOR, 0x00>>DIMM_FACTOR, 0 .byte 0xff>>5, 0xff>>5, 0x00>>5, 0 ;; yellow
rose: .byte 0xff>>5, 0x00>>5, 0x00>>5, 0 ;; red
.byte 0xff>>DIMM_FACTOR, 0x00>>DIMM_FACTOR, 0x80>>DIMM_FACTOR, 0 .byte 0xff>>5, 0xff>>5, 0xff>>5, 0 ;; white
magenta:
.byte 0xff>>DIMM_FACTOR, 0x00>>DIMM_FACTOR, 0xff>>DIMM_FACTOR, 0 .byte 0x00>>4, 0x00>>4, 0xff>>4, 0 ;; blue
violet: .byte 0x00>>4, 0xff>>4, 0x00>>4, 0 ;; green
.byte 0x80>>DIMM_FACTOR, 0x00>>DIMM_FACTOR, 0xff>>DIMM_FACTOR, 0 .byte 0xff>>4, 0x80>>4, 0x00>>4, 0 ;; orange
azure: .byte 0x80>>4, 0x00>>4, 0xff>>4, 0 ;; violet
.byte 0x00>>DIMM_FACTOR, 0x80>>DIMM_FACTOR, 0xff>>DIMM_FACTOR, 0 .byte 0x00>>4, 0xff>>4, 0xff>>4, 0 ;; cyan
cyan: .byte 0xff>>4, 0xff>>4, 0x00>>4, 0 ;; yellow
.byte 0x00>>DIMM_FACTOR, 0xff>>DIMM_FACTOR, 0xff>>DIMM_FACTOR, 0 .byte 0xff>>4, 0x00>>4, 0x00>>4, 0 ;; red
springgreen: .byte 0xff>>4, 0xff>>4, 0xff>>4, 0 ;; white
.byte 0x00>>DIMM_FACTOR, 0xff>>DIMM_FACTOR, 0x80>>DIMM_FACTOR, 0
chartreuse: .byte 0x00>>3, 0x00>>3, 0xff>>3, 0 ;; blue
.byte 0x80>>DIMM_FACTOR, 0xff>>DIMM_FACTOR, 0x00>>DIMM_FACTOR, 0 .byte 0x00>>3, 0xff>>3, 0x00>>3, 0 ;; green
yellow: .byte 0xff>>3, 0x80>>3, 0x00>>3, 0 ;; orange
.byte 0xff>>DIMM_FACTOR, 0xff>>DIMM_FACTOR, 0x00>>DIMM_FACTOR, 0 .byte 0x80>>3, 0x00>>3, 0xff>>3, 0 ;; violet
white: .byte 0x00>>3, 0xff>>3, 0xff>>3, 0 ;; cyan
.byte 0xff>>DIMM_FACTOR, 0xff>>DIMM_FACTOR, 0xff>>DIMM_FACTOR, 0 .byte 0xff>>3, 0xff>>3, 0x00>>3, 0 ;; yellow
red: .byte 0xff>>3, 0x00>>3, 0x00>>3, 0 ;; red
.byte 0xff>>DIMM_FACTOR, 0x00>>DIMM_FACTOR, 0x00>>DIMM_FACTOR, 0 .byte 0xff>>3, 0xff>>3, 0xff>>3, 0 ;; white
flash:
.byte 0xff, 0xff, 0xff, 0 .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

View File

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