CO528 - Assessment 3 - Guard Room Project

Dependencies:   C12832 MMA7660 mbed-http

Fork of http-example by sandbox

source/Core.cpp

Committer:
fpaf2
Date:
2017-05-03
Revision:
15:8965fc128e7b

File content as of revision 15:8965fc128e7b:

#include "Core.h"

// Speaker
PwmOut spkr(D6);

// Using Arduino pin notation
C12832 lcd(D11, D13, D12, D7, D10);

// Orientation
MMA7660 MMA(D14,D15);

// Led color
DigitalOut r(D5);
DigitalOut b(D8);
DigitalOut g(D9);

// Used for USB connection
Serial host(USBTX, USBRX);

Core::Core() {
    r = 1.0;
    b = 1.0;
    g = 1.0;
    _message = "Searching..";
    _quiet = true;
    host.baud(38400);
    
    _network = easy_connect(true);
    if (!_network) {
        printf("Cannot connect to the network, see serial output");
        return;
    }
}

bool Core::doorIsOpening() {
    if (MMA.x() > 0.2 || MMA.x() < -0.2) {
        return true;
    }
    return false;
}

void Core::displayMessageOnScreen() {
    lcd.cls();
    lcd.locate(0,0);
    lcd.printf("%s", _message); // Around 60max
    printf("%s\n", _message);
}

void Core::triggerAlarm() {
    static bool state = true;
    
    if (state) {
        r = 0;
        g = 1;
        b = 1;
        spkr.period(1.0/1000);
        spkr=0.5;

    } else {
        r = 1;
        g = 1;
        b = 0;        
        spkr.period(1.0/500);
        spkr=0.5;
    }
    state = !state;
}

void Core::dumpResponseGet(HttpResponse* res) {    
    char *pch;
    char *cstr = new char[res->get_body_as_string().length() + 1];
    
    strcpy(cstr, res->get_body_as_string().c_str());
    pch = strtok (cstr,"{}:,");
    int i = 0;
    while (pch != NULL) {
        pch = strtok (NULL, "{}:,");
        if (i == 2) {
            _message = pch;
        } else if (i == 4) {
            if (strcmp(pch, "false") == 0) {
                _quiet = false;
            } else {
                _quiet = true;
            }
            
        }
        i++;
    }
}

void Core::getRequest() {
    HttpRequest* get_req = new HttpRequest(_network, HTTP_GET, "http://10.0.0.91:8080/api/alarms/room1");
    HttpResponse* get_res = get_req->send();
    
    if (!get_res) {
        printf("HttpRequest get failed (error code %d)\n", get_req->get_error());
        return;
    }

    dumpResponseGet(get_res);

    printf("\n end response get\n");
    delete get_req;
}

void Core::putRequest() {
    HttpRequest* put_req = new HttpRequest(_network, HTTP_PUT, "http://10.0.0.91:8080/api/alarms/room1");
    put_req->set_header("Content-Type", "application/json");

    const char body[] = "{\"message\":\"Warning - Intruder !\", \"quiet\":\"false\"}";

    HttpResponse* put_res = put_req->send(body, strlen(body));
    if (!put_res) {
        printf("HttpRequest put failed (error code %d)\n", put_req->get_error());
        return;
    }
    delete put_req;
}

void Core::shutDownAlarm(void) {
    r = 1;
    g = 1;
    b = 1;
    spkr=0;
}

void Core::guard(void) {
    // Inifinte loop
    while (1) {
        if (doorIsOpening()) {
            putRequest(); // Update infos from local to API
        }
        getRequest(); // Update infos from API to local
        if (_quiet == false) {
            triggerAlarm();
        } else {
            shutDownAlarm();
        }
        displayMessageOnScreen();
    wait(0.5);
    }
}

int main()
{
    Core *core = new Core();
    
    core->guard();
    delete core;
}