Skip to content
Snippets Groups Projects
rest.cpp 2.97 KiB
Newer Older
Cyril Danilevski's avatar
Cyril Danilevski committed
#include "rest.hpp"
#include "mpod.hpp"
#include <ETH.h>
#ifndef ICBM_GIT_VERSION
#define ICBM_GIT_VERSION "DEVEL"
#endif

#ifndef ICBM_GIT_TIMESTAMP
#define ICBM_GIT_TIMESTAMP "UNKNOWN"
#endif

Cyril Danilevski's avatar
Cyril Danilevski committed
WebServer restServer(80);

void initializeRoutes() {
    restServer.on("/idn", identify);
	restServer.on("/restart", restart);
Cyril Danilevski's avatar
Cyril Danilevski committed
    restServer.onNotFound(notFound);
	restServer.on("/send", sendSNMP);
	restServer.on("/poll", pollMPODChannel);
Cyril Danilevski's avatar
Cyril Danilevski committed

    restServer.begin();
    Serial.println("REST Server Started");
}


void identify() {
	int seconds = millis() / 1000;
	int hours = seconds / 3600;
	int minutes = (seconds / 60) % 60;
	seconds = seconds % 60;

	String message = "{\n";

	message += "\"mac\":\"";
	message += ETH.macAddress();
	message += "\",\n";

Cyril Danilevski's avatar
Cyril Danilevski committed
	message += "\"version\":\"";
	message += ICBM_GIT_VERSION;
	message += "\",\n";

	message += "\"build date\":\"";
	message += ICBM_GIT_TIMESTAMP;
Cyril Danilevski's avatar
Cyril Danilevski committed
	message += "\",\n";

	message += "\"uptime\": \"";
	message += hours;
Cyril Danilevski's avatar
Cyril Danilevski committed
	message += ":";
	message += minutes;
Cyril Danilevski's avatar
Cyril Danilevski committed
	message += ":";
	message += seconds;
Cyril Danilevski's avatar
Cyril Danilevski committed
	message += "\"";

    // TODO: Add here mcp23s08 info:
    // Pin status;
    // Interrupt status;
    // seconds since last interrupt.
    //
    // TODO: Add here power sequence status
    // is_ramping_down
    // current step
    // percentage

Cyril Danilevski's avatar
Cyril Danilevski committed
	message += "\n}";

    restServer.send(200, "text/json", message);
}

void notFound() {
    String message = "{\n";
    message += "\"uri\":\"";
Cyril Danilevski's avatar
Cyril Danilevski committed
    message += restServer.uri();
    message += "\",\n\"method\":\"";
Cyril Danilevski's avatar
Cyril Danilevski committed
    message += (restServer.method() == HTTP_GET) ? "GET" : "POST";

    message += "\",\n\"arguments\":{";
Cyril Danilevski's avatar
Cyril Danilevski committed
    for (uint8_t i = 0; i < restServer.args(); i++) {
        message += "\n\"" + restServer.argName(i) + "\":\"" + restServer.arg(i) + "\",";
	if (restServer.args() != 0) {
		message.remove(message.length()-1);  // remove trailing comma for valid json
	}

	message += "\n}\n}";
    restServer.send(404, "text/json", message);
	Serial.println(message);
}

void restart() {
	restServer.send(200);
	ESP.restart();
	NONE,
};

void sendSNMP() {
	uint8_t output = NONE;
	bool success = false;

    for (uint8_t i = 0; i < restServer.args(); i++) {
		if(restServer.argName(i) == "output") {
			if(restServer.arg(i) == "on") {
				output = ON;
			} else if (restServer.arg(i) == "off") {
				output = OFF;
			}
		}
	}

	auto ipAddr = IPAddress(192,168,140,79);
    if (output != NONE) {
		SNMP::Message *snmp_msg = mpod.output(output);
		snmp.send(snmp_msg, ipAddr, SNMP::PORT::SNMP);
		delete snmp_msg;
		success = true;
	}

	String http_msg = "{\n";
	http_msg += "\"target\":\"" + ipAddr.toString() + "\",";
	http_msg += "\"arguments\":{\"output\":" + String(output) + "},\n";
	http_msg += "\"success\":" + String(success); 
	http_msg += "\n}";

	restServer.send(200, "text/json", http_msg);
}

void pollMPODChannel() {
	auto ret = mpod.toJSON();

	String http_msg = "{\n";
	http_msg += ret;
	http_msg += ",\"success\": 1";
	http_msg += "\n}";

	restServer.send(200, "text/json", http_msg);
}