reef monitor

Dependencies:   mbed-rtos EthernetInterface FatFileSystemCpp MCP23S17 SDFileSystem mbed

Fork of HTTPServerHelloWorld by Donatien Garnier

Revision:
11:9366140ebe5f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Services/Network/RestApiServer/HttpServer.cpp	Fri Jan 02 22:44:42 2015 +0000
@@ -0,0 +1,72 @@
+#include "HttpServer.h"
+
+HttpServer::HttpServer() {
+    listeningThread = NULL;
+    mainThreadId = osThreadGetId();
+}
+
+HttpServer::~HttpServer() {
+    stop();
+}
+
+void HttpServer::httpServerListeningThread(void const *serverInstance) {
+    bool stopListening = false;
+    osThreadId mainThreadId = ((HttpServer*)serverInstance)->getMainThreadId();
+    while (!stopListening) {
+        
+        
+        handleServerAliveRequests(mainThreadId);
+    }
+}
+
+void HttpServer::handleServerAliveRequests(osThreadId mainThreadId) {
+    osEvent event = Thread::signal_wait(STATUS_CHECK_SIGNAL, STATUS_CHECK_NO_BLOCKING);
+    if ((event.status == osEventSignal) && (event.value.signals & STATUS_CHECK_SIGNAL)) {
+        osSignalSet(mainThreadId, STATUS_CHECK_ACK_SIGNAL);
+    }
+}
+
+bool HttpServer::start() {
+    if (!listeningThread) {
+        slaveThreadStatusCounter = 0;
+        listeningThread = new Thread(&HttpServer::httpServerListeningThread, this);
+    }
+    return listeningThread != NULL && listeningThread->get_state() != Thread::Inactive;
+}
+
+bool HttpServer::stop() {
+    if (listeningThread) {
+        listeningThread->signal_set(CLOSE_SIGNAL);
+        unsigned short int waitingShutdownAttempts = 0;
+        while(waitingShutdownAttempts < WAITING_SHUTDOWN_ATTEMPTS && listeningThread->get_state() != Thread::Inactive) {
+            Thread::wait(SHUTDOWN_TIMEOUT_MILLIS);
+            waitingShutdownAttempts++;
+        }
+        return listeningThread->get_state() == Thread::Inactive;
+    }
+    return true;
+}
+
+bool HttpServer::restart() {
+    if (stop()) {
+        return start();
+    } else {
+        return false;    
+    };
+}
+
+bool HttpServer::isAlive() {
+    if (listeningThread) {
+        listeningThread->signal_set(STATUS_CHECK_SIGNAL);
+        osEvent statusAckEvent = Thread::signal_wait(STATUS_CHECK_ACK_SIGNAL, STATUS_CHECK_TIMEOUT_MILLIS);
+        if((statusAckEvent.status == osEventSignal) && (statusAckEvent.value.signals & STATUS_CHECK_ACK_SIGNAL)) {
+            slaveThreadStatusCounter = 0;
+        } else {
+            slaveThreadStatusCounter++;    
+        }
+        if (slaveThreadStatusCounter >= FAULTY_REPORTS_COUNT) {
+            return false;    
+        }
+    }
+    return true;
+}
\ No newline at end of file