mirror of
https://github.com/emsesp/EMS-ESP32.git
synced 2025-12-06 07:49:52 +03:00
Merge branch 'dev' of https://github.com/emsesp/EMS-ESP32 into dev
This commit is contained in:
935
interface/.yarn/releases/yarn-4.8.1.cjs
vendored
935
interface/.yarn/releases/yarn-4.8.1.cjs
vendored
File diff suppressed because one or more lines are too long
948
interface/.yarn/releases/yarn-4.9.0.cjs
vendored
Executable file
948
interface/.yarn/releases/yarn-4.9.0.cjs
vendored
Executable file
File diff suppressed because one or more lines are too long
@@ -1,3 +1,3 @@
|
||||
nodeLinker: node-modules
|
||||
|
||||
yarnPath: .yarn/releases/yarn-4.8.1.cjs
|
||||
yarnPath: .yarn/releases/yarn-4.9.0.cjs
|
||||
|
||||
@@ -62,5 +62,5 @@
|
||||
"vite-plugin-imagemin": "^0.6.1",
|
||||
"vite-tsconfig-paths": "^5.1.4"
|
||||
},
|
||||
"packageManager": "yarn@4.8.1"
|
||||
"packageManager": "yarn@4.9.0"
|
||||
}
|
||||
|
||||
@@ -2057,9 +2057,9 @@ __metadata:
|
||||
linkType: hard
|
||||
|
||||
"caniuse-lite@npm:^1.0.30001688":
|
||||
version: 1.0.30001711
|
||||
resolution: "caniuse-lite@npm:1.0.30001711"
|
||||
checksum: 10c0/1a6a5c6c586bd7a54e8fa3e54f084b3d640defa2b58a64d22fb6acf30361a4efacc24cebe37e19890a5f198e9a2f1924135c526563008c614a105ca24863399b
|
||||
version: 1.0.30001712
|
||||
resolution: "caniuse-lite@npm:1.0.30001712"
|
||||
checksum: 10c0/b3df8bdcc3335969380c2e47acb36c89bfc7f8fb4ef7ee2a5380e30ba46aa69e9d411654bc29894a06c201a1d60d490ab9b92787f3b66d7a7a38d71360e68215
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -2640,9 +2640,9 @@ __metadata:
|
||||
linkType: hard
|
||||
|
||||
"electron-to-chromium@npm:^1.5.73":
|
||||
version: 1.5.132
|
||||
resolution: "electron-to-chromium@npm:1.5.132"
|
||||
checksum: 10c0/5dcbbed2a5be4b19812d54d4beb0c09a7f753793018255690f028346f96baf8b5c77f4d231a735321bf6f69f389bdd90c045c99deac61e8ce19183788ceb4fb4
|
||||
version: 1.5.134
|
||||
resolution: "electron-to-chromium@npm:1.5.134"
|
||||
checksum: 10c0/ba0c8b3a86e139b142ce797e807f3a7b4b5708d8a550d820cc5467bf22fc62517fa9c2a38c4fec975c96f321f18918be1bcae41687f1715889a0ac6122fbfa6d
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// ArduinoJson - https://arduinojson.org
|
||||
// Copyright © 2014-2024, Benoit BLANCHON
|
||||
// Copyright © 2014-2025, Benoit BLANCHON
|
||||
// MIT License
|
||||
|
||||
#pragma once
|
||||
@@ -239,11 +239,11 @@
|
||||
#define ARDUINOJSON_BIN2ALPHA_1111() P
|
||||
#define ARDUINOJSON_BIN2ALPHA_(A, B, C, D) ARDUINOJSON_BIN2ALPHA_##A##B##C##D()
|
||||
#define ARDUINOJSON_BIN2ALPHA(A, B, C, D) ARDUINOJSON_BIN2ALPHA_(A, B, C, D)
|
||||
#define ARDUINOJSON_VERSION "7.3.0"
|
||||
#define ARDUINOJSON_VERSION "7.4.0"
|
||||
#define ARDUINOJSON_VERSION_MAJOR 7
|
||||
#define ARDUINOJSON_VERSION_MINOR 3
|
||||
#define ARDUINOJSON_VERSION_MINOR 4
|
||||
#define ARDUINOJSON_VERSION_REVISION 0
|
||||
#define ARDUINOJSON_VERSION_MACRO V730
|
||||
#define ARDUINOJSON_VERSION_MACRO V740
|
||||
#ifndef ARDUINOJSON_VERSION_NAMESPACE
|
||||
# define ARDUINOJSON_VERSION_NAMESPACE \
|
||||
ARDUINOJSON_CONCAT5( \
|
||||
@@ -1018,6 +1018,14 @@ struct StringAdapter<TChar*, enable_if_t<IsChar<TChar>::value>> {
|
||||
return AdaptedString(str, str ? ::strlen(str) : 0);
|
||||
}
|
||||
};
|
||||
template <typename TChar>
|
||||
struct StringAdapter<TChar[], enable_if_t<IsChar<TChar>::value>> {
|
||||
using AdaptedString = RamString;
|
||||
static AdaptedString adapt(const TChar* p) {
|
||||
auto str = reinterpret_cast<const char*>(p);
|
||||
return AdaptedString(str, str ? ::strlen(str) : 0);
|
||||
}
|
||||
};
|
||||
template <size_t N>
|
||||
struct StringAdapter<const char (&)[N]> {
|
||||
using AdaptedString = RamString;
|
||||
@@ -1029,8 +1037,9 @@ template <typename TChar, size_t N>
|
||||
struct StringAdapter<TChar[N], enable_if_t<IsChar<TChar>::value>> {
|
||||
using AdaptedString = RamString;
|
||||
static AdaptedString adapt(const TChar* p) {
|
||||
ARDUINOJSON_ASSERT(p);
|
||||
auto str = reinterpret_cast<const char*>(p);
|
||||
return AdaptedString(str, str ? ::strlen(str) : 0);
|
||||
return AdaptedString(str, ::strlen(str));
|
||||
}
|
||||
};
|
||||
template <typename TChar>
|
||||
@@ -2003,8 +2012,9 @@ ARDUINOJSON_END_PUBLIC_NAMESPACE
|
||||
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
|
||||
class ObjectData : public CollectionData {
|
||||
public:
|
||||
template <typename TAdaptedString> // also works with StringNode*
|
||||
template <typename TAdaptedString>
|
||||
VariantData* addMember(TAdaptedString key, ResourceManager* resources);
|
||||
VariantData* addPair(VariantData** value, ResourceManager* resources);
|
||||
template <typename TAdaptedString>
|
||||
VariantData* getOrAddMember(TAdaptedString key, ResourceManager* resources);
|
||||
template <typename TAdaptedString>
|
||||
@@ -2057,6 +2067,7 @@ enum class VariantTypeBits : uint8_t {
|
||||
};
|
||||
enum class VariantType : uint8_t {
|
||||
Null = 0, // 0000 0000
|
||||
TinyString = 0x02, // 0000 0010
|
||||
RawString = 0x03, // 0000 0011
|
||||
LinkedString = 0x04, // 0000 0100
|
||||
OwnedString = 0x05, // 0000 0101
|
||||
@@ -2077,6 +2088,7 @@ enum class VariantType : uint8_t {
|
||||
inline bool operator&(VariantType type, VariantTypeBits bit) {
|
||||
return (uint8_t(type) & uint8_t(bit)) != 0;
|
||||
}
|
||||
const size_t tinyStringMaxLength = 3;
|
||||
union VariantContent {
|
||||
VariantContent() {}
|
||||
float asFloat;
|
||||
@@ -2091,6 +2103,7 @@ union VariantContent {
|
||||
CollectionData asCollection;
|
||||
const char* asLinkedString;
|
||||
struct StringNode* asOwnedString;
|
||||
char asTinyString[tinyStringMaxLength + 1];
|
||||
};
|
||||
#if ARDUINOJSON_USE_EXTENSIONS
|
||||
union VariantExtension {
|
||||
@@ -2105,6 +2118,15 @@ union VariantExtension {
|
||||
#endif
|
||||
template <typename T>
|
||||
T parseNumber(const char* s);
|
||||
template <typename T>
|
||||
static bool isTinyString(const T& s, size_t n) {
|
||||
if (n > tinyStringMaxLength)
|
||||
return false;
|
||||
bool containsNul = false;
|
||||
for (uint8_t i = 0; i < uint8_t(n); i++)
|
||||
containsNul |= !s[i];
|
||||
return !containsNul;
|
||||
}
|
||||
class VariantData {
|
||||
VariantContent content_; // must be first to allow cast from array to variant
|
||||
VariantType type_;
|
||||
@@ -2140,6 +2162,8 @@ class VariantData {
|
||||
return visit.visit(content_.asArray);
|
||||
case VariantType::Object:
|
||||
return visit.visit(content_.asObject);
|
||||
case VariantType::TinyString:
|
||||
return visit.visit(JsonString(content_.asTinyString));
|
||||
case VariantType::LinkedString:
|
||||
return visit.visit(JsonString(content_.asLinkedString, true));
|
||||
case VariantType::OwnedString:
|
||||
@@ -2243,6 +2267,7 @@ class VariantData {
|
||||
#else
|
||||
(void)resources; // silence warning
|
||||
#endif
|
||||
const char* str = nullptr;
|
||||
switch (type_) {
|
||||
case VariantType::Boolean:
|
||||
return static_cast<T>(content_.asBoolean);
|
||||
@@ -2256,9 +2281,15 @@ class VariantData {
|
||||
case VariantType::Int64:
|
||||
return static_cast<T>(extension->asInt64);
|
||||
#endif
|
||||
case VariantType::TinyString:
|
||||
str = content_.asTinyString;
|
||||
break;
|
||||
case VariantType::LinkedString:
|
||||
str = content_.asLinkedString;
|
||||
break;
|
||||
case VariantType::OwnedString:
|
||||
return parseNumber<T>(content_.asOwnedString->data);
|
||||
str = content_.asOwnedString->data;
|
||||
break;
|
||||
case VariantType::Float:
|
||||
return static_cast<T>(content_.asFloat);
|
||||
#if ARDUINOJSON_USE_DOUBLE
|
||||
@@ -2266,8 +2297,10 @@ class VariantData {
|
||||
return static_cast<T>(extension->asDouble);
|
||||
#endif
|
||||
default:
|
||||
return 0;
|
||||
return 0.0;
|
||||
}
|
||||
ARDUINOJSON_ASSERT(str != nullptr);
|
||||
return parseNumber<T>(str);
|
||||
}
|
||||
template <typename T>
|
||||
T asIntegral(const ResourceManager* resources) const {
|
||||
@@ -2277,6 +2310,7 @@ class VariantData {
|
||||
#else
|
||||
(void)resources; // silence warning
|
||||
#endif
|
||||
const char* str = nullptr;
|
||||
switch (type_) {
|
||||
case VariantType::Boolean:
|
||||
return content_.asBoolean;
|
||||
@@ -2290,10 +2324,15 @@ class VariantData {
|
||||
case VariantType::Int64:
|
||||
return convertNumber<T>(extension->asInt64);
|
||||
#endif
|
||||
case VariantType::TinyString:
|
||||
str = content_.asTinyString;
|
||||
break;
|
||||
case VariantType::LinkedString:
|
||||
return parseNumber<T>(content_.asLinkedString);
|
||||
str = content_.asLinkedString;
|
||||
break;
|
||||
case VariantType::OwnedString:
|
||||
return parseNumber<T>(content_.asOwnedString->data);
|
||||
str = content_.asOwnedString->data;
|
||||
break;
|
||||
case VariantType::Float:
|
||||
return convertNumber<T>(content_.asFloat);
|
||||
#if ARDUINOJSON_USE_DOUBLE
|
||||
@@ -2303,6 +2342,8 @@ class VariantData {
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
ARDUINOJSON_ASSERT(str != nullptr);
|
||||
return parseNumber<T>(str);
|
||||
}
|
||||
ObjectData* asObject() {
|
||||
return isObject() ? &content_.asObject : 0;
|
||||
@@ -2321,6 +2362,8 @@ class VariantData {
|
||||
}
|
||||
JsonString asString() const {
|
||||
switch (type_) {
|
||||
case VariantType::TinyString:
|
||||
return JsonString(content_.asTinyString);
|
||||
case VariantType::LinkedString:
|
||||
return JsonString(content_.asLinkedString, true);
|
||||
case VariantType::OwnedString:
|
||||
@@ -2415,7 +2458,8 @@ class VariantData {
|
||||
}
|
||||
bool isString() const {
|
||||
return type_ == VariantType::LinkedString ||
|
||||
type_ == VariantType::OwnedString;
|
||||
type_ == VariantType::OwnedString ||
|
||||
type_ == VariantType::TinyString;
|
||||
}
|
||||
size_t nesting(const ResourceManager* resources) const {
|
||||
auto collection = asCollection();
|
||||
@@ -2450,7 +2494,7 @@ class VariantData {
|
||||
return;
|
||||
var->removeMember(key, resources);
|
||||
}
|
||||
void reset() {
|
||||
void reset() { // TODO: remove
|
||||
type_ = VariantType::Null;
|
||||
}
|
||||
void setBoolean(bool value) {
|
||||
@@ -2491,10 +2535,6 @@ class VariantData {
|
||||
}
|
||||
template <typename TAdaptedString>
|
||||
bool setString(TAdaptedString value, ResourceManager* resources);
|
||||
bool setString(StringNode* s, ResourceManager*) {
|
||||
setOwnedString(s);
|
||||
return true;
|
||||
}
|
||||
template <typename TAdaptedString>
|
||||
static void setString(VariantData* var, TAdaptedString value,
|
||||
ResourceManager* resources) {
|
||||
@@ -2509,6 +2549,14 @@ class VariantData {
|
||||
type_ = VariantType::LinkedString;
|
||||
content_.asLinkedString = s;
|
||||
}
|
||||
void setTinyString(const char* s, uint8_t n) {
|
||||
ARDUINOJSON_ASSERT(type_ == VariantType::Null); // must call clear() first
|
||||
ARDUINOJSON_ASSERT(s);
|
||||
type_ = VariantType::TinyString;
|
||||
for (uint8_t i = 0; i < n; i++)
|
||||
content_.asTinyString[i] = s[i];
|
||||
content_.asTinyString[n] = 0;
|
||||
}
|
||||
void setOwnedString(StringNode* s) {
|
||||
ARDUINOJSON_ASSERT(type_ == VariantType::Null); // must call clear() first
|
||||
ARDUINOJSON_ASSERT(s);
|
||||
@@ -4313,7 +4361,7 @@ template <typename T, typename Enable = void>
|
||||
struct Comparer;
|
||||
template <typename T>
|
||||
struct Comparer<T, enable_if_t<IsString<T>::value>> : ComparerBase {
|
||||
T rhs;
|
||||
T rhs; // TODO: store adapted string?
|
||||
explicit Comparer(T value) : rhs(value) {}
|
||||
CompareResult visit(JsonString lhs) {
|
||||
int i = stringCompare(adaptString(rhs), adaptString(lhs));
|
||||
@@ -4812,6 +4860,18 @@ inline VariantData* ObjectData::addMember(TAdaptedString key,
|
||||
CollectionData::appendPair(keySlot, valueSlot, resources);
|
||||
return valueSlot.ptr();
|
||||
}
|
||||
inline VariantData* ObjectData::addPair(VariantData** value,
|
||||
ResourceManager* resources) {
|
||||
auto keySlot = resources->allocVariant();
|
||||
if (!keySlot)
|
||||
return nullptr;
|
||||
auto valueSlot = resources->allocVariant();
|
||||
if (!valueSlot)
|
||||
return nullptr;
|
||||
*value = valueSlot.ptr();
|
||||
CollectionData::appendPair(keySlot, valueSlot, resources);
|
||||
return keySlot.ptr();
|
||||
}
|
||||
constexpr size_t sizeofObject(size_t n) {
|
||||
return 2 * n * ResourceManager::slotSize;
|
||||
}
|
||||
@@ -5358,10 +5418,16 @@ class StringBuilder {
|
||||
if (!node_)
|
||||
node_ = resources_->createString(initialCapacity);
|
||||
}
|
||||
StringNode* save() {
|
||||
void save(VariantData* variant) {
|
||||
ARDUINOJSON_ASSERT(variant != nullptr);
|
||||
ARDUINOJSON_ASSERT(node_ != nullptr);
|
||||
node_->data[size_] = 0;
|
||||
StringNode* node = resources_->getString(adaptString(node_->data, size_));
|
||||
char* p = node_->data;
|
||||
if (isTinyString(p, size_)) {
|
||||
variant->setTinyString(p, static_cast<uint8_t>(size_));
|
||||
return;
|
||||
}
|
||||
p[size_] = 0;
|
||||
StringNode* node = resources_->getString(adaptString(p, size_));
|
||||
if (!node) {
|
||||
node = resources_->resizeString(node_, size_);
|
||||
ARDUINOJSON_ASSERT(node != nullptr); // realloc to smaller can't fail
|
||||
@@ -5370,14 +5436,14 @@ class StringBuilder {
|
||||
} else {
|
||||
node->references++;
|
||||
}
|
||||
return node;
|
||||
variant->setOwnedString(node);
|
||||
}
|
||||
void append(const char* s) {
|
||||
while (*s)
|
||||
append(*s++);
|
||||
}
|
||||
void append(const char* s, size_t n) {
|
||||
while (n-- > 0)
|
||||
while (n-- > 0) // TODO: memcpy
|
||||
append(*s++);
|
||||
}
|
||||
void append(char c) {
|
||||
@@ -5583,9 +5649,9 @@ class StringBuilderPrint : public Print {
|
||||
StringBuilderPrint(ResourceManager* resources) : copier_(resources) {
|
||||
copier_.startString();
|
||||
}
|
||||
StringNode* save() {
|
||||
void save(VariantData* data) {
|
||||
ARDUINOJSON_ASSERT(!overflowed());
|
||||
return copier_.save();
|
||||
copier_.save(data);
|
||||
}
|
||||
size_t write(uint8_t c) {
|
||||
copier_.append(char(c));
|
||||
@@ -5616,7 +5682,7 @@ inline void convertToJson(const ::Printable& src, JsonVariant dst) {
|
||||
src.printTo(print);
|
||||
if (print.overflowed())
|
||||
return;
|
||||
data->setOwnedString(print.save());
|
||||
print.save(data);
|
||||
}
|
||||
#endif
|
||||
#if ARDUINOJSON_ENABLE_ARDUINO_STRING
|
||||
@@ -5762,6 +5828,10 @@ inline bool VariantData::setString(TAdaptedString value,
|
||||
setLinkedString(value.data());
|
||||
return true;
|
||||
}
|
||||
if (isTinyString(value, value.size())) {
|
||||
setTinyString(value.data(), uint8_t(value.size()));
|
||||
return true;
|
||||
}
|
||||
auto dup = resources->saveString(value);
|
||||
if (dup) {
|
||||
setOwnedString(dup);
|
||||
@@ -6883,10 +6953,10 @@ class JsonDeserializer {
|
||||
if (memberFilter.allow()) {
|
||||
auto member = object.getMember(adaptString(key), resources_);
|
||||
if (!member) {
|
||||
auto savedKey = stringBuilder_.save();
|
||||
member = object.addMember(savedKey, resources_);
|
||||
if (!member)
|
||||
auto keyVariant = object.addPair(&member, resources_);
|
||||
if (!keyVariant)
|
||||
return DeserializationError::NoMemory;
|
||||
stringBuilder_.save(keyVariant);
|
||||
} else {
|
||||
member->clear(resources_);
|
||||
}
|
||||
@@ -6960,7 +7030,7 @@ class JsonDeserializer {
|
||||
err = parseQuotedString();
|
||||
if (err)
|
||||
return err;
|
||||
variant.setOwnedString(stringBuilder_.save());
|
||||
stringBuilder_.save(&variant);
|
||||
return DeserializationError::Ok;
|
||||
}
|
||||
DeserializationError::Code parseQuotedString() {
|
||||
@@ -7412,7 +7482,23 @@ class StringBuffer {
|
||||
node_->data[capacity] = 0; // null-terminate the string
|
||||
return node_->data;
|
||||
}
|
||||
StringNode* save() {
|
||||
JsonString str() const {
|
||||
ARDUINOJSON_ASSERT(node_ != nullptr);
|
||||
return JsonString(node_->data, node_->length);
|
||||
}
|
||||
void save(VariantData* data) {
|
||||
ARDUINOJSON_ASSERT(node_ != nullptr);
|
||||
const char* s = node_->data;
|
||||
if (isTinyString(s, size_))
|
||||
data->setTinyString(s, static_cast<uint8_t>(size_));
|
||||
else
|
||||
data->setOwnedString(commitStringNode());
|
||||
}
|
||||
void saveRaw(VariantData* data) {
|
||||
data->setRawString(commitStringNode());
|
||||
}
|
||||
private:
|
||||
StringNode* commitStringNode() {
|
||||
ARDUINOJSON_ASSERT(node_ != nullptr);
|
||||
node_->data[size_] = 0;
|
||||
auto node = resources_->getString(adaptString(node_->data, size_));
|
||||
@@ -7430,11 +7516,6 @@ class StringBuffer {
|
||||
resources_->saveString(node);
|
||||
return node;
|
||||
}
|
||||
JsonString str() const {
|
||||
ARDUINOJSON_ASSERT(node_ != nullptr);
|
||||
return JsonString(node_->data, node_->length);
|
||||
}
|
||||
private:
|
||||
ResourceManager* resources_;
|
||||
StringNode* node_ = nullptr;
|
||||
size_t size_ = 0;
|
||||
@@ -7704,7 +7785,7 @@ class MsgPackDeserializer {
|
||||
err = readString(n);
|
||||
if (err)
|
||||
return err;
|
||||
variant->setOwnedString(stringBuffer_.save());
|
||||
stringBuffer_.save(variant);
|
||||
return DeserializationError::Ok;
|
||||
}
|
||||
DeserializationError::Code readString(size_t n) {
|
||||
@@ -7726,7 +7807,7 @@ class MsgPackDeserializer {
|
||||
auto err = readBytes(p + headerSize, n);
|
||||
if (err)
|
||||
return err;
|
||||
variant->setRawString(stringBuffer_.save());
|
||||
stringBuffer_.saveRaw(variant);
|
||||
return DeserializationError::Ok;
|
||||
}
|
||||
template <typename TFilter>
|
||||
@@ -7781,15 +7862,13 @@ class MsgPackDeserializer {
|
||||
return err;
|
||||
JsonString key = stringBuffer_.str();
|
||||
TFilter memberFilter = filter[key.c_str()];
|
||||
VariantData* member;
|
||||
VariantData* member = 0;
|
||||
if (memberFilter.allow()) {
|
||||
ARDUINOJSON_ASSERT(object != 0);
|
||||
auto savedKey = stringBuffer_.save();
|
||||
member = object->addMember(savedKey, resources_);
|
||||
if (!member)
|
||||
auto keyVariant = object->addPair(&member, resources_);
|
||||
if (!keyVariant)
|
||||
return DeserializationError::NoMemory;
|
||||
} else {
|
||||
member = 0;
|
||||
stringBuffer_.save(keyVariant);
|
||||
}
|
||||
err = parseVariant(member, memberFilter, nestingLimit.decrement());
|
||||
if (err)
|
||||
|
||||
935
mock-api/.yarn/releases/yarn-4.8.1.cjs
vendored
935
mock-api/.yarn/releases/yarn-4.8.1.cjs
vendored
File diff suppressed because one or more lines are too long
948
mock-api/.yarn/releases/yarn-4.9.0.cjs
vendored
Executable file
948
mock-api/.yarn/releases/yarn-4.9.0.cjs
vendored
Executable file
File diff suppressed because one or more lines are too long
@@ -1,3 +1,3 @@
|
||||
nodeLinker: node-modules
|
||||
|
||||
yarnPath: .yarn/releases/yarn-4.8.1.cjs
|
||||
yarnPath: .yarn/releases/yarn-4.9.0.cjs
|
||||
|
||||
@@ -15,5 +15,5 @@
|
||||
"itty-router": "^5.0.18",
|
||||
"prettier": "^3.5.3"
|
||||
},
|
||||
"packageManager": "yarn@4.8.1"
|
||||
"packageManager": "yarn@4.9.0"
|
||||
}
|
||||
|
||||
@@ -100,10 +100,10 @@ monitor_filters = direct
|
||||
build_type = release
|
||||
board_build.filesystem = littlefs
|
||||
lib_deps =
|
||||
bblanchon/ArduinoJson @ 7.3.1
|
||||
bblanchon/ArduinoJson @ 7.4.0
|
||||
ESP32Async/AsyncTCP @ 3.3.8
|
||||
ESP32Async/ESPAsyncWebServer @ 3.7.6
|
||||
https://github.com/emsesp/EMS-ESP-Modules.git @ 1.0.5
|
||||
https://github.com/emsesp/EMS-ESP-Modules.git @ 1.0.6
|
||||
|
||||
;
|
||||
; Builds for different board types
|
||||
|
||||
Reference in New Issue
Block a user