Unverified Commit cadbad88 authored by thewavelength's avatar thewavelength Committed by GitHub

Add partition label argument to Update and ArduinoOTA classThe UpdateClass in...

Add partition label argument to Update and ArduinoOTA classThe UpdateClass in the Updater component has the ability to update data toa SPIFFS partition. It selects the first available partition using theESP-IDF esp_partition_find_first() function.That behaviour is problematic if one has multiple SPIFFS partitions.This change allows a user to pass the label argument (defaults to NULL)to UpdateClass::begin() so a specific SPIFFS partition can be updated.Additionally, ArduinoOTA can set this partition label using thenew method ArduinoOTAClass::setPartitionLabel which is optional.This change does not break compatibility. (#4442)

The UpdateClass in the Updater component has the ability to update data to
a SPIFFS partition. It selects the first available partition using the
ESP-IDF esp_partition_find_first() function.
That behaviour is problematic if one has multiple SPIFFS partitions.

This change allows a user to pass the label argument (defaults to NULL)
to UpdateClass::begin() so a specific SPIFFS partition can be updated.

Additionally, ArduinoOTA can set this partition label using the
new method ArduinoOTAClass::setPartitionLabel which is optional.

This change does not break compatibility.
parent 3cbfa2ff
...@@ -88,6 +88,17 @@ ArduinoOTAClass& ArduinoOTAClass::setPasswordHash(const char * password) { ...@@ -88,6 +88,17 @@ ArduinoOTAClass& ArduinoOTAClass::setPasswordHash(const char * password) {
return *this; return *this;
} }
ArduinoOTAClass& ArduinoOTAClass::setPartitionLabel(const char * partition_label) {
if (!_initialized && !_partition_label.length() && partition_label) {
_partition_label = partition_label;
}
return *this;
}
String ArduinoOTAClass::getPartitionLabel() {
return _partition_label;
}
ArduinoOTAClass& ArduinoOTAClass::setRebootOnSuccess(bool reboot){ ArduinoOTAClass& ArduinoOTAClass::setRebootOnSuccess(bool reboot){
_rebootOnSuccess = reboot; _rebootOnSuccess = reboot;
return *this; return *this;
...@@ -235,7 +246,8 @@ void ArduinoOTAClass::_onRx(){ ...@@ -235,7 +246,8 @@ void ArduinoOTAClass::_onRx(){
} }
void ArduinoOTAClass::_runUpdate() { void ArduinoOTAClass::_runUpdate() {
if (!Update.begin(_size, _cmd)) { const char *partition_label = _partition_label.length() ? _partition_label.c_str() : NULL;
if (!Update.begin(_size, _cmd, -1, LOW, partition_label)) {
log_e("Begin ERROR: %s", Update.errorString()); log_e("Begin ERROR: %s", Update.errorString());
...@@ -358,7 +370,7 @@ void ArduinoOTAClass::end() { ...@@ -358,7 +370,7 @@ void ArduinoOTAClass::end() {
void ArduinoOTAClass::handle() { void ArduinoOTAClass::handle() {
if (!_initialized) { if (!_initialized) {
return; return;
} }
if (_state == OTA_RUNUPDATE) { if (_state == OTA_RUNUPDATE) {
_runUpdate(); _runUpdate();
......
...@@ -44,6 +44,10 @@ class ArduinoOTAClass ...@@ -44,6 +44,10 @@ class ArduinoOTAClass
//Sets the password as above but in the form MD5(password). Default NULL //Sets the password as above but in the form MD5(password). Default NULL
ArduinoOTAClass& setPasswordHash(const char *password); ArduinoOTAClass& setPasswordHash(const char *password);
//Sets the partition label to write to when updating SPIFFS. Default NULL
ArduinoOTAClass &setPartitionLabel(const char *partition_label);
String getPartitionLabel();
//Sets if the device should be rebooted after successful update. Default true //Sets if the device should be rebooted after successful update. Default true
ArduinoOTAClass& setRebootOnSuccess(bool reboot); ArduinoOTAClass& setRebootOnSuccess(bool reboot);
...@@ -80,6 +84,7 @@ class ArduinoOTAClass ...@@ -80,6 +84,7 @@ class ArduinoOTAClass
int _port; int _port;
String _password; String _password;
String _hostname; String _hostname;
String _partition_label;
String _nonce; String _nonce;
WiFiUDP _udp_ota; WiFiUDP _udp_ota;
bool _initialized; bool _initialized;
......
...@@ -43,7 +43,7 @@ class UpdateClass { ...@@ -43,7 +43,7 @@ class UpdateClass {
Call this to check the space needed for the update Call this to check the space needed for the update
Will return false if there is not enough space Will return false if there is not enough space
*/ */
bool begin(size_t size=UPDATE_SIZE_UNKNOWN, int command = U_FLASH, int ledPin = -1, uint8_t ledOn = LOW); bool begin(size_t size=UPDATE_SIZE_UNKNOWN, int command = U_FLASH, int ledPin = -1, uint8_t ledOn = LOW, const char *label = NULL);
/* /*
Writes a buffer to the flash and increments the address Writes a buffer to the flash and increments the address
......
...@@ -104,7 +104,7 @@ bool UpdateClass::rollBack(){ ...@@ -104,7 +104,7 @@ bool UpdateClass::rollBack(){
return _partitionIsBootable(partition) && !esp_ota_set_boot_partition(partition); return _partitionIsBootable(partition) && !esp_ota_set_boot_partition(partition);
} }
bool UpdateClass::begin(size_t size, int command, int ledPin, uint8_t ledOn) { bool UpdateClass::begin(size_t size, int command, int ledPin, uint8_t ledOn, const char *label) {
if(_size > 0){ if(_size > 0){
log_w("already running"); log_w("already running");
return false; return false;
...@@ -132,7 +132,7 @@ bool UpdateClass::begin(size_t size, int command, int ledPin, uint8_t ledOn) { ...@@ -132,7 +132,7 @@ bool UpdateClass::begin(size_t size, int command, int ledPin, uint8_t ledOn) {
log_d("OTA Partition: %s", _partition->label); log_d("OTA Partition: %s", _partition->label);
} }
else if (command == U_SPIFFS) { else if (command == U_SPIFFS) {
_partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_SPIFFS, NULL); _partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_SPIFFS, label);
if(!_partition){ if(!_partition){
_error = UPDATE_ERROR_NO_PARTITION; _error = UPDATE_ERROR_NO_PARTITION;
return false; return false;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment