First Commit

This commit is contained in:
Adrian Jaroszewski
2025-10-24 16:15:37 -04:00
commit ee8a17b4b3
6 changed files with 510 additions and 0 deletions

5
.gitignore vendored Normal file
View File

@@ -0,0 +1,5 @@
.pio
.vscode/.browse.c_cpp.db*
.vscode/c_cpp_properties.json
.vscode/launch.json
.vscode/ipch

261
include/fonts.h Normal file
View File

@@ -0,0 +1,261 @@
#pragma once
MD_MAX72XX::fontType_t pingpong_font[] PROGMEM =
{
0, // 0
0, // 1
0, // 2
0, // 3
0, // 4
0, // 5
0, // 6
0, // 7
0, // 8
0, // 9
0, // 10
0, // 11
0, // 12
0, // 13
0, // 14
0, // 15
0, // 16
0, // 17
0, // 18
0, // 19
0, // 20
0, // 21
0, // 22
0, // 23
0, // 24
0, // 25
0, // 26
0, // 27
0, // 28
0, // 29
0, // 30
0, // 31
0, // 32
0, // 33
0, // 34
0, // 35
0, // 36
0, // 37
0, // 38
0, // 39
0, // 40
0, // 41
0, // 42
0, // 43
0, // 44
0, // 45
0, // 46
0, // 47
5, 126, 129, 129, 129, 126, // 48
5, 132, 130, 255, 128, 128, // 49
5, 194, 161, 145, 137, 134, // 50
5, 66, 129, 137, 137, 118, // 51
5, 12, 10, 9, 255, 8, // 52
5, 71, 137, 137, 137, 113, // 53
5, 126, 137, 137, 137, 114, // 54
5, 1, 241, 9, 5, 3, // 55
5, 118, 137, 137, 137, 118, // 56
5, 78, 145, 145, 145, 126, // 57
0, // 58
0, // 59
8, 24, 60, 126, 219, 153, 24, 24, 24, // 60
8, 0, 24, 24, 24, 24, 24, 24, 0, // 61
8, 24, 24, 24, 153, 219, 126, 60, 24, // 62
0, // 63
0, // 64
0, // 65
0, // 66
0, // 67
0, // 68
0, // 69
0, // 70
0, // 71
0, // 72
0, // 73
0, // 74
0, // 75
0, // 76
0, // 77
0, // 78
0, // 79
0, // 80
0, // 81
0, // 82
0, // 83
0, // 84
0, // 85
0, // 86
0, // 87
0, // 88
0, // 89
0, // 90
0, // 91
0, // 92
0, // 93
0, // 94
0, // 95
0, // 96
0, // 97
0, // 98
0, // 99
0, // 100
0, // 101
0, // 102
0, // 103
0, // 104
0, // 105
0, // 106
0, // 107
0, // 108
0, // 109
0, // 110
0, // 111
0, // 112
0, // 113
0, // 114
0, // 115
0, // 116
0, // 117
0, // 118
0, // 119
0, // 120
0, // 121
0, // 122
0, // 123
0, // 124
0, // 125
0, // 126
0, // 127
0, // 128
0, // 129
0, // 130
0, // 131
0, // 132
0, // 133
0, // 134
0, // 135
0, // 136
0, // 137
0, // 138
0, // 139
0, // 140
0, // 141
0, // 142
0, // 143
0, // 144
0, // 145
0, // 146
0, // 147
0, // 148
0, // 149
0, // 150
0, // 151
0, // 152
0, // 153
0, // 154
0, // 155
0, // 156
0, // 157
0, // 158
0, // 159
0, // 160
0, // 161
0, // 162
0, // 163
0, // 164
0, // 165
0, // 166
0, // 167
0, // 168
0, // 169
0, // 170
0, // 171
0, // 172
0, // 173
0, // 174
0, // 175
0, // 176
0, // 177
0, // 178
0, // 179
0, // 180
0, // 181
0, // 182
0, // 183
0, // 184
0, // 185
0, // 186
0, // 187
0, // 188
0, // 189
0, // 190
0, // 191
0, // 192
0, // 193
0, // 194
0, // 195
0, // 196
0, // 197
0, // 198
0, // 199
0, // 200
0, // 201
0, // 202
0, // 203
0, // 204
0, // 205
0, // 206
0, // 207
0, // 208
0, // 209
0, // 210
0, // 211
0, // 212
0, // 213
0, // 214
0, // 215
0, // 216
0, // 217
0, // 218
0, // 219
0, // 220
0, // 221
0, // 222
0, // 223
0, // 224
0, // 225
0, // 226
0, // 227
0, // 228
0, // 229
0, // 230
0, // 231
0, // 232
0, // 233
0, // 234
0, // 235
0, // 236
0, // 237
0, // 238
0, // 239
0, // 240
0, // 241
0, // 242
0, // 243
0, // 244
0, // 245
0, // 246
0, // 247
0, // 248
0, // 249
0, // 250
0, // 251
0, // 252
0, // 253
0, // 254
0, // 255
};

70
lib/Game/src/game.cpp Normal file
View File

