/*
aledre% — Today at 8:02 AM
I made a case for every TM1638 key, but don't
know how to put in void handleKeypad() for make it to work...
*/
//Libraries
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
//#include <TM1638QYF.h>
//#include <TM16xxDisplay.h>
//#include <TM16xxButtons.h>
// Define pins for the HW16 modules
//#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW
#define MAX_DEVICES 4
#define CLK_PIN 18
#define DATA_PIN 23
#define CS_PIN1 19
#define CS_PIN2 5
// Define rotary encoder pins
#define ROTARY_PIN1 26
#define ROTARY_PIN2 27
#define ROTARY_BUTTON 25
#define DEBOUNCE_DELAY 200
#define RESET_DEBOUNCE_DELAY 100
// Define TM1638 module pins
#define TM1638_DIO 17
#define TM1638_CLK 16
#define TM1638_STB 22
//TM1638QYF module(TM1638_DIO, TM1638_CLK, TM1638_STB);
MD_Parola P1 = MD_Parola(HARDWARE_TYPE, CS_PIN1, MAX_DEVICES);
MD_Parola P2 = MD_Parola(HARDWARE_TYPE, CS_PIN2, MAX_DEVICES);
//TM16xxDisplay tmd(&module, 8);
//TM16xxButtons tmb(&module);
int lastEncoded = 0;
unsigned long lastDebounceTime = 0;
int availableScores[] = {201, 301, 401, 501, 601, 701, 801, 901};
int playerScores[2] = {0, 0};
int scoreIndex = 3;
bool scoreLocked = false;
int currentPlayer = 1;
String currentInput = "";
int previousScore = 0;
int lastPlayer = 0;
void handleRotaryEncoder() {
if (scoreLocked) return;
int MSB = digitalRead(ROTARY_PIN1);
int LSB = digitalRead(ROTARY_PIN2);
int currentEncoded = (MSB << 1) | LSB;
int sum = (lastEncoded << 2) | currentEncoded;
unsigned long currentTime = millis();
if (currentTime - lastDebounceTime > DEBOUNCE_DELAY) {
if (sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) {
scoreIndex = min(scoreIndex + 1, (int)(sizeof(availableScores) / sizeof(availableScores[0]) - 1));
P1.print(availableScores[scoreIndex]);
P2.print(availableScores[scoreIndex]);
lastDebounceTime = currentTime;
} else if (sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) {
scoreIndex = max(scoreIndex - 1, 0);
P1.print(availableScores[scoreIndex]);
P2.print(availableScores[scoreIndex]);
lastDebounceTime = currentTime;
}
}
lastEncoded = currentEncoded;
}
void handleButtonPress() {
int buttonState = digitalRead(ROTARY_BUTTON); // == LOW;
if (!buttonState && !scoreLocked && millis() - lastDebounceTime > DEBOUNCE_DELAY) {
//if (!buttonState) {
scoreLocked = true;
playerScores[0] = availableScores[scoreIndex];
playerScores[1] = availableScores[scoreIndex];
currentPlayer = 1;
updateDisplays();
lastDebounceTime = millis();
Serial.println("Game type locked");
}
}
/*
void handleKeypad() {
if (!scoreLocked) return;
uint16_t keys = module.getButtons();
if (keys) {
delay(300);
if (keys & 8) { // Use button A to reset
scoreIndex = 3;
scoreLocked = false;
P1.displayClear();
P1.print(availableScores[scoreIndex]);
P2.displayClear();
P2.print(availableScores[scoreIndex]);
tmd.clear();
} else if (keys & 4096) { // Use button * to cancel last score
playerScores[lastPlayer - 1] += previousScore;
currentPlayer = lastPlayer;
updateDisplays();
} else if (keys & 16384) { // Use button # to submit score
if (currentInput.length() > 0) {
int score = currentInput.toInt();
Serial.print("Current Input: ");
Serial.println(currentInput);
Serial.print("Score to subtract: ");
Serial.println(score);
previousScore = score;
lastPlayer = currentPlayer;
playerScores[currentPlayer - 1] -= score;
Serial.print("Player ");
Serial.print(currentPlayer);
Serial.print("'s score after subtraction: ");
Serial.println(playerScores[currentPlayer - 1]);
currentInput = "";
currentPlayer = currentPlayer % 2 + 1;
updateDisplays();
handleScore();
}
} else {
if (currentInput.length() < 3) {
switch (keys) {
case 1:
currentInput += '1'; // Map button 1 to 1
break;
case 2:
currentInput += '2'; // Map button 2 to 2
break;
case 4:
currentInput += '3'; // Map button 3 to 3
break;
case 16:
currentInput += '4'; // Map button 5 to 4
break;
case 32:
currentInput += '5'; // Map button 6 to 5
break;
case 64:
currentInput += '6'; // Map button 7 to 6
break;
case 256:
currentInput += '7'; // Map button 9 to 7
break;
case 512:
currentInput += '8'; // Map button 10 to 8
break;
case 1024:
currentInput += '9'; // Map button 11 to 9
break;
case 8192:
currentInput += '0'; // Map button 14 to 0
break;
default:
break;
}
displayCurrentInput();
}
}
}
}
*/
void handleScore() {
if (currentInput.length() > 0) {
int score = currentInput.toInt();
previousScore = score;
lastPlayer = currentPlayer;
playerScores[currentPlayer - 1] -= score;
currentInput = "";
currentPlayer = currentPlayer % 2 + 1;
updateDisplays();
}
}
void updateDisplays() {
P1.displayClear();
P1.print(playerScores[0]);
P2.displayClear();
P2.print(playerScores[1]);
P1.displayAnimate();
P2.displayAnimate();
//tmd.clear();
}
/*
void displayCurrentInput() {
tmd.clear();
tmd.println(currentInput);
}
*/
void setup() {
Serial.begin(115200);
pinMode(ROTARY_PIN1, INPUT_PULLUP);
pinMode(ROTARY_PIN2, INPUT_PULLUP);
pinMode(ROTARY_BUTTON, INPUT_PULLUP);
P1.begin();
P1.setIntensity(8); // Set brightness level (0 is min, 15 is max)
P1.print("D1 OK");
delay(1000);
P1.print(availableScores[scoreIndex]);
P2.begin();
P2.setIntensity(8); // Set brightness level (0 is min, 15 is max)
P2.print("D2 OK");
delay(1000);
P2.print(availableScores[scoreIndex]);
//module.setupDisplay(true, 7);
//tmd.println("DISP888");
delay(1000);
//tmd.clear();
Serial.println("\nReady\n");
}
void loop() {
if (!scoreLocked) {
handleRotaryEncoder();
}
handleButtonPress();
//handleKeypad();
}