Coordinator v2

Dependencies:   NerfUSXbee PinDetect EthernetInterface JSON MFRC522 WebSocketClient mbed-rtos mbed

Files at this revision

API Documentation at this revision

Comitter:
Ismael Balafrej
Date:
Tue Apr 11 12:40:05 2017 -0400
Parent:
1:e1c5259b7d9a
Child:
3:501120a68c11
Commit message:
Final version without allies/enemies

Changed in this revision

.hgignore Show annotated file Show diff for this revision Revisions of this file
.mbed Show annotated file Show diff for this revision Revisions of this file
EthernetInterface.lib Show annotated file Show diff for this revision Revisions of this file
JSON.lib Show annotated file Show diff for this revision Revisions of this file
MFRC522.lib Show annotated file Show diff for this revision Revisions of this file
WebSocketClient.lib Show annotated file Show diff for this revision Revisions of this file
includes/GameCoordinator.hpp Show annotated file Show diff for this revision Revisions of this file
includes/GameMode.hpp Show annotated file Show diff for this revision Revisions of this file
includes/GameModes/ReflexMode.hpp Show annotated file Show diff for this revision Revisions of this file
includes/Rfid.hpp Show annotated file Show diff for this revision Revisions of this file
includes/ServerData.hpp Show annotated file Show diff for this revision Revisions of this file
includes/Target.hpp Show annotated file Show diff for this revision Revisions of this file
includes/dispatcher.hpp Show annotated file Show diff for this revision Revisions of this file
includes/serverEvents.hpp Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed-rtos.lib Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
src/GameCoordinator.cpp Show annotated file Show diff for this revision Revisions of this file
src/Target.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/.hgignore	Mon Apr 10 15:02:24 2017 -0400
+++ b/.hgignore	Tue Apr 11 12:40:05 2017 -0400
@@ -1,10 +1,10 @@
 BUILD
 .temp
-JSON
-mbed-rtos
-mbed
-WebSocketClient
+mbed-rtos/
+mbed/
+WebSocketClient/
 .git
-MFRC522
-JSON
-EthernetInterface
+MFRC522/
+JSON/
+EthernetInterface/
+mbed_settings
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.mbed	Tue Apr 11 12:40:05 2017 -0400
@@ -0,0 +1,3 @@
+TARGET=LPC1768
+TOOLCHAIN=GCC_ARM
+ROOT=.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/EthernetInterface.lib	Tue Apr 11 12:40:05 2017 -0400
@@ -0,0 +1,1 @@
+https://mbed.org/users/mbed_official/code/EthernetInterface/#183490eb1b4a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/JSON.lib	Tue Apr 11 12:40:05 2017 -0400
@@ -0,0 +1,1 @@
+https://mbed.org/teams/Night-Crue/code/JSON/#8aa4d0e98eb0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MFRC522.lib	Tue Apr 11 12:40:05 2017 -0400
@@ -0,0 +1,1 @@
+https://mbed.org/users/AtomX/code/MFRC522/#63d729186747
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WebSocketClient.lib	Tue Apr 11 12:40:05 2017 -0400
@@ -0,0 +1,1 @@
+https://mbed.org/users/samux/code/WebSocketClient/#4567996414a5
--- a/includes/GameCoordinator.hpp	Mon Apr 10 15:02:24 2017 -0400
+++ b/includes/GameCoordinator.hpp	Tue Apr 11 12:40:05 2017 -0400
@@ -16,6 +16,10 @@
         void stop_game();
         void ticker_callback();
         void get_next_round();
+        void target_hit(int time_taken);
+        void target_miss();
+
+        void (*on_game_finish)(ServerEvent) = NULL;
 
         vector<Target> targets;
         Thread Tget_next_round;
@@ -25,6 +29,7 @@
         uint16_t target_timeout = 10000;
         uint8_t number_of_targets = 10;
         Ticker ticker;
+        Timer timer;
 };
 
 extern GameCoordinator gameCoordinator;
\ No newline at end of file
--- a/includes/GameMode.hpp	Mon Apr 10 15:02:24 2017 -0400
+++ b/includes/GameMode.hpp	Tue Apr 11 12:40:05 2017 -0400
@@ -12,11 +12,6 @@
     targets = _targets;
   }
 
-  virtual bool IsWeaponValid(int weaponId)
-  {
-    return true; //Default to any Weapons
-  }
-
   virtual ServerData GetStats()
   {
     return stats;
@@ -30,6 +25,14 @@
     return 1000; //default to 1 sec
   }
 
+  void reset()
+  {
+    stats.targets = 0;
+    stats.score = 0;
+    stats.averageReflexTime = 0;
+    stats.gameLength = 0;
+  }
+
 protected:
   ServerData stats;
   vector<Target>* targets;
