change to final_test
Dependencies: 4DGL-uLCD-SE EthernetInterface HTTPClient mbed-rtos mbed
Fork of Fianl_test by
main.cpp
- Committer:
- jderiso2
- Date:
- 2015-05-01
- Revision:
- 4:e928ee72a948
- Parent:
- 3:b834ab4a53d1
File content as of revision 4:e928ee72a948:
#include "mbed.h" #include "uLCD_4DGL.h" #include "board.h" #include "rtos.h" #include "EthernetInterface.h" #include "HTTPClient.h" #include <sstream> #include <string> #include <iostream> uLCD_4DGL lcd(p28,p27,p30); // serial tx, serial rx, reset pin; Serial pc(USBTX, USBRX); DigitalIn in0(p11); DigitalIn in1(p12); DigitalIn in2(p13); DigitalIn in3(p14); DigitalIn in4(p15); DigitalIn in5(p16); DigitalIn in6(p17); DigitalIn in7(p18); DigitalIn in8(p19); int player1=1; int player2=2; int turn =1; int printout = 0; void printBoard(int ** board) { lcd.cls(); lcd.line(0, 42 , 127, 42 , 0xFF0000); lcd.line(0, 84 , 127, 84 , 0xFF0000); lcd.line(42, 0 , 42, 127, 0xFF0000); lcd.line(84, 0, 84, 127, 0xFF0000); for(int i=0; i<3; i++) { for(int j=0; j<3; j++) { if(board[i][j] == 0) { lcd.line( j*42+2 , i*42 + 2 ,(j+1)*42-2 , (i+1)*42-2 , GREEN); lcd.line( j*42+2 , (i+1)*42 - 2 ,(j+1)*42-2 , (i)*42+2 , GREEN); } else if(board[i][j] == 1) { lcd.circle(42*j+21, 42*i+21, 19, BLUE); } } } } typedef enum GAME_STATE { STARTING, PLAYING, OVER, RETURN_ERROR = -1 } GAME_STATE; HTTPClient http; EthernetInterface eth; char str[1024]; int StartNewGame() { char* url = "http://4180.azurewebsites.net/api/TicTacToeGames/New\0"; HTTPResult ret = http.get(url, str, 1024); if (ret > 0) { pc.printf("HTTP Error return in StartNewGame\n"); return -1; } return atoi(str); } int JoinGame() { char* url = "http://4180.azurewebsites.net/api/TicTacToeGames/Join\0"; HTTPResult ret = http.get(url, str, 1024); if (ret > 0) { pc.printf("HTTP Error return in JoinGame\n"); return -1; } return atoi(str); } GAME_STATE GetGameState(int gameId) { string s; stringstream host; host.clear(); host << "http://4180.azurewebsites.net/odata/TicTacToeGames(" << gameId << ")?$select=GameState"; //printf("**** HOST IS %s\n", host.str().c_str()); HTTPResult ret = http.get(host.str().c_str(), str, 1024, 15000); if (ret > 0) { pc.printf("HTTP Error return in GetGameState\n"); return (GAME_STATE)-1; } s = string(str); if (s.find("\"GameState\":\"STARTING\"") != string::npos) return STARTING; else if(s.find("\"GameState\":\"PLAYING\"") != string::npos) return PLAYING; else if(s.find("\"GameState\":\"OVER\"") != string::npos) return OVER; else return RETURN_ERROR; // return (GAME_STATE)atoi(str); } void ParseBoard(string str, int** board) { // printf("Entering ParseBoard, got %s\n", str.c_str()); for (int i = 0; i < str.length(); i++) { if (str[i] == '[' || str[i] == ']' || str[i] == ',' || str[i] == '"') str[i] = ' '; } string temp; for (int i = 0; i < str.length() - 1; i++) { if (!(str[i] == ' ' && str[i+1] == ' ')) { temp += str[i]; } } str = temp; // printf("With changed delimiters %s\n", str.c_str()); stringstream stream(str); int t = 0; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { stream >> board[i][j]; //printf("%d\n", board[i][j]); } } /* for (int i = 0; i < 3; i++) { printf("\n["); for (int j = 0; j < 3; j++) printf("%d ", board[i][j]); printf("]"); }*/ } int PostMove(int playerId,int gameId, int x, int y) { stringstream host; host << "http://4180.azurewebsites.net/api/TicTacToeGames?gameId=" << gameId << "&playerId=" << playerId << "&moveX=" << x << "&moveY=" << y; string s = host.str(); HTTPText datain(""); HTTPMap dataout; HTTPResult ret = http.post(s.c_str(), dataout, &datain, 10000); if (ret > 0) { pc.printf("HTTP Error in PostMove"); return -1; } return 0; } int GetCurrentPlayer(int gameId) { stringstream host; host << "http://4180.azurewebsites.net/odata/TicTacToeGames(" << gameId << ")?$select=CurrentPlayer"; string s = host.str(); int retry_count = 5; HTTPResult ret = (HTTPResult)1; while (ret > 0 & retry_count-- > 0) ret = http.get(s.c_str(), str, 1024); if (ret > 0) { pc.printf("HTTP Error return in GetCurrentPlayer\n"); return -1; } s = string(str); int pos = s.find("\"CurrentPlayer\":"); if (pos == string::npos) return -1; return s[pos+16] - '0'; } int GetWinner(int gameId) { stringstream host; host << "http://4180.azurewebsites.net/odata/TicTacToeGames(" << gameId << ")?$select=Winner"; string s = host.str(); int retry_count = 5; HTTPResult ret = (HTTPResult)1; while (ret > 0 & retry_count-- > 0) ret = http.get(s.c_str(), str, 1024); if (ret > 0) { pc.printf("HTTP Error return in GetWinner\n"); return -1; } s = string(str); int pos = s.find("\"Winner\":"); if (pos == string::npos) return -1; return s[pos+9] - '0'; } int GetBoardState(int gameId, int** board) { stringstream host; host << "http://4180.azurewebsites.net/odata/TicTacToeGames(" << gameId << ")?$select=BoardState"; string s = host.str(); int retry_count = 5; HTTPResult ret = (HTTPResult)1; while (ret > 0 & retry_count-- > 0) ret = http.get(s.c_str(), str, 1024); if (ret > 0) { pc.printf("HTTP Error return in GetBoardState\n"); return -1; } s = string(str); int pos = s.find("\"BoardState\":"); if (pos == string::npos) return -1; ParseBoard(s.substr(pos +13, string::npos), board); return 0; } string GameStateToString(GAME_STATE state) { switch(state) { case STARTING: return "STARTING"; case PLAYING: return "PLAYING"; case OVER: return "OVER"; default: case RETURN_ERROR: return "ERROR"; } } int GetSerialInput() { return pc.getc() - '0'; } void ScanForMove(int* x, int* y, int** board) { // the following commented section can be used to input moves over pc terminal by pressing 00 for move at location [0,0] /* pc.printf("Entering scan\n"); *x = GetSerialInput(); *y = GetSerialInput(); return; */ while(1) { if (!in0 && board[0][0]== -1) { *x = 0; *y = 0; return; } else if (!in1 && board[0][1] == -1) { *x = 0; *y = 1; return; } else if (!in2 && board[0][2] == -1) { *x = 0; *y = 2; return; } else if (!in3 && board[1][0] == -1) { *x = 1; *y = 0; return; } else if (!in4 && board[1][1] == -1) { *x = 1; *y = 1; return; } else if (!in5 && board[1][2] == -1) { *x = 1; *y = 2; return; } else if (!in6 && board[2][0] == -1) { *x = 2; *y = 0; return; } else if (!in7 && board[2][1] == -1) { *x = 2; *y = 1; return; } else if (!in8 && board[2][2] == -1) { *x = 2; *y = 2; return; } wait(0.2); } } int main() { pc.printf("Ethernet connecting...\n"); eth.init(); //Use DHCP eth.connect(); pc.printf("IP Address is %s\n", eth.getIPAddress()); in0.mode(PullUp); in1.mode(PullUp); in2.mode(PullUp); in3.mode(PullUp); in4.mode(PullUp); in5.mode(PullUp); in6.mode(PullUp); in7.mode(PullUp); in8.mode(PullUp); lcd.baudrate(3000000); // START GAME OR JOIN GAME // FORMAT THIS TO LOOK PRETTY ON LCD int gameId = -1; int playerId = -1; bool reprint = true; do { if (reprint) { lcd.cls(); lcd.printf("Button 0: Start New Game\nButton 1: Join Existing Game"); reprint = false; } // I'm assuming by looking at the code that // you guys made the buttons active low so inverting the read if (!in0 /*|| true*/) { // Start Game gameId = StartNewGame(); if (gameId < 1) { // fail lcd.printf("Failed to start a new game!\n"); wait(1.5); reprint = true; } else playerId = 0; } else if(!in1) { gameId = JoinGame(); if (gameId < 1) { // fail lcd.printf("Failed to join game, try making one!\n"); wait(1.5); reprint = true; } else playerId = 1; } } while (gameId < 1); lcd.cls(); if (playerId == 1){ pc.printf("Successfully joined game %d!\n", gameId); lcd.printf("Successfully joined game %d!\n", gameId); } else{ pc.printf("Successfully started game %d!\n", gameId); lcd.printf("Successfully started game %d!\n", gameId); } wait(1.5); Board board; lcd.cls(); lcd.printf("Waiting for game to start...\n"); // wait for game to start while(GetGameState(gameId) != PLAYING) { wait(2); } // Main Game Loop lcd.cls(); while(1) { GAME_STATE state = GetGameState(gameId); if (state == OVER) break; // game over // wait for turn while(GetCurrentPlayer(gameId) != playerId){ wait(1.5); } GetBoardState(gameId, board.get_board()); printBoard(board.get_board()); state = GetGameState(gameId); if (state == OVER) break; int moveX, moveY; ScanForMove(&moveX,&moveY, board.get_board()); PostMove(playerId, gameId, moveX, moveY); GetBoardState(gameId, board.get_board()); printBoard(board.get_board()); wait(2); } int winner = GetWinner(gameId); pc.printf("Player %d Won!\n", winner); lcd.printf("Player %d Won!\n", winner); /* lcd.line(0, 42 , 127, 42 , 0xFF0000); lcd.line(0, 84 , 127, 84 , 0xFF0000); lcd.line(42, 0 , 42, 127, 0xFF0000); lcd.line(84, 0, 84, 127, 0xFF0000);*/ /* while (true) { if(!in0) printout = 1; else if(!in1) printout = 2; else if(!in2) printout = 3; else if(!in3) printout = 4; else if(!in4) printout = 5; else if(!in5) printout = 6; else if(!in6) printout = 7; else if(!in7) printout = 8; else if(!in8) printout = 9; else printout = 0; if(printout>0) { bool valid = board.updateBoard(turn, printout-1); if(valid) { output = board.get_board(); printBoard(output); printout=0; int victory = board.check_victory(turn); if(victory ==1) { lcd.cls(); lcd.printf("player 1 win!"); return 0; } else if(victory == 2) { lcd.cls(); lcd.printf("player 2 win!"); return 0; } if(turn ==1) turn =2; else turn =1; } } Thread::wait(400); } */ } int TEST_FN() { pc.printf("Trying Start New Game...\n"); int game = StartNewGame(); wait(1); while (JoinGame() != game) { wait(0.5); } int player = 0; Board b; printf("Joined Game %d\n", game); bool sentinel = true; while (sentinel) { GetBoardState(game, b.get_board()); printBoard(b.get_board()); if (player == 0) { PostMove(player, game, 0, 0); pc.printf("Exited first post move\n"); player = 1; } else { PostMove(1, game, 1, 1); sentinel = false; } wait(0.5); } pc.printf("Done with move\n"); wait(0.5); GetBoardState(game, b.get_board()); printBoard(b.get_board()); pc.printf("Got: %d\n\n", game); pc.printf("Trying GetGameState for Game %d...\n", game); pc.printf("Got: %s\n\n", GameStateToString(GetGameState(game)).c_str()); pc.printf("Trying Join Game...\n"); game = JoinGame(); wait(1); pc.printf("Got: %d\n\n", game); //pc.printf("Trying GetGameState for Game %d...\n", game); //pc.printf("Got: %s\n\n", GameStateToString(GetGameState(game)).c_str()); pc.printf("Trying GetBoardState for Game %d...\n", game); // Board b; wait(1); pc.printf("Got: %d\n\n", GetBoardState(game, b.get_board())); pc.printf("Testing over****\n"); /*pc.printf("%d\n", sizeof(str)); HTTPResult ret = http.get("http://4180.azurewebsites.net/api/TicTacToeGames/New", str, 4096);//http.get("http://4180.azurewebsites.net/", str, 4096); if (ret > 0) pc.printf("Return error\n"); for (int i = 0; i < 4096;i++){ if (str[i] == '1'|| str[i] == '2' || str[i] == '3' || str[i] == '4') pc.printf("HERE %d\n", i); pc.putc(str[i]); pc.printf("\n"); }*/ return 0; TCPSocketConnection socket; int r = socket.connect("4180.azurewebsites.net", 80); if (r != 0) pc.printf("Failed to connect to 4180.azurewebsites.net:80!\r\n"); char http_cmd[] = "GET / HTTP/1.0\n\n"; socket.send_all(http_cmd, sizeof(http_cmd)-1); char buff[300]; int rtn; while (true) { rtn = socket.receive(buff, sizeof(buff)-1); if (rtn <= 0) break; buff[rtn] = '\0'; pc.printf("Received %d chars from server:\n%s\n", rtn, buff); } pc.printf("Closing socket...\n"); socket.close(); eth.disconnect(); }