multiplayer pong game for LPC 1768

Dependencies:   mbed MbedJSONValue mbed-rtos Adafruit_ST7735 Adafruit_GFX EthernetInterface DebouncedInterrupt

main.cpp

Committer:
vsoltan
Date:
2020-11-28
Revision:
32:7cbf4d9a82af
Parent:
31:f70cf03c8ef9
Child:
33:98ba7b0b8c2b

File content as of revision 32:7cbf4d9a82af:


#include "mbed.h"
#include "network.h"
#include "gamestate.h"
#include "graphics.h" 
#include "DebouncedInterrupt.h"

#define DEBOUNCE 25

DebouncedInterrupt leftButton(p21);
DebouncedInterrupt middleButton(p22);
DebouncedInterrupt rightButton(p23);

EthernetInterface eth; 
UDPSocket sock; 
Endpoint nist; 

volatile int sendFlag = 0; 
volatile int moveData = 0;
volatile int menuPress = 0; 

int numGamesPlayed = 0; 

// interrupts service routines 

void pressButtonMenu(void) {
    menuPress = 1; 
}

void pressLeftGame( void ) {
    sendFlag = 1;
    moveData -= 5; 
}

void pressRightGame() {
    sendFlag = 1;
    moveData += 5; 
}
 
int main() {
    initEthernet(&eth, &sock, &nist);
    Graphics *gfx = new Graphics();    
      
    // attach ISR
    leftButton.attach(&pressButtonMenu, IRQ_RISE, DEBOUNCE);
    middleButton.attach(&pressButtonMenu, IRQ_RISE, DEBOUNCE);
    rightButton.attach(&pressButtonMenu, IRQ_RISE, DEBOUNCE);
    
    MbedJSONValue serverResponse; 
    MbedJSONValue serverRequest; 
    
    char connectionRequest[] = "{\"type\": \"connected\"}";
    char tmp_buffer[256]; 
    
    string serverRequestContent = ""; 
    int requestLength = 0; 
    char *serverRequestPayload = NULL; 
    
    gfx->renderLaunchScreen(); 
    
    while (1) { // keep program running
        if (menuPress) {
            GameState *gs = new GameState();
            numGamesPlayed++; 
            
            // request an open lobby from the server 
            sock.sendTo(nist, connectionRequest, strlen(connectionRequest)); 
                        
            // change ISRs to game controls 
            leftButton.attach(&pressLeftGame, IRQ_RISE, DEBOUNCE);
            middleButton.reset(); 
            rightButton.attach(&pressRightGame, IRQ_RISE, DEBOUNCE);
            
            while (!gs->done()) {
                if (sendFlag != 0) {
                    serverRequest["type"] = "move"; 
                    serverRequest["hash"] = "jaredyeagersflipflop"; 
                    serverRequest["player"] = gs->getLocalPlayerNum(); 
                    serverRequest["delta"] = (int)moveData; 
                    
                    serverRequestContent = serverRequest.serialize(); 
                    requestLength = serverRequestContent.size(); 
                    serverRequestPayload = (char *)serverRequestContent.c_str(); 
                    sendFlag = 0; 
                    moveData = 0; 
                    sock.sendTo(nist, serverRequestPayload, requestLength);
                }
                int bytesRead = sock.receiveFrom(nist, tmp_buffer, sizeof(tmp_buffer));
                tmp_buffer[bytesRead] = 0; 
                if (numGamesPlayed == 2) {
                    printf("read: %s\n\r", tmp_buffer); 
                }
                if (bytesRead > 0) {
                    parse(serverResponse, tmp_buffer); 
                    gs->updateAndRender(&serverResponse, gfx);
                } 
                wait(.1);
            }
            MbedJSONValue disconnectRequest; 
            disconnectRequest["hash"] = "jaredyeagersflipflop"; 
            disconnectRequest["type"] = "disconnect"; 
            
            string disconnectRequestContent = disconnectRequest.serialize(); 
            int len = disconnectRequestContent.size(); 
            char *disconnectRequestPayload = (char *)disconnectRequestContent.c_str(); 
            
            sock.sendTo(nist, disconnectRequestPayload, len); 
            
            // cleanup the socket from the previous game
            int flushBytes = 0; 
            while ((receiveFrom = sock.receiveFrom(nist, tmp_buffer, sizeof(tmp_buffer))) != 0) {}
             
            gfx->renderGameOver(gs);
            
            // reset the game  
            leftButton.attach(&pressButtonMenu, IRQ_RISE, DEBOUNCE);
            middleButton.attach(&pressButtonMenu, IRQ_RISE, DEBOUNCE);
            rightButton.attach(&pressButtonMenu, IRQ_RISE, DEBOUNCE);
            
            menuPress = 0; 
            delete gs; 
        }
        wait(0.3); 
    }
    // cleanupEthernet(&eth, &sock);
}