--- a/includes/GameModes/ReflexMode.hpp	Mon Apr 10 15:02:24 2017 -0400
+++ b/includes/GameModes/ReflexMode.hpp	Tue Apr 11 12:40:05 2017 -0400
@@ -12,7 +12,7 @@
     void OnTargetHit(int timeTaken)
     {
       stats.targets++;
-      stats.score += 5;
+      stats.score += 2;
     }
     void OnTargetMiss()
     {
@@ -20,6 +20,6 @@
     }  
     int getTimeBetweenTargets()
     {
-      return rand() % 3000 + 500;
+      return (rand() % 3000) + 1000;
     }
 };
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/includes/Rfid.hpp	Tue Apr 11 12:40:05 2017 -0400
@@ -0,0 +1,40 @@
+#include "ports.hpp"
+#include "MFRC522.h"
+#include "serverEvents.hpp"
+
+class Rfid 
+{
+    public:
+        Thread rfid_thread;
+
+        Rfid(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName reset) : RfChip(mosi, miso, sclk, cs, reset)
+        {
+            RfChip.PCD_Init();
+            rfid_thread = Thread(osPriorityNormal, 850);
+            rfid_thread.start(this, &Rfid::read_rfid);
+        }
+
+        void read_rfid()
+        {
+            ServerEvent event;
+            strcpy(event.event, "gun");
+            while(1)
+            {
+                if (RfChip.PICC_IsNewCardPresent() && RfChip.PICC_ReadCardSerial())
+                {                   
+                    for (uint8_t i = 0; i < RfChip.uid.size; i++)
+                    {
+                        itoa(RfChip.uid.uidByte[i], &(event.data.rfid_code[i]), 10);
+                    }
+                    event.data.rfid_code[RfChip.uid.size] = '\0';
+                    //toPc("RFID received, sending event name: %s, size: %i", event.event, RfChip.uid.size);
+                    websocket_message_send(event);
+                }
+                Thread::wait(500);
+            }
+        }
+
+    private:
+        MFRC522 RfChip;
+        
+};
\ No newline at end of file
--- a/includes/ServerData.hpp	Mon Apr 10 15:02:24 2017 -0400
+++ b/includes/ServerData.hpp	Tue Apr 11 12:40:05 2017 -0400
@@ -5,12 +5,10 @@
 {
     //To server
     uint8_t targets = 0;
-    uint8_t enemies = 0;
-    uint8_t allies = 0;
     uint16_t averageReflexTime = 0;
     uint16_t gameLength = 0;
-    uint16_t score = 0;
-    char rfid_code[32] = {'\0'};
+    int16_t score = 0;
+    char rfid_code[15] = {'\0'};
     char direction[10] = {'\0'};
 
     //From server
--- a/includes/Target.hpp	Mon Apr 10 15:02:24 2017 -0400
+++ b/includes/Target.hpp	Tue Apr 11 12:40:05 2017 -0400
@@ -9,6 +9,7 @@
 {
     int target_number; //0 or 1
     int addr_table[8]; //64 bit addr
+    int is_risen = false;
 
     Target(int address_msb, int address_lsb, int target_number);
 
--- a/includes/dispatcher.hpp	Mon Apr 10 15:02:24 2017 -0400
+++ b/includes/dispatcher.hpp	Tue Apr 11 12:40:05 2017 -0400
@@ -6,8 +6,11 @@
 
 void dispatch_event_from_target(vector<uint8_t> data, int* address)
 {
-    //addr: table of 8 int 
-    //TODO - calc stats
+    if (data[1]) {
+        gameCoordinator.target_miss();
+    } else {
+        gameCoordinator.target_hit((data[2] << 8) | data[3]);
+    }
 }
 
 void dispatch_event_from_server(ServerEvent *event) {
--- a/includes/serverEvents.hpp	Mon Apr 10 15:02:24 2017 -0400
+++ b/includes/serverEvents.hpp	Tue Apr 11 12:40:05 2017 -0400
@@ -31,7 +31,7 @@
     toPc("Connecting to websocket url: \"ws://1.0.0.1:8080/\"");
     ws.connect();
     if (ws.is_connected()) {
-        ws.send("{\"event\":\"mbed\",\"data\":\"{\"state\": \"connected\"}\"}");
+        ws.send("{\"event\":\"mbed\",\"data\":{\"state\": \"connected\"}}");
     }
 }
 
@@ -91,16 +91,13 @@
         sprintf(msgBuffer, "{"
             "\"event\":\"%s\","
             "\"data\":{"
-                "\"allies\": %i,"
-                "\"enemies\": %i,"
                 "\"targets\": %i,"
                 "\"averageReflexTime\": %i,"
                 "\"gameLength\": %i,"
                 "\"score\": %i"
             "}"
-        "}", event->event, event->data.allies, event->data.enemies, 
-        event->data.targets, event->data.averageReflexTime, event->data.gameLength, 
-        event->data.score);
+        "}", event->event, event->data.targets, event->data.averageReflexTime, 
+        event->data.gameLength, event->data.score);
     }
 
     //toPc("Sending msg to websocket: %s", msgBuffer);
