commit ee8a17b4b3b532987da4f2a1bf302a8f0393ed3f Author: Adrian Jaroszewski Date: Fri Oct 24 16:15:37 2025 -0400 First Commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..89cc49c --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.pio +.vscode/.browse.c_cpp.db* +.vscode/c_cpp_properties.json +.vscode/launch.json +.vscode/ipch diff --git a/include/fonts.h b/include/fonts.h new file mode 100644 index 0000000..ea424d2 --- /dev/null +++ b/include/fonts.h @@ -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 +}; \ No newline at end of file diff --git a/lib/Game/src/game.cpp b/lib/Game/src/game.cpp new file mode 100644 index 0000000..2f6b499 --- /dev/null +++ b/lib/Game/src/game.cpp @@ -0,0 +1,70 @@ +#include "game.h" +#include +#include + +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); + } +} diff --git a/lib/Game/src/game.h b/lib/Game/src/game.h new file mode 100644 index 0000000..5ac0f17 --- /dev/null +++ b/lib/Game/src/game.h @@ -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); \ No newline at end of file diff --git a/platformio.ini b/platformio.ini new file mode 100644 index 0000000..ec5bd2d --- /dev/null +++ b/platformio.ini @@ -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 diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..0ebd89b --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,144 @@ +#include +#include +#include +#include +#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); + +} +