diff options
Diffstat (limited to 'fiz/naloga/merjenje/src/main.cpp')
-rw-r--r-- | fiz/naloga/merjenje/src/main.cpp | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/fiz/naloga/merjenje/src/main.cpp b/fiz/naloga/merjenje/src/main.cpp new file mode 100644 index 0000000..a5209da --- /dev/null +++ b/fiz/naloga/merjenje/src/main.cpp @@ -0,0 +1,171 @@ +#define ARDUINOJSON_ENABLE_COMMENTS 1 +#include <stdlib.h> +#include <Arduino.h> +#include <ArduinoJson.h> +#include "LittleFS.h" +#include <DNSServer.h> +#include <ESP8266WiFi.h> +#include <WiFiClient.h> +#include <TimeLib.h> +#include <WiFiUdp.h> +#include <ESP8266httpUpdate.h> +#include <ESPAsyncWebServer.h> +#undef __POLLEDTIMING_H__ // http://github.com/dplasa/FTPClientServer/pull/19 +#include <FTPServer.h> +#define TEXT_ENC "text/plain" +#include "MPU9250.h" +const int str2pin_map[] = { D0, D1, D2, D3, D4, D5, D6, D7, D8, D9, D10, 0, 0, 0, 0, 0, 0, 0, 0, 0, A0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; +int str2pin (const char * s) { + if (s[0] >= '0' && s[0] <= '9') + return atoi(s); + return str2pin_map[atoi(s+1) + ((s[0] == 'A') ? 20 : 0)]; +} +DynamicJsonDocument settings(1024); +void load_settings () { + if (LittleFS.exists("settings.json")) { + File s = LittleFS.open("settings.json", "r"); + if (s) + deserializeJson(settings, s); + s.close(); + } +} +void store_settings () { + File s = LittleFS.open("settings.json", "w"); + serializeJson(settings, s); + s.close(); +} +void notFound (AsyncWebServerRequest * request) { + request->send(404, "text/plain", "404"); +} +FTPServer ftpServer(LittleFS); +DNSServer dnsServer; +AsyncWebServer httpServer(80); +MPU9250 mpu; +int do_reload = 0; +int measure = 0; +void reload (bool w) { + Serial.println("reload"); + if (!w) { + Serial.println("stopping services: ftp"); + ftpServer.stop(); + Serial.println("stopping services: http"); + httpServer.reset(); + httpServer.end(); + Serial.println("stopping services: dns"); + dnsServer.stop(); + } + Serial.println("loading settings"); + load_settings(); + pinMode(LED_BUILTIN, OUTPUT); + digitalWrite(LED_BUILTIN, HIGH); // izklopi luč + Serial.println("access point"); + const char * ap_pass = settings["ap_pass"].as<String>().c_str(); + if (ap_pass && strlen(ap_pass) < 8) + ap_pass = NULL; + WiFi.mode(WIFI_AP); + WiFi.softAP(settings["ap_ssid"].as<String>().c_str(), ap_pass, settings["ap_ch"].as<int>(), settings["ap_hidden"].as<int>()); + Serial.println("WiFi.softAPIP() = " + WiFi.softAPIP().toString()); + Serial.println("station networking"); + const char * sta_ssid = settings["sta_ssid"].as<String>().c_str(); + if (sta_ssid && strlen(sta_ssid)) { + Serial.println("setting up wifi station mode"); + IPAddress sta_ip(10, 69, 69, 82); + sta_ip.fromString(settings["sta_ip"].as<String>()); + IPAddress sta_gw(10, 69, 69, 1); + sta_gw.fromString(settings["sta_gw"].as<String>()); + IPAddress sta_nm(10, 69, 69, 255); + sta_nm.fromString(settings["sta_nm"].as<String>()); + IPAddress sta_dns1(93, 103, 235, 126); + sta_dns1.fromString(settings["sta_dns1"].as<String>()); + IPAddress sta_dns2(89, 212, 146, 168); + sta_dns2.fromString(settings["sta_dns2"].as<String>()); + const char * sta_mac = settings["sta_mac"].as<String>().c_str(); + if (sta_mac && strlen(sta_mac)) { + long long unsigned int mac; + uint8_t macar[6]; + mac = strtoull(sta_mac, NULL, 16); + memcpy(macar, (char *) &mac, 6); + wifi_set_macaddr(STATION_IF, macar); + } + WiFi.disconnect(true); + WiFi.hostname(settings["sta_host"].as<String>()); + const char * sta_pass = settings["sta_pass"].as<String>().c_str(); + if (sta_pass && strlen(sta_pass) < 8) + sta_pass = NULL; + WiFi.begin(sta_ssid, sta_pass); + if (settings["sta_static"].as<int>()) + if (!WiFi.config(sta_ip, sta_gw, sta_nm, sta_dns1, sta_dns2)) + Serial.println("failed to wifi config"); + Serial.println(String("wifi local ip: "+WiFi.localIP().toString())); + } else + WiFi.disconnect(); + dnsServer.start(53, settings["host"], WiFi.softAPIP()); + ftpServer.begin(settings["ftp_user"], settings["ftp_pass"]); +#define ADD_AUTH(s) s.setAuthentication(settings["http_user"], settings["http_pass"]) + auto f = httpServer.serveStatic("/", LittleFS, "/").setDefaultFile("index.html"); + ADD_AUTH(f); + auto s = httpServer.on("/s", [](AsyncWebServerRequest * r) { + r->send(201, TEXT_ENC, "OK\n"); + ESP.restart(); + }); + ADD_AUTH(s); + auto l = httpServer.on("/l", [](AsyncWebServerRequest * r) { + r->send(201, TEXT_ENC, "OK\n"); + do_reload = 1; + }); + ADD_AUTH(l); + auto m = httpServer.on("/m", [](AsyncWebServerRequest * r) { + if (measure) { + r->send(400, TEXT_ENC, "meritev že poteka\n"); + return; + } + measure = 1; + r->send(201, TEXT_ENC, "OK\n"); + }); + ADD_AUTH(m); + auto k = httpServer.on("/k", [](AsyncWebServerRequest * r) { + if (!measure) { + r->send(400, TEXT_ENC, "trenutno ni meritve\n"); + return; + } + measure = 0; + r->send(201, TEXT_ENC, "OK\n"); + }); + ADD_AUTH(k); + auto c = httpServer.on("/c", [](AsyncWebServerRequest * r) { + r->send(201, TEXT_ENC, "glej sporočila na UART za navodila\n"); + mpu.calibrateMag(); + }); + ADD_AUTH(c); + httpServer.begin(); + Wire.begin(); + int naslov = settings["mpu_address"].as<int>(); + if (!mpu.setup(naslov)) { + Serial.println("mpu ni dosegljiv na naslovu " + naslov); + } + mpu.verbose(true); + Serial.println("reload: done"); +} +void handleMeasure () { + if (!mpu.update()) { + Serial.println("!mpu.update()"); + } + Serial.printf("getMag: X: %f\tY: %f\tZ: %f\n", mpu.getMagX(), mpu.getMagY(), mpu.getMagZ()); + return; +} +void setup () { + Serial.begin(MONITOR_SPEED); + Serial.println("živ sem"); + LittleFS.begin(); + reload(1); +} +void loop () { + if (measure) + handleMeasure(); + ftpServer.handleFTP(); + dnsServer.processNextRequest(); + if (do_reload) { + reload(0); + do_reload = 0; + } +} |