--- a/main.cpp	Mon Apr 10 15:02:24 2017 -0400
+++ b/main.cpp	Tue Apr 11 12:40:05 2017 -0400
@@ -6,29 +6,25 @@
 #include "BtnHandler.hpp"
 #include "GameCoordinator.hpp"
 #include "FreeMem.h"
-#include "MFRC522.h"
-
-#define MF_RESET    D8
-
-DigitalOut LedGreen(LED1);
-MFRC522 RfChip(p5, p6, p7, p21, p22);
+#include "Rfid.hpp"
+#include "serverEvents.hpp"
 
 int main()
 {
     cls();
     toPc("Coordinator starting...");
-    toPc("Initial Memory: %i", FreeMem());
+    //toPc("Initial Memory: %i", FreeMem());
 
     //Starting the different threads
     //Websocket
-    Thread Twebsocket_message_receiver(websocket_message_receiver, osPriorityLow, 2300);
-    Thread Twebsocket_message_sender(websocket_message_sender, osPriorityLow, 1500);
+    Thread Twebsocket_message_receiver(websocket_message_receiver, osPriorityLow, 2400);
+    Thread Twebsocket_message_sender(websocket_message_sender, osPriorityLow, 1400);
 
     //Xbee
     RealXbeeReceiver xbeeReceiver;
     xbeeReceiver.start(&dispatch_event_from_target);
 
-    //Btn interupts
+    // //Btn interupts
     BtnHandler startBtn(p21, "start");
     BtnHandler nextBtn(p22, "navigate", "next");
     BtnHandler previousBtn(p23, "navigate", "previous");
@@ -37,50 +33,29 @@
     //Bruno/Max Router
     gameCoordinator.targets.push_back(Target(0x0013A200, 0x4086DA0E, 0));
     gameCoordinator.targets.push_back(Target(0x0013A200, 0x4086DA0E, 1));
+
+    //Routeur antenne
+    gameCoordinator.targets.push_back(Target(0x0013A200, 0x408B419E, 0));
+    gameCoordinator.targets.push_back(Target(0x0013A200, 0x408B419E, 1)); // moteur brisé
+
+    gameCoordinator.targets.push_back(Target(0x0013A200, 0x4033198C, 0));
+    gameCoordinator.targets.push_back(Target(0x0013A200, 0x4033198C, 1));
+
+    gameCoordinator.on_game_finish = &websocket_message_send;
     //TODO: more targets
 
-    RfChip.PCD_Init();
-
-    while(1) {
-        LedGreen = 1;
+    Rfid rfid(p5, p6, p7, p28, p27);
 
-        // Look for new cards
-        if ( ! RfChip.PICC_IsNewCardPresent())
-        {
-            toPc("No card detected");
-            Thread::wait(500);
-            continue;
-        }
-    
-        // Select one of the cards
-        if ( ! RfChip.PICC_ReadCardSerial())
-        {
-            toPc("Cant read serial");
-            Thread::wait(500);
-            //wait_ms(500);
-            continue;
-        }
-        toPc("Printing card");
-        LedGreen = 0;
- 
-        // Print Card UID
-        pc.printf("Card UID: ");
-        for (uint8_t i = 0; i < RfChip.uid.size; i++)
-        {
-        pc.printf(" %X02", RfChip.uid.uidByte[i]);
-        }
-        pc.printf("\n\r");
-
-
-        //Memory monitoring
-        // toPc("Thread Twebsocket_message_receiver max stack: %i / %i", Twebsocket_message_receiver.max_stack(), Twebsocket_message_receiver.stack_size());
-        // toPc("Thread Twebsocket_message_sender max stack: %i / %i", Twebsocket_message_sender.max_stack(), Twebsocket_message_sender.stack_size());
-        // toPc("Thread gameCoordinator.Tget_next_round max stack: %i / %i", gameCoordinator.Tget_next_round.max_stack(), gameCoordinator.Tget_next_round.stack_size());
-        // toPc("Thread xbeeReceiver.message_handler_thread max stack: %i / %i", xbeeReceiver.message_handler_thread.max_stack(), xbeeReceiver.message_handler_thread.stack_size());
-        // toPc("Thread xbeeReceiver.message_reader_thread max stack: %i / %i", xbeeReceiver.message_reader_thread.max_stack(), xbeeReceiver.message_reader_thread.stack_size());
-        // toPc("Free Memory: %i", FreeMem());
-        Thread::wait(1000);
-    }
-    //Thread::wait(osWaitForever);
+    //  while(1) {
+    //      //Memory monitoring
+    //     toPc("Thread Twebsocket_message_receiver max stack: %i / %i", Twebsocket_message_receiver.max_stack(), Twebsocket_message_receiver.stack_size());
+    //     toPc("Thread Twebsocket_message_sender max stack: %i / %i", Twebsocket_message_sender.max_stack(), Twebsocket_message_sender.stack_size());
+    //     toPc("Thread gameCoordinator.Tget_next_round max stack: %i / %i", gameCoordinator.Tget_next_round.max_stack(), gameCoordinator.Tget_next_round.stack_size());
+    //     toPc("Thread xbeeReceiver.message_handler_thread max stack: %i / %i", xbeeReceiver.message_handler_thread.max_stack(), xbeeReceiver.message_handler_thread.stack_size());
+    //     toPc("Thread xbeeReceiver.message_reader_thread max stack: %i / %i", xbeeReceiver.message_reader_thread.max_stack(), xbeeReceiver.message_reader_thread.stack_size());
+    //     toPc("Thread rfid.rfid_thread max stack: %i / %i", rfid.rfid_thread.max_stack(), rfid.rfid_thread.stack_size());
+    //     Thread::wait(20000);
+    // }
+    Thread::wait(osWaitForever);
 }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-rtos.lib	Tue Apr 11 12:40:05 2017 -0400
