change to final_test

Dependencies:   4DGL-uLCD-SE EthernetInterface HTTPClient mbed-rtos mbed

Fork of Fianl_test by Hongyao Shi

Revision:
3:b834ab4a53d1
Parent:
1:4e629f9ac9e8
Child:
4:e928ee72a948
--- a/main.cpp	Wed Apr 22 01:48:08 2015 +0000
+++ b/main.cpp	Mon Apr 27 17:38:55 2015 +0000
@@ -53,10 +53,11 @@
 } GAME_STATE;
 HTTPClient http;
 EthernetInterface eth;
-char str[4096];
+char str[1024];
 int StartNewGame()
 {
-    HTTPResult ret = http.get("http://4180.azurewebsites.net/api/TicTacToeGames/New", str, 4096);
+    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;
@@ -65,25 +66,23 @@
 }
 int JoinGame()
 {
-    HTTPResult ret = http.get("http://4180.azurewebsites.net/api/TicTacToeGames/Join", str, 4096);
+    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);
 }
-ostringstream host;
-string s;
-const char* cstr;
 GAME_STATE GetGameState(int gameId)
 {
-    //ostringstream host;
+    string s;
+    stringstream host;
     host.clear();
     host  << "http://4180.azurewebsites.net/odata/TicTacToeGames(" << gameId << ")?$select=GameState";
-    s = host.str();
-    cstr = s.c_str();
-    printf("**** HOST IS  %s\n", cstr);
-    HTTPResult ret = http.get(cstr, str, 4096);
+    //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;
@@ -98,63 +97,106 @@
     else
         return RETURN_ERROR;
 
-    return (GAME_STATE)atoi(str);
+  //  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++){
+
+    // 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] = ' ';    
+            str[i] = ' ';
     }
     string temp;
-    for (int i = 0; i < str.length() - 1; i++){
-        if (!(str[i] == ' ' && str[i+1] == ' ')){
+    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());
+    // 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++){
-            while(t < str.length() && str[t] == ' ')
-                t++;
-                board[i][j] = (int)(str[t] - '0');
-            //stream >> board[i][j];  
-            }  
+    for (int i = 0; i < 3; i++) {
+        for (int j = 0; j < 3; j++) {
+            stream >> board[i][j];
+            //printf("%d\n", board[i][j]);
+        }
     }
-    
-   /* char c;
-    stream >> c; // eat [
-    for (int i = 0; i < 3; i++) {
-        stream >> c; // eat [
-        for (int j = 0; j < 2; j++) {
-            stream >> board[i][j];
-            stream >> c ;// eat ,
-        }
-        stream >> board[i][2];
-        stream >> c ;// eat ]
-        if (i != 2)
-            stream >> c; // eat ,
-    }*/
-  /*  for (int i = 0; i < 3; i++) {
+
+    /*  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)
 {
-    ostringstream host;
+    stringstream host;
     host  << "http://4180.azurewebsites.net/odata/TicTacToeGames(" << gameId << ")?$select=BoardState";
     string s = host.str();
-    HTTPResult ret = http.get(s.c_str(), str, 4096);
+    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;
@@ -181,15 +223,244 @@
             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());
+        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());
@@ -200,7 +471,7 @@
     //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;
+    // Board b;
     wait(1);
     pc.printf("Got: %d\n\n", GetBoardState(game, b.get_board()));
     pc.printf("Testing over****\n");
@@ -236,84 +507,5 @@
     pc.printf("Closing socket...\n");
     socket.close();
     eth.disconnect();
-    /* int ret = http.get("http://ece4180mbedonlinegaming.azurewebsites.net/odata/TicTacToeGames(1)?$select=BoardState", str, 2048);
-     printf("%d\n",ret);
-     printf("Result: %s\n", str);*/
-    /*
-    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);
-
-    Board board;
-    int ** output = board.get_board();
-    printBoard(output);
-    lcd.baudrate(3000000);
-
-    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);
-    }
-    */
-
 }