summaryrefslogblamecommitdiffstats
path: root/fiz/naloga/merjenje/src/main.cpp
blob: a5209da0e9528a40b905a2dd350447c3b6c68314 (plain) (tree)










































































































































































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