config
This commit is contained in:
parent
eb75e31577
commit
ccd395d6ab
@ -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
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -4,7 +4,13 @@
|
||||
#include <stdbool.h>
|
||||
|
||||
void buttonsInit();
|
||||
void buttonsStart();
|
||||
bool isGameActive();
|
||||
bool isConfigMode();
|
||||
bool buttonsConfig1Pressed();
|
||||
bool buttonsConfig2Pressed();
|
||||
bool buttonsConfig3Pressed();
|
||||
bool buttonsConfig4Pressed();
|
||||
|
||||
|
||||
#endif // _BUTTONS_H_
|
||||
|
65
game-ctrl/config.c
Normal file
65
game-ctrl/config.c
Normal file
@ -0,0 +1,65 @@
|
||||
#include <stddef.h>
|
||||
#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);
|
||||
}
|
8
game-ctrl/config.h
Normal file
8
game-ctrl/config.h
Normal file
@ -0,0 +1,8 @@
|
||||
#ifndef _CONFIG_H_
|
||||
#define _CONFIG_H_
|
||||
|
||||
|
||||
void configInit();
|
||||
|
||||
|
||||
#endif // _CONFIG_H_
|
@ -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 union {
|
||||
uint8_t buffer[4];
|
||||
struct {
|
||||
typedef struct {
|
||||
uint16_t magic;
|
||||
uint16_t highScore;
|
||||
} v;
|
||||
uint8_t flashColor;
|
||||
} t_configBlock;
|
||||
|
||||
typedef union {
|
||||
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();
|
||||
for (uint8_t i = 0; i < sizeof(t_configBlock); i++) {
|
||||
spiSendOctet(DUMMY);
|
||||
buf.buffer[0] = spiReceiveOctet();
|
||||
spiSendOctet(DUMMY);
|
||||
buf.buffer[1] = spiReceiveOctet();
|
||||
spiSendOctet(DUMMY);
|
||||
buf.buffer[2] = spiReceiveOctet();
|
||||
spiSendOctet(DUMMY);
|
||||
buf.buffer[3] = spiReceiveOctet();
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
||||
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include "spi.h"
|
||||
#include "display.h"
|
||||
#include "eeprom.h"
|
||||
#include "config.h"
|
||||
|
||||
|
||||
int main() {
|
||||
@ -33,10 +34,15 @@ int main() {
|
||||
displayInit();
|
||||
myRandInit();
|
||||
canvasInit();
|
||||
buttonsInit();
|
||||
|
||||
if (isConfigMode()) {
|
||||
configInit();
|
||||
} else {
|
||||
shapesInit();
|
||||
gameInit();
|
||||
buttonsInit();
|
||||
buttonsStart();
|
||||
}
|
||||
|
||||
__enable_interrupt();
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -17,7 +17,7 @@
|
||||
#define _white 0x0c
|
||||
#define _red 0x0d
|
||||
#define _flash 0x0e
|
||||
|
||||
#define _color_end 0x0f
|
||||
|
||||
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user