multiplayer pong game for LPC 1768

Dependencies:   mbed MbedJSONValue mbed-rtos Adafruit_ST7735 Adafruit_GFX EthernetInterface DebouncedInterrupt

Committer:
vsoltan
Date:
Sun Nov 29 22:40:24 2020 +0000
Revision:
37:8a0fc62a0512
Parent:
36:46bb54b669bc
finalizing code before writing report

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vsoltan 18:32fce82690a1 1
donatien 1:8e1d4987eb90 2 #include "mbed.h"
vsoltan 36:46bb54b669bc 3 #include "DebouncedInterrupt.h"
vsoltan 36:46bb54b669bc 4
vsoltan 15:9d90f68e53da 5 #include "gamestate.h"
vsoltan 16:7fd48cda0773 6 #include "graphics.h"
vsoltan 36:46bb54b669bc 7 #include "network.h"
vsoltan 12:91affff3be75 8
vsoltan 26:ebadab157abe 9 #define DEBOUNCE 25
vsoltan 12:91affff3be75 10
denizguler 13:95d44f7855ca 11 DebouncedInterrupt leftButton(p21);
denizguler 13:95d44f7855ca 12 DebouncedInterrupt middleButton(p22);
denizguler 13:95d44f7855ca 13 DebouncedInterrupt rightButton(p23);
vsoltan 12:91affff3be75 14
vsoltan 12:91affff3be75 15 EthernetInterface eth;
vsoltan 12:91affff3be75 16 UDPSocket sock;
vsoltan 12:91affff3be75 17 Endpoint nist;
vsoltan 12:91affff3be75 18
vsoltan 14:6b20a930e1cb 19 volatile int sendFlag = 0;
vsoltan 36:46bb54b669bc 20 volatile int moveDelta = 0;
vsoltan 36:46bb54b669bc 21 volatile int menuPress = 0;
vsoltan 32:7cbf4d9a82af 22
vsoltan 17:32ae1f106002 23 // interrupts service routines
vsoltan 17:32ae1f106002 24
vsoltan 17:32ae1f106002 25 void pressButtonMenu(void) {
vsoltan 17:32ae1f106002 26 menuPress = 1;
vsoltan 17:32ae1f106002 27 }
vsoltan 17:32ae1f106002 28
vsoltan 17:32ae1f106002 29 void pressLeftGame( void ) {
vsoltan 14:6b20a930e1cb 30 sendFlag = 1;
vsoltan 36:46bb54b669bc 31 moveDelta -= 5;
vsoltan 12:91affff3be75 32 }
vsoltan 12:91affff3be75 33
vsoltan 17:32ae1f106002 34 void pressRightGame() {
vsoltan 14:6b20a930e1cb 35 sendFlag = 1;
vsoltan 36:46bb54b669bc 36 moveDelta += 5;
vsoltan 12:91affff3be75 37 }
emilmont 6:25aad2d88749 38
emilmont 6:25aad2d88749 39 int main() {
vsoltan 19:58cc5465f647 40 initEthernet(&eth, &sock, &nist);
vsoltan 17:32ae1f106002 41 Graphics *gfx = new Graphics();
vsoltan 19:58cc5465f647 42
vsoltan 17:32ae1f106002 43 // attach ISR
vsoltan 17:32ae1f106002 44 leftButton.attach(&pressButtonMenu, IRQ_RISE, DEBOUNCE);
vsoltan 17:32ae1f106002 45 middleButton.attach(&pressButtonMenu, IRQ_RISE, DEBOUNCE);
vsoltan 17:32ae1f106002 46 rightButton.attach(&pressButtonMenu, IRQ_RISE, DEBOUNCE);
vsoltan 12:91affff3be75 47
vsoltan 17:32ae1f106002 48 MbedJSONValue serverResponse;
vsoltan 24:05eb0b0ab554 49 MbedJSONValue serverRequest;
vsoltan 15:9d90f68e53da 50
vsoltan 29:4708bfb863cb 51 char tmp_buffer[256];
vsoltan 29:4708bfb863cb 52
vsoltan 29:4708bfb863cb 53 string serverRequestContent = "";
vsoltan 36:46bb54b669bc 54 int serverRequestLength = 0;
vsoltan 29:4708bfb863cb 55 char *serverRequestPayload = NULL;
vsoltan 14:6b20a930e1cb 56
vsoltan 17:32ae1f106002 57 gfx->renderLaunchScreen();
vsoltan 15:9d90f68e53da 58
vsoltan 17:32ae1f106002 59 while (1) { // keep program running
vsoltan 17:32ae1f106002 60 if (menuPress) {
vsoltan 17:32ae1f106002 61 GameState *gs = new GameState();
vsoltan 17:32ae1f106002 62
vsoltan 17:32ae1f106002 63 // change ISRs to game controls
vsoltan 17:32ae1f106002 64 leftButton.attach(&pressLeftGame, IRQ_RISE, DEBOUNCE);
vsoltan 27:fcc5fee18a24 65 middleButton.reset();
vsoltan 17:32ae1f106002 66 rightButton.attach(&pressRightGame, IRQ_RISE, DEBOUNCE);
vsoltan 17:32ae1f106002 67
vsoltan 34:b19f39ad74ac 68 // request an open lobby from the server
vsoltan 36:46bb54b669bc 69 sock.sendTo(nist, CONNECTION_REQ, strlen(CONNECTION_REQ));
vsoltan 36:46bb54b669bc 70
vsoltan 36:46bb54b669bc 71 // play an individual game to completion
vsoltan 32:7cbf4d9a82af 72 while (!gs->done()) {
vsoltan 36:46bb54b669bc 73 if (sendFlag) {
vsoltan 24:05eb0b0ab554 74 serverRequest["type"] = "move";
vsoltan 36:46bb54b669bc 75 serverRequest["hash"] = LOBBY_HASH;
vsoltan 24:05eb0b0ab554 76 serverRequest["player"] = gs->getLocalPlayerNum();
vsoltan 36:46bb54b669bc 77 serverRequest["delta"] = (int)moveDelta;
vsoltan 24:05eb0b0ab554 78
vsoltan 36:46bb54b669bc 79 // prepare and send JSON payload
vsoltan 29:4708bfb863cb 80 serverRequestContent = serverRequest.serialize();
vsoltan 36:46bb54b669bc 81 serverRequestLength = serverRequestContent.size();
vsoltan 29:4708bfb863cb 82 serverRequestPayload = (char *)serverRequestContent.c_str();
vsoltan 36:46bb54b669bc 83 sock.sendTo(nist, serverRequestPayload, serverRequestLength);
vsoltan 36:46bb54b669bc 84
vsoltan 36:46bb54b669bc 85 // reset
vsoltan 17:32ae1f106002 86 sendFlag = 0;
vsoltan 36:46bb54b669bc 87 moveDelta = 0;
vsoltan 17:32ae1f106002 88 }
vsoltan 29:4708bfb863cb 89 int bytesRead = sock.receiveFrom(nist, tmp_buffer, sizeof(tmp_buffer));
vsoltan 29:4708bfb863cb 90 tmp_buffer[bytesRead] = 0;
vsoltan 36:46bb54b669bc 91
vsoltan 36:46bb54b669bc 92 // populate serverResponse JSON and update local gamestate
vsoltan 17:32ae1f106002 93 if (bytesRead > 0) {
vsoltan 29:4708bfb863cb 94 parse(serverResponse, tmp_buffer);
vsoltan 27:fcc5fee18a24 95 gs->updateAndRender(&serverResponse, gfx);
vsoltan 17:32ae1f106002 96 }
vsoltan 17:32ae1f106002 97 wait(.1);
vsoltan 15:9d90f68e53da 98 }
vsoltan 36:46bb54b669bc 99 // once game ends, leave lobby and disconnect
vsoltan 29:4708bfb863cb 100 MbedJSONValue disconnectRequest;
vsoltan 36:46bb54b669bc 101 disconnectRequest["hash"] = LOBBY_HASH;
vsoltan 29:4708bfb863cb 102 disconnectRequest["type"] = "disconnect";
vsoltan 27:fcc5fee18a24 103
vsoltan 29:4708bfb863cb 104 string disconnectRequestContent = disconnectRequest.serialize();
vsoltan 29:4708bfb863cb 105 int len = disconnectRequestContent.size();
vsoltan 29:4708bfb863cb 106 char *disconnectRequestPayload = (char *)disconnectRequestContent.c_str();
vsoltan 32:7cbf4d9a82af 107 sock.sendTo(nist, disconnectRequestPayload, len);
vsoltan 32:7cbf4d9a82af 108
vsoltan 36:46bb54b669bc 109 // flush the socket from the previous game
vsoltan 32:7cbf4d9a82af 110 int flushBytes = 0;
vsoltan 34:b19f39ad74ac 111 while ((flushBytes = sock.receiveFrom(nist, tmp_buffer, sizeof(tmp_buffer))) != 0) {
vsoltan 37:8a0fc62a0512 112 printf("flushing bytes: %i\n\r", flushBytes);
vsoltan 35:2c5e582a6ee2 113 printf("tmp_buffer %s\n\r", tmp_buffer);
vsoltan 34:b19f39ad74ac 114 }
vsoltan 32:7cbf4d9a82af 115
vsoltan 29:4708bfb863cb 116 gfx->renderGameOver(gs);
vsoltan 29:4708bfb863cb 117
vsoltan 36:46bb54b669bc 118 // reset
vsoltan 27:fcc5fee18a24 119 leftButton.attach(&pressButtonMenu, IRQ_RISE, DEBOUNCE);
vsoltan 27:fcc5fee18a24 120 middleButton.attach(&pressButtonMenu, IRQ_RISE, DEBOUNCE);
vsoltan 27:fcc5fee18a24 121 rightButton.attach(&pressButtonMenu, IRQ_RISE, DEBOUNCE);
vsoltan 27:fcc5fee18a24 122
vsoltan 17:32ae1f106002 123 menuPress = 0;
vsoltan 28:a26a43cdaea8 124 delete gs;
vsoltan 14:6b20a930e1cb 125 }
vsoltan 17:32ae1f106002 126 wait(0.3);
denizguler 13:95d44f7855ca 127 }
vsoltan 15:9d90f68e53da 128 // cleanupEthernet(&eth, &sock);
donatien 1:8e1d4987eb90 129 }