ESP3D/esp3d/esp3d.cpp
Luc 1cf2744bad Add Notifications
Add EEPROM version Check
Update embedded page content and build process
Move check sum ESP commands from ESP6XX to ESP5XX to let Notifications use ESP6XX
Update command.txt with latest commands
2019-06-07 11:52:57 +02:00

332 lines
9.5 KiB
C++

/*
This file is part of ESP3D Firmware for 3D printer.
ESP3D Firmware for 3D printer is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ESP3D Firmware for 3D printer 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this Firmware. If not, see <http://www.gnu.org/licenses/>.
This firmware is using the standard arduino IDE with module to support ESP8266/ESP32:
https://github.com/esp8266/Arduino
https://github.com/espressif/arduino-esp32
Latest version of the code and documentation can be found here :
https://github.com/luc-github/ESP3D
Main author: luc lebosse
*/
#include "esp3d.h"
#include <EEPROM.h>
#ifndef FS_NO_GLOBALS
#define FS_NO_GLOBALS
#endif
#if defined (ASYNCWEBSERVER)
#include <ESPAsyncWebServer.h>
#endif
#include "config.h"
#if defined(TIMESTAMP_FEATURE)
#include <time.h>
#endif
#include "wificonf.h"
#include "espcom.h"
#include "webinterface.h"
#include "command.h"
#ifdef ARDUINO_ARCH_ESP8266
#include "ESP8266WiFi.h"
#if defined (ASYNCWEBSERVER)
#include <ESPAsyncTCP.h>
#else
#include <ESP8266WebServer.h>
#endif
#else //ESP32
#include <WiFi.h>
#if defined (ASYNCWEBSERVER)
#include <AsyncTCP.h>
#else
#include <WebServer.h>
#endif
#include <rom/rtc.h>
#include "esp_wifi.h"
#include "FS.h"
#include "SPIFFS.h"
#include "Update.h"
#endif
#include <WiFiClient.h>
#ifdef CAPTIVE_PORTAL_FEATURE
#include <DNSServer.h>
extern DNSServer dnsServer;
#endif
#ifndef FS_NO_GLOBALS
#define FS_NO_GLOBALS
#endif
#include <FS.h>
#ifdef ESP_OLED_FEATURE
#include "esp_oled.h"
#endif
#ifdef DHT_FEATURE
#include "DHTesp.h"
DHTesp dht;
#endif
#if defined (ASYNCWEBSERVER)
#include "asyncwebserver.h"
#else
#include "syncwebserver.h"
#endif
//Contructor
Esp3D::Esp3D() {
}
//Begin which setup everything
void Esp3D::begin(uint16_t startdelayms, uint16_t recoverydelayms)
{
// init:
//WiFi.disconnect();
WiFi.mode (WIFI_OFF);
wifi_config.WiFi_on = false;
//check EEPROM Version
#if defined( DEBUG_ESP3D) && defined(DEBUG_OUTPUT_SERIAL)
CONFIG::InitBaudrate(DEFAULT_BAUD_RATE);
delay (2000);
LOG ("\r\nDebug Serial set\r\n")
#endif
CONFIG::adjust_EEPROM_settings();
CONFIG::InitOutput();
#ifdef ESP_OLED_FEATURE
OLED_DISPLAY::begin();
OLED_DISPLAY::splash();
#endif
#ifdef ARDUINO_ARCH_ESP8266
struct rst_info *rtc_info = system_get_rst_info();
#else
RESET_REASON reason_0 = rtc_get_reset_reason(0);
RESET_REASON reason_1 = rtc_get_reset_reason(1);
#endif
bool breset_config = false;
web_interface = NULL;
#ifdef TCP_IP_DATA_FEATURE
data_server = NULL;
#endif
#ifdef ESP_OLED_FEATURE
uint32_t start_display_time = millis();
uint32_t now = millis();
while ( now - start_display_time < startdelayms){
int v = (100 * (millis() - start_display_time)) / startdelayms;
OLED_DISPLAY::display_mini_progress(v);
OLED_DISPLAY::update_lcd();
delay(100);
now = millis();
}
#else
delay (startdelayms);
#endif
CONFIG::InitDirectSD();
CONFIG::InitPins();
#ifdef RECOVERY_FEATURE
delay (recoverydelayms);
//check if reset config is requested
if (digitalRead (RESET_CONFIG_PIN) == 0) {
breset_config = true; //if requested =>reset settings
}
#endif
//check if EEPROM has value
if ( !CONFIG::InitBaudrate() || !CONFIG::InitExternalPorts() ) {
breset_config = true; //cannot access to config settings=> reset settings
LOG ("Error no EEPROM access\r\n")
}
//reset is requested
if (breset_config) {
//update EEPROM with default settings
CONFIG::InitBaudrate(DEFAULT_BAUD_RATE);
#ifdef ARDUINO_ARCH_ESP8266
Serial.setRxBufferSize (SERIAL_RX_BUFFER_SIZE);
#endif
delay (2000);
ESPCOM::println (F ("ESP EEPROM reset"), PRINTER_PIPE);
#ifdef DEBUG_ESP3D
CONFIG::print_config (DEBUG_PIPE, true);
delay (1000);
#endif
CONFIG::reset_config();
delay (1000);
//put some default value to a void some exception at first start
WiFi.mode (WIFI_AP);
wifi_config.WiFi_on = true;
#ifdef ARDUINO_ARCH_ESP8266
WiFi.setPhyMode (WIFI_PHY_MODE_11G);
#else
esp_wifi_set_protocol (ESP_IF_WIFI_AP, WIFI_PHY_MODE_11G);
#endif
CONFIG::esp_restart();
}
#if defined(DEBUG_ESP3D) && defined(DEBUG_OUTPUT_SERIAL)
LOG ("\r\n");
delay (500);
ESPCOM::flush (DEFAULT_PRINTER_PIPE);
#endif
//get target FW
CONFIG::InitFirmwareTarget();
delay(100);
//Update is done if any so should be Ok
#ifdef ARDUINO_ARCH_ESP32
SPIFFS.begin (true);
#else
SPIFFS.begin();
#endif
//basic autostart
if(SPIFFS.exists("/autostart.g")){
FS_FILE file = SPIFFS.open("/autostart.g", SPIFFS_FILE_READ);
if (file){
String autoscript = file.readString();
if (autoscript.length() > 0){
//clean line
autoscript.replace("\n","");
autoscript.replace("\r","");
ESPCOM::println (autoscript.c_str(), DEFAULT_PRINTER_PIPE);
}
file.close();
}
}
//setup wifi according settings
if (!wifi_config.Setup() ) {
ESPCOM::println (F ("Safe mode 1"), PRINTER_PIPE);
//try again in AP mode
if (!wifi_config.Setup (true) ) {
ESPCOM::println (F ("Safe mode 2"), PRINTER_PIPE);
wifi_config.Safe_Setup();
}
}
delay (100);
//setup servers
if (!wifi_config.Enable_servers() ) {
ESPCOM::println (F ("Error enabling servers"), PRINTER_PIPE);
}
/*#ifdef ARDUINO_ARCH_ESP8266
if (rtc_info->reason == REASON_WDT_RST ||
rtc_info->reason == REASON_EXCEPTION_RST ||
rtc_info->reason == REASON_SOFT_WDT_RST) {
String s = "reset ";
s+= String(rtc_info->reason);
if (rtc_info->reason == REASON_EXCEPTION_RST) {
s+=" except ";
s+=String(rtc_info->exccause);
}
ESPCOM::println (s, PRINTER_PIPE);
}
#else
if((( reason_0< 17) || ( reason_1< 17)) && !(((reason_0 == 1) && (reason_1 == 14)) || ((reason_0 == 16) && (reason_1 == 14))))
{
String s = "reset ";
ESPCOM::println (s, PRINTER_PIPE);
s+=String(reason_0);
s+="/";
s+=String(reason_1);
}
#endif*/
#ifdef ASYNCWEBSERVER
if (WiFi.getMode() != WIFI_AP) {
WiFi.scanNetworks (true);
}
#endif
LOG ("Setup Done\r\n");
}
//Process which handle all input
void Esp3D::process()
{
#if !defined(ASYNCWEBSERVER)
//web requests for sync
web_interface->web_server.handleClient();
socket_server->loop();
#endif
//be sure wifi is on to proceed wifi function
if ((WiFi.getMode() != WIFI_OFF) || wifi_config.WiFi_on) {
#ifdef CAPTIVE_PORTAL_FEATURE
if (WiFi.getMode() != WIFI_STA ) {
dnsServer.processNextRequest();
}
#endif
//TODO use config
CONFIG::wait(0);
}
//read / bridge all input
ESPCOM::bridge();
//in case of restart requested
if (web_interface->restartmodule) {
CONFIG::esp_restart();
}
#ifdef ESP_OLED_FEATURE
static uint32_t last_oled_update= 0;
if ( !CONFIG::is_locked(FLAG_BLOCK_OLED)){
uint32_t now_oled = millis();
if (now_oled - last_oled_update > 1000) {
last_oled_update = now_oled;
//refresh signal
if ((WiFi.getMode() == WIFI_OFF) || !wifi_config.WiFi_on) OLED_DISPLAY::display_signal(-1);
else OLED_DISPLAY::display_signal(wifi_config.getSignal (WiFi.RSSI ()));
//if line 0 is > 85 refresh
if(OLED_DISPLAY::L0_size >85)OLED_DISPLAY::display_text(OLED_DISPLAY::L0.c_str(), 0, 0, 85);
//if line 1 is > 128 refresh
if(OLED_DISPLAY::L1_size >128) OLED_DISPLAY::display_text(OLED_DISPLAY::L1.c_str(), 0, 16, 128);
//if line 2 is > 128 refresh
if(OLED_DISPLAY::L2_size >128) OLED_DISPLAY::display_text(OLED_DISPLAY::L2.c_str(), 0, 32, 128);
//if line 3 is > 128 refresh
if(OLED_DISPLAY::L3_size >128) OLED_DISPLAY::display_text(OLED_DISPLAY::L3.c_str(), 0, 48, 128);
OLED_DISPLAY::update_lcd();
}
}
#endif
#ifdef DHT_FEATURE
if (CONFIG::DHT_type != 255) {
static uint32_t last_dht_update= 0;
uint32_t now_dht = millis();
if (now_dht - last_dht_update > (CONFIG::DHT_interval * 1000)) {
last_dht_update = now_dht;
float humidity = dht.getHumidity();
float temperature = dht.getTemperature();
if (strcmp(dht.getStatusString(),"OK") == 0) {
String s = String(temperature,2);
String s2 = s + " " +String(humidity,2);
#if defined (ASYNCWEBSERVER)
web_interface->web_events.send( s2.c_str(),"DHT", millis());
#else
s = "DHT:" + s2;
socket_server->sendTXT(ESPCOM::current_socket_id, s);
#endif
#ifdef ESP_OLED_FEATURE
if ( !CONFIG::is_locked(FLAG_BLOCK_OLED)){
s = String(temperature,2);
s +="°C";
OLED_DISPLAY::display_text(s.c_str(), 84, 16);
}
#endif
}
}
}
#endif
//todo use config
CONFIG::wait(0);
}