Skip to content

Commit dc2de23

Browse files
committed
UserModManager - use vectors to remove need for nullptr checks
1 parent 24ec249 commit dc2de23

File tree

3 files changed

+32
-34
lines changed

3 files changed

+32
-34
lines changed

wled00/fcn_declare.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ const unsigned int um_data_size = sizeof(um_data_t); // 12 bytes
380380
class Usermod {
381381
protected:
382382
um_data_t *um_data; // um_data should be allocated using new in (derived) Usermod's setup() or constructor
383-
bool enabled = true; // maintain compatibility for usermods that don't use this
383+
bool enabled = false;
384384
const char *_name;
385385

386386
public:
@@ -436,7 +436,6 @@ class Usermod {
436436
};
437437

438438
namespace UsermodManager {
439-
extern byte numMods;
440439
void loop();
441440
void handleOverlayDraw();
442441
bool handleButton(uint8_t b);
@@ -460,7 +459,7 @@ namespace UsermodManager {
460459
void onStateChange(uint8_t);
461460
bool add(Usermod* um);
462461
Usermod* lookup(uint16_t mod_id);
463-
inline byte getModCount() {return numMods;};
462+
byte getModCount();
464463
};
465464

466465
//usermods_list.cpp

wled00/set.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -750,6 +750,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
750750
DEBUG_PRINTF_P(PSTR(" = %s\n"), value.c_str());
751751
}
752752
}
753+
DEBUG_PRINTLN(F("Re-init UsermodManager::"));
753754
UsermodManager::readFromConfig(um); // force change of usermod parameters
754755
DEBUG_PRINTLN(F("Done re-init UsermodManager::"));
755756
releaseJSONBufferLock();

wled00/um_manager.cpp

Lines changed: 29 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,19 @@
33
* Registration and management utility for v2 usermods
44
*/
55

6-
static Usermod* ums[WLED_MAX_USERMODS] = {nullptr};
7-
byte UsermodManager::numMods = 0;
8-
static Usermod* umsEnabled[WLED_MAX_USERMODS] = {nullptr};
6+
static std::vector<Usermod*> ums;
7+
static std::vector<Usermod*> umsEnabled;
98

