Skip to content

Commit c0737f5

Browse files
Fixed memory leaks in rainmaker examples (#7965)
* task: Added Rainmaker partition to esp32 wrover and s3 box * fix: memory leaks in rainmaker examples * Rainmaker: Improved error log messages * task: format Rainmaker examples
1 parent 8ebf758 commit c0737f5

File tree

6 files changed

+252
-195
lines changed

6 files changed

+252
-195
lines changed

Diff for: boards.txt

+9
Original file line numberDiff line numberDiff line change
@@ -1012,6 +1012,9 @@ esp32wrover.menu.PartitionScheme.min_spiffs.build.partitions=min_spiffs
10121012
esp32wrover.menu.PartitionScheme.min_spiffs.upload.maximum_size=1966080
10131013
esp32wrover.menu.PartitionScheme.fatflash=16M Flash (2MB APP/12.5MB FATFS)
10141014
esp32wrover.menu.PartitionScheme.fatflash.build.partitions=ffat
1015+
esp32wrover.menu.PartitionScheme.rainmaker=RainMaker
1016+
esp32wrover.menu.PartitionScheme.rainmaker.build.partitions=rainmaker
1017+
esp32wrover.menu.PartitionScheme.rainmaker.upload.maximum_size=3145728
10151018

10161019
esp32wrover.menu.FlashMode.qio=QIO
10171020
esp32wrover.menu.FlashMode.qio.build.flash_mode=dio
@@ -1238,6 +1241,9 @@ esp32s3box.menu.PartitionScheme.fatflash.upload.maximum_size=2097152
12381241
esp32s3box.menu.PartitionScheme.app3M_fat9M_16MB=16M Flash (3MB APP/9.9MB FATFS)
12391242
esp32s3box.menu.PartitionScheme.app3M_fat9M_16MB.build.partitions=app3M_fat9M_16MB
12401243
esp32s3box.menu.PartitionScheme.app3M_fat9M_16MB.upload.maximum_size=3145728
1244+
esp32s3box.menu.PartitionScheme.rainmaker=RainMaker
1245+
esp32s3box.menu.PartitionScheme.rainmaker.build.partitions=rainmaker
1246+
esp32s3box.menu.PartitionScheme.rainmaker.upload.maximum_size=3145728
12411247

12421248
esp32s3box.menu.DebugLevel.none=None
12431249
esp32s3box.menu.DebugLevel.none.build.code_debug=0
@@ -1686,6 +1692,9 @@ esp32wroverkit.menu.PartitionScheme.min_spiffs.build.partitions=min_spiffs
16861692
esp32wroverkit.menu.PartitionScheme.min_spiffs.upload.maximum_size=1966080
16871693
esp32wroverkit.menu.PartitionScheme.fatflash=16M Flash (2MB APP/12.5MB FATFS)
16881694
esp32wroverkit.menu.PartitionScheme.fatflash.build.partitions=ffat
1695+
esp32wroverkit.menu.PartitionScheme.rainmaker=RainMaker
1696+
esp32wroverkit.menu.PartitionScheme.rainmaker.build.partitions=rainmaker
1697+
esp32wroverkit.menu.PartitionScheme.rainmaker.upload.maximum_size=3145728
16891698
esp32wroverkit.menu.FlashMode.qio=QIO
16901699
esp32wroverkit.menu.FlashMode.qio.build.flash_mode=dio
16911700
esp32wroverkit.menu.FlashMode.qio.build.boot=qio

Diff for: libraries/RainMaker/examples/RMakerCustom/RMakerCustom.ino

+44-37
Original file line numberDiff line numberDiff line change
@@ -22,27 +22,27 @@ bool dimmer_state = true;
2222

2323
// The framework provides some standard device types like switch, lightbulb, fan, temperature sensor.
2424
// But, you can also define custom devices using the 'Device' base class object, as shown here
25-
static Device my_device("Dimmer", "custom.device.dimmer", &gpio_dimmer);
25+
static Device *my_device = NULL;
2626

2727
void sysProvEvent(arduino_event_t *sys_event)
2828
{
2929
switch (sys_event->event_id) {
30-
case ARDUINO_EVENT_PROV_START:
30+
case ARDUINO_EVENT_PROV_START:
3131
#if CONFIG_IDF_TARGET_ESP32S2
32-
Serial.printf("\nProvisioning Started with name \"%s\" and PoP \"%s\" on SoftAP\n", service_name, pop);
33-
printQR(service_name, pop, "softap");
32+
Serial.printf("\nProvisioning Started with name \"%s\" and PoP \"%s\" on SoftAP\n", service_name, pop);
33+
printQR(service_name, pop, "softap");
3434
#else
35-
Serial.printf("\nProvisioning Started with name \"%s\" and PoP \"%s\" on BLE\n", service_name, pop);
36-
printQR(service_name, pop, "ble");
35+
Serial.printf("\nProvisioning Started with name \"%s\" and PoP \"%s\" on BLE\n", service_name, pop);
36+
printQR(service_name, pop, "ble");
3737
#endif
38-
break;
39-
case ARDUINO_EVENT_PROV_INIT:
40-
wifi_prov_mgr_disable_auto_stop(10000);
41-
break;
42-
case ARDUINO_EVENT_PROV_CRED_SUCCESS:
43-
wifi_prov_mgr_stop_provisioning();
44-
break;
45-
default:;
38+
break;
39+
case ARDUINO_EVENT_PROV_INIT:
40+
wifi_prov_mgr_disable_auto_stop(10000);
41+
break;
42+
case ARDUINO_EVENT_PROV_CRED_SUCCESS:
43+
wifi_prov_mgr_stop_provisioning();
44+
break;
45+
default:;
4646
}
4747
}
4848

@@ -51,8 +51,8 @@ void write_callback(Device *device, Param *param, const param_val_t val, void *p
5151
const char *device_name = device->getDeviceName();
5252
const char *param_name = param->getParamName();
5353

54-
if(strcmp(param_name, "Power") == 0) {
55-
Serial.printf("Received value = %s for %s - %s\n", val.val.b? "true" : "false", device_name, param_name);
54+
if (strcmp(param_name, "Power") == 0) {
55+
Serial.printf("Received value = %s for %s - %s\n", val.val.b ? "true" : "false", device_name, param_name);
5656
dimmer_state = val.val.b;
5757
(dimmer_state == false) ? digitalWrite(gpio_dimmer, LOW) : digitalWrite(gpio_dimmer, HIGH);
5858
param->updateAndReport(val);
@@ -71,22 +71,25 @@ void setup()
7171

7272
Node my_node;
7373
my_node = RMaker.initNode("ESP RainMaker Node");
74-
74+
my_device = new Device("Dimmer", "custom.device.dimmer", &gpio_dimmer);
75+
if (!my_device) {
76+
return;
77+
}
7578
//Create custom dimmer device
76-
my_device.addNameParam();
77-
my_device.addPowerParam(DEFAULT_POWER_MODE);
78-
my_device.assignPrimaryParam(my_device.getParamByName(ESP_RMAKER_DEF_POWER_NAME));
79+
my_device->addNameParam();
80+
my_device->addPowerParam(DEFAULT_POWER_MODE);
81+
my_device->assignPrimaryParam(my_device->getParamByName(ESP_RMAKER_DEF_POWER_NAME));
7982

8083
//Create and add a custom level parameter
8184
Param level_param("Level", "custom.param.level", value(DEFAULT_DIMMER_LEVEL), PROP_FLAG_READ | PROP_FLAG_WRITE);
8285
level_param.addBounds(value(0), value(100), value(1));
8386
level_param.addUIType(ESP_RMAKER_UI_SLIDER);
84-
my_device.addParam(level_param);
87+
my_device->addParam(level_param);
8588

86-
my_device.addCb(write_callback);
89+
my_device->addCb(write_callback);
8790

8891
//Add custom dimmer device to the node
89-
my_node.addDevice(my_device);
92+
my_node.addDevice(*my_device);
9093

9194
//This is optional
9295
RMaker.enableOTA(OTA_USING_TOPICS);
@@ -112,29 +115,33 @@ void setup()
112115

113116
void loop()
114117
{
115-
if(digitalRead(gpio_0) == LOW) { //Push button pressed
118+
if (digitalRead(gpio_0) == LOW) { //Push button pressed
116119

117120
// Key debounce handling
118121
delay(100);
119122
int startTime = millis();
120-
while(digitalRead(gpio_0) == LOW) delay(50);
123+
while (digitalRead(gpio_0) == LOW) {
124+
delay(50);
125+
}
121126
int endTime = millis();
122127

123128
if ((endTime - startTime) > 10000) {
124-
// If key pressed for more than 10secs, reset all
125-
Serial.printf("Reset to factory.\n");
126-
RMakerFactoryReset(2);
129+
// If key pressed for more than 10secs, reset all
130+
Serial.printf("Reset to factory.\n");
131+
RMakerFactoryReset(2);
127132
} else if ((endTime - startTime) > 3000) {
128-
Serial.printf("Reset Wi-Fi.\n");
129-
// If key pressed for more than 3secs, but less than 10, reset Wi-Fi
130-
RMakerWiFiReset(2);
133+
Serial.printf("Reset Wi-Fi.\n");
134+
// If key pressed for more than 3secs, but less than 10, reset Wi-Fi
135+
RMakerWiFiReset(2);
131136
} else {
132-
// Toggle device state
133-
dimmer_state = !dimmer_state;
134-
Serial.printf("Toggle State to %s.\n", dimmer_state ? "true" : "false");
135-
my_device.updateAndReportParam(ESP_RMAKER_DEF_POWER_NAME, dimmer_state);
136-
(dimmer_state == false) ? digitalWrite(gpio_dimmer, LOW) : digitalWrite(gpio_dimmer, HIGH);
137-
}
137+
// Toggle device state
138+
dimmer_state = !dimmer_state;
139+
Serial.printf("Toggle State to %s.\n", dimmer_state ? "true" : "false");
140+
if (my_device) {
141+
my_device->updateAndReportParam(ESP_RMAKER_DEF_POWER_NAME, dimmer_state);
142+
}
143+
(dimmer_state == false) ? digitalWrite(gpio_dimmer, LOW) : digitalWrite(gpio_dimmer, HIGH);
144+
}
138145
}
139146
delay(100);
140147
}

Diff for: libraries/RainMaker/examples/RMakerCustomAirCooler/RMakerCustomAirCooler.ino

+58-45
Original file line numberDiff line numberDiff line change
@@ -39,27 +39,27 @@ bool power_state = true;
3939

4040
// The framework provides some standard device types like switch, lightbulb, fan, temperature sensor.
4141
// But, you can also define custom devices using the 'Device' base class object, as shown here
42-
static Device my_device("Air Cooler", "my.device.air-cooler", NULL);
42+
static Device *my_device = NULL;
4343

4444
void sysProvEvent(arduino_event_t *sys_event)
4545
{
4646
switch (sys_event->event_id) {
47-
case ARDUINO_EVENT_PROV_START:
47+
case ARDUINO_EVENT_PROV_START:
4848
#if CONFIG_IDF_TARGET_ESP32S2
49-
Serial.printf("\nProvisioning Started with name \"%s\" and PoP \"%s\" on SoftAP\n", service_name, pop);
50-
printQR(service_name, pop, "softap");
49+
Serial.printf("\nProvisioning Started with name \"%s\" and PoP \"%s\" on SoftAP\n", service_name, pop);
50+
printQR(service_name, pop, "softap");
5151
#else
52-
Serial.printf("\nProvisioning Started with name \"%s\" and PoP \"%s\" on BLE\n", service_name, pop);
53-
printQR(service_name, pop, "ble");
52+
Serial.printf("\nProvisioning Started with name \"%s\" and PoP \"%s\" on BLE\n", service_name, pop);
53+
printQR(service_name, pop, "ble");
5454
#endif
55-
break;
56-
case ARDUINO_EVENT_PROV_INIT:
57-
wifi_prov_mgr_disable_auto_stop(10000);
58-
break;
59-
case ARDUINO_EVENT_PROV_CRED_SUCCESS:
60-
wifi_prov_mgr_stop_provisioning();
61-
break;
62-
default:;
55+
break;
56+
case ARDUINO_EVENT_PROV_INIT:
57+
wifi_prov_mgr_disable_auto_stop(10000);
58+
break;
59+
case ARDUINO_EVENT_PROV_CRED_SUCCESS:
60+
wifi_prov_mgr_stop_provisioning();
61+
break;
62+
default:;
6363
}
6464
}
6565

@@ -68,13 +68,13 @@ void write_callback(Device *device, Param *param, const param_val_t val, void *p
6868
const char *device_name = device->getDeviceName();
6969
const char *param_name = param->getParamName();
7070

71-
if(strcmp(param_name, "Power") == 0) {
72-
Serial.printf("Received value = %s for %s - %s\n", val.val.b? "true" : "false", device_name, param_name);
71+
if (strcmp(param_name, "Power") == 0) {
72+
Serial.printf("Received value = %s for %s - %s\n", val.val.b ? "true" : "false", device_name, param_name);
7373
power_state = val.val.b;
7474
(power_state == false) ? digitalWrite(gpio_power, LOW) : digitalWrite(gpio_power, HIGH);
7575
param->updateAndReport(val);
7676
} else if (strcmp(param_name, "Swing") == 0) {
77-
Serial.printf("\nReceived value = %s for %s - %s\n", val.val.b? "true" : "false", device_name, param_name);
77+
Serial.printf("\nReceived value = %s for %s - %s\n", val.val.b ? "true" : "false", device_name, param_name);
7878
bool swing = val.val.b;
7979
(swing == false) ? digitalWrite(gpio_swing, LOW) : digitalWrite(gpio_swing, HIGH);
8080
param->updateAndReport(val);
@@ -84,7 +84,7 @@ void write_callback(Device *device, Param *param, const param_val_t val, void *p
8484
analogWrite(gpio_speed, speed);
8585
param->updateAndReport(val);
8686
} else if (strcmp(param_name, "Mode") == 0) {
87-
const char* mode = val.val.s;
87+
const char *mode = val.val.s;
8888
if (strcmp(mode, "Auto") == 0) {
8989
digitalWrite(gpio_mode_auto, HIGH);
9090
digitalWrite(gpio_mode_heat, LOW);
@@ -112,41 +112,50 @@ void setup()
112112
pinMode(gpio_swing, OUTPUT);
113113
digitalWrite(gpio_swing, DEFAULT_SWING);
114114
pinMode(gpio_mode_auto, OUTPUT);
115-
if (strcmp(DEFAULT_MODE, "Auto") == 0) digitalWrite(gpio_mode_auto, HIGH);
115+
if (strcmp(DEFAULT_MODE, "Auto") == 0) {
116+
digitalWrite(gpio_mode_auto, HIGH);
117+
}
116118
pinMode(gpio_mode_cool, OUTPUT);
117-
if (strcmp(DEFAULT_MODE, "Cool") == 0) digitalWrite(gpio_mode_auto, HIGH);
119+
if (strcmp(DEFAULT_MODE, "Cool") == 0) {
120+
digitalWrite(gpio_mode_auto, HIGH);
121+
}
118122
pinMode(gpio_mode_heat, OUTPUT);
119-
if (strcmp(DEFAULT_MODE, "Heat") == 0) digitalWrite(gpio_mode_auto, HIGH);
123+
if (strcmp(DEFAULT_MODE, "Heat") == 0) {
124+
digitalWrite(gpio_mode_auto, HIGH);
125+
}
120126
pinMode(gpio_speed, OUTPUT);
121127
analogWrite(gpio_speed, DEFAULT_SPEED);
122128

123129
Node my_node;
124130
my_node = RMaker.initNode("ESP RainMaker Node");
125-
131+
my_device = new Device("Air Cooler", "my.device.air-cooler", NULL);
132+
if (!my_device) {
133+
return;
134+
}
126135
//Create custom air cooler device
127-
my_device.addNameParam();
128-
my_device.addPowerParam(DEFAULT_POWER_MODE);
129-
my_device.assignPrimaryParam(my_device.getParamByName(ESP_RMAKER_DEF_POWER_NAME));
136+
my_device->addNameParam();
137+
my_device->addPowerParam(DEFAULT_POWER_MODE);
138+
my_device->assignPrimaryParam(my_device->getParamByName(ESP_RMAKER_DEF_POWER_NAME));
130139

131140
Param swing("Swing", ESP_RMAKER_PARAM_TOGGLE, value(DEFAULT_SWING), PROP_FLAG_READ | PROP_FLAG_WRITE);
132141
swing.addUIType(ESP_RMAKER_UI_TOGGLE);
133-
my_device.addParam(swing);
142+
my_device->addParam(swing);
134143

135144
Param speed("Speed", ESP_RMAKER_PARAM_RANGE, value(DEFAULT_SPEED), PROP_FLAG_READ | PROP_FLAG_WRITE);
136145
speed.addUIType(ESP_RMAKER_UI_SLIDER);
137146
speed.addBounds(value(0), value(255), value(1));
138-
my_device.addParam(speed);
147+
my_device->addParam(speed);
139148

140-
static const char* modes[] = { "Auto", "Cool", "Heat" };
149+
static const char *modes[] = { "Auto", "Cool", "Heat" };
141150
Param mode_param("Mode", ESP_RMAKER_PARAM_MODE, value("Auto"), PROP_FLAG_READ | PROP_FLAG_WRITE);
142151
mode_param.addValidStrList(modes, 3);
143152
mode_param.addUIType(ESP_RMAKER_UI_DROPDOWN);
144-
my_device.addParam(mode_param);
153+
my_device->addParam(mode_param);
145154

146-
my_device.addCb(write_callback);
155+
my_device->addCb(write_callback);
147156

148157
//Add custom Air Cooler device to the node
149-
my_node.addDevice(my_device);
158+
my_node.addDevice(*my_device);
150159

151160
//This is optional
152161
// RMaker.enableOTA(OTA_USING_TOPICS);
@@ -172,29 +181,33 @@ void setup()
172181

173182
void loop()
174183
{
175-
if(digitalRead(gpio_reset) == LOW) { //Push button pressed
184+
if (digitalRead(gpio_reset) == LOW) { //Push button pressed
176185

177186
// Key debounce handling
178187
delay(100);
179188
int startTime = millis();
180-
while(digitalRead(gpio_reset) == LOW) delay(50);
189+
while (digitalRead(gpio_reset) == LOW) {
190+
delay(50);
191+
}
181192
int press_duration = millis() - startTime;
182193

183194
if (press_duration > 10000) {
184-
// If key pressed for more than 10secs, reset all
185-
Serial.printf("Reset to factory.\n");
186-
RMakerFactoryReset(2);
195+
// If key pressed for more than 10secs, reset all
196+
Serial.printf("Reset to factory.\n");
197+
RMakerFactoryReset(2);
187198
} else if (press_duration > 3000) {
188-
Serial.printf("Reset Wi-Fi.\n");
189-
// If key pressed for more than 3secs, but less than 10, reset Wi-Fi
190-
RMakerWiFiReset(2);
199+
Serial.printf("Reset Wi-Fi.\n");
200+
// If key pressed for more than 3secs, but less than 10, reset Wi-Fi
201+
RMakerWiFiReset(2);
191202
} else {
192-
// Toggle device state
193-
power_state = !power_state;
194-
Serial.printf("Toggle power state to %s.\n", power_state ? "true" : "false");
195-
my_device.updateAndReportParam(ESP_RMAKER_DEF_POWER_NAME, power_state);
196-
(power_state == false) ? digitalWrite(gpio_power, LOW) : digitalWrite(gpio_power, HIGH);
197-
}
203+
// Toggle device state
204+
power_state = !power_state;
205+
Serial.printf("Toggle power state to %s.\n", power_state ? "true" : "false");
206+
if (my_device) {
207+
my_device->updateAndReportParam(ESP_RMAKER_DEF_POWER_NAME, power_state);
208+
}
209+
(power_state == false) ? digitalWrite(gpio_power, LOW) : digitalWrite(gpio_power, HIGH);
210+
}
198211
}
199212
delay(100);
200213
}

0 commit comments

Comments
 (0)