Skip to content

Commit 30faad3

Browse files
authored
Move wipe_devices lambda string dispatch to C++ to save ESP8266 RAM (#554)
1 parent 26cb798 commit 30faad3

File tree

2 files changed

+25
-11
lines changed

2 files changed

+25
-11
lines changed

base.yaml

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -42,17 +42,7 @@ api:
4242
devices_to_wipe: string
4343
then:
4444
- lambda: !lambda |-
45-
if(devices_to_wipe.compare("all") == 0) {
46-
id($id_prefix).clear_paired_devices(ratgdo::PairedDevice::ALL);
47-
} else if (devices_to_wipe.compare("remote") == 0) {
48-
id($id_prefix).clear_paired_devices(ratgdo::PairedDevice::REMOTE);
49-
} else if (devices_to_wipe.compare("keypad") == 0) {
50-
id($id_prefix).clear_paired_devices(ratgdo::PairedDevice::KEYPAD);
51-
} else if (devices_to_wipe.compare("wall") == 0) {
52-
id($id_prefix).clear_paired_devices(ratgdo::PairedDevice::WALL_CONTROL);
53-
} else if (devices_to_wipe.compare("accessory") == 0) {
54-
id($id_prefix).clear_paired_devices(ratgdo::PairedDevice::ACCESSORY);
55-
}
45+
id($id_prefix).clear_paired_devices(devices_to_wipe);
5646
5747
ota:
5848
- platform: esphome

components/ratgdo/ratgdo.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,30 @@ namespace ratgdo {
182182
void query_paired_devices(PairedDevice kind);
183183
void clear_paired_devices(PairedDevice kind);
184184

185+
// Uses length + first character instead of string comparisons to avoid
186+
// string literals in RODATA which consume RAM on ESP8266.
187+
// Valid values: "all" (3,a), "remote" (6,r), "keypad" (6,k), "wall" (4,w), "accessory" (9,a)
188+
// Template so it works with std::string, StringRef, or any type with length() and operator[].
189+
template <typename StringT>
190+
void clear_paired_devices(const StringT& kind)
191+
{
192+
PairedDevice device;
193+
if (kind.length() == 3 && kind[0] == 'a') {
194+
device = PairedDevice::ALL;
195+
} else if (kind.length() == 6 && kind[0] == 'r') {
196+
device = PairedDevice::REMOTE;
197+
} else if (kind.length() == 6 && kind[0] == 'k') {
198+
device = PairedDevice::KEYPAD;
199+
} else if (kind.length() == 4 && kind[0] == 'w') {
200+
device = PairedDevice::WALL_CONTROL;
201+
} else if (kind.length() == 9 && kind[0] == 'a') {
202+
device = PairedDevice::ACCESSORY;
203+
} else {
204+
return;
205+
}
206+
this->clear_paired_devices(device);
207+
}
208+
185209
// button functionality
186210
void query_status();
187211
void query_openings();

0 commit comments

Comments
 (0)