Add MKS Fast Upload support

This commit is contained in:
Luc 2021-01-07 16:24:36 +01:00
parent 4a1f1c72e8
commit 4c4ff06518
14 changed files with 397 additions and 35 deletions

View File

@ -107,7 +107,9 @@ bool Commands::ESP201(const char* cmd_params, level_authenticate_type auth_type,
if (!Hal::analogWrite(pin, value)) { if (!Hal::analogWrite(pin, value)) {
output->printERROR ("Invalid value!"); output->printERROR ("Invalid value!");
response = false; response = false;
} else output->printMSG ("ok"); } else {
output->printMSG ("ok");
}
} else { } else {
output->printERROR ("Invalid parameter!"); output->printERROR ("Invalid parameter!");
response = false; response = false;

View File

@ -22,6 +22,7 @@
#include "../esp3doutput.h" #include "../esp3doutput.h"
#include "../settings_esp3d.h" #include "../settings_esp3d.h"
#include "../../modules/authentication/authentication_service.h" #include "../../modules/authentication/authentication_service.h"
#include "../../modules/serial/serial_service.h"
#ifdef SENSOR_DEVICE #ifdef SENSOR_DEVICE
#include "../../modules/sensor/sensor.h" #include "../../modules/sensor/sensor.h"
#endif //SENSOR_DEVICE #endif //SENSOR_DEVICE
@ -135,6 +136,9 @@ bool Commands::ESP401(const char* cmd_params, level_authenticate_type auth_type,
esp3d_sensor.setInterval(sval.toInt()); esp3d_sensor.setInterval(sval.toInt());
break; break;
#endif //SENSOR_DEVICE #endif //SENSOR_DEVICE
case ESP_BAUD_RATE:
serial_service.updateBaudRate(sval.toInt());
break;
default: default:
break; break;
} }

View File

