reef monitor

Dependencies:   mbed-rtos EthernetInterface FatFileSystemCpp MCP23S17 SDFileSystem mbed

Fork of HTTPServerHelloWorld by Donatien Garnier

Services/Network/RestApiServer/HttpServer.cpp

Committer:
wyunreal
Date:
2015-01-02
Revision:
11:9366140ebe5f

File content as of revision 11:9366140ebe5f:

#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;
}