tetris/game-ctrl/buttons.c

110 lines
2.3 KiB
C
Raw Normal View History

2024-03-19 16:46:52 +01:00
#include <stddef.h>
#include <stdint.h>
2024-04-15 16:46:24 +02:00
#include <stdbool.h>
2024-03-19 16:46:52 +01:00
#include <msp430g2553.h>
2024-03-14 14:46:31 +01:00
#include "buttons.h"
2024-03-18 12:51:57 +01:00
#include "scheduler.h"
2024-03-14 14:46:31 +01:00
#include "shapes.h"
#include "canvas.h"
#include "sound.h"
2024-03-14 14:46:31 +01:00
static uint8_t buttonsMoveLeftPressed() {
2024-03-19 16:46:52 +01:00
static uint8_t last = 0;
uint8_t current = (P2IN & BIT4);
uint8_t res = (current != 0) && (current != last);
last = current;
return res;
2024-03-14 14:46:31 +01:00
}
static uint8_t buttonsMoveRightPressed() {
2024-03-19 16:46:52 +01:00
static uint8_t last = 0;
uint8_t current = (P2IN & BIT0);
uint8_t res = (current != 0) && (current != last);
last = current;
return res;
2024-03-14 14:46:31 +01:00
}
static uint8_t buttonsRotateLeftPressed() {
2024-03-19 16:46:52 +01:00
static uint8_t last = 0;
uint8_t current = (P2IN & BIT3);
uint8_t res = (current != 0) && (current != last);
last = current;
return res;
2024-03-15 12:54:32 +01:00
}
static uint8_t buttonsRotateRightPressed() {
2024-03-19 16:46:52 +01:00
static uint8_t last = 0;
uint8_t current = (P2IN & BIT1);
uint8_t res = (current != 0) && (current != last);
last = current;
return res;
}
static uint8_t buttonsMoveDownPressed() {
2024-03-19 17:42:25 +01:00
return P2IN & BIT2;
2024-03-14 17:25:45 +01:00
}
2024-03-14 14:46:31 +01:00
void buttonsExec(void *handle) {
static uint32_t unmuteTimestamp;
uint32_t currentTimestamp = getSeconds();
static bool unmuteFlag = false;
if (! stoneIsValid()) {
2024-03-14 14:46:31 +01:00
// don't do anything, the stone has not been initialized
return;
}
uint8_t buttonPressed = 0;
if (buttonsMoveLeftPressed()) {
stoneMoveLeft();
2024-04-15 16:42:33 +02:00
soundCtrl(e_SOUND_STONE_MOVE_LEFT);
2024-03-14 14:46:31 +01:00
buttonPressed = 1;
}
if (buttonsMoveRightPressed()) {
stoneMoveRight();
2024-04-15 16:42:33 +02:00
soundCtrl(e_SOUND_STONE_MOVE_RIGHT);
2024-03-14 14:46:31 +01:00
buttonPressed = 1;
}
if (buttonsRotateLeftPressed()) {
stoneRotateLeft();
2024-04-15 16:42:33 +02:00
soundCtrl(e_SOUND_STONE_ROTATE_LEFT);
2024-03-14 14:46:31 +01:00
buttonPressed = 1;
}
if (buttonsRotateRightPressed()) {
stoneRotateRight();
2024-04-15 16:42:33 +02:00
soundCtrl(e_SOUND_STONE_ROTATE_RIGHT);
2024-03-14 14:46:31 +01:00
buttonPressed = 1;
}
2024-03-19 16:46:52 +01:00
if (buttonsMoveDownPressed()) {
stoneMoveDown();
2024-04-15 16:42:33 +02:00
soundCtrl(e_SOUND_STONE_MOVE_DOWN);
2024-03-19 16:46:52 +01:00
buttonPressed = 1;
}
2024-03-14 14:46:31 +01:00
if (buttonPressed == 1) {
canvasShow();
if (! unmuteFlag) {
soundCtrl(e_SOUND_UNMUTE);
unmuteFlag = true;
}
unmuteTimestamp = currentTimestamp;
}
if (unmuteFlag && (unmuteTimestamp + MUTE_DELAY < currentTimestamp)) {
soundCtrl(e_SOUND_MUTE);
unmuteFlag = false;
2024-03-14 14:46:31 +01:00
}
}
void buttonsInit() {
2024-03-19 16:46:52 +01:00
P2DIR &= ~(BIT0|BIT1|BIT2|BIT3|BIT4);
2024-03-14 14:46:31 +01:00
2024-03-19 17:42:25 +01:00
schAdd(buttonsExec, NULL, 0, 25);
2024-03-14 14:46:31 +01:00
}