@@ -0,0 +1,1 @@
+https://mbed.org/users/mbed_official/code/mbed-rtos/#58563e6cba1e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Tue Apr 11 12:40:05 2017 -0400
@@ -0,0 +1,1 @@
+https://mbed.org/users/mbed_official/code/mbed/builds/tip
--- a/src/GameCoordinator.cpp	Mon Apr 10 15:02:24 2017 -0400
+++ b/src/GameCoordinator.cpp	Tue Apr 11 12:40:05 2017 -0400
@@ -13,7 +13,7 @@
     game_modes.push_back(speed_mode);
 
     //Starting internal thread
-    Tget_next_round = Thread(osPriorityNormal, 800);
+    Tget_next_round = Thread(osPriorityNormal, 1020);
     Tget_next_round.start(this, &GameCoordinator::get_next_round);
 }
 
@@ -22,6 +22,9 @@
     current_game = game_modes[configs->game_id];
     target_timeout = configs->max_reflex_time;
     number_of_targets = configs->number_of_target;
+    current_game->reset();
+    timer.reset();
+    timer.start();
     ticker.attach(callback(this, &GameCoordinator::ticker_callback), current_game->getTimeBetweenTargets() / 1000.0);
 }
 
@@ -29,7 +32,20 @@
 {
     ticker.detach();
     LPC_TIM3->TC = 0;
-    //TODO: send stats back to server
+    timer.stop();
+    ServerEvent stats;
+    stats.data = current_game->GetStats();
+    stats.data.gameLength = timer.read_ms();
+    if (stats.data.targets != 0)
+    {
+        stats.data.averageReflexTime = stats.data.gameLength / stats.data.targets;
+    }
+    
+    strcpy(stats.event, "report");
+    if (on_game_finish != NULL)
+    {
+        on_game_finish(stats);
+    }
 }
 
 void GameCoordinator::ticker_callback()
@@ -50,9 +66,19 @@
         } 
         else
         {
-            //TODO: how to select enemy or ally ?
-            nextTarget->rise(rand() % 2, target_timeout);
+            //TODO: how to select enemy or ally ? rand() % 2
+            nextTarget->rise(0, target_timeout);
         }
         Thread::yield();
     }
+}
+
+void GameCoordinator::target_hit(int time_taken)
+{
+    current_game->OnTargetHit(time_taken);
+}
+
+void GameCoordinator::target_miss()
+{
+    current_game->OnTargetMiss();
 }
\ No newline at end of file
--- a/src/Target.cpp	Mon Apr 10 15:02:24 2017 -0400
+++ b/src/Target.cpp	Tue Apr 11 12:40:05 2017 -0400
@@ -10,6 +10,7 @@
 
 void Target::rise(int mode, int timeout)
 {
+    is_risen = true;
     toPc("Rising target %i!", target_number);
     vector<uint8_t> message;
     message.push_back(target_number);