Skip to content

Commit 70696df

Browse files
authored
Merge branch 'master' into release/v3.3.x
2 parents ff3cc81 + 12e881b commit 70696df

File tree

31 files changed

+1334
-132
lines changed

31 files changed

+1334
-132
lines changed

.github/workflows/lib.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
{
1010
"name": "ArduinoBLE",
1111
"exclude_targets": [
12-
"esp32s2"
12+
"esp32s2",
13+
"esp32p4"
1314
],
1415
"sketch_path": [
1516
"~/Arduino/libraries/ArduinoBLE/examples/Central/Scan/Scan.ino"

boards.txt

Lines changed: 401 additions & 1 deletion
Large diffs are not rendered by default.

cores/esp32/WString.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -180,15 +180,15 @@ bool String::changeBuffer(unsigned int maxStrLen) {
180180
if (maxStrLen < sizeof(sso.buff) - 1) {
181181
if (isSSO() || !buffer()) {
182182
// Already using SSO, nothing to do
183-
uint16_t oldLen = len();
183+
size_t oldLen = len();
184184
setSSO(true);
185185
setLen(oldLen);
186186
} else { // if bufptr && !isSSO()
187187
// Using bufptr, need to shrink into sso.buff
188188
char temp[sizeof(sso.buff)];
189189
memcpy(temp, buffer(), maxStrLen);
190190
free(wbuffer());
191-
uint16_t oldLen = len();
191+
size_t oldLen = len();
192192
setSSO(true);
193193
memcpy(wbuffer(), temp, maxStrLen);
194194
setLen(oldLen);
@@ -201,7 +201,7 @@ bool String::changeBuffer(unsigned int maxStrLen) {
201201
if (newSize > CAPACITY_MAX) {
202202
return false;
203203
}
204-
uint16_t oldLen = len();
204+
size_t oldLen = len();
205205
char *newbuffer = (char *)realloc(isSSO() ? nullptr : wbuffer(), newSize);
206206
if (newbuffer) {
207207
size_t oldSize = capacity() + 1; // include NULL.

libraries/ESP32/examples/Camera/CameraWebServer/CameraWebServer.ino

Lines changed: 6 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,10 @@
11
#include "esp_camera.h"
22
#include <WiFi.h>
33

4-
//
5-
// WARNING!!! PSRAM IC required for UXGA resolution and high JPEG quality
6-
// Ensure ESP32 Wrover Module or other board with PSRAM is selected
7-
// Partial images will be transmitted if image exceeds buffer size
8-
//
9-
// You must select partition scheme from the board menu that has at least 3MB APP space.
10-
// Face Recognition is DISABLED for ESP32 and ESP32-S2, because it takes up from 15
11-
// seconds to process single frame. Face Detection is ENABLED if PSRAM is enabled as well
12-
13-
// ===================
14-
// Select camera model
15-
// ===================
16-
//#define CAMERA_MODEL_WROVER_KIT // Has PSRAM
17-
#define CAMERA_MODEL_ESP_EYE // Has PSRAM
18-
//#define CAMERA_MODEL_ESP32S3_EYE // Has PSRAM
19-
//#define CAMERA_MODEL_M5STACK_PSRAM // Has PSRAM
20-
//#define CAMERA_MODEL_M5STACK_V2_PSRAM // M5Camera version B Has PSRAM
21-
//#define CAMERA_MODEL_M5STACK_WIDE // Has PSRAM
22-
//#define CAMERA_MODEL_M5STACK_ESP32CAM // No PSRAM
23-
//#define CAMERA_MODEL_M5STACK_UNITCAM // No PSRAM
24-
//#define CAMERA_MODEL_M5STACK_CAMS3_UNIT // Has PSRAM
25-
//#define CAMERA_MODEL_AI_THINKER // Has PSRAM
26-
//#define CAMERA_MODEL_TTGO_T_JOURNAL // No PSRAM
27-
//#define CAMERA_MODEL_XIAO_ESP32S3 // Has PSRAM
28-
// ** Espressif Internal Boards **
29-
//#define CAMERA_MODEL_ESP32_CAM_BOARD
30-
//#define CAMERA_MODEL_ESP32S2_CAM_BOARD
31-
//#define CAMERA_MODEL_ESP32S3_CAM_LCD
32-
//#define CAMERA_MODEL_DFRobot_FireBeetle2_ESP32S3 // Has PSRAM
33-
//#define CAMERA_MODEL_DFRobot_Romeo_ESP32S3 // Has PSRAM
34-
#include "camera_pins.h"
4+
// ===========================
5+
// Select camera model in board_config.h
6+
// ===========================
7+
#include "board_config.h"
358

369
// ===========================
3710
// Enter your WiFi credentials
@@ -40,7 +13,7 @@ const char *ssid = "**********";
4013
const char *password = "**********";
4114

4215
void startCameraServer();
43-
void setupLedFlash(int pin);
16+
void setupLedFlash();
4417

4518
void setup() {
4619
Serial.begin(115200);
@@ -130,7 +103,7 @@ void setup() {
130103

131104
// Setup LED FLash if LED pin is defined in camera_pins.h
132105
#if defined(LED_GPIO_NUM)
133-
setupLedFlash(LED_GPIO_NUM);
106+
setupLedFlash();
134107
#endif
135108

136109
WiFi.begin(ssid, password);

libraries/ESP32/examples/Camera/CameraWebServer/app_httpd.cpp

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,14 @@
1919
#include "esp32-hal-ledc.h"
2020
#include "sdkconfig.h"
2121
#include "camera_index.h"
22+
#include "board_config.h"
2223

2324
#if defined(ARDUINO_ARCH_ESP32) && defined(CONFIG_ARDUHAL_ESP_LOG)
2425
#include "esp32-hal-log.h"
2526
#endif
2627

27-
// Enable LED FLASH setting
28-
#define CONFIG_LED_ILLUMINATOR_ENABLED 1
29-
3028
// LED FLASH setup
31-
#if CONFIG_LED_ILLUMINATOR_ENABLED
32-
33-
#define LED_LEDC_GPIO 22 //configure LED pin
29+
#if defined(LED_GPIO_NUM)
3430
#define CONFIG_LED_MAX_INTENSITY 255
3531

3632
int led_duty = 0;
@@ -91,13 +87,13 @@ static int ra_filter_run(ra_filter_t *filter, int value) {
9187
}
9288
#endif
9389

94-
#if CONFIG_LED_ILLUMINATOR_ENABLED
90+
#if defined(LED_GPIO_NUM)
9591
void enable_led(bool en) { // Turn LED On or Off
9692
int duty = en ? led_duty : 0;
9793
if (en && isStreaming && (led_duty > CONFIG_LED_MAX_INTENSITY)) {
9894
duty = CONFIG_LED_MAX_INTENSITY;
9995
}
100-
ledcWrite(LED_LEDC_GPIO, duty);
96+
ledcWrite(LED_GPIO_NUM, duty);
10197
//ledc_set_duty(CONFIG_LED_LEDC_SPEED_MODE, CONFIG_LED_LEDC_CHANNEL, duty);
10298
//ledc_update_duty(CONFIG_LED_LEDC_SPEED_MODE, CONFIG_LED_LEDC_CHANNEL);
10399
log_i("Set LED intensity to %d", duty);
@@ -162,7 +158,7 @@ static esp_err_t capture_handler(httpd_req_t *req) {
162158
int64_t fr_start = esp_timer_get_time();
163159
#endif
164160

165-
#if CONFIG_LED_ILLUMINATOR_ENABLED
161+
#if defined(LED_GPIO_NUM)
166162
enable_led(true);
167163
vTaskDelay(150 / portTICK_PERIOD_MS); // The LED needs to be turned on ~150ms before the call to esp_camera_fb_get()
168164
fb = esp_camera_fb_get(); // or it won't be visible in the frame. A better way to do this is needed.
@@ -230,7 +226,7 @@ static esp_err_t stream_handler(httpd_req_t *req) {
230226
httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*");
231227
httpd_resp_set_hdr(req, "X-Framerate", "60");
232228

233-
#if CONFIG_LED_ILLUMINATOR_ENABLED
229+
#if defined(LED_GPIO_NUM)
234230
isStreaming = true;
235231
enable_led(true);
236232
#endif
@@ -293,7 +289,7 @@ static esp_err_t stream_handler(httpd_req_t *req) {
293289
);
294290
}
295291

296-
#if CONFIG_LED_ILLUMINATOR_ENABLED
292+
#if defined(LED_GPIO_NUM)
297293
isStreaming = false;
298294
enable_led(false);
299295
#endif
@@ -393,7 +389,7 @@ static esp_err_t cmd_handler(httpd_req_t *req) {
393389
} else if (!strcmp(variable, "ae_level")) {
394390
res = s->set_ae_level(s, val);
395391
}
396-
#if CONFIG_LED_ILLUMINATOR_ENABLED
392+
#if defined(LED_GPIO_NUM)
397393
else if (!strcmp(variable, "led_intensity")) {
398394
led_duty = val;
399395
if (isStreaming) {
@@ -481,7 +477,7 @@ static esp_err_t status_handler(httpd_req_t *req) {
481477
p += sprintf(p, "\"vflip\":%u,", s->status.vflip);
482478
p += sprintf(p, "\"dcw\":%u,", s->status.dcw);
483479
p += sprintf(p, "\"colorbar\":%u", s->status.colorbar);
484-
#if CONFIG_LED_ILLUMINATOR_ENABLED
480+
#if defined(LED_GPIO_NUM)
485481
p += sprintf(p, ",\"led_intensity\":%u", led_duty);
486482
#else
487483
p += sprintf(p, ",\"led_intensity\":%d", -1);
@@ -843,10 +839,10 @@ void startCameraServer() {
843839
}
844840
}
845841

846-
void setupLedFlash(int pin) {
847-
#if CONFIG_LED_ILLUMINATOR_ENABLED
848-
ledcAttach(pin, 5000, 8);
842+
void setupLedFlash() {
843+
#if defined(LED_GPIO_NUM)
844+
ledcAttach(LED_GPIO_NUM, 5000, 8);
849845
#else
850-
log_i("LED flash is disabled -> CONFIG_LED_ILLUMINATOR_ENABLED = 0");
846+
log_i("LED flash is disabled -> LED_GPIO_NUM undefined");
851847
#endif
852848
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#ifndef BOARD_CONFIG_H
2+
#define BOARD_CONFIG_H
3+
4+
//
5+
// WARNING!!! PSRAM IC required for UXGA resolution and high JPEG quality
6+
// Ensure ESP32 Wrover Module or other board with PSRAM is selected
7+
// Partial images will be transmitted if image exceeds buffer size
8+
//
9+
// You must select partition scheme from the board menu that has at least 3MB APP space.
10+
11+
// ===================
12+
// Select camera model
13+
// ===================
14+
//#define CAMERA_MODEL_WROVER_KIT // Has PSRAM
15+
#define CAMERA_MODEL_ESP_EYE // Has PSRAM
16+
//#define CAMERA_MODEL_ESP32S3_EYE // Has PSRAM
17+
//#define CAMERA_MODEL_M5STACK_PSRAM // Has PSRAM
18+
//#define CAMERA_MODEL_M5STACK_V2_PSRAM // M5Camera version B Has PSRAM
19+
//#define CAMERA_MODEL_M5STACK_WIDE // Has PSRAM
20+
//#define CAMERA_MODEL_M5STACK_ESP32CAM // No PSRAM
21+
//#define CAMERA_MODEL_M5STACK_UNITCAM // No PSRAM
22+
//#define CAMERA_MODEL_M5STACK_CAMS3_UNIT // Has PSRAM
23+
//#define CAMERA_MODEL_AI_THINKER // Has PSRAM
24+
//#define CAMERA_MODEL_TTGO_T_JOURNAL // No PSRAM
25+
//#define CAMERA_MODEL_XIAO_ESP32S3 // Has PSRAM
26+
// ** Espressif Internal Boards **
27+
//#define CAMERA_MODEL_ESP32_CAM_BOARD
28+
//#define CAMERA_MODEL_ESP32S2_CAM_BOARD
29+
//#define CAMERA_MODEL_ESP32S3_CAM_LCD
30+
//#define CAMERA_MODEL_DFRobot_FireBeetle2_ESP32S3 // Has PSRAM
31+
//#define CAMERA_MODEL_DFRobot_Romeo_ESP32S3 // Has PSRAM
32+
#include "camera_pins.h"
33+
34+
#endif // BOARD_CONFIG_H

libraries/ESP_NOW/examples/ESP_NOW_Broadcast_Master/ESP_NOW_Broadcast_Master.ino

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@ void setup() {
8686
ESP.restart();
8787
}
8888

89+
Serial.printf("ESP-NOW version: %d, max data length: %d\n", ESP_NOW.getVersion(), ESP_NOW.getMaxDataLen());
90+
8991
Serial.println("Setup complete. Broadcasting messages every 5 seconds.");
9092
}
9193

libraries/ESP_NOW/examples/ESP_NOW_Broadcast_Slave/ESP_NOW_Broadcast_Slave.ino

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ void setup() {
104104
ESP.restart();
105105
}
106106

107+
Serial.printf("ESP-NOW version: %d, max data length: %d\n", ESP_NOW.getVersion(), ESP_NOW.getMaxDataLen());
108+
107109
// Register the new peer callback
108110
ESP_NOW.onNewPeer(register_new_master, nullptr);
109111

libraries/ESP_NOW/examples/ESP_NOW_Network/ESP_NOW_Network.ino

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,12 @@
7575
// The following struct is used to send data to the peer device.
7676
// We use the attribute "packed" to ensure that the struct is not padded (all data
7777
// is contiguous in the memory and without gaps).
78-
// The maximum size of the complete message is 250 bytes (ESP_NOW_MAX_DATA_LEN).
78+
// The maximum size of the payload is 250 bytes (ESP_NOW_MAX_DATA_LEN) for ESP-NOW v1.0.
79+
// For ESP-NOW v2.0, the maximum size of the payload is 1470 bytes (ESP_NOW_MAX_DATA_LEN_V2).
80+
// You can use ESP_NOW.getMaxDataLen() after calling ESP_NOW.begin() to get the maximum size
81+
// of the data that can be sent.
82+
// Read about the compatibility between ESP-NOW v1.0 and v2.0 in the ESP-IDF documentation:
83+
// https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/network/esp_now.html#frame-format
7984

8085
typedef struct {
8186
uint32_t count;
@@ -276,6 +281,8 @@ void setup() {
276281
fail_reboot();
277282
}
278283

284+
Serial.printf("ESP-NOW version: %d, max data length: %d\n", ESP_NOW.getVersion(), ESP_NOW.getMaxDataLen());
285+
279286
if (!broadcast_peer.begin()) {
280287
Serial.println("Failed to initialize broadcast peer");
281288
fail_reboot();

libraries/ESP_NOW/examples/ESP_NOW_Serial/ESP_NOW_Serial.ino

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ void setup() {
6464
// Start the ESP-NOW communication
6565
Serial.println("ESP-NOW communication starting...");
6666
NowSerial.begin(115200);
67+
Serial.printf("ESP-NOW version: %d, max data length: %d\n", ESP_NOW.getVersion(), ESP_NOW.getMaxDataLen());
6768
Serial.println("You can now send data to the peer device using the Serial Monitor.\n");
6869
}
6970

libraries/ESP_NOW/src/ESP32_NOW.cpp

Lines changed: 57 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,10 @@ static void _esp_now_tx_cb(const uint8_t *mac_addr, esp_now_send_status_t status
145145
}
146146
}
147147

148-
ESP_NOW_Class::ESP_NOW_Class() {}
148+
ESP_NOW_Class::ESP_NOW_Class() {
149+
max_data_len = 0;
150+
version = 0;
151+
}
149152

150153
ESP_NOW_Class::~ESP_NOW_Class() {}
151154

@@ -160,6 +163,23 @@ bool ESP_NOW_Class::begin(const uint8_t *pmk) {
160163
return false;
161164
}
162165

166+
// Unfortunately we can't get the ESP-NOW version before initializing the Wi-Fi
167+
uint32_t esp_now_version;
168+
err = esp_now_get_version(&esp_now_version);
169+
if (err != ESP_OK) {
170+
log_w("esp_now_get_version failed! Assuming ESP-NOW v1.0");
171+
esp_now_version = 1;
172+
}
173+
174+
if (esp_now_version == 1) {
175+
max_data_len = ESP_NOW_MAX_DATA_LEN;
176+
} else {
177+
max_data_len = ESP_NOW_MAX_DATA_LEN_V2;
178+
}
179+
180+
version = esp_now_version;
181+
log_i("ESP-NOW version: %lu, max_data_len: %lu", version, max_data_len);
182+
163183
_esp_now_has_begun = true;
164184

165185
memset(_esp_now_peers, 0, sizeof(ESP_NOW_Peer *) * ESP_NOW_MAX_TOTAL_PEER_NUM);
@@ -217,7 +237,7 @@ bool ESP_NOW_Class::end() {
217237
return true;
218238
}
219239

220-
int ESP_NOW_Class::getTotalPeerCount() {
240+
int ESP_NOW_Class::getTotalPeerCount() const {
221241
if (!_esp_now_has_begun) {
222242
return -1;
223243
}
@@ -230,7 +250,7 @@ int ESP_NOW_Class::getTotalPeerCount() {
230250
return num.total_num;
231251
}
232252

233-
int ESP_NOW_Class::getEncryptedPeerCount() {
253+
int ESP_NOW_Class::getEncryptedPeerCount() const {
234254
if (!_esp_now_has_begun) {
235255
return -1;
236256
}
@@ -243,16 +263,38 @@ int ESP_NOW_Class::getEncryptedPeerCount() {
243263
return num.encrypt_num;
244264
}
245265

266+
int ESP_NOW_Class::getMaxDataLen() const {
267+
if (max_data_len == 0) {
268+
log_e("ESP-NOW not initialized. Please call begin() first to get the max data length.");
269+
return -1;
270+
}
271+
272+
return max_data_len;
273+
}
274+
275+
int ESP_NOW_Class::getVersion() const {
276+
if (version == 0) {
277+
log_e("ESP-NOW not initialized. Please call begin() first to get the version.");
278+
return -1;
279+
}
280+
281+
return version;
282+
}
283+
246284
int ESP_NOW_Class::availableForWrite() {
247-
return ESP_NOW_MAX_DATA_LEN;
285+
int available = getMaxDataLen();
286+
if (available < 0) {
287+
return 0;
288+
}
289+
return available;
248290
}
249291

250292
size_t ESP_NOW_Class::write(const uint8_t *data, size_t len) {
251293
if (!_esp_now_has_begun) {
252294
return 0;
253295
}
254-
if (len > ESP_NOW_MAX_DATA_LEN) {
255-
len = ESP_NOW_MAX_DATA_LEN;
296+
if (len > max_data_len) {
297+
len = max_data_len;
256298
}
257299
esp_err_t result = esp_now_send(nullptr, data, len);
258300
if (result == ESP_OK) {
@@ -391,8 +433,15 @@ size_t ESP_NOW_Peer::send(const uint8_t *data, int len) {
391433
log_e("Peer not added.");
392434
return 0;
393435
}
394-
if (len > ESP_NOW_MAX_DATA_LEN) {
395-
len = ESP_NOW_MAX_DATA_LEN;
436+
437+
int max_data_len = ESP_NOW.getMaxDataLen();
438+
if (max_data_len < 0) {
439+
log_e("Error getting max data length.");
440+
return 0;
441+
}
442+
443+
if (len > max_data_len) {
444+
len = max_data_len;
396445
}
397446
esp_err_t result = esp_now_send(mac, data, len);
398447
if (result == ESP_OK) {

0 commit comments

Comments
 (0)