2026-01-20 16:55:17 +08:00

128 lines
3.7 KiB
C

/* volc rtc example code
This example code is in the Public Domain (or CC0 licensed, at your option.)
Unless required by applicable law or agreed to in writing, this
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied.
*/
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include "freertos/idf_additions.h"
#include "nvs_flash.h"
#include "esp_event.h"
#include "esp_netif.h"
#include "esp_netif_sntp.h"
#include "esp_log.h"
#include "esp_timer.h"
#include "audio_sys.h"
#include "audio_thread.h"
#include "esp_peripherals.h"
#include "periph_wifi.h"
#include "periph_spiffs.h"
#include "periph_sdcard.h"
#include "audio_mem.h"
#include "es8311.h"
#include "board.h"
#include "volc_rtc.h"
// #define ENABLE_TASK_MONITOR
static char *TAG = "main";
#if defined(ENABLE_TASK_MONITOR)
static void monitor_task(void *arg)
{
while (1) {
audio_sys_get_real_time_stats();
AUDIO_MEM_SHOW(TAG);
vTaskDelay(10000 / portTICK_RATE_MS);
}
}
#endif
// Pullup to fix the leakage issue of the ES8311 in standby mode.
static void set_gpio6_high(void)
{
gpio_config_t io_conf = {
.pin_bit_mask = 1ULL << GPIO_NUM_6,
.mode = GPIO_MODE_OUTPUT,
.pull_up_en = 0,
.pull_down_en = 0,
.intr_type = GPIO_INTR_DISABLE
};
gpio_config(&io_conf);
gpio_set_level(GPIO_NUM_6, 1);
}
void app_main()
{
ESP_ERROR_CHECK(nvs_flash_init());
ESP_ERROR_CHECK(esp_netif_init());
ESP_LOGI(TAG, "Initialize board peripherals");
esp_periph_config_t periph_cfg = DEFAULT_ESP_PERIPH_SET_CONFIG();
esp_periph_set_handle_t set = esp_periph_set_init(&periph_cfg);
#if CONFIG_ENABLE_RECORDER_DEBUG
// Initialize SD Card peripheral
audio_board_sdcard_init(set, SD_MODE_1_LINE);
#endif
periph_spiffs_cfg_t spiffs_cfg = {
.root = "/spiffs",
.partition_label = "spiffs_data",
.max_files = 5,
.format_if_mount_failed = true};
esp_periph_handle_t spiffs_handle = periph_spiffs_init(&spiffs_cfg);
esp_periph_start(set, spiffs_handle);
// Wait until spiffs is mounted
while (!periph_spiffs_is_mounted(spiffs_handle)) {
vTaskDelay(500 / portTICK_PERIOD_MS);
}
periph_wifi_cfg_t wifi_cfg = {
.wifi_config.sta.ssid = CONFIG_WIFI_SSID,
.wifi_config.sta.password = CONFIG_WIFI_PASSWORD,
};
esp_periph_handle_t wifi_handle = periph_wifi_init(&wifi_cfg);
esp_periph_start(set, wifi_handle);
periph_wifi_wait_for_connected(wifi_handle, portMAX_DELAY);
esp_sntp_config_t config = ESP_NETIF_SNTP_DEFAULT_CONFIG("pool.ntp.org");
esp_netif_sntp_init(&config);
// Wait for time to be set
int retry = 0;
const int retry_count = 5;
while (esp_netif_sntp_sync_wait(1000 / portTICK_PERIOD_MS) == ESP_ERR_TIMEOUT && ++retry < retry_count) {
ESP_LOGI(TAG, "Waiting for system time to be set... (%d/%d)", retry, retry_count);
}
// Set timezone to China Standard Time
time_t now = 0;
struct tm timeinfo = { 0 };
setenv("TZ", "CST-8", 1);
tzset();
localtime_r(&now, &timeinfo);
set_gpio6_high();
audio_board_handle_t board_handle = audio_board_init();
audio_hal_ctrl_codec(board_handle->audio_hal, AUDIO_HAL_CODEC_MODE_BOTH, AUDIO_HAL_CTRL_START);
audio_hal_set_volume(board_handle->audio_hal, 80);
es8311_set_mic_gain(ES8311_MIC_GAIN_0DB);
#if defined(ENABLE_TASK_MONITOR)
audio_thread_create(NULL, "monitor_task", monitor_task, NULL, 5 * 1024, 13, true, 0);
#endif
// Init byte rtc engine
volc_rtc_init();
}