@@ -0,0 +1,70 @@
#include "game.h"
#include <iostream>
#include <cmath>
using namespace std;
void printScore(int* score) {
cout << "(" << score[0] << ", " << score[1] << ")" << endl;
}
void resetScore(int* score) {
*score = 0;
*(score+1) = 0;
}
void won(int player) {
cout << "Player " << player+1 << " has won!" << endl;
}
int checkWin(int* score, int player) {
if (*(score+player) < 11) {
return 1;
}
else if (*(score+player) >= 21) {
return 0;
}
else {
if (*(score+abs(player-1)) <= *(score+player)-2 ) {
return 0;
}
else {
return 1;
}
}
}
int scored(int* score, int player) {
if (checkWin(score, player) == 1) {
*(score+player) = *(score+player) + 1;
checkWin(score, player);
return 0;
}
else {
return 1;
}
}
int removePoint(int* score, int player) {
if (*(score+player) > 0) {
*(score+player) = *(score+player) - 1;
checkWin(score, abs(player-1));
return 0;
}
else {
return 1;
}
}
int servingPlayer(int* score, int serving) {
if (score[0] < 11 && score[1] < 11) {
return (((((score[0]+score[1])%4)/2)+serving)%2); // based on the variable serving (which represents the starting serve player, 0 or 1) a 1 or 0 is returned.
}
else{
return ((((score[0]+score[1])%2)+serving)%2);
}
}

13
lib/Game/src/game.h Normal file
View File

@@ -0,0 +1,13 @@
void printScore(int* score);
void resetScore(int* score);
void won(int player);
int checkWin(int* score, int player);
int scored(int* score, int player);
int removePoint(int* score, int player);
int servingPlayer(int* score, int serving);

17
platformio.ini Normal file
View File

@@ -0,0 +1,17 @@
; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
[env:denky32]
platform = espressif32
board = denky32
framework = arduino
lib_deps =
majicdesigns/MD_MAX72XX@^3.5.1
majicdesigns/MD_Parola@^3.7.3

144
src/main.cpp Normal file
View File

@@ -0,0 +1,144 @@
#include <Arduino.h>
#include <game.h>
#include <MD_MAX72xx.h>
#include <MD_Parola.h>
#include "../include/fonts.h"
// Hardware SPI:
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4
#define SS_PIN 5
#define DATA_PIN 23
#define CLK_PIN 18
#define B1_IN 26
#define B2_IN 25
using namespace std;
// Create a new instance of the MD_MAX72XX class:
MD_Parola matrix = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, SS_PIN, MAX_DEVICES);
int score[2]= {0, 0};
bool start = false;
int serving;
bool game = true;
char servingChar = '=';
char displayOut[5] = {'0','0',servingChar,'0','0'};
int convertASCII(int score);
char setServeChar(char servingChar, int* score, int serving);
void setDisplay(int* score, MD_Parola* matrix, char* displayOut);
void setup() {
// put your setup code here, to run once:
pinMode(B1_IN, INPUT_PULLUP);
pinMode(B2_IN, INPUT_PULLUP);
// Intialize the object:
matrix.begin();
// Set the intensity (brightness) of the display (0-15):
matrix.setIntensity(15);
// Clear the display:
matrix.displayClear();
matrix.setTextAlignment(PA_CENTER);
matrix.setFont(pingpong_font);
Serial.begin(9600);
while (digitalRead(B1_IN) == 1 && digitalRead(B2_IN) == 1) {
}
if (digitalRead(B1_IN) == 0) {
while (digitalRead(B1_IN) == 0) {}
serving = 0;
displayOut[2] = setServeChar(servingChar, score, serving);
setDisplay(score, &matrix, displayOut);
delay(500); // to avoid calling twice
}
if (digitalRead(B2_IN) == 0) {
while (digitalRead(B2_IN) == 0) {}
serving = 1;
displayOut[2] = setServeChar(servingChar, score, serving);
setDisplay(score, &matrix, displayOut);
delay(500); // to avoid calling twice
}
}
void loop() {
while (game == true) {
while (digitalRead(B1_IN) == 1 && digitalRead(B2_IN) == 1) {
}
if (digitalRead(B1_IN) == 0) {
while (digitalRead(B1_IN) == 0) {} // Only execute add point on button release
scored(score, 0);
if (checkWin(score, 0) == 0) {
displayOut[2] = servingChar;
game = false;
}
else {
displayOut[2] = setServeChar(servingChar, score, serving);
delay(500); // to avoid calling twice
}
setDisplay(score, &matrix, displayOut);
}
if (digitalRead(B2_IN) == 0) {
while (digitalRead(B2_IN) == 0) {} // Only execute add point on button release
scored(score, 1);
if (checkWin(score, 1) == 0) {
displayOut[2] = servingChar;
game = false;
}
else {
displayOut[2] = setServeChar(servingChar, score, serving);
delay(500); // to avoid calling twice
}
setDisplay(score, &matrix, displayOut);
}
}
}
// put function definitions here:
int convertASCII(int score) {
return(score+48);
}
char setServeChar(char servingChar, int* score, int serving) {
return (servingChar + 1 - 2*(servingPlayer(score, serving)));
}
void setDisplay(int* score, MD_Parola* matrix, char* displayOut) {
for (int i = 0; i < 2; i++) {
displayOut[i*3] = convertASCII((*(score+i) - (*(score+i)%10)) / 10);
displayOut[(i*3)+1] = convertASCII(*(score+i)%10);
}
matrix->print(displayOut);
}