mirror of
https://git.mirrors.martin98.com/https://github.com/luc-github/ESP3D.git
synced 2025-06-06 02:36:49 +08:00
354 lines
9.9 KiB
C++
354 lines
9.9 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>
|
|
#ifdef ARDUINO_ARCH_ESP8266
|
|
#include <FS.h>
|
|
#endif
|
|
#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
|
|
bool breset_config = false;
|
|
web_interface = NULL;
|
|
#ifdef TCP_IP_DATA_FEATURE
|
|
data_server = NULL;
|
|
#endif
|
|
|
|
#ifdef MKS_TFT_FEATURE
|
|
startdelayms = 1000;
|
|
#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 (WIFI_IF_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);
|
|
}
|
|
if (WiFi.getMode() == WIFI_STA) {
|
|
String currentIP = WiFi.localIP().toString();
|
|
ESPCOM::println (currentIP.c_str(), 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()
|
|
{
|
|
#ifdef ARDUINO_ARCH_ESP8266
|
|
#ifdef MDNS_FEATURE
|
|
wifi_config.mdns.update();
|
|
#endif
|
|
#endif
|
|
#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);
|
|
}
|