Skip to content

Commit 2b53ed1

Browse files
committed
fix(esp_now): Fix example and use nullptr
1 parent 23c6abc commit 2b53ed1

File tree

7 files changed

+79
-62
lines changed

7 files changed

+79
-62
lines changed

libraries/ESP_NOW/examples/ESP_NOW_Broadcast_Master/ESP_NOW_Broadcast_Master.ino

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public:
5858
uint32_t msg_count = 0;
5959

6060
// Create a broadcast peer object
61-
ESP_NOW_Broadcast_Peer broadcast_peer(ESPNOW_WIFI_CHANNEL, WIFI_IF_STA, NULL);
61+
ESP_NOW_Broadcast_Peer broadcast_peer(ESPNOW_WIFI_CHANNEL, WIFI_IF_STA, nullptr);
6262

6363
/* Main */
6464

libraries/ESP_NOW/examples/ESP_NOW_Broadcast_Slave/ESP_NOW_Broadcast_Slave.ino

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ public:
5252
/* Global Variables */
5353

5454
// List of all the masters. It will be populated when a new master is registered
55-
std::vector<ESP_NOW_Peer_Class> masters;
55+
// Note: Using pointers instead of objects to prevent dangling pointers when the vector reallocates
56+
std::vector<ESP_NOW_Peer_Class *> masters;
5657

5758
/* Callbacks */
5859

@@ -62,13 +63,14 @@ void register_new_master(const esp_now_recv_info_t *info, const uint8_t *data, i
6263
Serial.printf("Unknown peer " MACSTR " sent a broadcast message\n", MAC2STR(info->src_addr));
6364
Serial.println("Registering the peer as a master");
6465

65-
ESP_NOW_Peer_Class new_master(info->src_addr, ESPNOW_WIFI_CHANNEL, WIFI_IF_STA, NULL);
66-
67-
masters.push_back(new_master);
68-
if (!masters.back().add_peer()) {
66+
ESP_NOW_Peer_Class *new_master = new ESP_NOW_Peer_Class(info->src_addr, ESPNOW_WIFI_CHANNEL, WIFI_IF_STA, nullptr);
67+
if (!new_master->add_peer()) {
6968
Serial.println("Failed to register the new master");
69+
delete new_master;
7070
return;
7171
}
72+
masters.push_back(new_master);
73+
Serial.printf("Successfully registered master " MACSTR " (total masters: %zu)\n", MAC2STR(new_master->addr()), masters.size());
7274
} else {
7375
// The slave will only receive broadcast messages
7476
log_v("Received a unicast message from " MACSTR, MAC2STR(info->src_addr));
@@ -103,11 +105,23 @@ void setup() {
103105
}
104106

105107
// Register the new peer callback
106-
ESP_NOW.onNewPeer(register_new_master, NULL);
108+
ESP_NOW.onNewPeer(register_new_master, nullptr);
107109

108110
Serial.println("Setup complete. Waiting for a master to broadcast a message...");
109111
}
110112

111113
void loop() {
112-
delay(1000);
114+
// Print debug information every 10 seconds
115+
static unsigned long last_debug = 0;
116+
if (millis() - last_debug > 10000) {
117+
last_debug = millis();
118+
Serial.printf("Registered masters: %zu\n", masters.size());
119+
for (size_t i = 0; i < masters.size(); i++) {
120+
if (masters[i]) {
121+
Serial.printf(" Master %zu: " MACSTR "\n", i, MAC2STR(masters[i]->addr()));
122+
}
123+
}
124+
}
125+
126+
delay(100);
113127
}

libraries/ESP_NOW/examples/ESP_NOW_Network/ESP_NOW_Network.ino

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ public:
123123
}
124124

