214 lines
5.9 KiB
C++
214 lines
5.9 KiB
C++
/**
|
|
* Transparentni seriovy port s podporou NVT pro ESP8266
|
|
*
|
|
* @file xpvsp.ino
|
|
* @author Pavel Brychta, http://www.xpablo.cz
|
|
*
|
|
* Copyright (c) 2016-2018 Pavel Brychta. All rights reserved.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*
|
|
*/
|
|
|
|
#include "configuration.h"
|
|
#include <EEPROM.h>
|
|
#include <ESP8266WiFi.h>
|
|
#include <ESPAsyncTCP.h>
|
|
#include <ESPAsyncUDP.h>
|
|
#include <ESPAsyncWebServer.h>
|
|
#ifdef USE_EDITOR
|
|
#include <SPIFFSEditor.h>
|
|
#endif
|
|
#include <ArduinoOTA.h>
|
|
#include <ESP8266mDNS.h>
|
|
#include <Ticker.h>
|
|
#include <SPI.h>
|
|
#ifdef HTTP_UPDATE
|
|
#include <ESP8266HTTPUpdateServer.h>
|
|
#endif
|
|
#include <interval.h>
|
|
#include <ESP8266NetBIOS.h>
|
|
#include <WiFiConfig.h>
|
|
#if (LED_PIN != NO_PIN)
|
|
#include <led.h>
|
|
#endif
|
|
#ifdef USE_SPIFFS
|
|
#warning Pouzivame SPIFFS - nezapomen pripravit obsah flash!
|
|
#include "FS.h"
|
|
#endif
|
|
#include "obfuscator.h"
|
|
|
|
// Definice obsazeni EEPROM
|
|
#define elementSize(type, element) sizeof(((type *)0)->element)
|
|
#define countof(a) (sizeof(a) / sizeof(a[0]))
|
|
|
|
typedef struct
|
|
{
|
|
wificonfigarea_t wc; // oblast, vyhrazena pro konfiguraci WiFi
|
|
#ifdef USE_CRASHDUMP
|
|
#warning CRASHDUMP save memory allocated!
|
|
uint8_t sc[SAVE_CRASH_SPACE_SIZE]; // misto pro uschovani padu aplikace
|
|
#endif
|
|
}eepromconfig_t;
|
|
|
|
#if (LED_PIN != NO_PIN)
|
|
LED led(LED_PIN, LOW, HIGH);
|
|
const uint8_t LS_CONNECTING[] = {LEDS_ONFOR + 0, LEDS_OFFFOR + 8, LEDS_RESTART};
|
|
const uint8_t LS_CONFIGAP[] = {LEDS_ONFOR + 0, LEDS_OFFFOR + 0, LEDS_ONFOR + 0, LEDS_OFFFOR + 6, LEDS_RESTART};
|
|
const uint8_t LS_CONNECTED[] = {LEDS_ONFOR + 0, LEDS_OFFFOR + 0, LEDS_ONFOR + 0, LEDS_OFFFOR + 0, LEDS_ONFOR + 0, LEDS_OFFFOR + 6, LEDS_RESTART};
|
|
#endif
|
|
|
|
#ifdef HTTP_UPDATE
|
|
ESP8266HTTPUpdateServer httpUpdater;
|
|
#ifdef HTTP_UPDATE_USERNAME
|
|
#define vxENCRYPT2(Str) (vxCplEncryptedString<vxCplIndexes<sizeof(Str) - 1>::Result>(Str))
|
|
auto _huuser = vxENCRYPT2(HTTP_UPDATE_USERNAME);
|
|
auto _hupass = vxENCRYPT2(HTTP_UPDATE_PASSWORD);
|
|
#endif
|
|
#endif
|
|
|
|
int otaActive = 0; // priznak moznosti aktivovat OTA
|
|
AsyncWebServer www(HTTP_PORT); // webovy server
|
|
Interval timer30s; // tikani po 30-ti sekundach
|
|
uint32_t upcounter; // citac poctu ubehlych 30-ti sekund (pro mereni uptime)
|
|
// Profiling
|
|
uint32_t start = 0;
|
|
uint32_t elapsed = 0;
|
|
uint32_t loopCounter = 0;
|
|
uint32_t loopCounterLast = 0;
|
|
uint32_t loopCounterMax = 1;
|
|
// **** sem je mozne dopsat dalsi globalni promenne
|
|
|
|
void wificfgcb(wificonfigstate_t state)
|
|
{
|
|
|
|
switch (state)
|
|
{
|
|
case WCS_CONNECTSTART:
|
|
// **** kod pro start signalizace, oznamujici zacatek pripojovani k WiFi siti (volano pouze jednou)
|
|
#if (LED_PIN != NO_PIN)
|
|
led.set(LS_CONNECTING);
|
|
#endif
|
|
|
|
break;
|
|
|
|
case WCS_CONNECTING:
|
|
// **** kod pro periodickou signalizaci probihajiciho pripojovani k WiFi siti (volano periodicky)
|
|
|
|
break;
|
|
|
|
case WCS_CONNECTED:
|
|
// **** kod pro start signalizace uspesneho pripojeni k WiFi siti (volano pouze jednou)
|
|
#if (LED_PIN != NO_PIN)
|
|
led.set(LS_CONNECTED);
|
|
#endif
|
|
|
|
break;
|
|
|
|
case WCS_CONFIGSTART:
|
|
// **** kod pro start signalizace, oznamujici spusteni konfiguracniho AP (volano pouze jednou)
|
|
#if (LED_PIN != NO_PIN)
|
|
led.set(LS_CONFIGAP);
|
|
#endif
|
|
|
|
break;
|
|
|
|
case WCS_CONFIGWAIT:
|
|
// **** kod pro periodickou signalizaci beziciho konfiguracniho AP (volano periodicky)
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
void runEach30Seconds(void)
|
|
{
|
|
|
|
timer30s.set(30000); // nove nastaveni casovace
|
|
++upcounter; // celkova delka behu
|
|
|
|
// mereni pro vypocet zatizeni zarizeni
|
|
loopCounterLast = loopCounter;
|
|
loopCounter = 0;
|
|
if (loopCounterLast > loopCounterMax)
|
|
loopCounterMax = loopCounterLast;
|
|
}
|
|
|
|
void ICACHE_FLASH_ATTR setup()
|
|
{
|
|
int _fc;
|
|
|
|
TRACE_INIT; // inicializace ladeni
|
|
EEPROM.begin(sizeof(eepromconfig_t) + 10); // zahajujeme praci s EEPROM (10 bytu je jen rezerva)
|
|
#if (LED_PIN != NO_PIN)
|
|
led.begin(); // inicializace signalizace
|
|
#endif
|
|
|
|
#if (FORCE_CONFIG_BUTTON_PIN != NO_PIN)
|
|
pinMode(FORCE_CONFIG_BUTTON_PIN, INPUT_PULLUP);
|
|
delay(20); // male zpozdeni, aby se ustalila hodnota na vstupu
|
|
_fc = digitalRead(FORCE_CONFIG_BUTTON_PIN); // pokud je na I/O pinu hodnota 0, tak vynutime nastavovaci AP
|
|
#else
|
|
_fc = 1; // nevstupujeme do konfigurace
|
|
#endif
|
|
{
|
|
WiFiConfig wifi; // konfigurace WiFi casti ESP modulu
|
|
|
|
if (WCR_OK != wifi.begin(offsetof(eepromconfig_t, wc), _fc, 60, wificfgcb)) // startujeme pripojeni
|
|
ESP.restart();
|
|
}
|
|
if (ESP.getFlashChipRealSize() > 1000000)
|
|
otaActive = 1; // flash pameti je dost - povolime OTA
|
|
|
|
if (strlen(WiFiDeviceName))
|
|
{
|
|
NBNS.begin(WiFiDeviceName);
|
|
if (otaActive)
|
|
{
|
|
ArduinoOTA.setHostname(WiFiDeviceName);
|
|
ArduinoOTA.begin();
|
|
TRACE(TRACE_INFO, F("OTA aktivovano"));
|
|
}
|
|
else
|
|
{
|
|
MDNS.begin(WiFiDeviceName);
|
|
MDNS.addService("http", "tcp", HTTP_PORT);
|
|
}
|
|
}
|
|
// montaz souboroveho systemu
|
|
#ifdef USE_SPIFFS
|
|
if (!SPIFFS.begin())
|
|
TRACE(TRACE_ERROR, F("SPIFFS neni pripojeny!"));
|
|
#endif
|
|
// Start weboveho serveru - sem je mozno pridavat odkazy na dalsi stranky
|
|
webserver_init(); // startujeme webovy server
|
|
vsp_init();
|
|
// **** dalsi uzivatelska inicializace
|
|
}
|
|
|
|
void loop()
|
|
{
|
|
|
|
if (otaActive)
|
|
{ // pripadna obsluha OTA aktualizace FW
|
|
ArduinoOTA.handle();
|
|
}
|
|
TRACE_POLL;
|
|
if (timer30s.expired())
|
|
runEach30Seconds();
|
|
++loopCounter;
|
|
// **** dalsi uzivatelske metody
|
|
vsp_loop();
|
|
}
|