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
Diff: Game_Synchronizer/game_synchronizer.cpp
- Revision:
- 9:ee330b1ba394
- Parent:
- 8:e6dd05393290
- Child:
- 10:5da9b27e050e
--- a/Game_Synchronizer/game_synchronizer.cpp Thu Oct 22 09:52:53 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,204 +0,0 @@ -#include "game_synchronizer.h" - -extern Serial pc; - -Game_Synchronizer::Game_Synchronizer(bool player) { - p1_p2 = player; -} - -void Game_Synchronizer::init(uLCD_4DGL* lcd, int mode) { - - // Save a pointer to the local lcd. - LCD = lcd; - // Save the play mode. (Multi-player or Single-player) - play_mode = mode; - - // Initialize the idx into the send_buffer to zero. - buffer_idx = 0; - - // buttons is the array containing player two's button (and accelerometer) values. - // Initialize it to zero. - memset(buttons, 0, sizeof(buttons)); - - switch (p1_p2) { - case PLAYER1: // If I am p1... - - // If play_mode is set to multi-player, establish the ethernet connection. - if(MULTI_PLAYER == play_mode) { - eth = new EthernetInterface(); - eth->init(PLAYER1_IP, "255.255.255.0", "0.0.0.0"); - eth->connect(); - - sock = new TCPSocketConnection(); - while(sock->connect(PLAYER2_IP, SERVER_PORT) < 0) { - //pc.printf("Trying to connect.\n"); - } - } - break; - case PLAYER2: // If I am p2... - - // If I am player 2, play_mode doesn't matter. I have to assume it's - // set to multi-player and try to connect to p1. - eth = new EthernetInterface(); - eth->init(PLAYER2_IP, "255.255.255.0", "0.0.0.0"); - eth->connect(); - - server = new TCPSocketServer(); - server->bind(SERVER_PORT); - server->listen(); - sock = new TCPSocketConnection(); - server->accept(*sock); - sock->set_blocking(false, 1500); - break; - } -} - -// Yes, this sucks. If you're smart, find a good way to do variable args and show me! -// Look into template metaprogramming! - -void Game_Synchronizer::draw(int CMD) {_draw(CMD, 0,0,0,0,0,0,0, 0); } -void Game_Synchronizer::draw(int CMD, int a) { _draw(CMD, a, 0,0,0,0,0,0, 1); } -void Game_Synchronizer::draw(int CMD, int a, int b) { _draw(CMD, a, b, 0,0,0,0,0, 2); } -void Game_Synchronizer::draw(int CMD, int a, int b, int c) { _draw(CMD, a, b, c, 0,0,0,0, 3); } -void Game_Synchronizer::draw(int CMD, int a, int b, int c, int d) { _draw(CMD, a, b, c, d, 0,0,0, 4); } -void Game_Synchronizer::draw(int CMD, int a, int b, int c, int d, int e) { _draw(CMD, a, b, c, d, e, 0,0, 5); } -void Game_Synchronizer::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); } -void Game_Synchronizer::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); } - -void Game_Synchronizer::_draw(int CMD, int a, int b, int c, int d, int e, int f, int g, char nArgs){ - - // I haven't had time to deal with overflows of the buffer. If you are pushing tons of draw calls into the buffer, - // you could overrun it. This will cause bad things. (At a minimum, your stuff won't be drawn.) - // If you have this problem, try calling update in the middle of your draw calls to flush the buffer. - // Alternatively, you can increase ETH_PACKET_SIZE. - - if(nArgs > 7) { - //pc.printf("Error in call to _draw(): nArgs > 7 not allowed!\n"); - return; - } - - 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; - if(nArgs >= 6) buffer[buffer_idx+6] = f; - if(nArgs >= 7) buffer[buffer_idx+7] = g; - // ERROR: nArgs > 7 - - - buffer_idx += nArgs+1; -} - - -void Game_Synchronizer::background_color(int color) { draw(BG_COLOR_CMD, color); } -void Game_Synchronizer::line(int sx, int sy, int ex, int ey, int color) { draw(LINE_CMD, sx, sy, ex, ey, color); } -void Game_Synchronizer::circle(int x , int y , int radius, int color) { draw(CIRCLE_CMD, x, y, radius, color); } -void Game_Synchronizer::filled_circle(int x , int y , int radius, int color) { draw(FILLED_CIRCLE_CMD, x, y, radius, color); } -void Game_Synchronizer::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); } -void Game_Synchronizer::rectangle(int a, int b, int c, int d, int col) { draw(RECT_CMD, a, b, c, d, col); } -void Game_Synchronizer::filled_rectangle(int a, int b, int c, int d, int col) { draw(FILLED_RECT_CMD, a, b, c, d, col); } -void Game_Synchronizer::pixel(int a, int b, int col) { draw(PIX_CMD, a, b, col); } -void Game_Synchronizer::cls(void) { draw(CLS_CMD); } - -/*void Game_Synchronizer::BLIT(int x1, int y1, int x2, int y2, int *colors) { - int size = abs((x1-x2)*(y1-y2)); - // pad to a multiple of 4 and memset buffer... - // I'll get to it later. -}*/ - -// Reads don't need to be done on the slave side. Hopefully both sides match! -int Game_Synchronizer::read_pixel(int x, int y) { return LCD->read_pixel(x, y); } - -void Game_Synchronizer::set_button_state(int a, int b, int c, int d, int e) { - buttons[0] = a; buttons[1] = b; buttons[2] = c; - buttons[3] = d; buttons[4] = e; -} - -int* Game_Synchronizer::get_button_state() { - return buttons; -} - -void Game_Synchronizer::update() { - int buffer_size = buffer_idx; - buffer_idx = 0; - - if(p1_p2 == PLAYER1 && MULTI_PLAYER == play_mode) { - sock->set_blocking(true, 100); - sock->send_all((char*)buffer, (buffer_size+1)*sizeof(buffer[0])); - - int n = sock->receive((char*)buttons, sizeof(buttons)); - //if(n < 0) {pc.printf("RECEIVE ERROR.\n");} - - }else if(p1_p2 == PLAYER2) { - sock->set_blocking(true, 100); - int n = sock->receive((char*)buffer, sizeof(buffer)); - //if(n < 0) {pc.printf("RECEIVE ERROR.\n");} - buffer[n] = '\0'; - buffer_size = n/sizeof(buffer[0]) - 1; - - sock->send_all((char*)buttons, sizeof(buttons)); - } - - int idx = 0; - while(idx < buffer_size) { - char cmd = buffer[idx]; - idx++; - - switch(cmd) { - case CLS_CMD: - LCD->cls(); - //pc.printf("Clear the screen!\n"); - break; - case BG_COLOR_CMD: - LCD->background_color(buffer[idx+1]); - //pc.printf("Change the background to 0x%X\n", buffer[idx]); - idx += 1; - break; - case LINE_CMD: - //pc.printf("LINE: (%d, %d) - (%d, %d) COLOR: 0x%X\n", buffer[idx], buffer[idx+1], buffer[idx+2], buffer[idx+3], buffer[idx+4]); - LCD->line(buffer[idx], buffer[idx+1], buffer[idx+2], buffer[idx+3], buffer[idx+4]); - idx += 5; - break; - case CIRCLE_CMD: - //pc.printf("CIRCLE: (%d, %d), r=%d\n", buffer[idx], buffer[idx+1], buffer[idx+2]); - LCD->circle(buffer[idx], buffer[idx+1], buffer[idx+2], buffer[idx+3]); - idx += 4; - break; - case FILLED_CIRCLE_CMD: - //pc.printf("CIRCLE: (%d, %d), r=%d\n", buffer[idx], buffer[idx+1], buffer[idx+2]); - LCD->filled_circle(buffer[idx], buffer[idx+1], buffer[idx+2], buffer[idx+3]); - idx += 4; - break; - case TRI_CMD: - //pc.printf("CIRCLE: (%d, %d), r=%d\n", buffer[idx], buffer[idx+1], buffer[idx+2]); - LCD->triangle(buffer[idx], buffer[idx+1], buffer[idx+2], buffer[idx+3], buffer[idx+4], buffer[idx+5], buffer[idx+6]); - idx += 7; - break; - case RECT_CMD: - LCD->rectangle(buffer[idx], buffer[idx+1], buffer[idx+2], buffer[idx+3], buffer[idx+4]); - idx += 5; - break; - case FILLED_RECT_CMD: - LCD->filled_rectangle(buffer[idx], buffer[idx+1], buffer[idx+2], buffer[idx+3], buffer[idx+4]); - idx += 5; - break; - case PIX_CMD: - LCD->pixel(buffer[idx], buffer[idx+1], buffer[idx+2]); - idx += 3; - break; - default: - //pc.printf("UNKNOWN CMD %d: This could get ugly!\n", cmd); - idx += 0; - } - } -} - -Game_Synchronizer::~Game_Synchronizer() { - sock->close(); - eth->disconnect(); - delete sock; - delete server; - delete eth; -}