You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
185 lines
6.3 KiB
C
185 lines
6.3 KiB
C
/* SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include "freertos/FreeRTOS.h"
|
|
#include "freertos/task.h"
|
|
#include "freertos/event_groups.h"
|
|
#include "esp_log.h"
|
|
#include "nvs.h"
|
|
#include "nvs_flash.h"
|
|
#include "esp_tinyuf2.h"
|
|
#include "ui.h"
|
|
#include "bsp/esp-bsp.h"
|
|
#include "esp_ota_ops.h"
|
|
|
|
#define NVS_MODIFIED_BIT BIT0
|
|
#define SSID_SIZE 32
|
|
#define PASSWORD_SIZE 64
|
|
#define KEY_SIZE 64
|
|
#define URL_SIZE 64
|
|
|
|
static const char *TAG = "ChatGPT_NVS";
|
|
|
|
static EventGroupHandle_t s_event_group;
|
|
static nvs_handle_t my_handle;
|
|
static size_t buf_len_long;
|
|
|
|
static void uf2_nvs_modified_cb()
|
|
{
|
|
ESP_LOGI(TAG, "uf2 nvs modified");
|
|
xEventGroupSetBits(s_event_group, NVS_MODIFIED_BIT);
|
|
}
|
|
|
|
void app_main(void)
|
|
{
|
|
const esp_partition_t *update_partition = esp_partition_find_first(ESP_PARTITION_TYPE_APP, ESP_PARTITION_SUBTYPE_APP_FACTORY, NULL);
|
|
ESP_LOGI(TAG, "Switch to partition factory");
|
|
esp_ota_set_boot_partition(update_partition);
|
|
esp_err_t err = ESP_OK;
|
|
|
|
const char *uf2_nvs_partition = "nvs";
|
|
const char *uf2_nvs_namespace = "configuration";
|
|
|
|
char ssid[SSID_SIZE] = {0};
|
|
char password[PASSWORD_SIZE] = {0};
|
|
char key[KEY_SIZE] = {0};
|
|
char url[URL_SIZE] = {0};
|
|
|
|
s_event_group = xEventGroupCreate();
|
|
|
|
// Initialize NVS
|
|
err = nvs_flash_init();
|
|
if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) {
|
|
ESP_ERROR_CHECK(nvs_flash_erase());
|
|
err = nvs_flash_init();
|
|
}
|
|
ESP_ERROR_CHECK(err);
|
|
|
|
err = nvs_open_from_partition(uf2_nvs_partition, uf2_nvs_namespace, NVS_READWRITE, &my_handle);
|
|
if (err != ESP_OK) {
|
|
printf("Error (%s) opening NVS handle!\n", esp_err_to_name(err));
|
|
} else {
|
|
buf_len_long = sizeof(ssid);
|
|
err = nvs_get_str(my_handle, "ssid", ssid, &buf_len_long);
|
|
if (err != ESP_OK || buf_len_long == 0) {
|
|
ESP_ERROR_CHECK(nvs_set_str(my_handle, "ssid", CONFIG_ESP_WIFI_SSID));
|
|
ESP_ERROR_CHECK(nvs_commit(my_handle));
|
|
ESP_LOGI(TAG, "no ssid, give a init value to nvs");
|
|
} else {
|
|
ESP_LOGI(TAG, "stored ssid:%s", ssid);
|
|
}
|
|
|
|
buf_len_long = sizeof(password);
|
|
err = nvs_get_str(my_handle, "password", password, &buf_len_long);
|
|
if (err != ESP_OK || buf_len_long == 0) {
|
|
ESP_ERROR_CHECK(nvs_set_str(my_handle, "password", CONFIG_ESP_WIFI_PASSWORD));
|
|
ESP_ERROR_CHECK(nvs_commit(my_handle));
|
|
ESP_LOGI(TAG, "no password, give a init value to nvs");
|
|
} else {
|
|
ESP_LOGI(TAG, "stored password:%s", password);
|
|
}
|
|
|
|
buf_len_long = sizeof(key);
|
|
err = nvs_get_str(my_handle, "ChatGPT_key", key, &buf_len_long);
|
|
if (err != ESP_OK || buf_len_long == 0) {
|
|
ESP_ERROR_CHECK(nvs_set_str(my_handle, "ChatGPT_key", CONFIG_OPENAI_API_KEY));
|
|
ESP_ERROR_CHECK(nvs_commit(my_handle));
|
|
ESP_LOGI(TAG, "no ChatGPT key, give a init value to key");
|
|
} else {
|
|
ESP_LOGI(TAG, "stored ChatGPT key:%s", key);
|
|
}
|
|
|
|
buf_len_long = sizeof(url);
|
|
err = nvs_get_str(my_handle, "Base_url", url, &buf_len_long);
|
|
if (err != ESP_OK || buf_len_long == 0) {
|
|
ESP_ERROR_CHECK(nvs_set_str(my_handle, "Base_url", CONFIG_OPENAI_URL));
|
|
ESP_ERROR_CHECK(nvs_commit(my_handle));
|
|
ESP_LOGI(TAG, "no base url, give a init value to key");
|
|
} else {
|
|
ESP_LOGI(TAG, "stored base url:%s", url);
|
|
}
|
|
}
|
|
nvs_close(my_handle);
|
|
|
|
/* install UF2 NVS */
|
|
tinyuf2_nvs_config_t nvs_config = DEFAULT_TINYUF2_NVS_CONFIG();
|
|
nvs_config.part_name = uf2_nvs_partition;
|
|
nvs_config.namespace_name = uf2_nvs_namespace;
|
|
nvs_config.modified_cb = uf2_nvs_modified_cb;
|
|
|
|
ESP_ERROR_CHECK(esp_tinyuf2_install(NULL, &nvs_config));
|
|
|
|
bsp_i2c_init();
|
|
|
|
bsp_display_cfg_t cfg = {
|
|
.lvgl_port_cfg = ESP_LVGL_PORT_INIT_CONFIG(),
|
|
.buffer_size = BSP_LCD_H_RES * CONFIG_BSP_LCD_DRAW_BUF_HEIGHT,
|
|
.double_buffer = 0,
|
|
.flags = {
|
|
.buff_dma = true,
|
|
}
|
|
};
|
|
bsp_display_start_with_config(&cfg);
|
|
bsp_display_backlight_on();
|
|
ui_init();
|
|
|
|
while (1) {
|
|
EventBits_t bits = xEventGroupWaitBits(s_event_group, NVS_MODIFIED_BIT,
|
|
pdTRUE, pdFALSE, portMAX_DELAY);
|
|
|
|
if (bits & NVS_MODIFIED_BIT) {
|
|
esp_err_t err = nvs_open_from_partition(uf2_nvs_partition, uf2_nvs_namespace, NVS_READONLY, &my_handle);
|
|
|
|
if (err != ESP_OK) {
|
|
ESP_LOGE(TAG, "Failed to open NVS partition: %s", esp_err_to_name(err));
|
|
// Handle the error or take appropriate action
|
|
return;
|
|
}
|
|
|
|
size_t buf_len_long = sizeof(ssid);
|
|
err = nvs_get_str(my_handle, "ssid", ssid, &buf_len_long);
|
|
if (err != ESP_OK) {
|
|
ESP_LOGE(TAG, "Failed to read 'ssid' from NVS: %s", esp_err_to_name(err));
|
|
nvs_close(my_handle);
|
|
return;
|
|
}
|
|
ESP_LOGD(TAG, "SSID", ssid);
|
|
|
|
buf_len_long = sizeof(password);
|
|
err = nvs_get_str(my_handle, "password", password, &buf_len_long);
|
|
if (err != ESP_OK) {
|
|
ESP_LOGE(TAG, "Failed to read 'password' from NVS: %s", esp_err_to_name(err));
|
|
nvs_close(my_handle);
|
|
return;
|
|
}
|
|
ESP_LOGD(TAG, "Password", password);
|
|
|
|
buf_len_long = sizeof(key);
|
|
err = nvs_get_str(my_handle, "ChatGPT_key", key, &buf_len_long);
|
|
if (err != ESP_OK) {
|
|
ESP_LOGE(TAG, "Failed to read 'ChatGPT_key' from NVS: %s", esp_err_to_name(err));
|
|
nvs_close(my_handle);
|
|
return;
|
|
}
|
|
ESP_LOGD(TAG, "OpenAI Key", key);
|
|
|
|
buf_len_long = sizeof(url);
|
|
err = nvs_get_str(my_handle, "Base_url", url, &buf_len_long);
|
|
if (err != ESP_OK) {
|
|
ESP_LOGE(TAG, "Failed to read 'BASE_url' from NVS: %s", esp_err_to_name(err));
|
|
nvs_close(my_handle);
|
|
return;
|
|
}
|
|
ESP_LOGD(TAG, "BASE url", url);
|
|
nvs_close(my_handle);
|
|
}
|
|
|
|
vTaskDelay(pdMS_TO_TICKS(1000));
|
|
}
|
|
|
|
}
|