diff --git a/esp_delta_ota/CHANGELOG.md b/esp_delta_ota/CHANGELOG.md index 14cd5993c5..4a09bef01a 100644 --- a/esp_delta_ota/CHANGELOG.md +++ b/esp_delta_ota/CHANGELOG.md @@ -1,3 +1,8 @@ +## 1.1.4 + +### Enhancements: +- Added support to pass user data to read callback with new callback function: `src_read_cb_with_user_ctx_t` + ## 1.1.3 ### Bugfixes: diff --git a/esp_delta_ota/idf_component.yml b/esp_delta_ota/idf_component.yml index b4caab573a..825a745ebc 100644 --- a/esp_delta_ota/idf_component.yml +++ b/esp_delta_ota/idf_component.yml @@ -1,4 +1,4 @@ -version: "1.1.3" +version: "1.1.4" description: "ESP Delta OTA Library" url: https://github.com/espressif/idf-extra-components/tree/master/esp_delta_ota dependencies: diff --git a/esp_delta_ota/include/esp_delta_ota.h b/esp_delta_ota/include/esp_delta_ota.h index 389e367fa0..df92649cee 100644 --- a/esp_delta_ota/include/esp_delta_ota.h +++ b/esp_delta_ota/include/esp_delta_ota.h @@ -23,6 +23,7 @@ typedef void *esp_delta_ota_handle_t; // Callback for reading the source data typedef esp_err_t (*src_read_cb_t)(uint8_t *buf_p, size_t size, int src_offset); +typedef esp_err_t (*src_read_cb_with_user_ctx_t)(uint8_t *buf_p, size_t size, int src_offset, void *user_data); // Callback for working on the data generated by applying patch on the source data typedef esp_err_t (*merged_stream_write_cb_t)(const uint8_t *buf_p, size_t size); @@ -30,7 +31,10 @@ typedef esp_err_t (*merged_stream_write_cb_with_user_ctx_t)(const uint8_t *buf_p typedef struct esp_delta_ota_cfg { void *user_data; /*!< User Data */ - src_read_cb_t read_cb; /*!< Read Callback */ + union { + src_read_cb_t read_cb; /*!< Read Callback */ + src_read_cb_with_user_ctx_t read_cb_with_user_data; /*!< Read Callback with user data */ + }; union { merged_stream_write_cb_with_user_ctx_t write_cb_with_user_data; /*!< Write Callback with user data */ merged_stream_write_cb_t write_cb DEPRECATED_ATTRIBUTE; /*!< Write Callback */ diff --git a/esp_delta_ota/src/esp_delta_ota.c b/esp_delta_ota/src/esp_delta_ota.c index 1b82477d3e..fa476fb4e8 100644 --- a/esp_delta_ota/src/esp_delta_ota.c +++ b/esp_delta_ota/src/esp_delta_ota.c @@ -19,7 +19,10 @@ static const char *TAG = "esp_delta_ota"; typedef struct esp_delta_ota_ctx { void *user_data; - src_read_cb_t read_cb; + union { + src_read_cb_t read_cb; /*!< Read Callback */ + src_read_cb_with_user_ctx_t read_cb_with_user_data; /*!< Read Callback with user data */ + }; union { merged_stream_write_cb_with_user_ctx_t write_cb_with_user_data; merged_stream_write_cb_t write_cb; @@ -57,11 +60,21 @@ static int esp_delta_ota_read_cb(void *arg_p, uint8_t *buf_p, size_t size) return -ESP_ERR_INVALID_ARG; } esp_delta_ota_ctx *handle = (esp_delta_ota_ctx *)arg_p; - esp_err_t err = handle->read_cb(buf_p, size, handle->src_offset); - if (err != ESP_OK) { - ESP_LOGE(TAG, "Error in read_cb(): %s", esp_err_to_name(err)); - return ESP_FAIL; + esp_err_t err = ESP_OK; + if (!handle->user_data) { + err = handle->read_cb(buf_p, size, handle->src_offset); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Error in read_cb(): %s", esp_err_to_name(err)); + return ESP_FAIL; + } + } else { + err = handle->read_cb_with_user_data(buf_p, size, handle->src_offset, handle->user_data); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Error in read_cb_with_user_data(): %s", esp_err_to_name(err)); + return ESP_FAIL; + } } + handle->src_offset += size; return ESP_OK; }