Coordinator v2
Dependencies: NerfUSXbee PinDetect EthernetInterface JSON MFRC522 WebSocketClient mbed-rtos mbed
Revision 2:019d8848cf7e, committed 2017-04-11
- 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
--- 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);