Skip to content

Commit 16b21f7

Browse files
committed
config: Fix fillArray
Allow using fillArray with tuples as source.
1 parent 79d34c4 commit 16b21f7

File tree

2 files changed

+49
-23
lines changed

2 files changed

+49
-23
lines changed

software/src/config.cpp

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -789,22 +789,37 @@ inline bool Config::update_value<float, Config::ConfFloat>(float val, const char
789789
template<>
790790
inline size_t Config::fillArray<float, Config::ConfFloat>(float *arr, size_t elements) {
791791
// Asserts checked in ::is.
792-
if (!this->is<ConfArray>()) {
793-
esp_system_abort("Can't fill array, Config is not an array");
792+
if (this->is<ConfArray>()) {
793+
const ConfArray &confArr = this->value.val.a;
794+
const size_t toWrite = std::min(confArr.getVal()->size(), elements);
795+
796+
for (size_t i = 0; i < toWrite; ++i) {
797+
const Config *entry = confArr.get(i);
798+
if (!entry->is<Config::ConfFloat>()) {
799+
esp_system_abort("Config entry has wrong type.");
800+
}
801+
arr[i] = entry->get<Config::ConfFloat>()->getVal();
802+
}
803+
804+
return toWrite;
794805
}
795806

796-
const ConfArray &confArr = this->value.val.a;
797-
size_t toWrite = std::min(confArr.getVal()->size(), elements);
807+
if (this->is<ConfTuple>()) {
808+
const ConfTuple &confTuple = this->value.val.t;
809+
const size_t toWrite = std::min(confTuple.getSize(), elements);
798810

799-
for (size_t i = 0; i < toWrite; ++i) {
800-
const Config *entry = confArr.get(i);
801-
if (!entry->is<Config::ConfFloat>()) {
802-
esp_system_abort("Config entry has wrong type.");
811+
for (size_t i = 0; i < toWrite; ++i) {
812+
const Config *entry = confTuple.get(i);
813+
if (!entry->is<Config::ConfFloat>()) {
814+
esp_system_abort("Config entry has wrong type.");
815+
}
816+
arr[i] = entry->get<Config::ConfFloat>()->getVal();
803817
}
804-
arr[i] = entry->get<Config::ConfFloat>()->getVal();
818+
819+
return toWrite;
805820
}
806821

807-
return toWrite;
822+
esp_system_abort("Can't fill array, Config is not an array or tuple");
808823
}
809824

810825
bool Config::updateString(const String &val)
@@ -890,37 +905,37 @@ size_t Config::fillFloatArray(float *arr, size_t elements)
890905
size_t Config::fillUint8Array(uint8_t *arr, size_t elements)
891906
{
892907
// Asserts checked in ::fillArray.
893-
return fillArray<uint8_t, Config::ConfUint>(arr, elements);
908+
return fillArray<uint8_t, Config::ConfUint8>(arr, elements);
894909
}
895910

896911
size_t Config::fillInt8Array(int8_t *arr, size_t elements)
897912
{
898913
// Asserts checked in ::fillArray.
899-
return fillArray<int8_t, Config::ConfInt>(arr, elements);
914+
return fillArray<int8_t, Config::ConfInt8>(arr, elements);
900915
}
901916

902917
size_t Config::fillUint16Array(uint16_t *arr, size_t elements)
903918
{
904919
// Asserts checked in ::fillArray.
905-
return fillArray<uint16_t, Config::ConfUint>(arr, elements);
920+
return fillArray<uint16_t, Config::ConfUint16>(arr, elements);
906921
}
907922

908923
size_t Config::fillInt16Array(int16_t *arr, size_t elements)
909924
{
910925
// Asserts checked in ::fillArray.
911-
return fillArray<int16_t, Config::ConfInt>(arr, elements);
926+
return fillArray<int16_t, Config::ConfInt16>(arr, elements);
912927
}
913928

914929
size_t Config::fillUint32Array(uint32_t *arr, size_t elements)
915930
{
916931
// Asserts checked in ::fillArray.
917-
return fillArray<uint32_t, Config::ConfUint>(arr, elements);
932+
return fillArray<uint32_t, Config::ConfUint32>(arr, elements);
918933
}
919934

920935
size_t Config::fillInt32Array(int32_t *arr, size_t elements)
921936
{
922937
// Asserts checked in ::fillArray.
923-
return fillArray<int32_t, Config::ConfInt>(arr, elements);
938+
return fillArray<int32_t, Config::ConfInt32>(arr, elements);
924939
}
925940

926941
size_t Config::json_size(bool zero_copy) const

software/src/config.h

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1130,18 +1130,29 @@ struct Config {
11301130
template<typename T, typename ConfigT>
11311131
size_t fillArray(T *arr, size_t elements) {
11321132
// Asserts checked in ::is.
1133-
if (!this->is<ConfArray>()) {
1134-
esp_system_abort("Can't fill array, Config is not an array");
1133+
if (this->is<ConfArray>()) {
1134+
const ConfArray &confArr = this->value.val.a;
1135+
const size_t toWrite = std::min(confArr.getVal()->size(), elements);
1136+
1137+
for (size_t i = 0; i < toWrite; ++i) {
1138+
arr[i] = *confArr.get(i)->get<ConfigT>()->getVal();
1139+
}
1140+
1141+
return toWrite;
11351142
}
11361143

1137-
const ConfArray &confArr = this->value.val.a;
1138-
size_t toWrite = std::min(confArr.getVal()->size(), elements);
1144+
if (this->is<ConfTuple>()) {
1145+
const ConfTuple &confTuple = this->value.val.t;
1146+
const size_t toWrite = std::min(confTuple.getSize(), elements);
1147+
1148+
for (size_t i = 0; i < toWrite; ++i) {
1149+
arr[i] = *confTuple.get(i)->get<ConfigT>()->getVal();
1150+
}
11391151

1140-
for (size_t i = 0; i < toWrite; ++i) {
1141-
arr[i] = *confArr.get(i)->get<ConfigT>()->getVal();
1152+
return toWrite;
11421153
}
11431154

1144-
return toWrite;
1155+
esp_system_abort("Can't fill array, Config is not an array or tuple");
11451156
}
11461157

11471158
DynamicJsonDocument to_json(const char *const *keys_to_censor, size_t keys_to_censor_len) const;

0 commit comments

Comments
 (0)