Stairs/src/main.cpp

154 lines
3.1 KiB
C++

/*
* Stairs lighting
* Copyright 2017 (c) Mark van Renswoude
*
* https://git.x2software.net/pub/Stairs
*/
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <WiFiUDP.h>
#include <ESPAsyncWebServer.h>
#include <ESPAsyncTCP.h>
#include <TimeLib.h>
#include <ArduinoJson.h>
#include <EspSaveCrash.h>
extern "C" {
#include <user_interface.h>
}
#include "./config.h"
#include "./debug.h"
#include "./global.h"
#include "./components/PCA9685.h"
#include "./settings/connection.h"
#include "./server/static.h"
#include "./server/settings.h"
#include "./server/firmware.h"
#include "./server/api.h"
#include "./main.wifi.h"
#include "./main.debug.h"
#include "./main.led.h"
#include "./main.triggers.h"
ADC_MODE(ADC_VCC);
// Forward declarations
void handleNotFound(AsyncWebServerRequest* request);
AsyncWebServer server(80);
PCA9685* pwmDriver;
inline void waitForTransition()
{
while (stairs->inTransition())
{
currentTime = millis();
stairs->tick();
delay(1);
}
}
void setup()
{
_dinit();
currentTime = millis();
if (!SPIFFS.begin())
_dln("Setup :: failed to mount file system");
connectionSettings->read();
systemSettings->read();
stepsSettings->read();
timeTriggerSettings->read();
motionTriggerSettings->read();
pinMode(systemSettings->pinAPButton(), INPUT_PULLUP);
pinMode(systemSettings->pinLEDAP(), OUTPUT);
pinMode(systemSettings->pinLEDSTA(), OUTPUT);
initMotionPins();
_dln("Setup :: initializing PCA9685");
pwmDriver = new PCA9685();
pwmDriver->setAddress(systemSettings->pwmDriverAddress(), systemSettings->pinPWMDriverSDA(), systemSettings->pinPWMDriverSCL());
pwmDriver->setPWMFrequency(systemSettings->pwmDriverFrequency());
pwmDriver->setAll(0);
_dln("Setup :: initializing Stairs");
stairs = new Stairs();
stairs->init(pwmDriver);
_dln("Setup :: starting initialization sequence");
uint8_t bottomStep = stepsSettings->count() - 1;
for (uint8_t i = 0; i < InitialisationBlinkCount; i++)
{
stairs->set(bottomStep, InitialisationBrightness, InitialisationFadeTime);
waitForTransition();
stairs->set(bottomStep, 0, InitialisationFadeTime);
waitForTransition();
}
_dln("Setup :: initializing WiFi");
WiFi.persistent(false);
WiFi.mode(WIFI_OFF);
initDebug();
initWiFi();
_dln("Setup :: registering routes");
registerStaticRoutes(&server);
registerAPIRoutes(&server);
registerSettingsRoutes(&server);
registerFirmwareRoutes(&server);
_dln("Setup :: starting HTTP server");
server.onNotFound(handleNotFound);
server.begin();
}
void loop()
{
if (shouldReboot || systemSettingsChanged)
{
_dln("Loop :: reboot requested, so long and thanks for all the fish!");
delay(100);
ESP.restart();
}
currentTime = millis();
updateDebugStatus();
if (connectionSettingsChanged)
{
_dln("Loop :: connection settings changed");
initWiFi();
connectionSettingsChanged = false;
}
updateWiFi();
updateLED();
updateNTPClient();
checkTriggers();
stairs->tick();
}
void handleNotFound(AsyncWebServerRequest *request)
{
_d("HTTP :: not found: "); _dln(request->url());
request->send(404);
}