mirror of
				https://github.com/luc-github/ESP3D.git
				synced 2025-10-24 11:50:52 -07: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);
 | |
| }
 |