mirror of
https://git.mirrors.martin98.com/https://github.com/luc-github/ESP3D.git
synced 2025-08-12 08:28:59 +08:00
Serial refactoring and idf 4.4.7 for ESP32 (#1048)
* Split esp32 code from esp8266 for Serial * split receive serial message and processing serial message in esp32 in different task * Make the esp32 code backward compatible with Arduino esp32 2.0.17 / IDF 4.4.7
This commit is contained in:
parent
bd5f96d1b0
commit
ae2dec2186
@ -611,11 +611,6 @@
|
|||||||
*/
|
*/
|
||||||
#define ESP_SAVE_SETTINGS SETTINGS_IN_EEPROM
|
#define ESP_SAVE_SETTINGS SETTINGS_IN_EEPROM
|
||||||
|
|
||||||
/* Add serial task
|
|
||||||
* ESP32 need to add a task to handle serial communication
|
|
||||||
*/
|
|
||||||
#define SERIAL_INDEPENDANT_TASK
|
|
||||||
|
|
||||||
/************************************
|
/************************************
|
||||||
*
|
*
|
||||||
* Development setting
|
* Development setting
|
||||||
|
@ -34,8 +34,13 @@
|
|||||||
#endif // __has_include ("rtc_wdt.h")
|
#endif // __has_include ("rtc_wdt.h")
|
||||||
#endif // CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2
|
#endif // CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2
|
||||||
#include <WiFi.h>
|
#include <WiFi.h>
|
||||||
|
#if ESP_ARDUINO_VERSION_MAJOR == 3
|
||||||
#include <esp_adc/adc_continuous.h>
|
#include <esp_adc/adc_continuous.h>
|
||||||
#include <esp_adc/adc_oneshot.h>
|
#include <esp_adc/adc_oneshot.h>
|
||||||
|
#endif // ESP_ARDUINO_VERSION_MAJOR == 3
|
||||||
|
#if ESP_ARDUINO_VERSION_MAJOR == 2
|
||||||
|
#include <driver/adc.h>
|
||||||
|
#endif // ESP_ARDUINO_VERSION_MAJOR == 2
|
||||||
#include <esp_task_wdt.h>
|
#include <esp_task_wdt.h>
|
||||||
|
|
||||||
#if !CONFIG_IDF_TARGET_ESP32C6
|
#if !CONFIG_IDF_TARGET_ESP32C6
|
||||||
|
@ -20,6 +20,13 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
/**************************
|
||||||
|
* Arduino core version
|
||||||
|
* ***********************/
|
||||||
|
#if ESP_ARDUINO_VERSION_MAJOR == 1
|
||||||
|
#error "ESP3D does not support Arduino Core 1.x.x"
|
||||||
|
#endif
|
||||||
|
|
||||||
/**************************
|
/**************************
|
||||||
* Settings
|
* Settings
|
||||||
* ***********************/
|
* ***********************/
|
||||||
|
@ -252,7 +252,12 @@ const char* mDNS_Service::answerIP(uint16_t index) {
|
|||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
#if defined(ARDUINO_ARCH_ESP32)
|
#if defined(ARDUINO_ARCH_ESP32)
|
||||||
|
#if ESP_ARDUINO_VERSION_MAJOR == 3
|
||||||
tmp = MDNS.address(index).toString();
|
tmp = MDNS.address(index).toString();
|
||||||
|
#endif // ESP_ARDUINO_VERSION_MAJOR == 3
|
||||||
|
#if ESP_ARDUINO_VERSION_MAJOR == 2
|
||||||
|
tmp = MDNS.IP(index).toString();
|
||||||
|
#endif // ESP_ARDUINO_VERSION_MAJOR == 2
|
||||||
|
|
||||||
#endif // ARDUINO_ARCH_ESP32
|
#endif // ARDUINO_ARCH_ESP32
|
||||||
#if defined(ARDUINO_ARCH_ESP8266)
|
#if defined(ARDUINO_ARCH_ESP8266)
|
||||||
|
@ -24,6 +24,10 @@
|
|||||||
#include "../../core/esp3d_client_types.h"
|
#include "../../core/esp3d_client_types.h"
|
||||||
#include "../../core/esp3d_message.h"
|
#include "../../core/esp3d_message.h"
|
||||||
|
|
||||||
|
#if defined(ARDUINO_ARCH_ESP32)
|
||||||
|
#include "../../core/esp3d_messageFifo.h"
|
||||||
|
#endif // ARDUINO_ARCH_ESP32
|
||||||
|
|
||||||
#define ESP3D_SERIAL_BUFFER_SIZE 1024
|
#define ESP3D_SERIAL_BUFFER_SIZE 1024
|
||||||
|
|
||||||
extern const uint32_t SupportedBaudList[];
|
extern const uint32_t SupportedBaudList[];
|
||||||
@ -36,11 +40,10 @@ class ESP3DSerialService final {
|
|||||||
void setParameters();
|
void setParameters();
|
||||||
bool begin(uint8_t serialIndex);
|
bool begin(uint8_t serialIndex);
|
||||||
bool end();
|
bool end();
|
||||||
void updateBaudRate(long br);
|
void updateBaudRate(uint32_t br);
|
||||||
void handle();
|
void handle();
|
||||||
void process();
|
|
||||||
bool reset();
|
bool reset();
|
||||||
long baudRate();
|
uint32_t baudRate();
|
||||||
uint8_t serialIndex() { return _serialIndex; }
|
uint8_t serialIndex() { return _serialIndex; }
|
||||||
const uint32_t *get_baudratelist(uint8_t *count);
|
const uint32_t *get_baudratelist(uint8_t *count);
|
||||||
void flush();
|
void flush();
|
||||||
@ -52,8 +55,13 @@ class ESP3DSerialService final {
|
|||||||
void initAuthentication();
|
void initAuthentication();
|
||||||
void setAuthentication(ESP3DAuthenticationLevel auth) { _auth = auth; }
|
void setAuthentication(ESP3DAuthenticationLevel auth) { _auth = auth; }
|
||||||
ESP3DAuthenticationLevel getAuthentication();
|
ESP3DAuthenticationLevel getAuthentication();
|
||||||
|
#if defined(ARDUINO_ARCH_ESP32)
|
||||||
|
void receiveCb();
|
||||||
|
static void receiveSerialCb();
|
||||||
|
static void receiveBridgeSeialCb();
|
||||||
|
#endif // ARDUINO_ARCH_ESP32
|
||||||
private:
|
private:
|
||||||
|
uint32_t _baudRate;
|
||||||
ESP3DAuthenticationLevel _auth;
|
ESP3DAuthenticationLevel _auth;
|
||||||
uint8_t _serialIndex;
|
uint8_t _serialIndex;
|
||||||
ESP3DClientType _origin;
|
ESP3DClientType _origin;
|
||||||
@ -65,6 +73,10 @@ class ESP3DSerialService final {
|
|||||||
uint32_t _lastflush;
|
uint32_t _lastflush;
|
||||||
uint8_t _buffer[ESP3D_SERIAL_BUFFER_SIZE + 1]; // keep space of 0x0 terminal
|
uint8_t _buffer[ESP3D_SERIAL_BUFFER_SIZE + 1]; // keep space of 0x0 terminal
|
||||||
size_t _buffer_size;
|
size_t _buffer_size;
|
||||||
|
#if defined(ARDUINO_ARCH_ESP32)
|
||||||
|
SemaphoreHandle_t _mutex;
|
||||||
|
ESP3DMessageFIFO _messagesInFIFO;
|
||||||
|
#endif // ARDUINO_ARCH_ESP32
|
||||||
void push2buffer(uint8_t *sbuf, size_t len);
|
void push2buffer(uint8_t *sbuf, size_t len);
|
||||||
void flushbuffer();
|
void flushbuffer();
|
||||||
};
|
};
|
||||||
|
437
esp3d/src/modules/serial/serial_service_esp32.cpp
Normal file
437
esp3d/src/modules/serial/serial_service_esp32.cpp
Normal file
@ -0,0 +1,437 @@
|
|||||||
|
/*
|
||||||
|
esp3d_serial_service.cpp - serial services functions class
|
||||||
|
|
||||||
|
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
|
||||||
|
*/
|
||||||
|
#if defined(ARDUINO_ARCH_ESP32)
|
||||||
|
#include "../../include/esp3d_config.h"
|
||||||
|
#if COMMUNICATION_PROTOCOL == RAW_SERIAL || defined(ESP_SERIAL_BRIDGE_OUTPUT)
|
||||||
|
#include "../../core/esp3d_commands.h"
|
||||||
|
#include "../../core/esp3d_settings.h"
|
||||||
|
#include "../../core/esp3d_string.h"
|
||||||
|
#include "../authentication/authentication_service.h"
|
||||||
|
#include "serial_service.h"
|
||||||
|
|
||||||
|
#define SERIAL_COMMUNICATION_TIMEOUT 500
|
||||||
|
|
||||||
|
#if defined(CONFIG_IDF_TARGET_ESP32C3) || \
|
||||||
|
defined(CONFIG_IDF_TARGET_ESP32C6) || defined(CONFIG_IDF_TARGET_ESP32S2)
|
||||||
|
#define MAX_SERIAL 2
|
||||||
|
HardwareSerial *Serials[MAX_SERIAL] = {&Serial, &Serial1};
|
||||||
|
#else
|
||||||
|
#define MAX_SERIAL 3
|
||||||
|
HardwareSerial *Serials[MAX_SERIAL] = {&Serial, &Serial1, &Serial2};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Serial Parameters
|
||||||
|
#define ESP_SERIAL_PARAM SERIAL_8N1
|
||||||
|
|
||||||
|
ESP3DSerialService esp3d_serial_service = ESP3DSerialService(MAIN_SERIAL);
|
||||||
|
#if defined(ESP_SERIAL_BRIDGE_OUTPUT)
|
||||||
|
ESP3DSerialService serial_bridge_service = ESP3DSerialService(BRIDGE_SERIAL);
|
||||||
|
#endif // ESP_SERIAL_BRIDGE_OUTPUT
|
||||||
|
|
||||||
|
const uint32_t SupportedBaudList[] = {9600, 19200, 38400, 57600, 74880,
|
||||||
|
115200, 230400, 250000, 500000, 921600,
|
||||||
|
1000000, 1958400, 2000000};
|
||||||
|
const size_t SupportedBaudListSize = sizeof(SupportedBaudList) / sizeof(uint32_t);
|
||||||
|
|
||||||
|
#define TIMEOUT_SERIAL_FLUSH 1500
|
||||||
|
// Constructor
|
||||||
|
ESP3DSerialService::ESP3DSerialService(uint8_t id) {
|
||||||
|
_buffer_size = 0;
|
||||||
|
_mutex = NULL;
|
||||||
|
_started = false;
|
||||||
|
#if defined(AUTHENTICATION_FEATURE)
|
||||||
|
_needauthentication = true;
|
||||||
|
#else
|
||||||
|
_needauthentication = false;
|
||||||
|
#endif // AUTHENTICATION_FEATURE
|
||||||
|
_id = id;
|
||||||
|
switch (_id) {
|
||||||
|
case MAIN_SERIAL:
|
||||||
|
_rxPin = ESP_RX_PIN;
|
||||||
|
_txPin = ESP_TX_PIN;
|
||||||
|
_origin = ESP3DClientType::serial;
|
||||||
|
break;
|
||||||
|
#if defined(ESP_SERIAL_BRIDGE_OUTPUT)
|
||||||
|
case BRIDGE_SERIAL:
|
||||||
|
_rxPin = ESP_BRIDGE_RX_PIN;
|
||||||
|
_txPin = ESP_BRIDGE_TX_PIN;
|
||||||
|
_origin = ESP3DClientType::serial_bridge;
|
||||||
|
break;
|
||||||
|
#endif // ESP_SERIAL_BRIDGE_OUTPUT
|
||||||
|
default:
|
||||||
|
_rxPin = ESP_RX_PIN;
|
||||||
|
_txPin = ESP_TX_PIN;
|
||||||
|
_origin = ESP3DClientType::serial;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
_messagesInFIFO.setId("in");
|
||||||
|
_messagesInFIFO.setMaxSize(0); // no limit
|
||||||
|
_baudRate = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Destructor
|
||||||
|
ESP3DSerialService::~ESP3DSerialService() { end(); }
|
||||||
|
|
||||||
|
// extra parameters that do not need a begin
|
||||||
|
void ESP3DSerialService::setParameters() {
|
||||||
|
#if defined(AUTHENTICATION_FEATURE)
|
||||||
|
_needauthentication =
|
||||||
|
(ESP3DSettings::readByte(ESP_SECURE_SERIAL) == 0) ? false : true;
|
||||||
|
#else
|
||||||
|
_needauthentication = false;
|
||||||
|
#endif // AUTHENTICATION_FEATURE
|
||||||
|
}
|
||||||
|
|
||||||
|
void ESP3DSerialService::initAuthentication() {
|
||||||
|
#if defined(AUTHENTICATION_FEATURE)
|
||||||
|
_auth = ESP3DAuthenticationLevel::guest;
|
||||||
|
#else
|
||||||
|
_auth = ESP3DAuthenticationLevel::admin;
|
||||||
|
#endif // AUTHENTICATION_FEATURE
|
||||||
|
}
|
||||||
|
ESP3DAuthenticationLevel ESP3DSerialService::getAuthentication() {
|
||||||
|
if (_needauthentication) {
|
||||||
|
return _auth;
|
||||||
|
}
|
||||||
|
return ESP3DAuthenticationLevel::admin;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ESP3DSerialService::receiveSerialCb() { esp3d_serial_service.receiveCb(); }
|
||||||
|
|
||||||
|
#if defined(ESP_SERIAL_BRIDGE_OUTPUT)
|
||||||
|
void ESP3DSerialService::receiveBridgeSeialCb() {
|
||||||
|
serial_bridge_service.receiveCb();
|
||||||
|
}
|
||||||
|
#endif // ESP_SERIAL_BRIDGE_OUTPUT
|
||||||
|
|
||||||
|
void ESP3DSerialService::receiveCb() {
|
||||||
|
if (!started()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (xSemaphoreTake(_mutex, portMAX_DELAY)) {
|
||||||
|
uint32_t now = millis();
|
||||||
|
while ((millis() - now) < SERIAL_COMMUNICATION_TIMEOUT) {
|
||||||
|
if (Serials[_serialIndex]->available()) {
|
||||||
|
_buffer[_buffer_size] = Serials[_serialIndex]->read();
|
||||||
|
_buffer_size++;
|
||||||
|
now = millis();
|
||||||
|
if (_buffer_size > ESP3D_SERIAL_BUFFER_SIZE ||
|
||||||
|
_buffer[_buffer_size - 1] == '\n' ||
|
||||||
|
_buffer[_buffer_size - 1] == '\r') {
|
||||||
|
if (_buffer[_buffer_size - 1] == '\r') {
|
||||||
|
_buffer[_buffer_size - 1] = '\n';
|
||||||
|
}
|
||||||
|
flushbuffer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
xSemaphoreGive(_mutex);
|
||||||
|
} else {
|
||||||
|
esp3d_log_e("Mutex not taken");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setup Serial
|
||||||
|
bool ESP3DSerialService::begin(uint8_t serialIndex) {
|
||||||
|
_mutex = xSemaphoreCreateMutex();
|
||||||
|
if (_mutex == NULL) {
|
||||||
|
esp3d_log_e("Mutex creation failed");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
_serialIndex = serialIndex - 1;
|
||||||
|
esp3d_log("Serial %d begin for %d", _serialIndex, _id);
|
||||||
|
if (_id == BRIDGE_SERIAL &&
|
||||||
|
ESP3DSettings::readByte(ESP_SERIAL_BRIDGE_ON) == 0) {
|
||||||
|
esp3d_log("Serial %d for %d is disabled", _serialIndex, _id);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (_serialIndex >= MAX_SERIAL) {
|
||||||
|
esp3d_log_e("Serial %d begin for %d failed, index out of range",
|
||||||
|
_serialIndex, _id);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
_lastflush = millis();
|
||||||
|
// read from settings
|
||||||
|
uint32_t br = 0;
|
||||||
|
uint32_t defaultBr = 0;
|
||||||
|
switch (_id) {
|
||||||
|
case MAIN_SERIAL:
|
||||||
|
br = ESP3DSettings::readUint32(ESP_BAUD_RATE);
|
||||||
|
defaultBr = ESP3DSettings::getDefaultIntegerSetting(ESP_BAUD_RATE);
|
||||||
|
break;
|
||||||
|
#if defined(ESP_SERIAL_BRIDGE_OUTPUT)
|
||||||
|
case BRIDGE_SERIAL:
|
||||||
|
br = ESP3DSettings::readUint32(ESP_SERIAL_BRIDGE_BAUD);
|
||||||
|
defaultBr =
|
||||||
|
ESP3DSettings::getDefaultIntegerSetting(ESP_SERIAL_BRIDGE_BAUD);
|
||||||
|
break;
|
||||||
|
#endif // ESP_SERIAL_BRIDGE_OUTPUT
|
||||||
|
default:
|
||||||
|
esp3d_log_e("Serial %d begin for %d failed, unknown id", _serialIndex,
|
||||||
|
_id);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
setParameters();
|
||||||
|
esp3d_log("Baud rate is %d , default is %d", br, defaultBr);
|
||||||
|
_buffer_size = 0;
|
||||||
|
// change only if different from current
|
||||||
|
if (br != baudRate() || (_rxPin != -1) || (_txPin != -1)) {
|
||||||
|
if (!ESP3DSettings::isValidIntegerSetting(br, ESP_BAUD_RATE)) {
|
||||||
|
br = defaultBr;
|
||||||
|
}
|
||||||
|
Serials[_serialIndex]->setRxBufferSize(SERIAL_RX_BUFFER_SIZE);
|
||||||
|
Serials[_serialIndex]->begin(br, ESP_SERIAL_PARAM, _rxPin, _txPin);
|
||||||
|
_baudRate = br;
|
||||||
|
if (_id == MAIN_SERIAL) {
|
||||||
|
Serials[_serialIndex]->onReceive(receiveSerialCb);
|
||||||
|
}
|
||||||
|
#if defined(ESP_SERIAL_BRIDGE_OUTPUT)
|
||||||
|
if (_id == BRIDGE_SERIAL) {
|
||||||
|
Serials[_serialIndex]->onReceive(receiveBridgeSeialCb);
|
||||||
|
}
|
||||||
|
#endif // ESP_SERIAL_BRIDGE_OUTPUT
|
||||||
|
}
|
||||||
|
_started = true;
|
||||||
|
esp3d_log("Serial %d for %d is started", _serialIndex, _id);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// End serial
|
||||||
|
bool ESP3DSerialService::end() {
|
||||||
|
flush();
|
||||||
|
delay(100);
|
||||||
|
if (_mutex != NULL) {
|
||||||
|
vSemaphoreDelete(_mutex);
|
||||||
|
_mutex = NULL;
|
||||||
|
}
|
||||||
|
Serials[_serialIndex]->end();
|
||||||
|
_buffer_size = 0;
|
||||||
|
_started = false;
|
||||||
|
initAuthentication();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// return the array of uint32_t and array size
|
||||||
|
const uint32_t *ESP3DSerialService::get_baudratelist(uint8_t *count) {
|
||||||
|
if (count) {
|
||||||
|
*count = sizeof(SupportedBaudList) / sizeof(uint32_t);
|
||||||
|
}
|
||||||
|
return SupportedBaudList;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Function which could be called in other loop
|
||||||
|
void ESP3DSerialService::handle() {
|
||||||
|
// Do we have some data waiting
|
||||||
|
size_t len = _messagesInFIFO.size();
|
||||||
|
if (len > 0) {
|
||||||
|
if (len > 10) {
|
||||||
|
len = 10;
|
||||||
|
}
|
||||||
|
while (len > 0) {
|
||||||
|
esp3d_log_d("Serial in fifo size %d", _messagesInFIFO.size());
|
||||||
|
ESP3DMessage *message = _messagesInFIFO.pop();
|
||||||
|
if (message) {
|
||||||
|
esp3d_commands.process(message);
|
||||||
|
} else {
|
||||||
|
esp3d_log_e("Cannot create message");
|
||||||
|
}
|
||||||
|
len--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ESP3DSerialService::flushbuffer() {
|
||||||
|
_buffer[_buffer_size] = 0x0;
|
||||||
|
if (_buffer_size == 1 && _buffer[0] == '\n') {
|
||||||
|
_buffer_size = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// dispatch command
|
||||||
|
ESP3DMessage *message = esp3d_message_manager.newMsg(
|
||||||
|
_origin,
|
||||||
|
_id == MAIN_SERIAL ? ESP3DClientType::all_clients
|
||||||
|
: esp3d_commands.getOutputClient(),
|
||||||
|
(uint8_t *)_buffer, _buffer_size, getAuthentication());
|
||||||
|
if (message) {
|
||||||
|
// process command
|
||||||
|
message->type = ESP3DMessageType::unique;
|
||||||
|
esp3d_log_d("Message sent to fifo list");
|
||||||
|
_messagesInFIFO.push(message);
|
||||||
|
} else {
|
||||||
|
esp3d_log_e("Cannot create message");
|
||||||
|
}
|
||||||
|
_lastflush = millis();
|
||||||
|
_buffer_size = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// push collected data to buffer and proceed accordingly
|
||||||
|
void ESP3DSerialService::push2buffer(uint8_t *sbuf, size_t len) {
|
||||||
|
/* if (!_started) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
esp3d_log("buffer get %d data ", len);
|
||||||
|
for (size_t i = 0; i < len; i++) {
|
||||||
|
_lastflush = millis();
|
||||||
|
// command is defined
|
||||||
|
if ((char(sbuf[i]) == '\n') || (char(sbuf[i]) == '\r')) {
|
||||||
|
if (_buffer_size < ESP3D_SERIAL_BUFFER_SIZE) {
|
||||||
|
_buffer[_buffer_size] = sbuf[i];
|
||||||
|
_buffer_size++;
|
||||||
|
}
|
||||||
|
flushbuffer();
|
||||||
|
} else if (esp3d_string::isPrintableChar(char(sbuf[i]))) {
|
||||||
|
if (_buffer_size < ESP3D_SERIAL_BUFFER_SIZE) {
|
||||||
|
_buffer[_buffer_size] = sbuf[i];
|
||||||
|
_buffer_size++;
|
||||||
|
} else {
|
||||||
|
flushbuffer();
|
||||||
|
_buffer[_buffer_size] = sbuf[i];
|
||||||
|
_buffer_size++;
|
||||||
|
}
|
||||||
|
} else { // it is not printable char
|
||||||
|
// clean buffer first
|
||||||
|
if (_buffer_size > 0) {
|
||||||
|
flushbuffer();
|
||||||
|
}
|
||||||
|
// process char
|
||||||
|
_buffer[_buffer_size] = sbuf[i];
|
||||||
|
_buffer_size++;
|
||||||
|
flushbuffer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/}
|
||||||
|
|
||||||
|
// Reset Serial Setting (baud rate)
|
||||||
|
bool ESP3DSerialService::reset() {
|
||||||
|
esp3d_log("Reset serial");
|
||||||
|
bool res = false;
|
||||||
|
switch (_id) {
|
||||||
|
case MAIN_SERIAL:
|
||||||
|
return ESP3DSettings::writeUint32(
|
||||||
|
ESP_BAUD_RATE,
|
||||||
|
ESP3DSettings::getDefaultIntegerSetting(ESP_BAUD_RATE));
|
||||||
|
#if defined(ESP_SERIAL_BRIDGE_OUTPUT)
|
||||||
|
case BRIDGE_SERIAL:
|
||||||
|
res = ESP3DSettings::writeByte(
|
||||||
|
ESP_SERIAL_BRIDGE_ON,
|
||||||
|
ESP3DSettings::getDefaultByteSetting(ESP_SERIAL_BRIDGE_ON));
|
||||||
|
return res && ESP3DSettings::writeUint32(
|
||||||
|
ESP_SERIAL_BRIDGE_BAUD,
|
||||||
|
ESP3DSettings::getDefaultIntegerSetting(
|
||||||
|
ESP_SERIAL_BRIDGE_BAUD));
|
||||||
|
#endif // ESP_SERIAL_BRIDGE_OUTPUT
|
||||||
|
default:
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ESP3DSerialService::updateBaudRate(uint32_t br) {
|
||||||
|
if (br != _baudRate) {
|
||||||
|
Serials[_serialIndex]->flush();
|
||||||
|
Serials[_serialIndex]->updateBaudRate(br);
|
||||||
|
_baudRate = br;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get current baud rate
|
||||||
|
uint32_t ESP3DSerialService::baudRate() {
|
||||||
|
|
||||||
|
return _baudRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t ESP3DSerialService::writeBytes(const uint8_t *buffer, size_t size) {
|
||||||
|
if (!_started) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if ((uint)Serials[_serialIndex]->availableForWrite() >= size) {
|
||||||
|
return Serials[_serialIndex]->write(buffer, size);
|
||||||
|
} else {
|
||||||
|
size_t sizetosend = size;
|
||||||
|
size_t sizesent = 0;
|
||||||
|
uint8_t *buffertmp = (uint8_t *)buffer;
|
||||||
|
uint32_t starttime = millis();
|
||||||
|
// loop until all is sent or timeout
|
||||||
|
while (sizetosend > 0 && ((millis() - starttime) < 100)) {
|
||||||
|
size_t available = Serials[_serialIndex]->availableForWrite();
|
||||||
|
if (available > 0) {
|
||||||
|
// in case less is sent
|
||||||
|
available = Serials[_serialIndex]->write(
|
||||||
|
&buffertmp[sizesent],
|
||||||
|
(available >= sizetosend) ? sizetosend : available);
|
||||||
|
sizetosend -= available;
|
||||||
|
sizesent += available;
|
||||||
|
starttime = millis();
|
||||||
|
} else {
|
||||||
|
ESP3DHal::wait(5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sizesent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t ESP3DSerialService::readBytes(uint8_t *sbuf, size_t len) {
|
||||||
|
if (!_started) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return Serials[_serialIndex]->readBytes(sbuf, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ESP3DSerialService::flush() {
|
||||||
|
if (!_started) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Serials[_serialIndex]->flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ESP3DSerialService::swap() {
|
||||||
|
// Nothing to do
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ESP3DSerialService::dispatch(ESP3DMessage *message) {
|
||||||
|
bool done = false;
|
||||||
|
// Only is serial service is started
|
||||||
|
if (_started) {
|
||||||
|
// Only if message is not null
|
||||||
|
if (message) {
|
||||||
|
// if message is not null
|
||||||
|
if (message->data && message->size != 0) {
|
||||||
|
if (writeBytes(message->data, message->size) == message->size) {
|
||||||
|
flush();
|
||||||
|
// Delete message now
|
||||||
|
esp3d_message_manager.deleteMsg(message);
|
||||||
|
done = true;
|
||||||
|
} else {
|
||||||
|
esp3d_log_e("Error while sending data");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
esp3d_log_e("Error null data");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
esp3d_log_e("Error null message");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return done;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // COMMUNICATION_PROTOCOL == RAW_SERIAL ||
|
||||||
|
// defined(ESP_SERIAL_BRIDGE_OUTPUT)
|
||||||
|
#endif // ARDUINO_ARCH_ESP32
|
@ -17,10 +17,9 @@
|
|||||||
License along with This code; if not, write to the Free Software
|
License along with This code; if not, write to the Free Software
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
|
#if defined(ARDUINO_ARCH_ESP8266)
|
||||||
#include "../../include/esp3d_config.h"
|
#include "../../include/esp3d_config.h"
|
||||||
#if COMMUNICATION_PROTOCOL == MKS_SERIAL || \
|
#if COMMUNICATION_PROTOCOL == MKS_SERIAL || COMMUNICATION_PROTOCOL == RAW_SERIAL
|
||||||
COMMUNICATION_PROTOCOL == RAW_SERIAL || defined(ESP_SERIAL_BRIDGE_OUTPUT)
|
|
||||||
#include "../../core/esp3d_commands.h"
|
#include "../../core/esp3d_commands.h"
|
||||||
#include "../../core/esp3d_settings.h"
|
#include "../../core/esp3d_settings.h"
|
||||||
#include "../../core/esp3d_string.h"
|
#include "../../core/esp3d_string.h"
|
||||||
@ -30,43 +29,18 @@
|
|||||||
#include "../mks/mks_service.h"
|
#include "../mks/mks_service.h"
|
||||||
#endif // COMMUNICATION_PROTOCOL == MKS_SERIAL
|
#endif // COMMUNICATION_PROTOCOL == MKS_SERIAL
|
||||||
#include "../authentication/authentication_service.h"
|
#include "../authentication/authentication_service.h"
|
||||||
#if defined(ARDUINO_ARCH_ESP8266)
|
|
||||||
#define MAX_SERIAL 2
|
#define MAX_SERIAL 2
|
||||||
HardwareSerial *Serials[MAX_SERIAL] = {&Serial, &Serial1};
|
HardwareSerial *Serials[MAX_SERIAL] = {&Serial, &Serial1};
|
||||||
#endif // ARDUINO_ARCH_ESP8266
|
|
||||||
|
|
||||||
#if defined(ARDUINO_ARCH_ESP32)
|
|
||||||
|
|
||||||
#if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) ||defined(CONFIG_IDF_TARGET_ESP32S2)
|
|
||||||
#define MAX_SERIAL 2
|
|
||||||
HardwareSerial *Serials[MAX_SERIAL] = {&Serial, &Serial1};
|
|
||||||
#else
|
|
||||||
#define MAX_SERIAL 3
|
|
||||||
HardwareSerial *Serials[MAX_SERIAL] = {&Serial, &Serial1, &Serial2};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // ARDUINO_ARCH_ESP32
|
|
||||||
|
|
||||||
// Serial Parameters
|
// Serial Parameters
|
||||||
#define ESP_SERIAL_PARAM SERIAL_8N1
|
#define ESP_SERIAL_PARAM SERIAL_8N1
|
||||||
|
|
||||||
#define ESP3DSERIAL_RUNNING_PRIORITY 1
|
|
||||||
#define ESP3DSERIAL_RUNNING_CORE 1
|
|
||||||
#define SERIAL_YIELD 10
|
|
||||||
|
|
||||||
ESP3DSerialService esp3d_serial_service = ESP3DSerialService(MAIN_SERIAL);
|
ESP3DSerialService esp3d_serial_service = ESP3DSerialService(MAIN_SERIAL);
|
||||||
#if defined(ESP_SERIAL_BRIDGE_OUTPUT)
|
|
||||||
ESP3DSerialService serial_bridge_service = ESP3DSerialService(BRIDGE_SERIAL);
|
|
||||||
#endif // ESP_SERIAL_BRIDGE_OUTPUT
|
|
||||||
|
|
||||||
#if defined(ARDUINO_ARCH_ESP32) && defined(SERIAL_INDEPENDANT_TASK)
|
|
||||||
TaskHandle_t _hserialtask = nullptr;
|
|
||||||
#endif // ARDUINO_ARCH_ESP32
|
|
||||||
|
|
||||||
const uint32_t SupportedBaudList[] = {9600, 19200, 38400, 57600, 74880,
|
const uint32_t SupportedBaudList[] = {9600, 19200, 38400, 57600, 74880,
|
||||||
115200, 230400, 250000, 500000, 921600,
|
115200, 230400, 250000, 500000, 921600,
|
||||||
1000000, 1958400, 2000000};
|
1000000, 1958400, 2000000};
|
||||||
const size_t SupportedBaudListSize = sizeof(SupportedBaudList) / sizeof(long);
|
const size_t SupportedBaudListSize = sizeof(SupportedBaudList) / sizeof(uint32_t);
|
||||||
|
|
||||||
#define TIMEOUT_SERIAL_FLUSH 1500
|
#define TIMEOUT_SERIAL_FLUSH 1500
|
||||||
// Constructor
|
// Constructor
|
||||||
@ -79,51 +53,15 @@ ESP3DSerialService::ESP3DSerialService(uint8_t id) {
|
|||||||
_needauthentication = false;
|
_needauthentication = false;
|
||||||
#endif // AUTHENTICATION_FEATURE
|
#endif // AUTHENTICATION_FEATURE
|
||||||
_id = id;
|
_id = id;
|
||||||
switch (_id) {
|
|
||||||
case MAIN_SERIAL:
|
_rxPin = ESP_RX_PIN;
|
||||||
_rxPin = ESP_RX_PIN;
|
_txPin = ESP_TX_PIN;
|
||||||
_txPin = ESP_TX_PIN;
|
_origin = ESP3DClientType::serial;
|
||||||
_origin = ESP3DClientType::serial;
|
|
||||||
break;
|
|
||||||
#if defined(ESP_SERIAL_BRIDGE_OUTPUT)
|
|
||||||
case BRIDGE_SERIAL:
|
|
||||||
_rxPin = ESP_BRIDGE_RX_PIN;
|
|
||||||
_txPin = ESP_BRIDGE_TX_PIN;
|
|
||||||
_origin = ESP3DClientType::serial_bridge;
|
|
||||||
break;
|
|
||||||
#endif // ESP_SERIAL_BRIDGE_OUTPUT
|
|
||||||
default:
|
|
||||||
_rxPin = ESP_RX_PIN;
|
|
||||||
_txPin = ESP_TX_PIN;
|
|
||||||
_origin = ESP3DClientType::serial;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Destructor
|
// Destructor
|
||||||
ESP3DSerialService::~ESP3DSerialService() { end(); }
|
ESP3DSerialService::~ESP3DSerialService() { end(); }
|
||||||
|
|
||||||
// dedicated serial task
|
|
||||||
#if defined(ARDUINO_ARCH_ESP32) && defined(SERIAL_INDEPENDANT_TASK)
|
|
||||||
void ESP3DSerialTaskfn(void *parameter) {
|
|
||||||
uint8_t id = *((uint8_t *)parameter);
|
|
||||||
if (id == MAIN_SERIAL) {
|
|
||||||
esp3d_log("Serial Task for main serial");
|
|
||||||
} else {
|
|
||||||
esp3d_log("Serial Task for bridge serial");
|
|
||||||
}
|
|
||||||
for (;;) {
|
|
||||||
esp3d_serial_service.process();
|
|
||||||
#if defined(ESP_SERIAL_BRIDGE_OUTPUT)
|
|
||||||
esp3d_log("Serial Task for bridge serial");
|
|
||||||
serial_bridge_service.process();
|
|
||||||
#endif // ESP_SERIAL_BRIDGE_OUTPUT
|
|
||||||
ESP3DHal::wait(SERIAL_YIELD); // Yield to other tasks
|
|
||||||
}
|
|
||||||
vTaskDelete(NULL);
|
|
||||||
}
|
|
||||||
#endif // ARDUINO_ARCH_ESP32
|
|
||||||
|
|
||||||
// extra parameters that do not need a begin
|
// extra parameters that do not need a begin
|
||||||
void ESP3DSerialService::setParameters() {
|
void ESP3DSerialService::setParameters() {
|
||||||
#if defined(AUTHENTICATION_FEATURE)
|
#if defined(AUTHENTICATION_FEATURE)
|
||||||
@ -152,11 +90,6 @@ ESP3DAuthenticationLevel ESP3DSerialService::getAuthentication() {
|
|||||||
bool ESP3DSerialService::begin(uint8_t serialIndex) {
|
bool ESP3DSerialService::begin(uint8_t serialIndex) {
|
||||||
_serialIndex = serialIndex - 1;
|
_serialIndex = serialIndex - 1;
|
||||||
esp3d_log("Serial %d begin for %d", _serialIndex, _id);
|
esp3d_log("Serial %d begin for %d", _serialIndex, _id);
|
||||||
if (_id == BRIDGE_SERIAL &&
|
|
||||||
ESP3DSettings::readByte(ESP_SERIAL_BRIDGE_ON) == 0) {
|
|
||||||
esp3d_log("Serial %d for %d is disabled", _serialIndex, _id);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (_serialIndex >= MAX_SERIAL) {
|
if (_serialIndex >= MAX_SERIAL) {
|
||||||
esp3d_log_e("Serial %d begin for %d failed, index out of range",
|
esp3d_log_e("Serial %d begin for %d failed, index out of range",
|
||||||
_serialIndex, _id);
|
_serialIndex, _id);
|
||||||
@ -164,25 +97,11 @@ bool ESP3DSerialService::begin(uint8_t serialIndex) {
|
|||||||
}
|
}
|
||||||
_lastflush = millis();
|
_lastflush = millis();
|
||||||
// read from settings
|
// read from settings
|
||||||
long br = 0;
|
uint32_t br = 0;
|
||||||
long defaultBr = 0;
|
uint32_t defaultBr = 0;
|
||||||
switch (_id) {
|
|
||||||
case MAIN_SERIAL:
|
br = ESP3DSettings::readUint32(ESP_BAUD_RATE);
|
||||||
br = ESP3DSettings::readUint32(ESP_BAUD_RATE);
|
defaultBr = ESP3DSettings::getDefaultIntegerSetting(ESP_BAUD_RATE);
|
||||||
defaultBr = ESP3DSettings::getDefaultIntegerSetting(ESP_BAUD_RATE);
|
|
||||||
break;
|
|
||||||
#if defined(ESP_SERIAL_BRIDGE_OUTPUT)
|
|
||||||
case BRIDGE_SERIAL:
|
|
||||||
br = ESP3DSettings::readUint32(ESP_SERIAL_BRIDGE_BAUD);
|
|
||||||
defaultBr =
|
|
||||||
ESP3DSettings::getDefaultIntegerSetting(ESP_SERIAL_BRIDGE_BAUD);
|
|
||||||
break;
|
|
||||||
#endif // ESP_SERIAL_BRIDGE_OUTPUT
|
|
||||||
default:
|
|
||||||
esp3d_log_e("Serial %d begin for %d failed, unknown id", _serialIndex,
|
|
||||||
_id);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
setParameters();
|
setParameters();
|
||||||
esp3d_log("Baud rate is %d , default is %d", br, defaultBr);
|
esp3d_log("Baud rate is %d , default is %d", br, defaultBr);
|
||||||
_buffer_size = 0;
|
_buffer_size = 0;
|
||||||
@ -192,36 +111,11 @@ bool ESP3DSerialService::begin(uint8_t serialIndex) {
|
|||||||
br = defaultBr;
|
br = defaultBr;
|
||||||
}
|
}
|
||||||
Serials[_serialIndex]->setRxBufferSize(SERIAL_RX_BUFFER_SIZE);
|
Serials[_serialIndex]->setRxBufferSize(SERIAL_RX_BUFFER_SIZE);
|
||||||
#ifdef ARDUINO_ARCH_ESP8266
|
|
||||||
Serials[_serialIndex]->begin(br, ESP_SERIAL_PARAM, SERIAL_FULL,
|
Serials[_serialIndex]->begin(br, ESP_SERIAL_PARAM, SERIAL_FULL,
|
||||||
(_txPin == -1) ? 1 : _txPin);
|
(_txPin == -1) ? 1 : _txPin);
|
||||||
if (_rxPin != -1) {
|
if (_rxPin != -1) {
|
||||||
Serials[_serialIndex]->pins((_txPin == -1) ? 1 : _txPin, _rxPin);
|
Serials[_serialIndex]->pins((_txPin == -1) ? 1 : _txPin, _rxPin);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // ARDUINO_ARCH_ESP8266
|
|
||||||
#if defined(ARDUINO_ARCH_ESP32)
|
|
||||||
Serials[_serialIndex]->begin(br, ESP_SERIAL_PARAM, _rxPin, _txPin);
|
|
||||||
#if defined(SERIAL_INDEPENDANT_TASK)
|
|
||||||
// create serial task once
|
|
||||||
esp3d_log("Serial %d for %d Task creation", _serialIndex, _id);
|
|
||||||
if (_hserialtask == nullptr && (_id == MAIN_SERIAL)) {
|
|
||||||
xTaskCreatePinnedToCore(
|
|
||||||
ESP3DSerialTaskfn, /* Task function. */
|
|
||||||
"ESP3D Serial Task", /* name of task. */
|
|
||||||
8192, /* Stack size of task */
|
|
||||||
&_id, /* parameter of the task = is main or bridge*/
|
|
||||||
ESP3DSERIAL_RUNNING_PRIORITY, /* priority of the task */
|
|
||||||
&_hserialtask, /* Task handle to keep track of created task */
|
|
||||||
ESP3DSERIAL_RUNNING_CORE /* Core to run the task */
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if (_hserialtask == nullptr) {
|
|
||||||
esp3d_log_e("Serial %d for %d Task creation failed", _serialIndex, _id);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
#endif // SERIAL_INDEPENDANT_TASK
|
|
||||||
#endif // ARDUINO_ARCH_ESP32
|
|
||||||
}
|
}
|
||||||
_started = true;
|
_started = true;
|
||||||
esp3d_log("Serial %d for %d is started", _serialIndex, _id);
|
esp3d_log("Serial %d for %d is started", _serialIndex, _id);
|
||||||
@ -242,13 +136,13 @@ bool ESP3DSerialService::end() {
|
|||||||
// return the array of uint32_t and array size
|
// return the array of uint32_t and array size
|
||||||
const uint32_t *ESP3DSerialService::get_baudratelist(uint8_t *count) {
|
const uint32_t *ESP3DSerialService::get_baudratelist(uint8_t *count) {
|
||||||
if (count) {
|
if (count) {
|
||||||
*count = sizeof(SupportedBaudList) / sizeof(long);
|
*count = sizeof(SupportedBaudList) / sizeof(uint32_t);
|
||||||
}
|
}
|
||||||
return SupportedBaudList;
|
return SupportedBaudList;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Function which could be called in other loop
|
// Function which could be called in other loop
|
||||||
void ESP3DSerialService::process() {
|
void ESP3DSerialService::handle() {
|
||||||
if (!_started) {
|
if (!_started) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -275,18 +169,6 @@ void ESP3DSerialService::process() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Function which could be called in other loop
|
|
||||||
void ESP3DSerialService::handle() {
|
|
||||||
// the serial bridge do not use independant task
|
|
||||||
// not sure if it is sill necessary to do it for the main serial
|
|
||||||
// TBC..
|
|
||||||
#if defined(ARDUINO_ARCH_ESP32) && defined(SERIAL_INDEPENDANT_TASK)
|
|
||||||
if (_id == MAIN_SERIAL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif // ARDUINO_ARCH_ESP32 && SERIAL_INDEPENDANT_TASK0
|
|
||||||
process();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ESP3DSerialService::flushbuffer() {
|
void ESP3DSerialService::flushbuffer() {
|
||||||
_buffer[_buffer_size] = 0x0;
|
_buffer[_buffer_size] = 0x0;
|
||||||
@ -445,28 +327,11 @@ void ESP3DSerialService::push2buffer(uint8_t *sbuf, size_t len) {
|
|||||||
// Reset Serial Setting (baud rate)
|
// Reset Serial Setting (baud rate)
|
||||||
bool ESP3DSerialService::reset() {
|
bool ESP3DSerialService::reset() {
|
||||||
esp3d_log("Reset serial");
|
esp3d_log("Reset serial");
|
||||||
bool res = false;
|
return ESP3DSettings::writeUint32(
|
||||||
switch (_id) {
|
ESP_BAUD_RATE, ESP3DSettings::getDefaultIntegerSetting(ESP_BAUD_RATE));
|
||||||
case MAIN_SERIAL:
|
|
||||||
return ESP3DSettings::writeUint32(
|
|
||||||
ESP_BAUD_RATE,
|
|
||||||
ESP3DSettings::getDefaultIntegerSetting(ESP_BAUD_RATE));
|
|
||||||
#if defined(ESP_SERIAL_BRIDGE_OUTPUT)
|
|
||||||
case BRIDGE_SERIAL:
|
|
||||||
res = ESP3DSettings::writeByte(
|
|
||||||
ESP_SERIAL_BRIDGE_ON,
|
|
||||||
ESP3DSettings::getDefaultByteSetting(ESP_SERIAL_BRIDGE_ON));
|
|
||||||
return res &&
|
|
||||||
ESP3DSettings::writeUint32(ESP_SERIAL_BRIDGE_BAUD,
|
|
||||||
ESP3DSettings::getDefaultIntegerSetting(
|
|
||||||
ESP_SERIAL_BRIDGE_BAUD));
|
|
||||||
#endif // ESP_SERIAL_BRIDGE_OUTPUT
|
|
||||||
default:
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ESP3DSerialService::updateBaudRate(long br) {
|
void ESP3DSerialService::updateBaudRate(uint32_t br) {
|
||||||
if (br != baudRate()) {
|
if (br != baudRate()) {
|
||||||
Serials[_serialIndex]->flush();
|
Serials[_serialIndex]->flush();
|
||||||
Serials[_serialIndex]->updateBaudRate(br);
|
Serials[_serialIndex]->updateBaudRate(br);
|
||||||
@ -474,19 +339,8 @@ void ESP3DSerialService::updateBaudRate(long br) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get current baud rate
|
// Get current baud rate
|
||||||
long ESP3DSerialService::baudRate() {
|
uint32_t ESP3DSerialService::baudRate() {
|
||||||
long br = 0;
|
return Serials[_serialIndex]->baudRate();
|
||||||
br = Serials[_serialIndex]->baudRate();
|
|
||||||
#ifdef ARDUINO_ARCH_ESP32
|
|
||||||
// workaround for ESP32
|
|
||||||
if (br == 115201) {
|
|
||||||
br = 115200;
|
|
||||||
}
|
|
||||||
if (br == 230423) {
|
|
||||||
br = 230400;
|
|
||||||
}
|
|
||||||
#endif // ARDUINO_ARCH_ESP32
|
|
||||||
return br;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t ESP3DSerialService::writeBytes(const uint8_t *buffer, size_t size) {
|
size_t ESP3DSerialService::writeBytes(const uint8_t *buffer, size_t size) {
|
||||||
@ -567,3 +421,4 @@ bool ESP3DSerialService::dispatch(ESP3DMessage *message) {
|
|||||||
|
|
||||||
#endif // COMMUNICATION_PROTOCOL == MKS_SERIAL || COMMUNICATION_PROTOCOL ==
|
#endif // COMMUNICATION_PROTOCOL == MKS_SERIAL || COMMUNICATION_PROTOCOL ==
|
||||||
// RAW_SERIAL
|
// RAW_SERIAL
|
||||||
|
#endif // ARDUINO_ARCH_ESP8266
|
@ -22,7 +22,9 @@
|
|||||||
#if defined(WIFI_FEATURE)
|
#if defined(WIFI_FEATURE)
|
||||||
#ifdef ARDUINO_ARCH_ESP32
|
#ifdef ARDUINO_ARCH_ESP32
|
||||||
#include <esp_wifi.h>
|
#include <esp_wifi.h>
|
||||||
|
#if ESP_ARDUINO_VERSION_MAJOR == 3
|
||||||
#include <esp_wifi_ap_get_sta_list.h>
|
#include <esp_wifi_ap_get_sta_list.h>
|
||||||
|
#endif // ESP_ARDUINO_VERSION_MAJOR == 3
|
||||||
#endif // ARDUINO_ARCH_ESP32
|
#endif // ARDUINO_ARCH_ESP32
|
||||||
#ifdef ARDUINO_ARCH_ESP8266
|
#ifdef ARDUINO_ARCH_ESP8266
|
||||||
#endif // ARDUINO_ARCH_ESP8266
|
#endif // ARDUINO_ARCH_ESP8266
|
||||||
@ -515,19 +517,30 @@ const char* WiFiConfig::getConnectedSTA(uint8_t* totalcount, bool reset) {
|
|||||||
current = 0;
|
current = 0;
|
||||||
}
|
}
|
||||||
static wifi_sta_list_t sta_list;
|
static wifi_sta_list_t sta_list;
|
||||||
|
#if ESP_ARDUINO_VERSION_MAJOR == 3
|
||||||
static wifi_sta_mac_ip_list_t tcpip_sta_list;
|
static wifi_sta_mac_ip_list_t tcpip_sta_list;
|
||||||
|
#endif // ESP_ARDUINO_VERSION_MAJOR == 3
|
||||||
|
#if ESP_ARDUINO_VERSION_MAJOR == 2
|
||||||
|
static tcpip_adapter_sta_list_t tcpip_sta_list;
|
||||||
|
#endif // ESP_ARDUINO_VERSION_MAJOR == 2
|
||||||
if (reset) {
|
if (reset) {
|
||||||
count = 0;
|
count = 0;
|
||||||
}
|
}
|
||||||
if (count == 0) {
|
if (count == 0) {
|
||||||
current = 0;
|
current = 0;
|
||||||
|
#if ESP_ARDUINO_VERSION_MAJOR == 3
|
||||||
if(esp_wifi_ap_get_sta_list(&sta_list)!=ESP_OK){
|
if(esp_wifi_ap_get_sta_list(&sta_list)!=ESP_OK){
|
||||||
|
#endif // ESP_ARDUINO_VERSION_MAJOR == 3
|
||||||
|
#if ESP_ARDUINO_VERSION_MAJOR == 2
|
||||||
|
if(tcpip_adapter_get_sta_list(&sta_list, &tcpip_sta_list)!=ESP_OK){
|
||||||
|
#endif // ESP_ARDUINO_VERSION_MAJOR == 2
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
if (sta_list.num > 0) {
|
if (sta_list.num > 0) {
|
||||||
|
#if ESP_ARDUINO_VERSION_MAJOR == 3
|
||||||
ESP_ERROR_CHECK(
|
ESP_ERROR_CHECK(
|
||||||
esp_wifi_ap_get_sta_list_with_ip(&sta_list, &tcpip_sta_list));
|
esp_wifi_ap_get_sta_list_with_ip(&sta_list, &tcpip_sta_list));
|
||||||
|
#endif // ESP_ARDUINO_VERSION_MAJOR == 3
|
||||||
}
|
}
|
||||||
count = sta_list.num;
|
count = sta_list.num;
|
||||||
}
|
}
|
||||||
|
@ -43,6 +43,8 @@ EspLuaEngine::PauseFunction EspLuaEngine::_pauseFunction = nullptr;
|
|||||||
String EspLuaEngine::_lastError;
|
String EspLuaEngine::_lastError;
|
||||||
|
|
||||||
/*Public methods*/
|
/*Public methods*/
|
||||||
|
std::atomic<bool> EspLuaEngine::_isPaused{false};
|
||||||
|
std::atomic<bool> EspLuaEngine::_isRunning{false};
|
||||||
|
|
||||||
EspLuaEngine::EspLuaEngine() : _lua_state(nullptr) {
|
EspLuaEngine::EspLuaEngine() : _lua_state(nullptr) {
|
||||||
_lua_state = luaL_newstate();
|
_lua_state = luaL_newstate();
|
||||||
|
@ -71,8 +71,8 @@ class EspLuaEngine {
|
|||||||
lua_State* _lua_state;
|
lua_State* _lua_state;
|
||||||
static PauseFunction _pauseFunction;
|
static PauseFunction _pauseFunction;
|
||||||
static String _lastError;
|
static String _lastError;
|
||||||
static inline std::atomic<bool> _isPaused{false};
|
static std::atomic<bool> _isPaused;
|
||||||
static inline std::atomic<bool> _isRunning{false};
|
static std::atomic<bool> _isRunning;
|
||||||
|
|
||||||
static void hookFunction(lua_State* L, lua_Debug* ar);
|
static void hookFunction(lua_State* L, lua_Debug* ar);
|
||||||
static void _defaultPauseFunction();
|
static void _defaultPauseFunction();
|
||||||
|
@ -16,7 +16,10 @@ libdeps_dir = .piolibdeps
|
|||||||
data_dir = esp3d/data
|
data_dir = esp3d/data
|
||||||
default_envs = esp32dev
|
default_envs = esp32dev
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[env:esp32dev]
|
[env:esp32dev]
|
||||||
|
; Arduino core 3.0.4 - IDF 5.1.4
|
||||||
platform = https://github.com/pioarduino/platform-espressif32/releases/download/51.03.04/platform-espressif32.zip
|
platform = https://github.com/pioarduino/platform-espressif32/releases/download/51.03.04/platform-espressif32.zip
|
||||||
board = esp32dev
|
board = esp32dev
|
||||||
framework = arduino
|
framework = arduino
|
||||||
@ -39,6 +42,33 @@ extra_scripts = pre:platformIO/extra_script.py
|
|||||||
lib_ignore =
|
lib_ignore =
|
||||||
TFT_eSPI
|
TFT_eSPI
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[env:esp32_4_4_7]
|
||||||
|
; Arduino core 2.0.17 - IDF 4.4.7
|
||||||
|
platform = espressif32@6.8.1
|
||||||
|
board = esp32dev
|
||||||
|
framework = arduino
|
||||||
|
monitor_speed = 115200
|
||||||
|
monitor_echo = yes
|
||||||
|
monitor_filters = send_on_enter, colorize, esp32_exception_decoder
|
||||||
|
; set frequency to 240MHz
|
||||||
|
;board_build.f_cpu = 240000000L
|
||||||
|
; set frequency to 80MHz
|
||||||
|
;board_build.f_flash = 80000000L
|
||||||
|
;board_build.flash_mode = qio
|
||||||
|
;uncomment and modify if board is not 4MB
|
||||||
|
;board_upload.flash_size = 16MB
|
||||||
|
;board_build.partitions = default_16MB.csv
|
||||||
|
; None
|
||||||
|
build_flags = -DCORE_DEBUG_LEVEL=0
|
||||||
|
board_build.partitions = min_spiffs.csv
|
||||||
|
upload_speed = 460800
|
||||||
|
extra_scripts = pre:platformIO/extra_script.py
|
||||||
|
lib_ignore =
|
||||||
|
TFT_eSPI
|
||||||
|
|
||||||
[env:esp32cam]
|
[env:esp32cam]
|
||||||
platform = https://github.com/pioarduino/platform-espressif32/releases/download/51.03.04/platform-espressif32.zip
|
platform = https://github.com/pioarduino/platform-espressif32/releases/download/51.03.04/platform-espressif32.zip
|
||||||
board = esp32dev
|
board = esp32dev
|
||||||
|
Loading…
x
Reference in New Issue
Block a user