#include <esp_partition.h>
#include <esp_err.h>
#include <esp_log.h>

void* map_partition_to_memory(const char* partition_name) {
    const esp_partition_t* partition = esp_partition_find_first(
        ESP_PARTITION_TYPE_ANY, ESP_PARTITION_SUBTYPE_ANY, partition_name);
    if (!partition) {
        Serial.printf("Partition '%s' not found\n", partition_name);
        return NULL;
    }

    static const char store_data[] = "ESP-IDF Partition Memory Map Example";
    // Prepare data to be read later using the mapped address
    ESP_ERROR_CHECK(esp_partition_erase_range(partition, 0, partition->size));
    ESP_ERROR_CHECK(esp_partition_write(partition, 0, store_data, sizeof(store_data)));
    ESP_LOGI(TAG, "Written sample data to partition: %s", store_data);

    const void *map_ptr;
    esp_partition_mmap_handle_t map_handle;

    // Map the partition to data memory
    ESP_ERROR_CHECK(esp_partition_mmap(partition, 0, partition->size, ESP_PARTITION_MMAP_DATA, &map_ptr, &map_handle));
    Serial.printf("Mapped partition to data memory address %p\n", map_ptr);

    return (void*) map_ptr;
}

void setup() {
    Serial.begin(115200);

    // Example: Map a partition named 'lib'
    void* mapped_data = map_partition_to_memory("lib");
    if (mapped_data) {
        // Access the mapped data
        uint8_t* data_ptr = (uint8_t*)mapped_data;
        Serial.printf("1st block: %s\n", data_ptr);

        // Example of writing data
        data_ptr[0] = 0x41;  // Write 0xAA to the first byte

        char msg[] = "Annex RDS";
        esp_partition_write(partition, 0, msg, sizeof(msg));
        Serial.printf("2st block: %s\n", data_ptr);

    }

    // Additional setup code
}

void loop() {
    // Your loop code
}
esp:0
esp:2
esp:4
esp:5
esp:12
esp:13
esp:14
esp:15
esp:16
esp:17
esp:18
esp:19
esp:21
esp:22
esp:23
esp:25
esp:26
esp:27
esp:32
esp:33
esp:34
esp:35
esp:3V3
esp:EN
esp:VP
esp:VN
esp:GND.1
esp:D2
esp:D3
esp:CMD
esp:5V
esp:GND.2
esp:TX
esp:RX
esp:GND.3
esp:D1
esp:D0
esp:CLK