diff --git a/game-ctrl/Makefile b/game-ctrl/Makefile index a8a67e1..52c1730 100644 --- a/game-ctrl/Makefile +++ b/game-ctrl/Makefile @@ -11,7 +11,7 @@ CFLAGS=-Wall -mmcu=$(MCU) -std=gnu99 -I $(TOOLCHAIN_PREFIX)/include -O1 -g0 LDFLAGS=-mmcu=$(MCU) -L $(TOOLCHAIN_PREFIX)/include -$(ARTIFACT).elf: main.o spi.o scheduler.o canvas.o shapes.o game.o buttons.o myrand.o display.o sound.o eeprom.o +$(ARTIFACT).elf: main.o spi.o scheduler.o canvas.o shapes.o game.o buttons.o myrand.o display.o sound.o eeprom.o config.o $(CC) -o $@ $(LDFLAGS) $^ $(OBJDUMP) -D $(ARTIFACT).elf > $(ARTIFACT).txt diff --git a/game-ctrl/buttons.c b/game-ctrl/buttons.c index c640a2e..ce48155 100644 --- a/game-ctrl/buttons.c +++ b/game-ctrl/buttons.c @@ -20,6 +20,14 @@ static uint8_t buttonsMoveLeftPressed() { return res; } +bool isConfigMode() { + return (P2IN & BIT4); +} + +bool buttonsConfig1Pressed() { + return buttonsMoveLeftPressed(); +} + static uint8_t buttonsMoveRightPressed() { static uint8_t last = 0; uint8_t current = (P2IN & BIT0); @@ -28,6 +36,10 @@ static uint8_t buttonsMoveRightPressed() { return res; } +bool buttonsConfig4Pressed() { + return buttonsMoveRightPressed(); +} + static uint8_t buttonsRotateLeftPressed() { static uint8_t last = 0; uint8_t current = (P2IN & BIT3); @@ -36,6 +48,10 @@ static uint8_t buttonsRotateLeftPressed() { return res; } +bool buttonsConfig2Pressed() { + return buttonsRotateLeftPressed(); +} + static uint8_t buttonsRotateRightPressed() { static uint8_t last = 0; uint8_t current = (P2IN & BIT1); @@ -44,6 +60,11 @@ static uint8_t buttonsRotateRightPressed() { return res; } +bool buttonsConfig3Pressed() { + return buttonsRotateRightPressed(); +} + + static uint8_t buttonsMoveDownPressed() { return P2IN & BIT2; } @@ -104,7 +125,9 @@ void buttonsExec(void *handle) { void buttonsInit() { P2DIR &= ~(BIT0|BIT1|BIT2|BIT3|BIT4); +} +void buttonsStart() { schAdd(buttonsExec, NULL, 0, 25); } diff --git a/game-ctrl/buttons.h b/game-ctrl/buttons.h index 72e9c69..8cf6ecb 100644 --- a/game-ctrl/buttons.h +++ b/game-ctrl/buttons.h @@ -4,7 +4,13 @@ #include void buttonsInit(); +void buttonsStart(); bool isGameActive(); +bool isConfigMode(); +bool buttonsConfig1Pressed(); +bool buttonsConfig2Pressed(); +bool buttonsConfig3Pressed(); +bool buttonsConfig4Pressed(); #endif // _BUTTONS_H_ diff --git a/game-ctrl/config.c b/game-ctrl/config.c new file mode 100644 index 0000000..3cb70a4 --- /dev/null +++ b/game-ctrl/config.c @@ -0,0 +1,65 @@ +#include +#include "config.h" +#include "canvas.h" +#include "../rgb-driver/colors.h" +#include "scheduler.h" +#include "buttons.h" +#include "eeprom.h" + + +typedef enum { e_Config_Flash, e_Config_ResetHighscore, e_Config_End } t_ConfigState; + +static bool configChanged = false; + +static void configHandleFlash() { + canvasSetPixel(0, 1, eepromReadFlashColor()); + + if (buttonsConfig2Pressed()) { + configChanged = true; + uint8_t color = eepromReadFlashColor() + 1; + if (color == _color_end) { + color = 0; + } + eepromSetFlashColor(color); + } +} + +static void configHandleResetHighScore() { +} + +void (*configHandler[])(void) = { configHandleFlash, configHandleResetHighScore }; + + +void configExec(void *handle) { + static t_ConfigState configState = e_Config_Flash; + + if (buttonsConfig1Pressed()) { + configState += 1; + if (configState == e_Config_End) { + configState = e_Config_Flash; + } + canvasClear(); + + canvasSetPixel(configState, 0, _red); + } + + configHandler[configState](); + + if (configChanged) { + canvasSetPixel(0, 2, _red); + if (buttonsConfig4Pressed()) { + eepromCommit(); + configChanged = false; + } + } else { + canvasSetPixel(0, 2, _green); + } + + + canvasShow(); +} + + +void configInit() { + schAdd(configExec, NULL, 0, 25); +} diff --git a/game-ctrl/config.h b/game-ctrl/config.h new file mode 100644 index 0000000..edd8067 --- /dev/null +++ b/game-ctrl/config.h @@ -0,0 +1,8 @@ +#ifndef _CONFIG_H_ +#define _CONFIG_H_ + + +void configInit(); + + +#endif // _CONFIG_H_ diff --git a/game-ctrl/eeprom.c b/game-ctrl/eeprom.c index 605cd97..d2b9982 100644 --- a/game-ctrl/eeprom.c +++ b/game-ctrl/eeprom.c @@ -3,7 +3,7 @@ #include "spi.h" -#define MAGIC 0xaffe +#define MAGIC 0xafff #define HIGHSCORE_ADDR 0x00 #define DUMMY 0x00 #define CMD_READ 0b00000011 @@ -12,12 +12,15 @@ #define CMD_WREN 0b00000110 +typedef struct { + uint16_t magic; + uint16_t highScore; + uint8_t flashColor; +} t_configBlock; + typedef union { - uint8_t buffer[4]; - struct { - uint16_t magic; - uint16_t highScore; - } v; + t_configBlock v; + uint8_t buffer[sizeof(t_configBlock)]; } eepromBuf_t; eepromBuf_t buf; @@ -30,10 +33,9 @@ static void writeBuf() { spiSendBegin(e_SPI_EEPROM); spiSendOctet(CMD_WRITE); spiSendOctet(HIGHSCORE_ADDR); - spiSendOctet(buf.buffer[0]); - spiSendOctet(buf.buffer[1]); - spiSendOctet(buf.buffer[2]); - spiSendOctet(buf.buffer[3]); + for (uint8_t i = 0; i < sizeof(t_configBlock); i++) { + spiSendOctet(buf.buffer[i]); + } spiSendEnd(e_SPI_EEPROM); } @@ -43,14 +45,10 @@ static void readBuf() { spiReceiveOctet(); spiSendOctet(HIGHSCORE_ADDR); spiReceiveOctet(); - spiSendOctet(DUMMY); - buf.buffer[0] = spiReceiveOctet(); - spiSendOctet(DUMMY); - buf.buffer[1] = spiReceiveOctet(); - spiSendOctet(DUMMY); - buf.buffer[2] = spiReceiveOctet(); - spiSendOctet(DUMMY); - buf.buffer[3] = spiReceiveOctet(); + for (uint8_t i = 0; i < sizeof(t_configBlock); i++) { + spiSendOctet(DUMMY); + buf.buffer[i] = spiReceiveOctet(); + } spiSendEnd(e_SPI_EEPROM); } @@ -60,16 +58,29 @@ void eepromInit() { if (buf.v.magic != MAGIC) { buf.v.magic = MAGIC; buf.v.highScore = 0; + buf.v.flashColor = 0; writeBuf(); } } +void eepromCommit() { + writeBuf(); +} + uint16_t eepromReadHighScore() { return buf.v.highScore; } -void eepromWriteHighScore(uint16_t v) { +void eepromSetHighScore(uint16_t v) { buf.v.highScore = v; writeBuf(); } +uint8_t eepromReadFlashColor() { + return buf.v.flashColor; +} + +void eepromSetFlashColor(uint8_t v) { + buf.v.flashColor = v; +} + diff --git a/game-ctrl/eeprom.h b/game-ctrl/eeprom.h index 0caf393..1e1222a 100644 --- a/game-ctrl/eeprom.h +++ b/game-ctrl/eeprom.h @@ -6,7 +6,10 @@ void eepromInit(); uint16_t eepromReadHighScore(); -void eepromWriteHighScore(uint16_t v); +void eepromSetHighScore(uint16_t v); +uint8_t eepromReadFlashColor(); +void eepromSetFlashColor(uint8_t v); +void eepromCommit(); diff --git a/game-ctrl/game.c b/game-ctrl/game.c index 44963fa..eeb15ce 100644 --- a/game-ctrl/game.c +++ b/game-ctrl/game.c @@ -105,7 +105,8 @@ void gameExec(void *handle) { score += level; if (score > eepromReadHighScore()) { newHighScoreAchieved = true; - eepromWriteHighScore(score); + eepromSetHighScore(score); + eepromCommit(); } state = e_ClearRowFlash; } else { @@ -114,7 +115,7 @@ void gameExec(void *handle) { break; case e_ClearRowFlash: - canvasFillRow(clearCheckCnt, _flash); + canvasFillRow(clearCheckCnt, eepromReadFlashColor()); state = e_ClearRowFlashDelay; break; diff --git a/game-ctrl/main.c b/game-ctrl/main.c index 88ff97b..ccde948 100644 --- a/game-ctrl/main.c +++ b/game-ctrl/main.c @@ -13,6 +13,7 @@ #include "spi.h" #include "display.h" #include "eeprom.h" +#include "config.h" int main() { @@ -33,11 +34,16 @@ int main() { displayInit(); myRandInit(); canvasInit(); - - shapesInit(); - gameInit(); buttonsInit(); + if (isConfigMode()) { + configInit(); + } else { + shapesInit(); + gameInit(); + buttonsStart(); + } + __enable_interrupt(); while (1) { diff --git a/rgb-driver/colors.S b/rgb-driver/colors.S index 0536039..04c4208 100644 --- a/rgb-driver/colors.S +++ b/rgb-driver/colors.S @@ -8,7 +8,7 @@ colors: .global colors ;; red, green, blue, padding off: - .byte 0x00, 0x00, 0x00, 0 + .byte 0x00, 0x00, 0x00, 0 ;; off blue: .byte 0x00>>DIMM_FACTOR, 0x00>>DIMM_FACTOR, 0xff>>DIMM_FACTOR, 0 green: @@ -36,8 +36,5 @@ white: red: .byte 0xff>>DIMM_FACTOR, 0x00>>DIMM_FACTOR, 0x00>>DIMM_FACTOR, 0 flash: - ;; .byte 0xff, 0x00, 0x00, 0 - ;; .byte 0xff, 0xff, 0xff, 0 - .byte 0x00, 0x00, 0x00, 0 - ;; .byte 0x80>>3, 0x00>>3, 0xff>>3, 0 + .byte 0xff, 0xff, 0xff, 0 diff --git a/rgb-driver/colors.h b/rgb-driver/colors.h index 352fdd4..c66855a 100644 --- a/rgb-driver/colors.h +++ b/rgb-driver/colors.h @@ -17,7 +17,7 @@ #define _white 0x0c #define _red 0x0d #define _flash 0x0e - +#define _color_end 0x0f #endif