Coordinator v2

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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers serverEvents.hpp Source File

serverEvents.hpp

00001 #pragma once
00002 #include "ports.hpp"
00003 #include "EthernetInterface.h"
00004 #include "Websocket.h"
00005 #include "jsonParser.hpp"
00006 #include "dispatcher.hpp"
00007 
00008 #define USING_DHCP_SERVER 0
00009 
00010 EthernetInterface eth;
00011 Websocket ws("ws://1.0.0.1:8080/");
00012 Mail<ServerEvent, 30> messages_to_server;
00013 void websocket_message_send(ServerEvent event);
00014 
00015 void ethernet_initialization() {
00016     #if USING_DHCP_SERVER
00017         eth.init();
00018     #else
00019         char ip_addr[]="1.0.0.2";
00020         char mask[]="255.255.255.0";
00021         char gateway[]="1.0.0.1";
00022         eth.init(ip_addr, mask, gateway); 
00023     #endif
00024     
00025     eth.connect();
00026     toPc("IP Address is %s", eth.getIPAddress());
00027     toPc("Mask is %s", eth.getNetworkMask());
00028 }
00029 
00030 void websocket_initialization() {
00031     toPc("Connecting to websocket url: \"ws://1.0.0.1:8080/\"");
00032     ws.connect();
00033     if (ws.is_connected()) {
00034         ws.send("{\"event\":\"mbed\",\"data\":{\"state\": \"connected\"}}");
00035     }
00036 }
00037 
00038 //Thread
00039 void websocket_message_receiver() {
00040     ethernet_initialization();
00041     websocket_initialization();
00042 
00043     char msgBuffer[500];
00044     ServerEvent newEvent;
00045     while(1) {
00046         if (!ws.is_connected()) {
00047             toPc("Disconnected from websocket... Attempting to reconnect");
00048             websocket_initialization();
00049         } else {
00050             if (ws.read(msgBuffer)) {
00051                 toPc("New message received from server");
00052                 parse_server_event_from_json(msgBuffer, &newEvent);
00053                 dispatch_event_from_server(&newEvent);
00054             }
00055         }
00056         Thread::wait(100);
00057     }
00058 }
00059 
00060 //Via thread
00061 void websocket_message_send(ServerEvent event)
00062 {
00063     ServerEvent *newEvent = messages_to_server.alloc();
00064     *newEvent = event;
00065     messages_to_server.put(newEvent);
00066 }
00067 
00068 //Direct send
00069 void send_message_to_websocket(ServerEvent *event)
00070 {
00071     char msgBuffer[500];
00072     if (strcmp(event->event, "start") == 0) {
00073         sprintf(msgBuffer, "{"
00074             "\"event\":\"%s\""
00075         "}", event->event);
00076     } else if (strcmp(event->event, "navigate") == 0) {
00077         sprintf(msgBuffer, "{"
00078             "\"event\":\"%s\","
00079             "\"data\":{"
00080                 "\"direction\":\"%s\""
00081             "}"
00082         "}", event->event, event->data.direction);
00083     } else if (strcmp(event->event, "gun") == 0) {
00084         sprintf(msgBuffer, "{"
00085             "\"event\":\"%s\","
00086             "\"data\":{"
00087                 "\"rfid_code\":\"%s\""
00088             "}"
00089         "}", event->event, event->data.rfid_code);
00090     } else { //event == report
00091         sprintf(msgBuffer, "{"
00092             "\"event\":\"%s\","
00093             "\"data\":{"
00094                 "\"targets\": %i,"
00095                 "\"averageReflexTime\": %i,"
00096                 "\"gameLength\": %i,"
00097                 "\"score\": %i"
00098             "}"
00099         "}", event->event, event->data.targets, event->data.averageReflexTime, 
00100         event->data.gameLength, event->data.score);
00101     }
00102 
00103     //toPc("Sending msg to websocket: %s", msgBuffer);
00104     ws.send(msgBuffer);
00105 }
00106 
00107 //Thread
00108 void websocket_message_sender()
00109 {
00110     while(1) {
00111         osEvent evt = messages_to_server.get();
00112         if (evt.status == osEventMail) {
00113             ServerEvent *mail = (ServerEvent*)evt.value.p;
00114             send_message_to_websocket(mail);            
00115             messages_to_server.free(mail);
00116         }
00117         Thread::yield();
00118     }
00119 }