// #include "secrets.h"
#include "Arduino.h"
#include "Frame.h"
#include <LinkedList.h>
#include "Thermostat.h"
#include <ArduinoJson.h>
// #include <ESP8266WiFi.h>
// #include <ESP8266WebServer.h>
// #include <ESP8266mDNS.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <ESPmDNS.h>
// const char *ssid = SECRET_SSID;
// const char *password = SECRET_WIFI_PASSWORD;
// ESP8266WebServer server(80);
#define MAX_THERMOSTATS 12
uint8_t buffer[384];
uint8_t bytesReceived;
LinkedList<Thermostat> thermostatList;
Frame::Model *frame;
DynamicJsonDocument doc(3000);
char jsonBuffer[3000];
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
Serial.begin(19200);
Serial.println(ESP.getFreeHeap());
// setupWiFi();
}
int thermostatIndex(uint8_t *id) {
int index = -1;
for (int i = 0; i < thermostatList.size(); i++) {
if (memcmp(id, thermostatList.get(i).id, 2) == 0) {
return i;
}
}
return index;
}
void processFrame() {
// Serial.println(Frame::toStr(frame));
frame->type = Frame::getType(frame);
if (frame->type == Frame::Type::TEMPRATURE || frame->type == Frame::Type::SETTINGS) {
uint8_t *fType = (uint8_t *)malloc(2);
if (fType != NULL) {
fType[0] = frame->data[0];
fType[1] = frame->data[1];
}
uint8_t *fId = (uint8_t *)malloc(2);
if (fId != NULL) {
fId[0] = frame->data[2];
fId[1] = frame->data[3];
}
uint8_t fChecksum[] = { frame->data[frame->size - 1], frame->data[frame->size] };
int tIndex = thermostatIndex(fId);
if (tIndex == -1) {
Thermostat *thermostat = new Thermostat;
if (thermostat != NULL) {
thermostat->type = fType;
thermostat->id = fId;
thermostat->settings = new LinkedList<Setting>();
for (int i = 4; i <= frame->size - 4; i += 3) {
Setting setting = { frame->data[i], (frame->data[i + 1] << 8) | frame->data[i + 2] };
thermostat->settings->add(setting);
}
thermostatList.add(*thermostat);
}
} else {
Thermostat thermostat = thermostatList.get(tIndex);
for (int i = 4; i <= frame->size - 4; i += 3) {
Setting setting = { frame->data[i], (frame->data[i + 1] << 8) | frame->data[i + 2] };
thermostat.addSetting(setting);
}
}
}
}
void writeBytes(byte *data, size_t size) {
while (Serial.availableForWrite() <= 0) {
Serial.write(data, size);
}
}
void processBytes() {
while (Serial.available() > 0 && bytesReceived < sizeof(buffer)) {
buffer[bytesReceived++] = Serial.read();
}
if (bytesReceived > 0) {
for (int i = 0; i < sizeof(packets); i++) {
if (packets[i] == Frame::START_BYTE) {
frame = new Frame::Model();
Frame::append(frame, packets[i]);
} else if (frame->size <= Frame::MAX_SIZE) {
Frame::append(frame, packets[i]);
if (packets[i + 1] == Frame::START_BYTE || frame->size == Frame::MAX_SIZE) {
// last packet of frme received
Frame::close(frame);
if (Frame::checkCRC(frame)) {
processFrame();
}
Frame::reset(frame);
}
} else {
Frame::reset(frame);
}
}
for (int i = 0; i < thermostatList.size(); i++) {
Thermostat thermostat = thermostatList.get(i);
doc["thermostats"][i]["name"] = thermostat.name();
doc["thermostats"][i]["current_temprature"] = thermostat.currentTemprature();
doc["thermostats"][i]["setpoint_temprature"] = thermostat.setPointTemprature();
doc["thermostats"][i]["setpoint_temprature_min"] = thermostat.setPointTempratureMin();
doc["thermostats"][i]["setpoint_temprature_max"] = thermostat.setPointTempratureMax();
doc["thermostats"][i]["demand"] = thermostat.demand();
doc["thermostats"][i]["allow_cooling"] = thermostat.allowCooling();
doc["thermostats"][i]["eco_set_back"] = thermostat.ecoSetBack();
}
doc["total"] = thermostatList.size();
doc["uptime"] = millis();
// serializeJsonPretty(doc, Serial);
bytesReceived = 0;
Serial.println(ESP.getFreeHeap());
}
blink(1000);
}
void blink(int ms) {
digitalWrite(LED_BUILTIN, LOW);
delay(ms);
digitalWrite(LED_BUILTIN, HIGH);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
// byte data[] = {0x11, 0x0C, 0x04, 0xDB, 0xFF};
// byte payload[7] = Frame::create(data, 5);
// writeBytes(payload, 7);
// delay(3000);
processBytes();
// Serial.print("freeMemory()=");
// Serial.println(freeMemory());
// server.handleClient();
}
// void getThermostats() {
// serializeJsonPretty(doc, jsonBuffer);
// server.send(200, "text/json", jsonBuffer);
// memset(jsonBuffer,0,sizeof(jsonBuffer));
// }
// void welcome() {
// server.send(200, "text/html", "Welcome to the REST Web Server");
// }
// // Define routing
// void restServerRouting() {
// server.on("/", HTTP_GET, welcome);
// // server.on("/getThermostats", HTTP_GET, getThermostats);
// }
// // Manage not found URL
// void handleNotFound() {
// String message = "File Not Found\n\n";
// message += "URI: ";
// message += server.uri();
// message += "\nMethod: ";
// message += (server.method() == HTTP_GET) ? "GET" : "POST";
// message += "\nArguments: ";
// message += server.args();
// message += "\n";
// for (uint8_t i = 0; i < server.args(); i++) {
// message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
// }
// server.send(404, "text/plain", message);
// }
// void setupWiFi() {
// WiFi.mode(WIFI_STA);
// WiFi.begin(ssid, password);
// Serial.println("");
// // Wait for connection
// while (WiFi.status() != WL_CONNECTED) {
// delay(500);
// Serial.print(".");
// }
// Serial.println("");
// Serial.print("Connected to ");
// Serial.println(ssid);
// Serial.print("IP address: ");
// Serial.println(WiFi.localIP());
// // Activate mDNS this is used to be able to connect to the server
// // with local DNS hostmane esp8266.local
// if (MDNS.begin("esp8266")) {
// Serial.println("MDNS responder started");
// }
// // Set server routing
// restServerRouting();
// // Set not found response
// server.onNotFound(handleNotFound);
// // Start server
// server.begin();
// Serial.println("HTTP server started");
// }