From 6341475d586f41ab3ef5d1f5defe384107f5bf42 Mon Sep 17 00:00:00 2001
From: Cyril Danilevski <cydanil@gmail.com>
Date: Wed, 7 Feb 2024 19:57:08 +0100
Subject: [PATCH] Add basic web server

---
 icbm.ino | 19 ++++++++++++++-----
 rest.cpp | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 rest.hpp |  8 ++++++++
 3 files changed, 74 insertions(+), 5 deletions(-)
 create mode 100644 rest.cpp
 create mode 100644 rest.hpp

diff --git a/icbm.ino b/icbm.ino
index 18805c1..d806173 100644
--- a/icbm.ino
+++ b/icbm.ino
@@ -1,6 +1,7 @@
 #include <WiFiUdp.h>
 #include <SNMP.h>
 #include "esp32_ethernet.hpp"
+#include "rest.hpp"
 
 WiFiUDP udp;
 SNMP::Manager snmp;
@@ -232,6 +233,7 @@ extern bool eth_connected;
 
 void setup() {
     Serial.begin(115200);
+
     connectNetwork();
     // SNMP
     snmp.begin(&udp);
@@ -242,6 +244,9 @@ void setup() {
         delay(100);
     }
 
+    initializeRoutes();
+    Serial.println("Started REST server");
+
     start = millis();
     // MPOD
     SNMP::Message *message = mpod.setup();
@@ -255,10 +260,7 @@ enum {
     OFF,
 };
 
-void loop() {
-    // Manager loop function must be called to process incoming messages
-    snmp.loop();
-    // Serial
+void serial_loop() {
     if (Serial.available()) {
         uint8_t output = NONE;
         // Read command from serial
@@ -280,12 +282,19 @@ void loop() {
             delete message;
         }
     }
-    // Send a request every second
+}
+
+void loop() {
+    // Manager loop function must be called to process incoming messages
+    restServer.handleClient();
+    serial_loop();
+
     if (millis() - start  >= 1000) {
         start = millis();
         // Create message to query MPOD and send it
         SNMP::Message* message = mpod.read();
         snmp.send(message, IPAddress(10, 42, 0, 1), SNMP::PORT::SNMP);
         delete message;
+        Serial.print(".");
     }
 }
diff --git a/rest.cpp b/rest.cpp
new file mode 100644
index 0000000..8758637
--- /dev/null
+++ b/rest.cpp
@@ -0,0 +1,52 @@
+#include "rest.hpp"
+
+WebServer restServer(80);
+
+void initializeRoutes() {
+    restServer.on("/idn", identify);
+    restServer.onNotFound(notFound);
+
+    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 += "\"version\":\"";
+	message += "0.1";  // TODO: Get from Git
+	message += "\",\n";
+
+	message += "\"uptime\": \"";
+	message += String(hours);
+	message += ":";
+	message += String(minutes);
+	message += ":";
+	message += String(seconds);
+	message += "\"";
+
+	message += "\n}";
+
+    restServer.send(200, "text/json", message);
+}
+
+void notFound() {
+    String message = "File Not Found\n\n";
+    message += "URI: ";
+    message += restServer.uri();
+    message += "\nMethod: ";
+    message += (restServer.method() == HTTP_GET) ? "GET" : "POST";
+    message += "\nArguments: ";
+    message += restServer.args();
+    message += "\n";
+    for (uint8_t i = 0; i < restServer.args(); i++) {
+        message += " " + restServer.argName(i) + ": " + restServer.arg(i) + "\n";
+    }
+    restServer.send(404, "text/plain", message);
+}
diff --git a/rest.hpp b/rest.hpp
new file mode 100644
index 0000000..bb098d6
--- /dev/null
+++ b/rest.hpp
@@ -0,0 +1,8 @@
+#pragma once
+#include <WebServer.h>
+
+extern WebServer restServer;
+
+void initializeRoutes();
+void identify();
+void notFound();
-- 
GitLab