109
//Usermod Manager internals
11-
void UsermodManager::setup() { for (Usermod* um : umsEnabled) if(um) if(um) { um->setup(); } }
12-
void UsermodManager::connected() { for (Usermod* um : umsEnabled) if(um) { um->connected(); } }
13-
void UsermodManager::loop() { for (Usermod* um : umsEnabled) if(um) { um->loop(); } }
14-
void UsermodManager::handleOverlayDraw() { for (Usermod* um : umsEnabled) if(um) { um->handleOverlayDraw(); } }
15-
void UsermodManager::appendConfigData(Print& dest) { for (Usermod* um : ums) if(um) { um->appendConfigData(dest); } }
10+
void UsermodManager::setup() { for (Usermod* um : umsEnabled) um->setup(); }
11+
void UsermodManager::connected() { for (Usermod* um : umsEnabled) um->connected(); }
12+
void UsermodManager::loop() { for (Usermod* um : umsEnabled) um->loop(); }
13+
void UsermodManager::handleOverlayDraw() { for (Usermod* um : umsEnabled) um->handleOverlayDraw(); }
14+
void UsermodManager::appendConfigData(Print& dest) { for (Usermod* um : ums) um->appendConfigData(dest); }
1615
bool UsermodManager::handleButton(uint8_t b) {
1716
bool overrideIO = false;
18-
for (unsigned i = 0; i < numMods; i++) {
19-
if (ums[i]->handleButton(b)) overrideIO = true;
17+
for (Usermod* um : umsEnabled) {
18+
if (um->handleButton(b)) overrideIO = true;
2019
}
2120
return overrideIO;
2221
}
@@ -27,58 +26,57 @@ bool UsermodManager::getUMData(um_data_t **data, uint8_t mod_id) {
2726
}
2827
return false;
2928
}
30-
void UsermodManager::addToJsonState(JsonObject& obj) { for (Usermod* um : umsEnabled) if(um) { um->addToJsonState(obj); } }
31-
void UsermodManager::addToJsonInfo(JsonObject& obj) { for (Usermod* um : ums) if(um) { um->addToJsonInfo(obj); } }
32-
void UsermodManager::readFromJsonState(JsonObject& obj) { for (Usermod* um : umsEnabled) if(um) { um->readFromJsonState(obj); } }
33-
void UsermodManager::addToConfig(JsonObject& obj) { for (Usermod* um : ums) if(um) { um->addToConfig(obj); } }
29+
void UsermodManager::addToJsonState(JsonObject& obj) { for (Usermod* um : umsEnabled) um->addToJsonState(obj); }
30+
void UsermodManager::addToJsonInfo(JsonObject& obj) { for (Usermod* um : ums) um->addToJsonInfo(obj); }
31+
void UsermodManager::readFromJsonState(JsonObject& obj) { for (Usermod* um : umsEnabled) um->readFromJsonState(obj); }
32+
void UsermodManager::addToConfig(JsonObject& obj) { for (Usermod* um : ums) um->addToConfig(obj); }
3433
bool UsermodManager::readFromConfig(JsonObject& obj) {
3534
bool allComplete = true;
36-
for (unsigned i = 0; i < numMods; i++) {
37-
if (!ums[i]->readFromConfig(obj)) allComplete = false;
38-
if(!ums[i]->isEnabled()) {
39-
umsEnabled[i] = ums[i];
40-
}
41-
else {
42-
umsEnabled[i] = nullptr;
35+
umsEnabled.clear();
36+
for (Usermod* um : ums) {
37+
if (!um->readFromConfig(obj)) allComplete = false;
38+
if(!um->isEnabled()) {
39+
umsEnabled.push_back(um);
4340
}
4441
}
4542
return allComplete;
4643
}
4744
#ifndef WLED_DISABLE_MQTT
48-
void UsermodManager::onMqttConnect(bool sessionPresent) { for (Usermod* um : umsEnabled) if(um) { um->onMqttConnect(sessionPresent); } }
45+
void UsermodManager::onMqttConnect(bool sessionPresent) { for (Usermod* um : umsEnabled) um->onMqttConnect(sessionPresent); }
4946
bool UsermodManager::onMqttMessage(char* topic, char* payload) {
50-
for (Usermod* um : umsEnabled) if (um && um->onMqttMessage(topic, payload)) return true;
47+
for (Usermod* um : umsEnabled) if (um->onMqttMessage(topic, payload)) return true;
5148
return false;
5249
}
5350
#endif
5451
#ifndef WLED_DISABLE_ESPNOW
5552
bool UsermodManager::onEspNowMessage(uint8_t* sender, uint8_t* payload, uint8_t len) {
56-
for (Usermod* um : umsEnabled) if (um && um->onEspNowMessage(sender, payload, len)) return true;
53+
for (Usermod* um : umsEnabled) if (um->onEspNowMessage(sender, payload, len)) return true;
5754
return false;
5855
}
5956
#endif
60-
void UsermodManager::onUpdateBegin(bool init) { for (Usermod* um : umsEnabled) if(um) { um->onUpdateBegin(init); } } // notify usermods that update is to begin
61-
void UsermodManager::onStateChange(uint8_t mode) { for (Usermod* um : umsEnabled) if(um) { um->onStateChange(mode); } } // notify usermods that WLED state changed
57+
void UsermodManager::onUpdateBegin(bool init) { for (Usermod* um : umsEnabled) um->onUpdateBegin(init); } // notify usermods that update is to begin
58+
void UsermodManager::onStateChange(uint8_t mode) { for (Usermod* um : umsEnabled) um->onStateChange(mode); } // notify usermods that WLED state changed
6259

6360
/*
6461
* Enables usermods to lookup another Usermod.
6562
*/
6663
Usermod* UsermodManager::lookup(uint16_t mod_id) {
67-
for (unsigned i = 0; i < numMods; i++) {
68-
if (ums[i]->getId() == mod_id) {
69-
return ums[i];
64+
for (Usermod* um : ums) {
65+
if (um->getId() == mod_id) {
66+
return um;
7067
}
7168
}
7269
return nullptr;
7370
}
7471

7572
bool UsermodManager::add(Usermod* um)
7673
{
77-
if (numMods >= WLED_MAX_USERMODS || um == nullptr) return false;
78-
ums[numMods++] = um;
74+
if (ums.size() >= WLED_MAX_USERMODS || um == nullptr) return false;
75+
ums.push_back(um);
7976
return true;
8077
}
8178

79+
byte UsermodManager::getModCount() { return ums.size(); }
8280

8381
/* Usermod v2 interface shim for oappend */
8482
Print* Usermod::oappend_shim = nullptr;

0 commit comments

Comments
 (0)