125125
bool send_message(const uint8_t *data, size_t len) {
126-
if (data == NULL || len == 0) {
126+
if (data == nullptr || len == 0) {
127127
log_e("Data to be sent is NULL or has a length of 0");
128128
return false;
129129
}
@@ -169,9 +169,12 @@ public:
169169

170170
/* Peers */
171171

172-
std::vector<ESP_NOW_Network_Peer *> peers; // Create a vector to store the peer pointers
173-
ESP_NOW_Network_Peer broadcast_peer(ESP_NOW.BROADCAST_ADDR, 0, NULL); // Register the broadcast peer (no encryption support for the broadcast address)
174-
ESP_NOW_Network_Peer *master_peer = nullptr; // Pointer to peer that is the master
172+
// Create a vector to store the peer pointers
173+
std::vector<ESP_NOW_Network_Peer *> peers;
174+
// Register the broadcast peer (no encryption support for the broadcast address)
175+
ESP_NOW_Network_Peer broadcast_peer(ESP_NOW.BROADCAST_ADDR, 0, nullptr);
176+
// Pointer to the peer that is the master
177+
ESP_NOW_Network_Peer *master_peer = nullptr;
175178

176179
/* Helper functions */
177180

@@ -279,7 +282,7 @@ void setup() {
279282
}
280283

281284
// Register the callback to be called when a new peer is found
282-
ESP_NOW.onNewPeer(register_new_peer, NULL);
285+
ESP_NOW.onNewPeer(register_new_peer, nullptr);
283286

284287
Serial.println("Setup complete. Broadcasting own priority to find the master...");
285288
memset(&new_msg, 0, sizeof(new_msg));

libraries/ESP_NOW/src/ESP32_NOW.cpp

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@
99
#include "esp32-hal.h"
1010
#include "esp_wifi.h"
1111

12-
static void (*new_cb)(const esp_now_recv_info_t *info, const uint8_t *data, int len, void *arg) = NULL;
13-
static void *new_arg = NULL; // * tx_arg = NULL, * rx_arg = NULL,
12+
static void (*new_cb)(const esp_now_recv_info_t *info, const uint8_t *data, int len, void *arg) = nullptr;
13+
static void *new_arg = nullptr; // * tx_arg = nullptr, * rx_arg = nullptr,
1414
static bool _esp_now_has_begun = false;
1515
static ESP_NOW_Peer *_esp_now_peers[ESP_NOW_MAX_TOTAL_PEER_NUM];
1616

17-
static esp_err_t _esp_now_add_peer(const uint8_t *mac_addr, uint8_t channel, wifi_interface_t iface, const uint8_t *lmk, ESP_NOW_Peer *_peer = NULL) {
17+
static esp_err_t _esp_now_add_peer(const uint8_t *mac_addr, uint8_t channel, wifi_interface_t iface, const uint8_t *lmk, ESP_NOW_Peer *_peer = nullptr) {
1818
log_v(MACSTR, MAC2STR(mac_addr));
1919
if (esp_now_is_peer_exist(mac_addr)) {
2020
log_e("Peer Already Exists");
@@ -26,16 +26,16 @@ static esp_err_t _esp_now_add_peer(const uint8_t *mac_addr, uint8_t channel, wif
2626
memcpy(peer.peer_addr, mac_addr, ESP_NOW_ETH_ALEN);
2727
peer.channel = channel;
2828
peer.ifidx = iface;
29-
peer.encrypt = lmk != NULL;
29+
peer.encrypt = lmk != nullptr;
3030
if (lmk) {
3131
memcpy(peer.lmk, lmk, ESP_NOW_KEY_LEN);
3232
}
3333

3434
esp_err_t result = esp_now_add_peer(&peer);
3535
if (result == ESP_OK) {
36-
if (_peer != NULL) {
36+
if (_peer != nullptr) {
3737
for (uint8_t i = 0; i < ESP_NOW_MAX_TOTAL_PEER_NUM; i++) {
38-
if (_esp_now_peers[i] == NULL) {
38+
if (_esp_now_peers[i] == nullptr) {
3939
_esp_now_peers[i] = _peer;
4040
return ESP_OK;
4141
}
@@ -67,8 +67,8 @@ static esp_err_t _esp_now_del_peer(const uint8_t *mac_addr) {
6767
}
6868

6969
for (uint8_t i = 0; i < ESP_NOW_MAX_TOTAL_PEER_NUM; i++) {
70-
if (_esp_now_peers[i] != NULL && memcmp(mac_addr, _esp_now_peers[i]->addr(), ESP_NOW_ETH_ALEN) == 0) {
71-
_esp_now_peers[i] = NULL;
70+
if (_esp_now_peers[i] != nullptr && memcmp(mac_addr, _esp_now_peers[i]->addr(), ESP_NOW_ETH_ALEN) == 0) {
71+
_esp_now_peers[i] = nullptr;
7272
break;
7373
}
7474
}
@@ -87,7 +87,7 @@ static esp_err_t _esp_now_modify_peer(const uint8_t *mac_addr, uint8_t channel,
8787
memcpy(peer.peer_addr, mac_addr, ESP_NOW_ETH_ALEN);
8888
peer.channel = channel;
8989
peer.ifidx = iface;
90-
peer.encrypt = lmk != NULL;
90+
peer.encrypt = lmk != nullptr;
9191
if (lmk) {
9292
memcpy(peer.lmk, lmk, ESP_NOW_KEY_LEN);
9393
}
@@ -111,17 +111,17 @@ static void _esp_now_rx_cb(const esp_now_recv_info_t *info, const uint8_t *data,
111111
bool broadcast = memcmp(info->des_addr, ESP_NOW.BROADCAST_ADDR, ESP_NOW_ETH_ALEN) == 0;
112112
log_v("%s from " MACSTR ", data length : %u", broadcast ? "Broadcast" : "Unicast", MAC2STR(info->src_addr), len);
113113
log_buf_v(data, len);
114-
if (!esp_now_is_peer_exist(info->src_addr) && new_cb != NULL) {
114+
if (!esp_now_is_peer_exist(info->src_addr) && new_cb != nullptr) {
115115
log_v("Calling new_cb, peer not found.");
116116
new_cb(info, data, len, new_arg);
117117
return;
118118
}
119119
//find the peer and call it's callback
120120
for (uint8_t i = 0; i < ESP_NOW_MAX_TOTAL_PEER_NUM; i++) {
121-
if (_esp_now_peers[i] != NULL) {
121+
if (_esp_now_peers[i] != nullptr) {
122122
log_v("Checking peer " MACSTR, MAC2STR(_esp_now_peers[i]->addr()));
123123
}
124-
if (_esp_now_peers[i] != NULL && memcmp(info->src_addr, _esp_now_peers[i]->addr(), ESP_NOW_ETH_ALEN) == 0) {
124+
if (_esp_now_peers[i] != nullptr && memcmp(info->src_addr, _esp_now_peers[i]->addr(), ESP_NOW_ETH_ALEN) == 0) {
125125
log_v("Calling onReceive");
126126
_esp_now_peers[i]->onReceive(data, len, broadcast);
127127
return;
@@ -133,7 +133,7 @@ static void _esp_now_tx_cb(const uint8_t *mac_addr, esp_now_send_status_t status
133133
log_v(MACSTR " : %s", MAC2STR(mac_addr), (status == ESP_NOW_SEND_SUCCESS) ? "SUCCESS" : "FAILED");
134134
//find the peer and call it's callback
135135
for (uint8_t i = 0; i < ESP_NOW_MAX_TOTAL_PEER_NUM; i++) {
136-
if (_esp_now_peers[i] != NULL && memcmp(mac_addr, _esp_now_peers[i]->addr(), ESP_NOW_ETH_ALEN) == 0) {
136+
if (_esp_now_peers[i] != nullptr && memcmp(mac_addr, _esp_now_peers[i]->addr(), ESP_NOW_ETH_ALEN) == 0) {
137137
_esp_now_peers[i]->onSent(status == ESP_NOW_SEND_SUCCESS);
138138
return;
139139
}
@@ -197,7 +197,7 @@ bool ESP_NOW_Class::end() {
197197
}
198198
//remove all peers
199199
for (uint8_t i = 0; i < ESP_NOW_MAX_TOTAL_PEER_NUM; i++) {
200-
if (_esp_now_peers[i] != NULL) {
200+
if (_esp_now_peers[i] != nullptr) {
201201
removePeer(*_esp_now_peers[i]);
202202
}
203203
}
@@ -249,7 +249,7 @@ size_t ESP_NOW_Class::write(const uint8_t *data, size_t len) {
249249
if (len > ESP_NOW_MAX_DATA_LEN) {
250250
len = ESP_NOW_MAX_DATA_LEN;
251251
}
252-
esp_err_t result = esp_now_send(NULL, data, len);
252+
esp_err_t result = esp_now_send(nullptr, data, len);
253253
if (result == ESP_OK) {
254254
return len;
255255
} else if (result == ESP_ERR_ESPNOW_NOT_INIT) {
@@ -292,7 +292,7 @@ ESP_NOW_Peer::ESP_NOW_Peer(const uint8_t *mac_addr, uint8_t channel, wifi_interf
292292
}
293293
chan = channel;
294294
ifc = iface;
295-
encrypt = lmk != NULL;
295+
encrypt = lmk != nullptr;
296296
if (encrypt) {
297297
memcpy(key, lmk, 16);
298298
}
@@ -305,7 +305,7 @@ bool ESP_NOW_Peer::add() {
305305
if (added) {
306306
return true;
307307
}
308-
if (_esp_now_add_peer(mac, chan, ifc, encrypt ? key : NULL, this) != ESP_OK) {
308+
if (_esp_now_add_peer(mac, chan, ifc, encrypt ? key : nullptr, this) != ESP_OK) {
309309
return false;
310310
}
311311
log_v("Peer added - " MACSTR, MAC2STR(mac));
@@ -350,7 +350,7 @@ bool ESP_NOW_Peer::setChannel(uint8_t channel) {
350350
if (!_esp_now_has_begun || !added) {
351351
return true;
352352
}
353-
return _esp_now_modify_peer(mac, chan, ifc, encrypt ? key : NULL) == ESP_OK;
353+
return _esp_now_modify_peer(mac, chan, ifc, encrypt ? key : nullptr) == ESP_OK;
354354
}
355355

356356
wifi_interface_t ESP_NOW_Peer::getInterface() const {
@@ -362,22 +362,22 @@ bool ESP_NOW_Peer::setInterface(wifi_interface_t iface) {
362362
if (!_esp_now_has_begun || !added) {
363363
return true;
364364
}
365-
return _esp_now_modify_peer(mac, chan, ifc, encrypt ? key : NULL) == ESP_OK;
365+
return _esp_now_modify_peer(mac, chan, ifc, encrypt ? key : nullptr) == ESP_OK;
366366
}
367367

368368
bool ESP_NOW_Peer::isEncrypted() const {
369369
return encrypt;
370370
}
371371

372372
bool ESP_NOW_Peer::setKey(const uint8_t *lmk) {
373-
encrypt = lmk != NULL;
373+
encrypt = lmk != nullptr;
374374
if (encrypt) {
375375
memcpy(key, lmk, 16);
376376
}
377377
if (!_esp_now_has_begun || !added) {
378378
return true;
379379
}
380-
return _esp_now_modify_peer(mac, chan, ifc, encrypt ? key : NULL) == ESP_OK;
380+
return _esp_now_modify_peer(mac, chan, ifc, encrypt ? key : nullptr) == ESP_OK;
381381
}
382382

383383
size_t ESP_NOW_Peer::send(const uint8_t *data, int len) {

libraries/ESP_NOW/src/ESP32_NOW.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class ESP_NOW_Class : public Print {
2020
ESP_NOW_Class();
2121
~ESP_NOW_Class();
2222

23-
bool begin(const uint8_t *pmk = NULL /* 16 bytes */);
23+
bool begin(const uint8_t *pmk = nullptr /* 16 bytes */);
2424
bool end();
2525

2626
int getTotalPeerCount();
@@ -50,7 +50,7 @@ class ESP_NOW_Peer {
5050
bool remove();
5151
size_t send(const uint8_t *data, int len);
5252

53-
ESP_NOW_Peer(const uint8_t *mac_addr, uint8_t channel = 0, wifi_interface_t iface = WIFI_IF_AP, const uint8_t *lmk = NULL);
53+
ESP_NOW_Peer(const uint8_t *mac_addr, uint8_t channel = 0, wifi_interface_t iface = WIFI_IF_AP, const uint8_t *lmk = nullptr);
5454

5555
public:
5656
virtual ~ESP_NOW_Peer() {}

0 commit comments

Comments
 (0)