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

Committer:
jford38
Date:
Thu Oct 15 19:57:51 2015 +0000
Revision:
4:d8bd8b41468d
Parent:
3:3ddefff03cb2
Child:
5:cfec780c935b
Working without LCD's. Going to add uLCD's now.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jford38 0:899c85cd266f 1 #ifndef TWO_PLAYER_H__
jford38 0:899c85cd266f 2 #define TWO_PLAYER_H__
jford38 0:899c85cd266f 3
jford38 3:3ddefff03cb2 4 #include <cmath>
jford38 0:899c85cd266f 5 #include "uLCD_4DGL.h"
jford38 0:899c85cd266f 6 #include "EthernetInterface.h"
jford38 0:899c85cd266f 7
jford38 0:899c85cd266f 8 #define PLAYER1 true
jford38 0:899c85cd266f 9 #define PLAYER2 false
jford38 0:899c85cd266f 10
jford38 0:899c85cd266f 11 Serial pc(USBTX, USBRX);
jford38 0:899c85cd266f 12
jford38 0:899c85cd266f 13 const char* PLAYER1_IP = "192.168.2.1";
jford38 0:899c85cd266f 14 const char* PLAYER2_IP = "192.168.2.2";
jford38 0:899c85cd266f 15 const int SERVER_PORT = 7;
jford38 0:899c85cd266f 16
jford38 0:899c85cd266f 17 DigitalOut led(LED2);
jford38 0:899c85cd266f 18
jford38 0:899c85cd266f 19
jford38 0:899c85cd266f 20 class uLCD_2P
jford38 0:899c85cd266f 21 {
jford38 0:899c85cd266f 22
jford38 0:899c85cd266f 23 public :
jford38 0:899c85cd266f 24
jford38 0:899c85cd266f 25 int p1_p2;
jford38 3:3ddefff03cb2 26
jford38 0:899c85cd266f 27 enum Color
jford38 0:899c85cd266f 28 {
jford38 4:d8bd8b41468d 29 CLS_CMD=1,
jford38 3:3ddefff03cb2 30 BG_COLOR_CMD,
jford38 0:899c85cd266f 31 LINE_CMD,
jford38 0:899c85cd266f 32 CIRCLE_CMD,
jford38 3:3ddefff03cb2 33 FILLED_CIRCLE_CMD,
jford38 3:3ddefff03cb2 34 TRI_CMD,
jford38 3:3ddefff03cb2 35 RECT_CMD,
jford38 3:3ddefff03cb2 36 FILLED_RECT_CMD,
jford38 3:3ddefff03cb2 37 PIX_CMD,
jford38 3:3ddefff03cb2 38 PEN_SZ_CMD
jford38 0:899c85cd266f 39 };
jford38 0:899c85cd266f 40
jford38 0:899c85cd266f 41 uLCD_2P(PinName tx, PinName rx, PinName rst, bool player) {
jford38 0:899c85cd266f 42 p1_p2 = player;
jford38 0:899c85cd266f 43 //LCD = new uLCD_4DGL (tx, rx, rst);
jford38 0:899c85cd266f 44 }
jford38 0:899c85cd266f 45
jford38 0:899c85cd266f 46 void init() {
jford38 0:899c85cd266f 47
jford38 0:899c85cd266f 48 buffer_idx = 0;
jford38 1:0589ea36661b 49 memset(buttons, 0, sizeof(buttons));
jford38 1:0589ea36661b 50
jford38 0:899c85cd266f 51 switch (p1_p2) {
jford38 0:899c85cd266f 52 case PLAYER1: // Client
jford38 3:3ddefff03cb2 53
jford38 3:3ddefff03cb2 54 eth = new EthernetInterface();
jford38 0:899c85cd266f 55 eth->init(PLAYER1_IP, "255.255.255.0", "0.0.0.0");
jford38 0:899c85cd266f 56 eth->connect();
jford38 3:3ddefff03cb2 57
jford38 3:3ddefff03cb2 58 sock = new TCPSocketConnection();
jford38 3:3ddefff03cb2 59 while(sock->connect(PLAYER2_IP, SERVER_PORT) < 0) {
jford38 3:3ddefff03cb2 60 pc.printf("Trying to connect.\n");
jford38 3:3ddefff03cb2 61 //wait(1);
jford38 3:3ddefff03cb2 62 }
jford38 3:3ddefff03cb2 63
jford38 0:899c85cd266f 64 break;
jford38 0:899c85cd266f 65 case PLAYER2: // Server
jford38 3:3ddefff03cb2 66 eth = new EthernetInterface();
jford38 0:899c85cd266f 67 eth->init(PLAYER2_IP, "255.255.255.0", "0.0.0.0");
jford38 0:899c85cd266f 68 eth->connect();
jford38 3:3ddefff03cb2 69
jford38 3:3ddefff03cb2 70 server = new TCPSocketServer();
jford38 3:3ddefff03cb2 71 server->bind(SERVER_PORT);
jford38 3:3ddefff03cb2 72 server->listen();
jford38 3:3ddefff03cb2 73 sock = new TCPSocketConnection();
jford38 3:3ddefff03cb2 74 server->accept(*sock);
jford38 3:3ddefff03cb2 75 sock->set_blocking(false, 1500);
jford38 0:899c85cd266f 76 break;
jford38 0:899c85cd266f 77 }
jford38 3:3ddefff03cb2 78 pc.printf("Ethernet Connected.\n");
jford38 0:899c85cd266f 79 }
jford38 0:899c85cd266f 80
jford38 3:3ddefff03cb2 81 // Yes, this sucks. If you're smart, find a good way to do variable args and show me!
jford38 3:3ddefff03cb2 82 // Look into template metaprogramming!
jford38 3:3ddefff03cb2 83
jford38 3:3ddefff03cb2 84 void draw(int CMD) {_draw(CMD, 0,0,0,0,0,0,0, 0); }
jford38 3:3ddefff03cb2 85 void draw(int CMD, int a) { _draw(CMD, a, 0,0,0,0,0,0, 1); }
jford38 3:3ddefff03cb2 86 void draw(int CMD, int a, int b) { _draw(CMD, a, b, 0,0,0,0,0, 2); }
jford38 3:3ddefff03cb2 87 void draw(int CMD, int a, int b, int c) { _draw(CMD, a, b, c, 0,0,0,0, 3); }
jford38 3:3ddefff03cb2 88 void draw(int CMD, int a, int b, int c, int d) { _draw(CMD, a, b, c, d, 0,0,0, 4); }
jford38 3:3ddefff03cb2 89 void draw(int CMD, int a, int b, int c, int d, int e) { _draw(CMD, a, b, c, d, e, 0,0, 5); }
jford38 3:3ddefff03cb2 90 void draw(int CMD, int a, int b, int c, int d, int e, int f) { _draw(CMD, a, b, c, d, e, f, 0, 6); }
jford38 3:3ddefff03cb2 91 void draw(int CMD, int a, int b, int c, int d, int e, int f, int g) { _draw(CMD, a, b, c, d, e, f, g, 7); }
jford38 3:3ddefff03cb2 92
jford38 3:3ddefff03cb2 93 void _draw(int CMD, int a, int b, int c, int d, int e, int f, int g, char nArgs){
jford38 0:899c85cd266f 94
jford38 0:899c85cd266f 95 // Deal with overflows
jford38 3:3ddefff03cb2 96 // if(buffer_idx + nArgs > 256) {//flush();}
jford38 3:3ddefff03cb2 97
jford38 3:3ddefff03cb2 98 if(nArgs > 7) {
jford38 3:3ddefff03cb2 99 pc.printf("Error in call to _draw(): nArgs > 7 not allowed!\n");
jford38 3:3ddefff03cb2 100 return;
jford38 3:3ddefff03cb2 101 }
jford38 0:899c85cd266f 102
jford38 0:899c85cd266f 103 buffer[buffer_idx] = CMD;
jford38 0:899c85cd266f 104 if(nArgs >= 1) buffer[buffer_idx+1] = a;
jford38 0:899c85cd266f 105 if(nArgs >= 2) buffer[buffer_idx+2] = b;
jford38 0:899c85cd266f 106 if(nArgs >= 3) buffer[buffer_idx+3] = c;
jford38 0:899c85cd266f 107 if(nArgs >= 4) buffer[buffer_idx+4] = d;
jford38 3:3ddefff03cb2 108 if(nArgs >= 5) buffer[buffer_idx+5] = e;
jford38 3:3ddefff03cb2 109 if(nArgs >= 6) buffer[buffer_idx+6] = f;
jford38 3:3ddefff03cb2 110 if(nArgs >= 7) buffer[buffer_idx+7] = g;
jford38 3:3ddefff03cb2 111 // ERROR: nArgs > 7
jford38 0:899c85cd266f 112
jford38 0:899c85cd266f 113
jford38 0:899c85cd266f 114 buffer_idx += nArgs+1;
jford38 0:899c85cd266f 115 }
jford38 0:899c85cd266f 116
jford38 3:3ddefff03cb2 117
jford38 3:3ddefff03cb2 118 void background_color(int color) { draw(BG_COLOR_CMD, color); }
jford38 3:3ddefff03cb2 119 void line(int sx, int sy, int ex, int ey, int color) { draw(LINE_CMD, sx, sy, ex, ey, color); }
jford38 3:3ddefff03cb2 120 void circle(int x , int y , int radius, int color) { draw(CIRCLE_CMD, x, y, radius, color); }
jford38 3:3ddefff03cb2 121 void filled_circle(int x , int y , int radius, int color) { draw(FILLED_CIRCLE_CMD, x, y, radius, color); }
jford38 3:3ddefff03cb2 122 void triangle(int a, int b, int c, int d , int e, int f, int col) { draw(TRI_CMD, a, b, c, d, e, f, col); }
jford38 3:3ddefff03cb2 123 void rectangle(int a, int b, int c, int d, int col) { draw(RECT_CMD, a, b, c, d, col); }
jford38 3:3ddefff03cb2 124 void filled_rectangle(int a, int b, int c, int d, int col) { draw(FILLED_RECT_CMD, a, b, c, d, col); }
jford38 3:3ddefff03cb2 125 void pixel(int a, int b, int col) { draw(PIX_CMD, a, b, col); }
jford38 3:3ddefff03cb2 126 void cls(void) { draw(CLS_CMD); }
jford38 3:3ddefff03cb2 127
jford38 3:3ddefff03cb2 128 void pen_size(char sz) { draw(PEN_SZ_CMD, sz); }
jford38 3:3ddefff03cb2 129 /*void BLIT(int x1, int y1, int x2, int y2, int *colors) {
jford38 3:3ddefff03cb2 130 int size = abs((x1-x2)*(y1-y2));
jford38 3:3ddefff03cb2 131 // pad to a multiple of 4 and memset buffer...
jford38 3:3ddefff03cb2 132 // I'll get to it later.
jford38 3:3ddefff03cb2 133 }*/
jford38 3:3ddefff03cb2 134
jford38 3:3ddefff03cb2 135 // Reads don't need to be done on the slave side. Hopefully both sides match!
jford38 3:3ddefff03cb2 136 int read_pixel(int x, int y) { return LCD->read_pixel(x, y); }
jford38 3:3ddefff03cb2 137
jford38 1:0589ea36661b 138 void set_button_state(int a, int b, int c, int d, int e) {
jford38 1:0589ea36661b 139 buttons[0] = a; buttons[1] = b; buttons[2] = c;
jford38 1:0589ea36661b 140 buttons[3] = d; buttons[4] = e;
jford38 1:0589ea36661b 141 }
jford38 3:3ddefff03cb2 142
jford38 1:0589ea36661b 143 int* get_button_state() {
jford38 1:0589ea36661b 144 return buttons;
jford38 1:0589ea36661b 145 }
jford38 0:899c85cd266f 146
jford38 0:899c85cd266f 147 void update() {
jford38 1:0589ea36661b 148 sock->set_blocking(true, 100);
jford38 0:899c85cd266f 149 if(p1_p2 == PLAYER1) {
jford38 3:3ddefff03cb2 150 sock->send_all((char*)buffer, (buffer_idx+1)*sizeof(buffer[0]));
jford38 0:899c85cd266f 151 buffer_idx = 0;
jford38 3:3ddefff03cb2 152
jford38 3:3ddefff03cb2 153 int n = sock->receive((char*)buttons, sizeof(buttons));
jford38 3:3ddefff03cb2 154 if(n < 0) {pc.printf("RECEIVE ERROR.\n");}
jford38 2:c358ad9aedc4 155
jford38 3:3ddefff03cb2 156 }else if(p1_p2 == PLAYER2) {
jford38 3:3ddefff03cb2 157 int n = sock->receive((char*)buffer, sizeof(buffer));
jford38 2:c358ad9aedc4 158 if(n < 0) {pc.printf("RECEIVE ERROR.\n");}
jford38 1:0589ea36661b 159 buffer[n] = '\0';
jford38 3:3ddefff03cb2 160 sock->send_all((char*)buttons, sizeof(buttons));
jford38 0:899c85cd266f 161 }
jford38 0:899c85cd266f 162
jford38 4:d8bd8b41468d 163 int i = 0;
jford38 4:d8bd8b41468d 164 pc.printf("Buffer: ");
jford38 2:c358ad9aedc4 165 while(buffer[i] != '\0') {
jford38 2:c358ad9aedc4 166 pc.printf("%d ", buffer[i]);
jford38 2:c358ad9aedc4 167 i++;
jford38 2:c358ad9aedc4 168 }
jford38 2:c358ad9aedc4 169 pc.printf("\n");
jford38 2:c358ad9aedc4 170
jford38 0:899c85cd266f 171 int idx = 0;
jford38 0:899c85cd266f 172 while(buffer[idx] != '\0') {
jford38 0:899c85cd266f 173 char cmd = buffer[idx];
jford38 0:899c85cd266f 174 idx++;
jford38 0:899c85cd266f 175
jford38 0:899c85cd266f 176 switch(cmd) {
jford38 0:899c85cd266f 177 case BG_COLOR_CMD:
jford38 0:899c85cd266f 178 //LCD->background_color(buffer[idx+1]);
jford38 0:899c85cd266f 179 pc.printf("Change the background to %x\n", buffer[idx]);
jford38 0:899c85cd266f 180 idx += 1;
jford38 0:899c85cd266f 181 break;
jford38 0:899c85cd266f 182 case LINE_CMD:
jford38 3:3ddefff03cb2 183 pc.printf("LINE: (%d, %d) - (%d, %d) COLOR: %X\n", buffer[idx], buffer[idx+1], buffer[idx+2], buffer[idx+3], buffer[idx+4]);
jford38 3:3ddefff03cb2 184 idx += 5;
jford38 0:899c85cd266f 185 break;
jford38 0:899c85cd266f 186 case CLS_CMD:
jford38 0:899c85cd266f 187 //LCD->cls();
jford38 0:899c85cd266f 188 pc.printf("Clear the screen!\n");
jford38 0:899c85cd266f 189 break;
jford38 3:3ddefff03cb2 190 case CIRCLE_CMD:
jford38 3:3ddefff03cb2 191 //LCD->cls();
jford38 3:3ddefff03cb2 192 pc.printf("CIRCLE: (%d, %d), r=%d\n", buffer[idx], buffer[idx+1], buffer[idx+2]);
jford38 4:d8bd8b41468d 193 idx += 4;
jford38 2:c358ad9aedc4 194 break;
jford38 0:899c85cd266f 195 default:
jford38 0:899c85cd266f 196 pc.printf("UNKNOWN CMD %d: This could get ugly!\n", cmd);
jford38 0:899c85cd266f 197 idx += 0;
jford38 0:899c85cd266f 198 }
jford38 0:899c85cd266f 199 }
jford38 0:899c85cd266f 200 }
jford38 0:899c85cd266f 201
jford38 0:899c85cd266f 202 ~uLCD_2P() {
jford38 0:899c85cd266f 203 sock->close();
jford38 0:899c85cd266f 204 eth->disconnect();
jford38 0:899c85cd266f 205 delete sock;
jford38 3:3ddefff03cb2 206 delete server;
jford38 0:899c85cd266f 207 delete eth;
jford38 0:899c85cd266f 208 }
jford38 0:899c85cd266f 209
jford38 0:899c85cd266f 210 private:
jford38 0:899c85cd266f 211 bool master_slave;
jford38 0:899c85cd266f 212
jford38 0:899c85cd266f 213 int buffer[256];
jford38 0:899c85cd266f 214 int buffer_idx;
jford38 0:899c85cd266f 215
jford38 3:3ddefff03cb2 216 TCPSocketServer* server;
jford38 3:3ddefff03cb2 217 TCPSocketConnection* sock;
jford38 0:899c85cd266f 218 EthernetInterface* eth;
jford38 0:899c85cd266f 219
jford38 0:899c85cd266f 220 uLCD_4DGL* LCD;
jford38 0:899c85cd266f 221
jford38 1:0589ea36661b 222 int buttons[5];
jford38 0:899c85cd266f 223 };
jford38 0:899c85cd266f 224
jford38 3:3ddefff03cb2 225 #endif