multiplayer pong game for LPC 1768
Dependencies: mbed MbedJSONValue mbed-rtos Adafruit_ST7735 Adafruit_GFX EthernetInterface DebouncedInterrupt
main.cpp@37:8a0fc62a0512, 2020-11-29 (annotated)
- 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?
User | Revision | Line number | New 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(ð, &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(ð, &sock); |
donatien | 1:8e1d4987eb90 | 129 | } |