Revenge of the Mouse

Dependencies:   4DGL-uLCD-SE EthernetInterface Game_Synchronizer LCD_fonts MMA8452 SDFileSystem mbed-rtos mbed wave_player

Fork of 2035_Tanks_Shell by ECE2035 Spring 2015 TA

Revision:
0:899c85cd266f
Child:
1:0589ea36661b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/two_player.h	Tue Oct 06 01:54:18 2015 +0000
@@ -0,0 +1,165 @@
+#ifndef TWO_PLAYER_H__
+#define TWO_PLAYER_H__
+
+#include "uLCD_4DGL.h"
+#include "EthernetInterface.h"
+
+#define PLAYER1 true
+#define PLAYER2 false
+
+Serial pc(USBTX, USBRX);
+
+const char* PLAYER1_IP   = "192.168.2.1";
+const char* PLAYER2_IP   = "192.168.2.2";
+const int   SERVER_PORT = 7;
+
+DigitalOut led(LED2);
+
+
+class uLCD_2P
+{
+
+public :
+
+    int p1_p2;
+    enum Color
+    {
+        LINE_CMD,
+        BG_COLOR_CMD,
+        CIRCLE_CMD,
+        CLS_CMD,
+        BUTTONS_CMD
+    };
+
+
+    uLCD_2P(PinName tx, PinName rx, PinName rst, bool player) {
+        p1_p2 = player;
+        //LCD = new uLCD_4DGL (tx, rx, rst);        
+    }
+    
+    void init() {
+        
+        buffer_idx = 0;
+        sock = new UDPSocket();
+        endpoint = new Endpoint();
+        eth = new EthernetInterface();
+        
+        switch (p1_p2) {
+            case PLAYER1:           // Client
+                eth->init(PLAYER1_IP, "255.255.255.0", "0.0.0.0"); 
+                eth->connect();
+                sock->init();
+                endpoint->set_address(PLAYER2_IP, SERVER_PORT);
+                //sock.sendTo(endpoint, buffer, sizeof(buffer));
+                //int n = sock.receiveFrom(echo_server, in_buffer, sizeof(in_buffer));
+                break;
+            case PLAYER2:           // Server
+                eth->init(PLAYER2_IP, "255.255.255.0", "0.0.0.0"); 
+                eth->connect();
+                sock->bind(SERVER_PORT);  
+                //sock.sendTo(endpoint, buffer, sizeof(buffer));
+                //int n = sock.receiveFrom(endpoint, buffer, sizeof(buffer));
+                break;   
+        }
+    }
+    
+    void draw(int CMD, int a, int b, int c, int d, int e, char nArgs){
+        
+        // Deal with overflows
+        //if(buffer_idx + nArgs > 256) {//flush();}
+        
+        buffer[buffer_idx] = CMD;
+        if(nArgs >= 1) buffer[buffer_idx+1] = a;
+        if(nArgs >= 2) buffer[buffer_idx+2] = b;
+        if(nArgs >= 3) buffer[buffer_idx+3] = c;
+        if(nArgs >= 4) buffer[buffer_idx+4] = d;
+        if(nArgs == 5) buffer[buffer_idx+5] = e;
+        // ERROR: nArgs > 5
+        
+        
+        buffer_idx += nArgs+1;
+    }
+    
+    void cls(void) { draw(CLS_CMD, 0,0,0,0,0,0); }
+    void background_color(int color) {
+        draw(BG_COLOR_CMD, color, 0,0,0,0,1);
+    }
+    void set_button_state(int a, int b, int c, int d, int e) { draw(BUTTONS_CMD, a,b,c,d,e,5); }
+    void line(int sx, int sy, int ex, int ey, int color) {
+        //draw(LINE_CMD, sx, sy, ex, ey, color);
+    }
+    
+
+    void update() {
+        if(p1_p2 == PLAYER1) {
+            sock->sendTo(*endpoint, (char*)buffer, (buffer_idx+1)*sizeof(buffer[0]));
+            buffer_idx = 0;
+        }else if(p1_p2 == PLAYER2) {
+            int n = sock->receiveFrom(*endpoint, (char*)buffer, sizeof(buffer)/sizeof(buffer[0]));    
+            buffer[n] = '\0';       
+        }
+        
+        int idx = 0;
+        while(buffer[idx] != '\0') {
+            char cmd = buffer[idx];
+            idx++;
+            
+            switch(cmd) {
+                case BG_COLOR_CMD:
+                    //LCD->background_color(buffer[idx+1]);
+                    pc.printf("Change the background to %x\n", buffer[idx]);
+                    idx += 1;
+                    break;
+                case LINE_CMD:
+                    break;
+                case CLS_CMD:
+                    //LCD->cls();
+                    pc.printf("Clear the screen!\n");
+                    idx += 0;
+                    break;
+                case BUTTONS_CMD:
+                    A_button = buffer[idx+0];
+                    B_button = buffer[idx+1];
+                    C_button = buffer[idx+2];
+                    D_button = buffer[idx+3];
+                    E_button = buffer[idx+4];
+                    pc.printf("Button Values: %d %d %d %d %d\n",
+                    A_button, B_button, C_button, D_button, E_button);
+                    idx += 5;
+                    break;
+                default:
+                    pc.printf("UNKNOWN CMD %d: This could get ugly!\n", cmd);
+                    idx += 0;
+            }
+        }
+        
+    }
+    
+    ~uLCD_2P() {            
+        sock->close();
+        eth->disconnect();  
+        delete sock;
+        delete endpoint;
+        delete eth; 
+    }
+ 
+    private:
+        bool master_slave;
+        
+        int buffer[256];
+        int  buffer_idx;
+        
+        UDPSocket* sock;
+        Endpoint*  endpoint;
+        EthernetInterface* eth;
+        
+        uLCD_4DGL* LCD;
+        
+        int A_button;
+        int B_button;
+        int C_button;
+        int D_button;
+        int E_button;
+};
+
+#endif
\ No newline at end of file