@ -137,6 +137,23 @@ bool Commands::ESP800(const char* cmd_params, level_authenticate_type auth_type,
} else { } else {
output->print("none"); output->print("none");
} }
if(plain) {
output->printLN("");
} else {
output->print("\"");
}
//Serial protocol
if (plain) {
output->print("Serial protocol:");
} else {
output->print(",\"serialprotocol\":\"");
}
#if COMMUNICATION_PROTOCOL == MKS_SERIAL
output->print("MKS");
#endif //COMMUNICATION_PROTOCOL == MKS_SERIAL
#if COMMUNICATION_PROTOCOL == RAW_SERIAL
output->print("RAW");
#endif //COMMUNICATION_PROTOCOL == RAW_SERIAL
if(plain) { if(plain) {
output->printLN(""); output->printLN("");
} else { } else {

View File

@ -22,7 +22,7 @@
#define _VERSION_ESP3D_H #define _VERSION_ESP3D_H
//version and sources location //version and sources location
#define FW_VERSION "3.0.0.a79" #define FW_VERSION "3.0.0.a80"
#define REPOSITORY "https://github.com/luc-github/ESP3D/tree/3.0" #define REPOSITORY "https://github.com/luc-github/ESP3D/tree/3.0"
#endif //_VERSION_ESP3D_H #endif //_VERSION_ESP3D_H

View File

@ -0,0 +1,50 @@
/*
handle-mks-files.cpp - ESP3D http handle
Copyright (c) 2014 Luc Lebosse. All rights reserved.
This code 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 code 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 code; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "../../../include/esp3d_config.h"
#if defined (HTTP_FEATURE) && (COMMUNICATION_PROTOCOL == MKS_SERIAL)
#include "../http_server.h"
#if defined (ARDUINO_ARCH_ESP32)
#include <WebServer.h>
#endif //ARDUINO_ARCH_ESP32
#if defined (ARDUINO_ARCH_ESP8266)
#include <ESP8266WebServer.h>
#endif //ARDUINO_ARCH_ESP8266
#include "../../mks/mks_service.h"
#include "../../authentication/authentication_service.h"
void HTTP_Server::handleMKSUpload ()
{
level_authenticate_type auth_level = AuthenticationService::authenticated_level();
if (auth_level == LEVEL_GUEST) {
_upload_status = UPLOAD_STATUS_NONE;
_webserver->send (401, "text/plain", "Wrong authentication!");
return;
}
if ( (_upload_status == UPLOAD_STATUS_FAILED) || (_upload_status == UPLOAD_STATUS_CANCELLED) ) {
_webserver->send (500, "text/plain", "Upload failed!");
_upload_status = UPLOAD_STATUS_NONE;
return;
}
//no error
_webserver->send (200, "text/plain", "{\"status\":\"ok\"}");
_upload_status = UPLOAD_STATUS_NONE;
}
#endif //HTTP_FEATURE && (COMMUNICATION_PROTOCOL == MKS_SERIAL)

View File

@ -0,0 +1,114 @@
/*
upload-mks-files.cpp - ESP3D http handle
Copyright (c) 2014 Luc Lebosse. All rights reserved.
This code 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 code 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 code; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "../../../include/esp3d_config.h"
#if defined (HTTP_FEATURE) && (COMMUNICATION_PROTOCOL == MKS_SERIAL)
#include "../http_server.h"
#if defined (ARDUINO_ARCH_ESP32)
#include <WebServer.h>
#endif //ARDUINO_ARCH_ESP32
#if defined (ARDUINO_ARCH_ESP8266)
#include <ESP8266WebServer.h>
#endif //ARDUINO_ARCH_ESP8266
#include "../../mks/mks_service.h"
#include "../../authentication/authentication_service.h"
//MKS files uploader handle
void HTTP_Server::MKSFileupload ()
{
static uint32_t fragmentID = 0;
static uint8_t buf2send[MKS_FRAME_DATA_MAX_SIZE];
static size_t buf2sendlen = 0;
//get authentication status
level_authenticate_type auth_level= AuthenticationService::authenticated_level();
//Guest cannot upload - only admin
if (auth_level == LEVEL_GUEST) {
pushError(ESP_ERROR_AUTHENTICATION, "Upload rejected", 401);
_upload_status=UPLOAD_STATUS_FAILED;
} else {
HTTPUpload& upload = _webserver->upload();
if (upload.status == UPLOAD_FILE_START) {
buf2sendlen = 0;
log_esp3d("Starting upload");
_upload_status= UPLOAD_STATUS_ONGOING;
size_t fileSize = 0 ;
String filename = upload.filename;
String sfilename = "s"+filename;
if (_webserver->hasArg(sfilename)) {
fileSize = _webserver->arg(sfilename).toInt();
} else if (_webserver->hasHeader("Content-Length")) {
fileSize = _webserver->header("Content-Length").toInt();
}
fragmentID = 0;
if (MKSService::sendFirstFragment(filename.c_str(), fileSize)) {
MKSService::uploadMode();
}
} else if(upload.status == UPLOAD_FILE_WRITE) {
if (_upload_status == UPLOAD_STATUS_ONGOING) {
uint currentsize = upload.currentSize;
uint8_t * currentBuffer = upload.buf;
while ((currentsize > 0) &&(_upload_status == UPLOAD_STATUS_ONGOING)) {
while ((buf2sendlen<MKS_FRAME_DATA_MAX_SIZE) && currentsize > 0) {
buf2send[buf2sendlen]=currentBuffer[0];
buf2sendlen++;
currentsize--;
currentBuffer++;
}
if (buf2sendlen == MKS_FRAME_DATA_MAX_SIZE) {
log_esp3d("Send %d chars in Fragment %d", buf2sendlen, fragmentID);
if (MKSService::sendFragment(buf2send,buf2sendlen,fragmentID)) {
buf2sendlen=0;
fragmentID++;
} else {
_upload_status=UPLOAD_STATUS_FAILED;
pushError(ESP_ERROR_FILE_WRITE, "File write failed");
}
}
Hal::wait(0);
}
}
} else if(upload.status == UPLOAD_FILE_END) {
if (_upload_status == UPLOAD_STATUS_ONGOING) {
log_esp3d("Upload end");
fragmentID=MKSService::getFragmentID(fragmentID,true);
log_esp3d("Send %d chars in Fragment %d", buf2sendlen, fragmentID);
if(MKSService::sendFragment(buf2send,buf2sendlen,fragmentID)) {
_upload_status=UPLOAD_STATUS_SUCCESSFUL;
} else {
_upload_status=UPLOAD_STATUS_FAILED;
pushError(ESP_ERROR_FILE_CLOSE, "File close failed");
}
MKSService::commandMode();
}
} else {
//error
_upload_status=UPLOAD_STATUS_FAILED;
pushError(ESP_ERROR_FILE_WRITE, "File write failed");
}
}
if(_upload_status == UPLOAD_STATUS_FAILED) {
cancelUpload();
//TBC need to do that
//MKSService::sendFragment(nullptr,0,MKSService::getFragmentID(fragmentID, true));
MKSService::commandMode();
}
}
#endif //HTTP_FEATURE && (COMMUNICATION_PROTOCOL == MKS_SERIAL)

View File

@ -58,6 +58,10 @@ void HTTP_Server::init_handlers()
//FileSystememptyConstChar //FileSystememptyConstChar
_webserver->on ("/files", HTTP_ANY, handleFSFileList, FSFileupload); _webserver->on ("/files", HTTP_ANY, handleFSFileList, FSFileupload);
#endif //FILESYSTEM_FEATURE #endif //FILESYSTEM_FEATURE
#if COMMUNICATION_PROTOCOL == MKS_SERIAL
//MKS_SERIAL
_webserver->on ("/upload", HTTP_ANY, handleMKSUpload, MKSFileupload);
#endif //COMMUNICATION_PROTOCOL == MKS_SERIAL
#ifdef SD_DEVICE #ifdef SD_DEVICE
//SD //SD
_webserver->on ("/sdfiles", HTTP_ANY, handleSDFileList, SDFileupload); _webserver->on ("/sdfiles", HTTP_ANY, handleSDFileList, SDFileupload);
@ -199,14 +203,16 @@ bool HTTP_Server::begin()
} }
init_handlers(); init_handlers();
#ifdef AUTHENTICATION_FEATURE
//here the list of headers to be recorded //here the list of headers to be recorded
//Autrization is already added //Autorization is already added
const char * headerkeys[] = {"Cookie"} ;
size_t headerkeyssize = sizeof (headerkeys) / sizeof (char*);
//ask server to track these headers //ask server to track these headers
_webserver->collectHeaders (headerkeys, headerkeyssize ); #ifdef AUTHENTICATION_FEATURE
const char * headerkeys[] = {"Cookie","Content-Length"} ;
#else
const char * headerkeys[] = {"Content-Length"} ;
#endif #endif
size_t headerkeyssize = sizeof (headerkeys) / sizeof (char*);
_webserver->collectHeaders (headerkeys, headerkeyssize );
_webserver->begin(); _webserver->begin();
#ifdef AUTHENTICATION_FEATURE #ifdef AUTHENTICATION_FEATURE
AuthenticationService::begin(_webserver); AuthenticationService::begin(_webserver);

View File

@ -93,6 +93,10 @@ private:
static void handleSDFileList (); static void handleSDFileList ();
static bool StreamSDFile(const char* filename, const char * contentType); static bool StreamSDFile(const char* filename, const char * contentType);
#endif //SD_DEVICE #endif //SD_DEVICE
#if COMMUNICATION_PROTOCOL == MKS_SERIAL
static void MKSFileupload ();
static void handleMKSUpload ();
#endif //COMMUNICATION_PROTOCOL == MKS_SERIAL
}; };
#endif //_HTTP_SERVER_H #endif //_HTTP_SERVER_H

View File

@ -28,8 +28,7 @@
#include "../telnet/telnet_server.h" #include "../telnet/telnet_server.h"
#include "../http/http_server.h" #include "../http/http_server.h"
#include "../network/netconfig.h" #include "../network/netconfig.h"
#include "../serial/serial_service.h"
#define MKS_FRAME_DATA_MAX_SIZE (MKS_FRAME_SIZE - 5 - 4)
//Flag Pins //Flag Pins
#define ESP_FLAG_PIN 0 #define ESP_FLAG_PIN 0
@ -91,18 +90,21 @@
#define ERROR_STATE 0x1 #define ERROR_STATE 0x1
#define SUCCESS_STATE 0x2 #define SUCCESS_STATE 0x2
#define NB_HOTSPOT_MAX 15 #define NB_HOTSPOT_MAX 15
//Timeouts //Timeouts
#define FRAME_WAIT_TO_SEND_TIMEOUT 2000 #define FRAME_WAIT_TO_SEND_TIMEOUT 2000
#define ACK_TIMEOUT 5000
#define NET_FRAME_REFRESH_TIME 10000 #define NET_FRAME_REFRESH_TIME 10000
#define UPLOAD_BAUD_RATE 1958400
bool MKSService::_started = false; bool MKSService::_started = false;
char MKSService::_frame[MKS_FRAME_SIZE] = {0}; uint8_t MKSService::_frame[MKS_FRAME_SIZE] = {0};
char MKSService::_moduleId[22] = {0}; char MKSService::_moduleId[22] = {0};
uint8_t MKSService::_uploadStatus = UNKNOW_STATE; uint8_t MKSService::_uploadStatus = UNKNOW_STATE;
long MKSService::_commandBaudRate = 115200;
bool MKSService::_uploadMode = false;
bool MKSService::isHead(const char c) bool MKSService::isHead(const char c)
{ {
@ -131,9 +133,125 @@ bool MKSService::begin()
_started = true; _started = true;
//max size is 21 //max size is 21
strncpy(_moduleId,NetConfig::hostname(), 21); strncpy(_moduleId,NetConfig::hostname(), 21);
commandMode(true);
return true; return true;
} }
void MKSService::commandMode(bool fromSettings)
{
if (fromSettings) {
_commandBaudRate= Settings_ESP3D::read_uint32(ESP_BAUD_RATE);
}
log_esp3d("Cmd Mode");
_uploadMode = false;
serial_service.updateBaudRate(_commandBaudRate);
}
void MKSService::uploadMode()
{
log_esp3d("Upload Mode");
_uploadMode = true;
serial_service.updateBaudRate(UPLOAD_BAUD_RATE);
}
uint MKSService::getFragmentID(uint32_t fragmentNumber, bool isLast)
{
log_esp3d("Fragment: %d %s",fragmentNumber, isLast?" is last":"" );
if (isLast) {
fragmentNumber |= (1 << 31);
} else {
fragmentNumber &= ~(1 << 31);
}
log_esp3d("Fragment is now: %d",fragmentNumber);
return fragmentNumber;
}
bool MKSService::sendFirstFragment(const char* filename, size_t filesize)
{
uint fileNameLen = strlen(filename);
uint dataLen = fileNameLen + 5;
clearFrame();
//Head Flag
_frame[MKS_FRAME_HEAD_OFFSET] = MKS_FRAME_HEAD_FLAG;
//Type Flag
_frame[MKS_FRAME_TYPE_OFFSET] = MKS_FRAME_DATA_FIRST_FRAGMENT_TYPE;
//Fragment size
_frame[MKS_FRAME_DATALEN_OFFSET] = dataLen & 0xff;
_frame[MKS_FRAME_DATALEN_OFFSET + 1] = dataLen >> 8;
//FileName size
_frame[MKS_FRAME_DATA_OFFSET] = strlen(filename);
//File Size
_frame[MKS_FRAME_DATA_OFFSET+1] = filesize & 0xff;
_frame[MKS_FRAME_DATA_OFFSET+2] = (filesize >> 8) & 0xff;
_frame[MKS_FRAME_DATA_OFFSET+3] = (filesize >> 16) & 0xff;
_frame[MKS_FRAME_DATA_OFFSET+4] = (filesize >> 24) & 0xff;
//Filename
strncpy((char *)&_frame[MKS_FRAME_DATA_OFFSET+ 5], filename, fileNameLen);
//Tail Flag
_frame[dataLen + 4] = MKS_FRAME_TAIL_FLAG;
log_esp3d("Filename: %s Filesize: %d",filename, filesize );
for (uint i =0; i< dataLen + 5 ; i++) {
log_esp3d("%c %x",_frame[i],_frame[i]);
}
_uploadStatus = UNKNOW_STATE;
if (canSendFrame()) {
ESP3DOutput output(ESP_SERIAL_CLIENT);
_uploadStatus = UNKNOW_STATE;
if (output.write(_frame,dataLen + 5) == (dataLen + 5)) {
log_esp3d("First fragment Ok");
sendFrameDone();
return true;
}
}
log_esp3d("Failed");
sendFrameDone();
return false;
}
bool MKSService::sendFragment(const uint8_t * dataFrame, const size_t dataSize,uint fragmentID)
{
uint dataLen = dataSize + 4;
log_esp3d("Fragment datalen:%d",dataSize);
//Head Flag
_frame[MKS_FRAME_HEAD_OFFSET] = MKS_FRAME_HEAD_FLAG;
//Type Flag
_frame[MKS_FRAME_TYPE_OFFSET] = MKS_FRAME_DATA_FRAGMENT_TYPE;
//Fragment size
_frame[MKS_FRAME_DATALEN_OFFSET] = dataLen & 0xff;
_frame[MKS_FRAME_DATALEN_OFFSET + 1] = dataLen >> 8;
//Fragment ID
_frame[MKS_FRAME_DATA_OFFSET ] = fragmentID & 0xff;
_frame[MKS_FRAME_DATA_OFFSET + 1] = (fragmentID >> 8) & 0xff;
_frame[MKS_FRAME_DATA_OFFSET + 2] = (fragmentID >> 16) & 0xff;
_frame[MKS_FRAME_DATA_OFFSET + 3] = (fragmentID >> 24) & 0xff;
//data
if ((dataSize>0) && (dataFrame!=nullptr)) {
memcpy(&_frame[MKS_FRAME_DATA_OFFSET+ 4], dataFrame, dataSize);
}
if (dataSize<MKS_FRAME_DATA_MAX_SIZE) {
clearFrame(dataLen + 4);
}
//Tail Flag
_frame[dataLen + 4] = MKS_FRAME_TAIL_FLAG;
/* for (uint i =0; i< dataLen + 5 ; i++) {
log_esp3d("%c %x",_frame[i],_frame[i]);
}*/
if (canSendFrame()) {
ESP3DOutput output(ESP_SERIAL_CLIENT);
_uploadStatus = UNKNOW_STATE;
if (output.write(_frame,MKS_FRAME_SIZE) == MKS_FRAME_SIZE) {
log_esp3d("Ok");
sendFrameDone();
return true;
}
log_esp3d("Error with size sent");
}
log_esp3d("Failed");
sendFrameDone();
return false;
}
void MKSService::sendWifiHotspots() void MKSService::sendWifiHotspots()
{ {
@ -188,7 +306,7 @@ void MKSService::sendWifiHotspots()
} }
if (canSendFrame()) { if (canSendFrame()) {
ESP3DOutput output(ESP_SERIAL_CLIENT); ESP3DOutput output(ESP_SERIAL_CLIENT);
if (output.write((const uint8_t *)_frame,dataOffset+5) == (dataOffset+5)) { if (output.write(_frame,dataOffset+5) == (dataOffset+5)) {
log_esp3d("Ok"); log_esp3d("Ok");
sendFrameDone(); sendFrameDone();
} else { } else {
@ -202,6 +320,7 @@ void MKSService::sendWifiHotspots()
} }
//Restore mode //Restore mode
WiFi.mode((WiFiMode_t)currentmode); WiFi.mode((WiFiMode_t)currentmode);
sendFrameDone();
} }
void MKSService::handleFrame(const uint8_t type, const uint8_t * dataFrame, const size_t dataSize ) void MKSService::handleFrame(const uint8_t type, const uint8_t * dataFrame, const size_t dataSize )
@ -304,6 +423,24 @@ void MKSService::messageException(const uint8_t * dataFrame, const size_t dataSi
} }
} }
bool MKSService::waitForAck()
{
uint32_t timestart = millis();
bool res=true;
while ((_uploadStatus==UNKNOW_STATE)&&((millis()-timestart)<ACK_TIMEOUT)) {
serial_service.handle();
Hal::wait(10);
}
if (_uploadStatus!=SUCCESS_STATE) {
res=false;
}
if(_uploadStatus==UNKNOW_STATE) {
log_esp3d("Ack timeout");
}
_uploadStatus=UNKNOW_STATE;
return res;
}
void MKSService::messageWiFiConfig(const uint8_t * dataFrame, const size_t dataSize ) void MKSService::messageWiFiConfig(const uint8_t * dataFrame, const size_t dataSize )
{ {
String ssid; String ssid;
@ -383,14 +520,15 @@ void MKSService::messageWiFiConfig(const uint8_t * dataFrame, const size_t dataS
bool MKSService::canSendFrame() bool MKSService::canSendFrame()
{ {
//log_esp3d("Is board ready for frame?"); log_esp3d("Is board ready for frame?");
digitalWrite(ESP_FLAG_PIN, HIGH); digitalWrite(ESP_FLAG_PIN, BOARD_READY_FLAG_VALUE);
uint32_t startTime = millis(); uint32_t startTime = millis();
while( (millis() - startTime) < FRAME_WAIT_TO_SEND_TIMEOUT) { while( (millis() - startTime) < FRAME_WAIT_TO_SEND_TIMEOUT) {
if (digitalRead(BOARD_FLAG_PIN) == BOARD_READY_FLAG_VALUE) { if (digitalRead(BOARD_FLAG_PIN) == BOARD_READY_FLAG_VALUE) {
// log_esp3d("Yes"); log_esp3d("Yes");
return true; return true;
} }
Hal::wait(0);
} }
log_esp3d("Time out no board answer"); log_esp3d("Time out no board answer");
return false; return false;
@ -398,12 +536,15 @@ bool MKSService::canSendFrame()
void MKSService::sendFrameDone() void MKSService::sendFrameDone()
{ {
digitalWrite(ESP_FLAG_PIN, LOW); digitalWrite(ESP_FLAG_PIN, !BOARD_READY_FLAG_VALUE);
} }
bool MKSService::sendGcodeFrame(const char* cmd) bool MKSService::sendGcodeFrame(const char* cmd)
{ {
if (_uploadMode) {
return false;
}
String tmp = cmd; String tmp = cmd;
if (tmp.endsWith("\n")) { if (tmp.endsWith("\n")) {
tmp[tmp.length()-1]='\0'; tmp[tmp.length()-1]='\0';
@ -428,7 +569,7 @@ bool MKSService::sendGcodeFrame(const char* cmd)
if (canSendFrame()) { if (canSendFrame()) {
ESP3DOutput output(ESP_SERIAL_CLIENT); ESP3DOutput output(ESP_SERIAL_CLIENT);
if (output.write((const uint8_t *)_frame,strlen(tmp.c_str())+7) == (strlen(tmp.c_str())+7)) { if (output.write(_frame,strlen(tmp.c_str())+7) == (strlen(tmp.c_str())+7)) {
log_esp3d("Ok"); log_esp3d("Ok");
sendFrameDone(); sendFrameDone();
return true; return true;
@ -445,6 +586,9 @@ bool MKSService::sendNetworkFrame()
size_t dataOffset = 0; size_t dataOffset = 0;
String s; String s;
static uint32_t lastsend = 0; static uint32_t lastsend = 0;
if (_uploadMode) {
return false;
}
if ((millis() - lastsend)> NET_FRAME_REFRESH_TIME) { if ((millis() - lastsend)> NET_FRAME_REFRESH_TIME) {
lastsend = millis(); lastsend = millis();
log_esp3d("Network frame preparation"); log_esp3d("Network frame preparation");
@ -487,7 +631,7 @@ bool MKSService::sendNetworkFrame()
dataOffset = MKS_FRAME_DATA_OFFSET + 9; dataOffset = MKS_FRAME_DATA_OFFSET + 9;
////////////////////////////////// //////////////////////////////////
//Wifi_name Segment //Wifi_name Segment
strcpy(&_frame[dataOffset], s.c_str()); strcpy((char *)&_frame[dataOffset], s.c_str());
dataOffset+=s.length(); dataOffset+=s.length();
////////////////////////////////// //////////////////////////////////
//Wifi_key_len Segment //Wifi_key_len Segment
@ -496,7 +640,7 @@ bool MKSService::sendNetworkFrame()
dataOffset++; dataOffset++;
////////////////////////////////// //////////////////////////////////
//Wifi_key Segment //Wifi_key Segment
strcpy(&_frame[dataOffset], s.c_str()); strcpy((char *)&_frame[dataOffset], s.c_str());
dataOffset+=s.length(); dataOffset+=s.length();
} else if (NetConfig::getMode() == ESP_WIFI_AP) { } else if (NetConfig::getMode() == ESP_WIFI_AP) {
log_esp3d("AP Mode"); log_esp3d("AP Mode");
@ -522,7 +666,7 @@ bool MKSService::sendNetworkFrame()
dataOffset = MKS_FRAME_DATA_OFFSET + 9; dataOffset = MKS_FRAME_DATA_OFFSET + 9;
////////////////////////////////// //////////////////////////////////
//Wifi_name Segment //Wifi_name Segment
strcpy(&_frame[dataOffset], s.c_str()); strcpy((char *)&_frame[dataOffset], s.c_str());
dataOffset+=s.length(); dataOffset+=s.length();
////////////////////////////////// //////////////////////////////////
//Wifi_key_len Segment //Wifi_key_len Segment
@ -531,7 +675,7 @@ bool MKSService::sendNetworkFrame()
dataOffset++; dataOffset++;
////////////////////////////////// //////////////////////////////////
//Wifi_key Segment //Wifi_key Segment
strcpy(&_frame[dataOffset], s.c_str()); strcpy((char *)&_frame[dataOffset], s.c_str());
dataOffset+=s.length(); dataOffset+=s.length();
} else { } else {
//not supported //not supported
@ -559,7 +703,7 @@ bool MKSService::sendNetworkFrame()
////////////////////////////////// //////////////////////////////////
//Cloud host Segment //Cloud host Segment
//Use ESP3D IP instead //Use ESP3D IP instead
strcpy(&_frame[dataOffset], s.c_str()); strcpy((char *)&_frame[dataOffset], s.c_str());
dataOffset+=s.length(); dataOffset+=s.length();
////////////////////////////////// //////////////////////////////////
//Cloud host port Segment //Cloud host port Segment
@ -575,7 +719,7 @@ bool MKSService::sendNetworkFrame()
dataOffset++; dataOffset++;
////////////////////////////////// //////////////////////////////////
//Module id Segment //Module id Segment
strcpy(&_frame[dataOffset], _moduleId); strcpy((char *)&_frame[dataOffset], _moduleId);
dataOffset+=strlen(_moduleId); dataOffset+=strlen(_moduleId);
////////////////////////////////// //////////////////////////////////
//FW version len Segment //FW version len Segment
@ -583,7 +727,7 @@ bool MKSService::sendNetworkFrame()
dataOffset++; dataOffset++;
////////////////////////////////// //////////////////////////////////
//FW version Segment //FW version Segment
strcpy(&_frame[dataOffset], "ESP3D_" FW_VERSION); strcpy((char *)&_frame[dataOffset], "ESP3D_" FW_VERSION);
dataOffset+=strlen(FW_VERSION)+6; dataOffset+=strlen(FW_VERSION)+6;
////////////////////////////////// //////////////////////////////////
//Tail Segment //Tail Segment
@ -597,7 +741,7 @@ bool MKSService::sendNetworkFrame()
log_esp3d("Size of data in frame %d ", dataOffset-4); log_esp3d("Size of data in frame %d ", dataOffset-4);
if (canSendFrame()) { if (canSendFrame()) {
ESP3DOutput output(ESP_SERIAL_CLIENT); ESP3DOutput output(ESP_SERIAL_CLIENT);
if (output.write((const uint8_t *)_frame,dataOffset+1) == (dataOffset+1)) { if (output.write(_frame,dataOffset+1) == (dataOffset+1)) {
log_esp3d("Ok"); log_esp3d("Ok");
sendFrameDone(); sendFrameDone();
return true; return true;
@ -610,9 +754,9 @@ bool MKSService::sendNetworkFrame()
return false; return false;
} }
void MKSService::clearFrame() void MKSService::clearFrame(uint start)
{ {
memset(_frame, 0, sizeof(_frame)); memset(&_frame[start], 0, sizeof(_frame)-start);
} }
void MKSService::handle() void MKSService::handle()
{ {

View File

@ -22,6 +22,7 @@
#define _MKS_SERVICES_H #define _MKS_SERVICES_H
#define MKS_FRAME_SIZE 1024 #define MKS_FRAME_SIZE 1024
#define MKS_FRAME_DATA_MAX_SIZE (MKS_FRAME_SIZE - 5 - 4)
class MKSService class MKSService
{ {
@ -40,18 +41,26 @@ public:
static bool isTail(const char c); static bool isTail(const char c);
static bool isFrame(const char c); static bool isFrame(const char c);
static bool isCommand(const char c); static bool isCommand(const char c);
static bool waitForAck();
static bool sendFirstFragment(const char* filename, size_t filesize);
static bool sendFragment(const uint8_t * dataFrame, const size_t dataSize,uint fragmentID);
static uint getFragmentID(uint32_t fragmentNumber, bool isLast=false);
static void commandMode(bool fromSettings=false);
static void uploadMode();
private: private:
static uint8_t _uploadStatus; static uint8_t _uploadStatus;
static long _commandBaudRate;
static void sendWifiHotspots(); static void sendWifiHotspots();
static void messageWiFiControl(const uint8_t * dataFrame, const size_t dataSize); static void messageWiFiControl(const uint8_t * dataFrame, const size_t dataSize);
static void messageException(const uint8_t * dataFrame, const size_t dataSize); static void messageException(const uint8_t * dataFrame, const size_t dataSize);
static void messageWiFiConfig(const uint8_t * dataFrame, const size_t dataSize); static void messageWiFiConfig(const uint8_t * dataFrame, const size_t dataSize);
static void clearFrame(); static void clearFrame(uint start=0);
static bool canSendFrame(); static bool canSendFrame();
static void sendFrameDone(); static void sendFrameDone();
static bool _started; static bool _started;
static char _frame[MKS_FRAME_SIZE]; static uint8_t _frame[MKS_FRAME_SIZE];
static char _moduleId[22]; static char _moduleId[22];
static bool _uploadMode;
}; };

View File

@ -236,6 +236,7 @@ bool NetConfig::begin()
end(); end();
int8_t espMode =Settings_ESP3D::read_byte(ESP_RADIO_MODE); int8_t espMode =Settings_ESP3D::read_byte(ESP_RADIO_MODE);
ESP3DOutput output(ESP_ALL_CLIENTS); ESP3DOutput output(ESP_ALL_CLIENTS);
log_esp3d("Starting Network");
if (espMode != NO_NETWORK) { if (espMode != NO_NETWORK) {
if (Settings_ESP3D::isVerboseBoot()) { if (Settings_ESP3D::isVerboseBoot()) {
output.printMSG("Starting Network"); output.printMSG("Starting Network");
@ -259,6 +260,7 @@ bool NetConfig::begin()
_hostname = Settings_ESP3D::read_string(ESP_HOSTNAME); _hostname = Settings_ESP3D::read_string(ESP_HOSTNAME);
_mode = espMode; _mode = espMode;
if (espMode == NO_NETWORK) { if (espMode == NO_NETWORK) {
output.printMSG("Disable Network");
WiFi.mode(WIFI_OFF); WiFi.mode(WIFI_OFF);
ESP3DGlobalOutput::display_IP(); ESP3DGlobalOutput::display_IP();
if (Settings_ESP3D::isVerboseBoot()) { if (Settings_ESP3D::isVerboseBoot()) {
@ -271,6 +273,7 @@ bool NetConfig::begin()
} }
#if defined (WIFI_FEATURE) #if defined (WIFI_FEATURE)
if ((espMode == ESP_WIFI_AP) || (espMode == ESP_WIFI_STA)) { if ((espMode == ESP_WIFI_AP) || (espMode == ESP_WIFI_STA)) {
output.printMSG("Setup wifi");
res = WiFiConfig::begin(); res = WiFiConfig::begin();
//in case STA failed and fallback to AP mode //in case STA failed and fallback to AP mode
if (WiFi.getMode() == WIFI_AP) { if (WiFi.getMode() == WIFI_AP) {

View File

@ -86,9 +86,6 @@ bool NetServices::begin()
String hostname = Settings_ESP3D::read_string(ESP_HOSTNAME); String hostname = Settings_ESP3D::read_string(ESP_HOSTNAME);
ESP3DOutput output(ESP_ALL_CLIENTS); ESP3DOutput output(ESP_ALL_CLIENTS);
end(); end();
#if COMMUNICATION_PROTOCOL == MKS_SERIAL
MKSService::begin();
#endif //COMMUNICATION_PROTOCOL == MKS_SERIAL
#ifdef TIMESTAMP_FEATURE #ifdef TIMESTAMP_FEATURE
if (WiFi.getMode() != WIFI_AP) { if (WiFi.getMode() != WIFI_AP) {
if(!timeserver.begin()) { if(!timeserver.begin()) {
@ -303,6 +300,9 @@ bool NetServices::begin()
output.printMSG("Failed start camera streaming server"); output.printMSG("Failed start camera streaming server");
} }
#endif //CAMERA_DEVICE #endif //CAMERA_DEVICE
#if COMMUNICATION_PROTOCOL == MKS_SERIAL
MKSService::begin();
#endif //COMMUNICATION_PROTOCOL == MKS_SERIAL
if (!res) { if (!res) {
end(); end();
} }

View File

@ -51,7 +51,7 @@ SerialService serial_service;
TaskHandle_t _hserialtask= nullptr; TaskHandle_t _hserialtask= nullptr;
#endif //ARDUINO_ARCH_ESP32 #endif //ARDUINO_ARCH_ESP32
const long SupportedBaudList[] = {9600, 19200, 38400, 57600, 74880, 115200, 230400, 250000, 500000, 921600}; const long SupportedBaudList[] = {9600, 19200, 38400, 57600, 74880, 115200, 230400, 250000, 500000, 921600, 1958400};
#define TIMEOUT_SERIAL_FLUSH 1500 #define TIMEOUT_SERIAL_FLUSH 1500
//Constructor //Constructor

View File

@ -118,6 +118,7 @@ bool WiFiConfig::ConnectSTA2AP()
uint8_t dot = 0; uint8_t dot = 0;
wl_status_t status = WiFi.status(); wl_status_t status = WiFi.status();
ESP3DOutput output(ESP_ALL_CLIENTS); ESP3DOutput output(ESP_ALL_CLIENTS);
log_esp3d("Connecting");
#if COMMUNICATION_PROTOCOL != MKS_SERIAL #if COMMUNICATION_PROTOCOL != MKS_SERIAL
if (!Settings_ESP3D::isVerboseBoot()) { if (!Settings_ESP3D::isVerboseBoot()) {
output.printMSG("Connecting"); output.printMSG("Connecting");
@ -142,6 +143,7 @@ bool WiFiConfig::ConnectSTA2AP()
} }
msg_out+="."; msg_out+=".";
msg= msg_out; msg= msg_out;
log_esp3d("...");
dot++; dot++;
break; break;
} }
@ -163,6 +165,7 @@ bool WiFiConfig::ConnectSTA2AP()
*/ */
bool WiFiConfig::StartSTA() bool WiFiConfig::StartSTA()
{ {
log_esp3d("StartSTA");
#if defined (ARDUINO_ARCH_ESP32) #if defined (ARDUINO_ARCH_ESP32)
esp_wifi_start(); esp_wifi_start();
#endif //ARDUINO_ARCH_ESP32 #endif //ARDUINO_ARCH_ESP32
@ -248,7 +251,7 @@ bool WiFiConfig::StartAP()
IPAddress ip(IP); IPAddress ip(IP);
IPAddress mask(DEFAULT_AP_MASK_VALUE); IPAddress mask(DEFAULT_AP_MASK_VALUE);
//Set static IP //Set static IP
log_esp3d("Use: %s / %s / %s", ip.toString().c_str(),ip.toString().c_str(),mask.toString().c_str());
if (!WiFi.softAPConfig(ip, ip, mask)) { if (!WiFi.softAPConfig(ip, ip, mask)) {
output.printERROR("Set IP to AP failed"); output.printERROR("Set IP to AP failed");
} else { } else {
@ -263,6 +266,7 @@ bool WiFiConfig::StartAP()
stmp +=" is started not protected by passord"; stmp +=" is started not protected by passord";
} }
output.printMSG(stmp.c_str()); output.printMSG(stmp.c_str());
log_esp3d("%s",stmp.c_str());
//must be done after starting AP not before //must be done after starting AP not before
#if defined (ARDUINO_ARCH_ESP32) #if defined (ARDUINO_ARCH_ESP32)
WiFi.setSleep(false); WiFi.setSleep(false);
@ -271,6 +275,7 @@ bool WiFiConfig::StartAP()
return true; return true;
} else { } else {
output.printERROR("Starting AP failed"); output.printERROR("Starting AP failed");
log_esp3d("Starting AP failed");
return false; return false;
} }
} }
@ -287,17 +292,21 @@ bool WiFiConfig::begin()
{ {
bool res = false; bool res = false;
end(); end();
log_esp3d("Starting Wifi Config");
if (Settings_ESP3D::isVerboseBoot()) { if (Settings_ESP3D::isVerboseBoot()) {
ESP3DOutput output(ESP_ALL_CLIENTS); ESP3DOutput output(ESP_ALL_CLIENTS);
output.printMSG("Starting WiFi"); output.printMSG("Starting WiFi");
} }
int8_t wifiMode =Settings_ESP3D::read_byte(ESP_RADIO_MODE); int8_t wifiMode =Settings_ESP3D::read_byte(ESP_RADIO_MODE);
if (wifiMode == ESP_WIFI_AP) { if (wifiMode == ESP_WIFI_AP) {
log_esp3d("Starting AP mode");
res = StartAP(); res = StartAP();
} else if (wifiMode == ESP_WIFI_STA) { } else if (wifiMode == ESP_WIFI_STA) {
log_esp3d("Starting STA");
res = StartSTA(); res = StartSTA();
//AP is backup mode //AP is backup mode
if(!res) { if(!res) {
log_esp3d("Starting AP mode in safe mode");
res = StartAP(); res = StartAP();
} }
} }