Format code.
This commit is contained in:
parent
8a2b1dd2e9
commit
ef2a154c91
291
main/app_sr.c
291
main/app_sr.c
|
|
@ -1,169 +1,184 @@
|
|||
|
||||
#include "app_sr.h"
|
||||
#include "esp_log.h"
|
||||
#include "esp_wn_iface.h"
|
||||
#include "esp_wn_models.h"
|
||||
|
||||
#include "app_ui.h"
|
||||
#include "audio_player.h"
|
||||
#include "esp32_s3_szp.h"
|
||||
#include "esp_afe_sr_iface.h"
|
||||
#include "esp_afe_sr_models.h"
|
||||
#include "esp_log.h"
|
||||
#include "esp_mn_iface.h"
|
||||
#include "esp_mn_models.h"
|
||||
#include "esp_mn_speech_commands.h"
|
||||
#include "model_path.h"
|
||||
#include "esp32_s3_szp.h"
|
||||
#include "esp_process_sdkconfig.h"
|
||||
#include "esp_wn_iface.h"
|
||||
#include "esp_wn_models.h"
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/task.h"
|
||||
#include "esp_process_sdkconfig.h"
|
||||
#include "audio_player.h"
|
||||
#include "app_ui.h"
|
||||
#include "model_path.h"
|
||||
|
||||
static const char *TAG = "app_sr";
|
||||
static const char* TAG = "app_sr";
|
||||
|
||||
srmodel_list_t *models = NULL;
|
||||
static esp_afe_sr_iface_t *afe_handle = NULL;
|
||||
static esp_afe_sr_data_t *afe_data = NULL;
|
||||
srmodel_list_t* models = NULL;
|
||||
static esp_afe_sr_iface_t* afe_handle = NULL;
|
||||
static esp_afe_sr_data_t* afe_data = NULL;
|
||||
|
||||
int detect_flag = 0;
|
||||
static volatile int task_flag = 0;
|
||||
|
||||
void feed_Task(void *arg)
|
||||
{
|
||||
esp_afe_sr_data_t *afe_data = arg; // 获取参数
|
||||
int audio_chunksize = afe_handle->get_feed_chunksize(afe_data); // 获取帧长度
|
||||
int nch = afe_handle->get_channel_num(afe_data); // 获取声道数
|
||||
int feed_channel = bsp_get_feed_channel(); // 获取ADC输入通道数
|
||||
assert(nch <= feed_channel);
|
||||
int16_t *i2s_buff = heap_caps_malloc(audio_chunksize * sizeof(int16_t) * feed_channel, MALLOC_CAP_8BIT | MALLOC_CAP_SPIRAM); // 分配获取I2S数据的缓存大小
|
||||
assert(i2s_buff);
|
||||
void feed_Task(void* arg) {
|
||||
esp_afe_sr_data_t* afe_data = arg; // 获取参数
|
||||
int audio_chunksize = afe_handle->get_feed_chunksize(afe_data); // 获取帧长度
|
||||
int nch = afe_handle->get_channel_num(afe_data); // 获取声道数
|
||||
int feed_channel = bsp_get_feed_channel(); // 获取ADC输入通道数
|
||||
assert(nch <= feed_channel);
|
||||
int16_t* i2s_buff = heap_caps_malloc(
|
||||
audio_chunksize * sizeof(int16_t) * feed_channel,
|
||||
MALLOC_CAP_8BIT | MALLOC_CAP_SPIRAM); // 分配获取I2S数据的缓存大小
|
||||
assert(i2s_buff);
|
||||
|
||||
while (task_flag) {
|
||||
bsp_get_feed_data(false, i2s_buff, audio_chunksize * sizeof(int16_t) * feed_channel); // 获取I2S数据
|
||||
while (task_flag) {
|
||||
bsp_get_feed_data(
|
||||
false, i2s_buff,
|
||||
audio_chunksize * sizeof(int16_t) * feed_channel); // 获取I2S数据
|
||||
|
||||
afe_handle->feed(afe_data, i2s_buff); // 把获取到的I2S数据输入给afe_data
|
||||
}
|
||||
if (i2s_buff) {
|
||||
free(i2s_buff);
|
||||
i2s_buff = NULL;
|
||||
}
|
||||
vTaskDelete(NULL);
|
||||
afe_handle->feed(afe_data, i2s_buff); // 把获取到的I2S数据输入给afe_data
|
||||
}
|
||||
if (i2s_buff) {
|
||||
free(i2s_buff);
|
||||
i2s_buff = NULL;
|
||||
}
|
||||
vTaskDelete(NULL);
|
||||
}
|
||||
|
||||
void detect_Task(void *arg)
|
||||
{
|
||||
esp_afe_sr_data_t *afe_data = arg; // 接收参数
|
||||
int afe_chunksize = afe_handle->get_fetch_chunksize(afe_data); // 获取fetch帧长度
|
||||
char *mn_name = esp_srmodel_filter(models, ESP_MN_PREFIX, ESP_MN_CHINESE); // 初始化命令词模型
|
||||
printf("multinet:%s\n", mn_name); // 打印命令词模型名称
|
||||
esp_mn_iface_t *multinet = esp_mn_handle_from_name(mn_name);
|
||||
model_iface_data_t *model_data = multinet->create(mn_name, 6000); // 设置唤醒后等待事件 6000代表6000毫秒
|
||||
esp_mn_commands_clear(); // 清除当前的命令词列表
|
||||
esp_mn_commands_add(1, "bo fang yin yue"); // 播放音乐
|
||||
esp_mn_commands_add(2, "zan ting"); // 暂停
|
||||
esp_mn_commands_add(3, "ji xu"); // 继续
|
||||
esp_mn_commands_add(4, "shang yi shou"); // 上一首
|
||||
esp_mn_commands_add(5, "xia yi shou"); // 下一首
|
||||
esp_mn_commands_add(6, "sheng yin da yi dian"); // 声音大一点
|
||||
esp_mn_commands_add(7, "sheng yin xiao yi dian"); // 声音小一点
|
||||
esp_mn_commands_update(); // 更新命令词
|
||||
int mu_chunksize = multinet->get_samp_chunksize(model_data); // 获取samp帧长度
|
||||
assert(mu_chunksize == afe_chunksize);
|
||||
void detect_Task(void* arg) {
|
||||
esp_afe_sr_data_t* afe_data = arg; // 接收参数
|
||||
int afe_chunksize =
|
||||
afe_handle->get_fetch_chunksize(afe_data); // 获取fetch帧长度
|
||||
char* mn_name = esp_srmodel_filter(models, ESP_MN_PREFIX,
|
||||
ESP_MN_CHINESE); // 初始化命令词模型
|
||||
printf("multinet:%s\n", mn_name); // 打印命令词模型名称
|
||||
esp_mn_iface_t* multinet = esp_mn_handle_from_name(mn_name);
|
||||
model_iface_data_t* model_data =
|
||||
multinet->create(mn_name, 6000); // 设置唤醒后等待事件 6000代表6000毫秒
|
||||
esp_mn_commands_clear(); // 清除当前的命令词列表
|
||||
esp_mn_commands_add(1, "bo fang yin yue"); // 播放音乐
|
||||
esp_mn_commands_add(2, "zan ting"); // 暂停
|
||||
esp_mn_commands_add(3, "ji xu"); // 继续
|
||||
esp_mn_commands_add(4, "shang yi shou"); // 上一首
|
||||
esp_mn_commands_add(5, "xia yi shou"); // 下一首
|
||||
esp_mn_commands_add(6, "sheng yin da yi dian"); // 声音大一点
|
||||
esp_mn_commands_add(7, "sheng yin xiao yi dian"); // 声音小一点
|
||||
esp_mn_commands_update(); // 更新命令词
|
||||
int mu_chunksize =
|
||||
multinet->get_samp_chunksize(model_data); // 获取samp帧长度
|
||||
assert(mu_chunksize == afe_chunksize);
|
||||
|
||||
// 打印所有的命令
|
||||
multinet->print_active_speech_commands(model_data);
|
||||
printf("------------detect start------------\n");
|
||||
// 打印所有的命令
|
||||
multinet->print_active_speech_commands(model_data);
|
||||
printf("------------detect start------------\n");
|
||||
|
||||
while (task_flag) {
|
||||
afe_fetch_result_t* res = afe_handle->fetch(afe_data); // 获取模型输出结果
|
||||
if (!res || res->ret_value == ESP_FAIL) {
|
||||
printf("fetch error!\n");
|
||||
while (task_flag) {
|
||||
afe_fetch_result_t* res = afe_handle->fetch(afe_data); // 获取模型输出结果
|
||||
if (!res || res->ret_value == ESP_FAIL) {
|
||||
printf("fetch error!\n");
|
||||
break;
|
||||
}
|
||||
if (res->wakeup_state == WAKENET_DETECTED) {
|
||||
printf("WAKEWORD DETECTED\n");
|
||||
multinet->clean(model_data); // clean all status of multinet
|
||||
} else if (res->wakeup_state == WAKENET_CHANNEL_VERIFIED) { // 检测到唤醒词
|
||||
// play_voice = -1;
|
||||
afe_handle->disable_wakenet(afe_data); // 关闭唤醒词识别
|
||||
detect_flag = 1; // 标记已检测到唤醒词
|
||||
ai_gui_in(); // AI人出现
|
||||
printf("AFE_FETCH_CHANNEL_VERIFIED, channel index: %d\n",
|
||||
res->trigger_channel_id);
|
||||
}
|
||||
|
||||
if (detect_flag == 1) {
|
||||
esp_mn_state_t mn_state =
|
||||
multinet->detect(model_data, res->data); // 检测命令词
|
||||
|
||||
if (mn_state == ESP_MN_STATE_DETECTING) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (mn_state == ESP_MN_STATE_DETECTED) { // 已检测到命令词
|
||||
esp_mn_results_t* mn_result =
|
||||
multinet->get_results(model_data); // 获取检测词结果
|
||||
for (int i = 0; i < mn_result->num; i++) { // 打印获取到的命令词
|
||||
printf("TOP %d, command_id: %d, phrase_id: %d, string:%s prob: %f\n",
|
||||
i + 1, mn_result->command_id[i], mn_result->phrase_id[i],
|
||||
mn_result->string, mn_result->prob[i]);
|
||||
}
|
||||
// 根据命令词 执行相应动作
|
||||
switch (mn_result->command_id[0]) {
|
||||
case 1: // bo fang yin yue 播放音乐
|
||||
ai_play();
|
||||
break;
|
||||
case 2: // zan ting 暂停
|
||||
ai_pause();
|
||||
break;
|
||||
case 3: // ji xu 继续
|
||||
ai_resume();
|
||||
break;
|
||||
case 4: // shang yi shou 上一首
|
||||
ai_prev_music();
|
||||
break;
|
||||
case 5: // xia yi shou 下一首
|
||||
ai_next_music();
|
||||
break;
|
||||
case 6: // sheng yin da yi dian 声音大一点
|
||||
ai_volume_up();
|
||||
break;
|
||||
case 7: // sheng yin xiao yi dian 声音小一点
|
||||
ai_volume_down();
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (res->wakeup_state == WAKENET_DETECTED) {
|
||||
printf("WAKEWORD DETECTED\n");
|
||||
multinet->clean(model_data); // clean all status of multinet
|
||||
} else if (res->wakeup_state == WAKENET_CHANNEL_VERIFIED) { // 检测到唤醒词
|
||||
// play_voice = -1;
|
||||
afe_handle->disable_wakenet(afe_data); // 关闭唤醒词识别
|
||||
detect_flag = 1; // 标记已检测到唤醒词
|
||||
ai_gui_in(); // AI人出现
|
||||
printf("AFE_FETCH_CHANNEL_VERIFIED, channel index: %d\n", res->trigger_channel_id);
|
||||
}
|
||||
printf("\n-----------listening-----------\n");
|
||||
}
|
||||
|
||||
if (detect_flag == 1) {
|
||||
esp_mn_state_t mn_state = multinet->detect(model_data, res->data); // 检测命令词
|
||||
|
||||
if (mn_state == ESP_MN_STATE_DETECTING) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (mn_state == ESP_MN_STATE_DETECTED) { // 已检测到命令词
|
||||
esp_mn_results_t *mn_result = multinet->get_results(model_data); // 获取检测词结果
|
||||
for (int i = 0; i < mn_result->num; i++) { // 打印获取到的命令词
|
||||
printf("TOP %d, command_id: %d, phrase_id: %d, string:%s prob: %f\n",
|
||||
i+1, mn_result->command_id[i], mn_result->phrase_id[i], mn_result->string, mn_result->prob[i]);
|
||||
}
|
||||
// 根据命令词 执行相应动作
|
||||
switch (mn_result->command_id[0])
|
||||
{
|
||||
case 1: // bo fang yin yue 播放音乐
|
||||
ai_play();
|
||||
break;
|
||||
case 2: // zan ting 暂停
|
||||
ai_pause();
|
||||
break;
|
||||
case 3: // ji xu 继续
|
||||
ai_resume();
|
||||
break;
|
||||
case 4: // shang yi shou 上一首
|
||||
ai_prev_music();
|
||||
break;
|
||||
case 5: // xia yi shou 下一首
|
||||
ai_next_music();
|
||||
break;
|
||||
case 6: // sheng yin da yi dian 声音大一点
|
||||
ai_volume_up();
|
||||
break;
|
||||
case 7: // sheng yin xiao yi dian 声音小一点
|
||||
ai_volume_down();
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
printf("\n-----------listening-----------\n");
|
||||
}
|
||||
|
||||
if (mn_state == ESP_MN_STATE_TIMEOUT) { // 达到最大检测命令词时间
|
||||
esp_mn_results_t *mn_result = multinet->get_results(model_data);
|
||||
printf("timeout, string:%s\n", mn_result->string);
|
||||
afe_handle->enable_wakenet(afe_data); // 重新打开唤醒词识别
|
||||
detect_flag = 0; // 清除标记
|
||||
printf("\n-----------awaits to be waken up-----------\n");
|
||||
ai_gui_out(); // AI人退出
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (mn_state == ESP_MN_STATE_TIMEOUT) { // 达到最大检测命令词时间
|
||||
esp_mn_results_t* mn_result = multinet->get_results(model_data);
|
||||
printf("timeout, string:%s\n", mn_result->string);
|
||||
afe_handle->enable_wakenet(afe_data); // 重新打开唤醒词识别
|
||||
detect_flag = 0; // 清除标记
|
||||
printf("\n-----------awaits to be waken up-----------\n");
|
||||
ai_gui_out(); // AI人退出
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (model_data) {
|
||||
multinet->destroy(model_data);
|
||||
model_data = NULL;
|
||||
}
|
||||
printf("detect exit\n");
|
||||
vTaskDelete(NULL);
|
||||
}
|
||||
if (model_data) {
|
||||
multinet->destroy(model_data);
|
||||
model_data = NULL;
|
||||
}
|
||||
printf("detect exit\n");
|
||||
vTaskDelete(NULL);
|
||||
}
|
||||
|
||||
void app_sr_init(void)
|
||||
{
|
||||
models = esp_srmodel_init("model"); // 获取模型 名称“model”和分区表中装载模型的名称一致
|
||||
void app_sr_init(void) {
|
||||
models = esp_srmodel_init(
|
||||
"model"); // 获取模型 名称“model”和分区表中装载模型的名称一致
|
||||
|
||||
afe_handle = (esp_afe_sr_iface_t *)&ESP_AFE_SR_HANDLE; // 先配置afe句柄 随后才可以调用afe接口
|
||||
afe_config_t afe_config = AFE_CONFIG_DEFAULT(); // 配置afe
|
||||
afe_handle =
|
||||
(esp_afe_sr_iface_t*)&ESP_AFE_SR_HANDLE; // 先配置afe句柄
|
||||
// 随后才可以调用afe接口
|
||||
afe_config_t afe_config = AFE_CONFIG_DEFAULT(); // 配置afe
|
||||
|
||||
afe_config.wakenet_model_name = esp_srmodel_filter(models, ESP_WN_PREFIX, NULL); // 配置唤醒模型 必须在create_from_config之前配置
|
||||
afe_data = afe_handle->create_from_config(&afe_config); // 创建afe_data
|
||||
ESP_LOGI(TAG, "wakenet:%s", afe_config.wakenet_model_name); // 打印唤醒名称
|
||||
afe_config.wakenet_model_name = esp_srmodel_filter(
|
||||
models, ESP_WN_PREFIX,
|
||||
NULL); // 配置唤醒模型 必须在create_from_config之前配置
|
||||
afe_data = afe_handle->create_from_config(&afe_config); // 创建afe_data
|
||||
ESP_LOGI(TAG, "wakenet:%s", afe_config.wakenet_model_name); // 打印唤醒名称
|
||||
|
||||
task_flag = 1;
|
||||
xTaskCreatePinnedToCore(&detect_Task, "detect", 8 * 1024, (void*)afe_data, 5, NULL, 1);
|
||||
xTaskCreatePinnedToCore(&feed_Task, "feed", 8 * 1024, (void*)afe_data, 5, NULL, 0);
|
||||
task_flag = 1;
|
||||
xTaskCreatePinnedToCore(&detect_Task, "detect", 8 * 1024, (void*)afe_data, 5,
|
||||
NULL, 1);
|
||||
xTaskCreatePinnedToCore(&feed_Task, "feed", 8 * 1024, (void*)afe_data, 5,
|
||||
NULL, 0);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3,8 +3,3 @@
|
|||
#include <stdbool.h>
|
||||
|
||||
void app_sr_init(void);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
812
main/app_ui.c
812
main/app_ui.c
|
|
@ -1,527 +1,535 @@
|
|||
#include "app_ui.h"
|
||||
|
||||
#include <dirent.h>
|
||||
|
||||
#include "audio_player.h"
|
||||
#include "esp32_s3_szp.h"
|
||||
#include "file_iterator.h"
|
||||
#include "string.h"
|
||||
#include <dirent.h>
|
||||
|
||||
static const char *TAG = "app_ui";
|
||||
static const char* TAG = "app_ui";
|
||||
|
||||
static audio_player_config_t player_config = {0};
|
||||
static uint8_t g_sys_volume = VOLUME_DEFAULT;
|
||||
static file_iterator_instance_t *file_iterator = NULL;
|
||||
static file_iterator_instance_t* file_iterator = NULL;
|
||||
|
||||
lv_obj_t *music_list;
|
||||
lv_obj_t *label_play_pause;
|
||||
lv_obj_t *btn_play_pause;
|
||||
lv_obj_t *volume_slider;
|
||||
lv_obj_t* music_list;
|
||||
lv_obj_t* label_play_pause;
|
||||
lv_obj_t* btn_play_pause;
|
||||
lv_obj_t* volume_slider;
|
||||
|
||||
// 播放指定序号的音乐
|
||||
static void play_index(int index)
|
||||
{
|
||||
ESP_LOGI(TAG, "play_index(%d)", index);
|
||||
static void play_index(int index) {
|
||||
ESP_LOGI(TAG, "play_index(%d)", index);
|
||||
|
||||
char filename[128];
|
||||
int retval = file_iterator_get_full_path_from_index(file_iterator, index, filename, sizeof(filename));
|
||||
if (retval == 0) {
|
||||
ESP_LOGE(TAG, "unable to retrieve filename");
|
||||
return;
|
||||
}
|
||||
char filename[128];
|
||||
int retval = file_iterator_get_full_path_from_index(
|
||||
file_iterator, index, filename, sizeof(filename));
|
||||
if (retval == 0) {
|
||||
ESP_LOGE(TAG, "unable to retrieve filename");
|
||||
return;
|
||||
}
|
||||
|
||||
FILE *fp = fopen(filename, "rb");
|
||||
if (fp) {
|
||||
ESP_LOGI(TAG, "Playing '%s'", filename);
|
||||
audio_player_play(fp);
|
||||
} else {
|
||||
ESP_LOGE(TAG, "unable to open index %d, filename '%s'", index, filename);
|
||||
}
|
||||
FILE* fp = fopen(filename, "rb");
|
||||
if (fp) {
|
||||
ESP_LOGI(TAG, "Playing '%s'", filename);
|
||||
audio_player_play(fp);
|
||||
} else {
|
||||
ESP_LOGE(TAG, "unable to open index %d, filename '%s'", index, filename);
|
||||
}
|
||||
}
|
||||
|
||||
// 设置声音处理函数
|
||||
static esp_err_t _audio_player_mute_fn(AUDIO_PLAYER_MUTE_SETTING setting)
|
||||
{
|
||||
esp_err_t ret = ESP_OK;
|
||||
// 获取当前音量
|
||||
// uint8_t volume = get_sys_volume();
|
||||
// 判断是否需要静音
|
||||
bsp_codec_mute_set(setting == AUDIO_PLAYER_MUTE ? true : false);
|
||||
// 如果不是静音 设置音量
|
||||
if (setting == AUDIO_PLAYER_UNMUTE) {
|
||||
bsp_codec_volume_set(g_sys_volume, NULL);
|
||||
}
|
||||
ret = ESP_OK;
|
||||
static esp_err_t _audio_player_mute_fn(AUDIO_PLAYER_MUTE_SETTING setting) {
|
||||
esp_err_t ret = ESP_OK;
|
||||
// 获取当前音量
|
||||
// uint8_t volume = get_sys_volume();
|
||||
// 判断是否需要静音
|
||||
bsp_codec_mute_set(setting == AUDIO_PLAYER_MUTE ? true : false);
|
||||
// 如果不是静音 设置音量
|
||||
if (setting == AUDIO_PLAYER_UNMUTE) {
|
||||
bsp_codec_volume_set(g_sys_volume, NULL);
|
||||
}
|
||||
ret = ESP_OK;
|
||||
|
||||
return ret;
|
||||
return ret;
|
||||
}
|
||||
|
||||
// 播放音乐函数 播放音乐的时候 会不断进入
|
||||
static esp_err_t _audio_player_write_fn(void *audio_buffer, size_t len, size_t *bytes_written, uint32_t timeout_ms)
|
||||
{
|
||||
esp_err_t ret = ESP_OK;
|
||||
static esp_err_t _audio_player_write_fn(void* audio_buffer, size_t len,
|
||||
size_t* bytes_written,
|
||||
uint32_t timeout_ms) {
|
||||
esp_err_t ret = ESP_OK;
|
||||
|
||||
ret = bsp_i2s_write(audio_buffer, len, bytes_written, timeout_ms);
|
||||
ret = bsp_i2s_write(audio_buffer, len, bytes_written, timeout_ms);
|
||||
|
||||
return ret;
|
||||
return ret;
|
||||
}
|
||||
|
||||
// 设置采样率 播放的时候进入一次
|
||||
static esp_err_t _audio_player_std_clock(uint32_t rate, uint32_t bits_cfg, i2s_slot_mode_t ch)
|
||||
{
|
||||
esp_err_t ret = ESP_OK;
|
||||
static esp_err_t _audio_player_std_clock(uint32_t rate, uint32_t bits_cfg,
|
||||
i2s_slot_mode_t ch) {
|
||||
esp_err_t ret = ESP_OK;
|
||||
|
||||
// ret = bsp_speaker_set_fs(rate, bits_cfg, ch);
|
||||
// ret = bsp_codec_set_fs(rate, bits_cfg, ch);
|
||||
return ret;
|
||||
// ret = bsp_speaker_set_fs(rate, bits_cfg, ch);
|
||||
// ret = bsp_codec_set_fs(rate, bits_cfg, ch);
|
||||
return ret;
|
||||
}
|
||||
|
||||
// 回调函数 播放器每次动作都会进入
|
||||
static void _audio_player_callback(audio_player_cb_ctx_t *ctx)
|
||||
{
|
||||
ESP_LOGI(TAG, "ctx->audio_event = %d", ctx->audio_event);
|
||||
switch (ctx->audio_event) {
|
||||
static void _audio_player_callback(audio_player_cb_ctx_t* ctx) {
|
||||
ESP_LOGI(TAG, "ctx->audio_event = %d", ctx->audio_event);
|
||||
switch (ctx->audio_event) {
|
||||
case AUDIO_PLAYER_CALLBACK_EVENT_IDLE: { // 播放完一首歌 进入这个case
|
||||
ESP_LOGI(TAG, "AUDIO_PLAYER_REQUEST_IDLE");
|
||||
// 指向下一首歌
|
||||
file_iterator_next(file_iterator);
|
||||
int index = file_iterator_get_index(file_iterator);
|
||||
ESP_LOGI(TAG, "playing index '%d'", index);
|
||||
play_index(index);
|
||||
// 修改当前播放的音乐名称
|
||||
lvgl_port_lock(0);
|
||||
lv_dropdown_set_selected(music_list, index);
|
||||
lv_obj_t *label_title = (lv_obj_t *) music_list->user_data;
|
||||
lv_label_set_text_static(label_title, file_iterator_get_name_from_index(file_iterator, index));
|
||||
lvgl_port_unlock();
|
||||
break;
|
||||
ESP_LOGI(TAG, "AUDIO_PLAYER_REQUEST_IDLE");
|
||||
// 指向下一首歌
|
||||
file_iterator_next(file_iterator);
|
||||
int index = file_iterator_get_index(file_iterator);
|
||||
ESP_LOGI(TAG, "playing index '%d'", index);
|
||||
play_index(index);
|
||||
// 修改当前播放的音乐名称
|
||||
lvgl_port_lock(0);
|
||||
lv_dropdown_set_selected(music_list, index);
|
||||
lv_obj_t* label_title = (lv_obj_t*)music_list->user_data;
|
||||
lv_label_set_text_static(
|
||||
label_title, file_iterator_get_name_from_index(file_iterator, index));
|
||||
lvgl_port_unlock();
|
||||
break;
|
||||
}
|
||||
case AUDIO_PLAYER_CALLBACK_EVENT_PLAYING: // 正在播放音乐
|
||||
ESP_LOGI(TAG, "AUDIO_PLAYER_REQUEST_PLAY");
|
||||
pa_en(1); // 打开音频功放
|
||||
break;
|
||||
case AUDIO_PLAYER_CALLBACK_EVENT_PAUSE: // 正在暂停音乐
|
||||
ESP_LOGI(TAG, "AUDIO_PLAYER_REQUEST_PAUSE");
|
||||
pa_en(0); // 关闭音频功放
|
||||
break;
|
||||
case AUDIO_PLAYER_CALLBACK_EVENT_PLAYING: // 正在播放音乐
|
||||
ESP_LOGI(TAG, "AUDIO_PLAYER_REQUEST_PLAY");
|
||||
pa_en(1); // 打开音频功放
|
||||
break;
|
||||
case AUDIO_PLAYER_CALLBACK_EVENT_PAUSE: // 正在暂停音乐
|
||||
ESP_LOGI(TAG, "AUDIO_PLAYER_REQUEST_PAUSE");
|
||||
pa_en(0); // 关闭音频功放
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// mp3播放器初始化
|
||||
void mp3_player_init(void)
|
||||
{
|
||||
// 获取文件信息
|
||||
file_iterator = file_iterator_new(SPIFFS_BASE);
|
||||
assert(file_iterator != NULL);
|
||||
void mp3_player_init(void) {
|
||||
// 获取文件信息
|
||||
file_iterator = file_iterator_new(SPIFFS_BASE);
|
||||
assert(file_iterator != NULL);
|
||||
|
||||
// 初始化音频播放
|
||||
player_config.mute_fn = _audio_player_mute_fn;
|
||||
player_config.write_fn = _audio_player_write_fn;
|
||||
player_config.clk_set_fn = _audio_player_std_clock;
|
||||
player_config.priority = 6;
|
||||
player_config.coreID = 1;
|
||||
// 初始化音频播放
|
||||
player_config.mute_fn = _audio_player_mute_fn;
|
||||
player_config.write_fn = _audio_player_write_fn;
|
||||
player_config.clk_set_fn = _audio_player_std_clock;
|
||||
player_config.priority = 6;
|
||||
player_config.coreID = 1;
|
||||
|
||||
ESP_ERROR_CHECK(audio_player_new(player_config));
|
||||
ESP_ERROR_CHECK(audio_player_callback_register(_audio_player_callback, NULL));
|
||||
// ESP_ERROR_CHECK(audio_player_new(player_config));
|
||||
// ESP_ERROR_CHECK(audio_player_callback_register(_audio_player_callback,
|
||||
// NULL));
|
||||
|
||||
// 显示界面
|
||||
music_ui();
|
||||
// 显示界面
|
||||
music_ui();
|
||||
}
|
||||
|
||||
|
||||
// 按钮样式相关定义
|
||||
typedef struct {
|
||||
lv_style_t style_bg;
|
||||
lv_style_t style_focus_no_outline;
|
||||
lv_style_t style_bg;
|
||||
lv_style_t style_focus_no_outline;
|
||||
} button_style_t;
|
||||
|
||||
static button_style_t g_btn_styles;
|
||||
|
||||
button_style_t *ui_button_styles(void)
|
||||
{
|
||||
return &g_btn_styles;
|
||||
}
|
||||
button_style_t* ui_button_styles(void) { return &g_btn_styles; }
|
||||
|
||||
// 按钮样式初始化
|
||||
static void ui_button_style_init(void)
|
||||
{
|
||||
/*Init the style for the default state*/
|
||||
lv_style_init(&g_btn_styles.style_focus_no_outline);
|
||||
lv_style_set_outline_width(&g_btn_styles.style_focus_no_outline, 0);
|
||||
static void ui_button_style_init(void) {
|
||||
/*Init the style for the default state*/
|
||||
lv_style_init(&g_btn_styles.style_focus_no_outline);
|
||||
lv_style_set_outline_width(&g_btn_styles.style_focus_no_outline, 0);
|
||||
|
||||
lv_style_init(&g_btn_styles.style_bg);
|
||||
lv_style_set_bg_opa(&g_btn_styles.style_bg, LV_OPA_100);
|
||||
lv_style_set_bg_color(&g_btn_styles.style_bg, lv_color_make(255, 255, 255));
|
||||
lv_style_set_shadow_width(&g_btn_styles.style_bg, 0);
|
||||
lv_style_init(&g_btn_styles.style_bg);
|
||||
lv_style_set_bg_opa(&g_btn_styles.style_bg, LV_OPA_100);
|
||||
lv_style_set_bg_color(&g_btn_styles.style_bg, lv_color_make(255, 255, 255));
|
||||
lv_style_set_shadow_width(&g_btn_styles.style_bg, 0);
|
||||
}
|
||||
|
||||
// 播放暂停按钮 事件处理函数
|
||||
static void btn_play_pause_cb(lv_event_t *event)
|
||||
{
|
||||
lv_obj_t *btn = lv_event_get_target(event);
|
||||
lv_obj_t *lab = (lv_obj_t *) btn->user_data;
|
||||
static void btn_play_pause_cb(lv_event_t* event) {
|
||||
lv_obj_t* btn = lv_event_get_target(event);
|
||||
lv_obj_t* lab = (lv_obj_t*)btn->user_data;
|
||||
|
||||
audio_player_state_t state = audio_player_get_state();
|
||||
printf("state=%d\n", state);
|
||||
if(state == AUDIO_PLAYER_STATE_IDLE){
|
||||
lvgl_port_lock(0);
|
||||
lv_label_set_text_static(lab, LV_SYMBOL_PAUSE);
|
||||
lvgl_port_unlock();
|
||||
int index = file_iterator_get_index(file_iterator);
|
||||
ESP_LOGI(TAG, "playing index '%d'", index);
|
||||
play_index(index);
|
||||
}else if (state == AUDIO_PLAYER_STATE_PAUSE) {
|
||||
lvgl_port_lock(0);
|
||||
lv_label_set_text_static(lab, LV_SYMBOL_PAUSE);
|
||||
lvgl_port_unlock();
|
||||
audio_player_resume();
|
||||
} else if (state == AUDIO_PLAYER_STATE_PLAYING) {
|
||||
lvgl_port_lock(0);
|
||||
lv_label_set_text_static(lab, LV_SYMBOL_PLAY);
|
||||
lvgl_port_unlock();
|
||||
audio_player_pause();
|
||||
}
|
||||
audio_player_state_t state = audio_player_get_state();
|
||||
printf("state=%d\n", state);
|
||||
if (state == AUDIO_PLAYER_STATE_IDLE) {
|
||||
lvgl_port_lock(0);
|
||||
lv_label_set_text_static(lab, LV_SYMBOL_PAUSE);
|
||||
lvgl_port_unlock();
|
||||
int index = file_iterator_get_index(file_iterator);
|
||||
ESP_LOGI(TAG, "playing index '%d'", index);
|
||||
play_index(index);
|
||||
} else if (state == AUDIO_PLAYER_STATE_PAUSE) {
|
||||
lvgl_port_lock(0);
|
||||
lv_label_set_text_static(lab, LV_SYMBOL_PAUSE);
|
||||
lvgl_port_unlock();
|
||||
audio_player_resume();
|
||||
} else if (state == AUDIO_PLAYER_STATE_PLAYING) {
|
||||
lvgl_port_lock(0);
|
||||
lv_label_set_text_static(lab, LV_SYMBOL_PLAY);
|
||||
lvgl_port_unlock();
|
||||
audio_player_pause();
|
||||
}
|
||||
}
|
||||
|
||||
// 上一首 下一首 按键事件处理函数
|
||||
static void btn_prev_next_cb(lv_event_t *event)
|
||||
{
|
||||
bool is_next = (bool) event->user_data;
|
||||
static void btn_prev_next_cb(lv_event_t* event) {
|
||||
bool is_next = (bool)event->user_data;
|
||||
|
||||
if (is_next) {
|
||||
ESP_LOGI(TAG, "btn next");
|
||||
file_iterator_next(file_iterator);
|
||||
} else {
|
||||
ESP_LOGI(TAG, "btn prev");
|
||||
file_iterator_prev(file_iterator);
|
||||
}
|
||||
// 修改当前的音乐名称
|
||||
int index = file_iterator_get_index(file_iterator);
|
||||
lvgl_port_lock(0);
|
||||
lv_dropdown_set_selected(music_list, index);
|
||||
lv_obj_t *label_title = (lv_obj_t *) music_list->user_data;
|
||||
lv_label_set_text_static(label_title, file_iterator_get_name_from_index(file_iterator, index));
|
||||
lvgl_port_unlock();
|
||||
// 执行音乐事件
|
||||
audio_player_state_t state = audio_player_get_state();
|
||||
printf("prev_next_state=%d\n", state);
|
||||
if (state == AUDIO_PLAYER_STATE_IDLE) {
|
||||
// Nothing to do
|
||||
}else if (state == AUDIO_PLAYER_STATE_PAUSE){ // 如果当前正在暂停歌曲
|
||||
ESP_LOGI(TAG, "playing index '%d'", index);
|
||||
play_index(index);
|
||||
audio_player_pause();
|
||||
} else if (state == AUDIO_PLAYER_STATE_PLAYING) { // 如果当前正在播放歌曲
|
||||
// 播放歌曲
|
||||
ESP_LOGI(TAG, "playing index '%d'", index);
|
||||
play_index(index);
|
||||
}
|
||||
if (is_next) {
|
||||
ESP_LOGI(TAG, "btn next");
|
||||
file_iterator_next(file_iterator);
|
||||
} else {
|
||||
ESP_LOGI(TAG, "btn prev");
|
||||
file_iterator_prev(file_iterator);
|
||||
}
|
||||
// 修改当前的音乐名称
|
||||
int index = file_iterator_get_index(file_iterator);
|
||||
lvgl_port_lock(0);
|
||||
lv_dropdown_set_selected(music_list, index);
|
||||
lv_obj_t* label_title = (lv_obj_t*)music_list->user_data;
|
||||
lv_label_set_text_static(
|
||||
label_title, file_iterator_get_name_from_index(file_iterator, index));
|
||||
lvgl_port_unlock();
|
||||
// 执行音乐事件
|
||||
audio_player_state_t state = audio_player_get_state();
|
||||
printf("prev_next_state=%d\n", state);
|
||||
if (state == AUDIO_PLAYER_STATE_IDLE) {
|
||||
// Nothing to do
|
||||
} else if (state == AUDIO_PLAYER_STATE_PAUSE) { // 如果当前正在暂停歌曲
|
||||
ESP_LOGI(TAG, "playing index '%d'", index);
|
||||
play_index(index);
|
||||
audio_player_pause();
|
||||
} else if (state == AUDIO_PLAYER_STATE_PLAYING) { // 如果当前正在播放歌曲
|
||||
// 播放歌曲
|
||||
ESP_LOGI(TAG, "playing index '%d'", index);
|
||||
play_index(index);
|
||||
}
|
||||
}
|
||||
|
||||
// 音量调节滑动条 事件处理函数
|
||||
static void volume_slider_cb(lv_event_t *event)
|
||||
{
|
||||
lv_obj_t *slider = lv_event_get_target(event);
|
||||
int volume = lv_slider_get_value(slider); // 获取slider的值
|
||||
bsp_codec_volume_set(volume, NULL); // 设置声音大小
|
||||
g_sys_volume = volume; // 把声音赋值给g_sys_volume保存
|
||||
ESP_LOGI(TAG, "volume '%d'", volume);
|
||||
static void volume_slider_cb(lv_event_t* event) {
|
||||
lv_obj_t* slider = lv_event_get_target(event);
|
||||
int volume = lv_slider_get_value(slider); // 获取slider的值
|
||||
bsp_codec_volume_set(volume, NULL); // 设置声音大小
|
||||
g_sys_volume = volume; // 把声音赋值给g_sys_volume保存
|
||||
ESP_LOGI(TAG, "volume '%d'", volume);
|
||||
}
|
||||
|
||||
// 音乐列表 点击事件处理函数
|
||||
static void music_list_cb(lv_event_t *event)
|
||||
{
|
||||
lv_obj_t *label_title = (lv_obj_t *) music_list->user_data;
|
||||
|
||||
uint16_t index = lv_dropdown_get_selected(music_list);
|
||||
ESP_LOGI(TAG, "switching index to '%d'", index);
|
||||
file_iterator_set_index(file_iterator, index);
|
||||
lvgl_port_lock(0);
|
||||
lv_label_set_text_static(label_title, file_iterator_get_name_from_index(file_iterator, index));
|
||||
lvgl_port_unlock();
|
||||
|
||||
audio_player_state_t state = audio_player_get_state();
|
||||
if (state == AUDIO_PLAYER_STATE_PAUSE){ // 如果当前正在暂停歌曲
|
||||
play_index(index);
|
||||
audio_player_pause();
|
||||
} else if (state == AUDIO_PLAYER_STATE_PLAYING) { // 如果当前正在播放歌曲
|
||||
play_index(index);
|
||||
}
|
||||
static void music_list_cb(lv_event_t* event) {
|
||||
lv_obj_t* label_title = (lv_obj_t*)music_list->user_data;
|
||||
|
||||
uint16_t index = lv_dropdown_get_selected(music_list);
|
||||
ESP_LOGI(TAG, "switching index to '%d'", index);
|
||||
file_iterator_set_index(file_iterator, index);
|
||||
lvgl_port_lock(0);
|
||||
lv_label_set_text_static(
|
||||
label_title, file_iterator_get_name_from_index(file_iterator, index));
|
||||
lvgl_port_unlock();
|
||||
|
||||
audio_player_state_t state = audio_player_get_state();
|
||||
if (state == AUDIO_PLAYER_STATE_PAUSE) { // 如果当前正在暂停歌曲
|
||||
play_index(index);
|
||||
audio_player_pause();
|
||||
} else if (state == AUDIO_PLAYER_STATE_PLAYING) { // 如果当前正在播放歌曲
|
||||
play_index(index);
|
||||
}
|
||||
}
|
||||
|
||||
// 音乐名称加入列表
|
||||
static void build_file_list(lv_obj_t *music_list)
|
||||
{
|
||||
lv_obj_t *label_title = (lv_obj_t *) music_list->user_data;
|
||||
static void build_file_list(lv_obj_t* music_list) {
|
||||
lv_obj_t* label_title = (lv_obj_t*)music_list->user_data;
|
||||
|
||||
lvgl_port_lock(0);
|
||||
lv_dropdown_clear_options(music_list);
|
||||
lvgl_port_unlock();
|
||||
lvgl_port_lock(0);
|
||||
lv_dropdown_clear_options(music_list);
|
||||
lvgl_port_unlock();
|
||||
|
||||
for(size_t i = 0; i<file_iterator->count; i++)
|
||||
{
|
||||
const char *file_name = file_iterator_get_name_from_index(file_iterator, i);
|
||||
if (NULL != file_name) {
|
||||
lvgl_port_lock(0);
|
||||
lv_dropdown_add_option(music_list, file_name, i); // 添加音乐名称到列表中
|
||||
lvgl_port_unlock();
|
||||
}
|
||||
for (size_t i = 0; i < file_iterator->count; i++) {
|
||||
const char* file_name = file_iterator_get_name_from_index(file_iterator, i);
|
||||
if (NULL != file_name) {
|
||||
lvgl_port_lock(0);
|
||||
lv_dropdown_add_option(music_list, file_name, i); // 添加音乐名称到列表中
|
||||
lvgl_port_unlock();
|
||||
}
|
||||
lvgl_port_lock(0);
|
||||
lv_dropdown_set_selected(music_list, 0); // 选择列表中的第一个
|
||||
lv_label_set_text_static(label_title, file_iterator_get_name_from_index(file_iterator, 0)); // 显示list中第一个音乐的名称
|
||||
lvgl_port_unlock();
|
||||
}
|
||||
lvgl_port_lock(0);
|
||||
lv_dropdown_set_selected(music_list, 0); // 选择列表中的第一个
|
||||
lv_label_set_text_static(
|
||||
label_title, file_iterator_get_name_from_index(
|
||||
file_iterator, 0)); // 显示list中第一个音乐的名称
|
||||
lvgl_port_unlock();
|
||||
}
|
||||
|
||||
// 播放器界面初始化
|
||||
void music_ui(void)
|
||||
{
|
||||
lvgl_port_lock(0);
|
||||
void music_ui(void) {
|
||||
lvgl_port_lock(0);
|
||||
|
||||
ui_button_style_init();// 初始化按键风格
|
||||
ui_button_style_init(); // 初始化按键风格
|
||||
|
||||
/* 创建播放暂停控制按键 */
|
||||
btn_play_pause = lv_btn_create(lv_scr_act());
|
||||
lv_obj_align(btn_play_pause, LV_ALIGN_CENTER, 0, 40);
|
||||
lv_obj_set_size(btn_play_pause, 50, 50);
|
||||
lv_obj_set_style_radius(btn_play_pause, 25, LV_STATE_DEFAULT);
|
||||
lv_obj_add_flag(btn_play_pause, LV_OBJ_FLAG_CHECKABLE);
|
||||
/* 创建播放暂停控制按键 */
|
||||
btn_play_pause = lv_btn_create(lv_scr_act());
|
||||
lv_obj_align(btn_play_pause, LV_ALIGN_CENTER, 0, 40);
|
||||
lv_obj_set_size(btn_play_pause, 50, 50);
|
||||
lv_obj_set_style_radius(btn_play_pause, 25, LV_STATE_DEFAULT);
|
||||
lv_obj_add_flag(btn_play_pause, LV_OBJ_FLAG_CHECKABLE);
|
||||
|
||||
lv_obj_add_style(btn_play_pause, &ui_button_styles()->style_focus_no_outline, LV_STATE_FOCUS_KEY);
|
||||
lv_obj_add_style(btn_play_pause, &ui_button_styles()->style_focus_no_outline, LV_STATE_FOCUSED);
|
||||
lv_obj_add_style(btn_play_pause, &ui_button_styles()->style_focus_no_outline,
|
||||
LV_STATE_FOCUS_KEY);
|
||||
lv_obj_add_style(btn_play_pause, &ui_button_styles()->style_focus_no_outline,
|
||||
LV_STATE_FOCUSED);
|
||||
|
||||
label_play_pause = lv_label_create(btn_play_pause);
|
||||
lv_label_set_text_static(label_play_pause, LV_SYMBOL_PLAY);
|
||||
lv_obj_center(label_play_pause);
|
||||
label_play_pause = lv_label_create(btn_play_pause);
|
||||
lv_label_set_text_static(label_play_pause, LV_SYMBOL_PLAY);
|
||||
lv_obj_center(label_play_pause);
|
||||
|
||||
lv_obj_set_user_data(btn_play_pause, (void *) label_play_pause);
|
||||
lv_obj_add_event_cb(btn_play_pause, btn_play_pause_cb, LV_EVENT_VALUE_CHANGED, NULL);
|
||||
lv_obj_set_user_data(btn_play_pause, (void*)label_play_pause);
|
||||
lv_obj_add_event_cb(btn_play_pause, btn_play_pause_cb, LV_EVENT_VALUE_CHANGED,
|
||||
NULL);
|
||||
|
||||
/* 创建上一首控制按键 */
|
||||
lv_obj_t *btn_play_prev = lv_btn_create(lv_scr_act());
|
||||
lv_obj_set_size(btn_play_prev, 50, 50);
|
||||
lv_obj_set_style_radius(btn_play_prev, 25, LV_STATE_DEFAULT);
|
||||
lv_obj_clear_flag(btn_play_prev, LV_OBJ_FLAG_CHECKABLE);
|
||||
lv_obj_align_to(btn_play_prev, btn_play_pause, LV_ALIGN_OUT_LEFT_MID, -40, 0);
|
||||
/* 创建上一首控制按键 */
|
||||
lv_obj_t* btn_play_prev = lv_btn_create(lv_scr_act());
|
||||
lv_obj_set_size(btn_play_prev, 50, 50);
|
||||
lv_obj_set_style_radius(btn_play_prev, 25, LV_STATE_DEFAULT);
|
||||
lv_obj_clear_flag(btn_play_prev, LV_OBJ_FLAG_CHECKABLE);
|
||||
lv_obj_align_to(btn_play_prev, btn_play_pause, LV_ALIGN_OUT_LEFT_MID, -40, 0);
|
||||
|
||||
lv_obj_add_style(btn_play_prev, &ui_button_styles()->style_focus_no_outline, LV_STATE_FOCUS_KEY);
|
||||
lv_obj_add_style(btn_play_prev, &ui_button_styles()->style_focus_no_outline, LV_STATE_FOCUSED);
|
||||
lv_obj_add_style(btn_play_prev, &ui_button_styles()->style_bg, LV_STATE_FOCUS_KEY);
|
||||
lv_obj_add_style(btn_play_prev, &ui_button_styles()->style_bg, LV_STATE_FOCUSED);
|
||||
lv_obj_add_style(btn_play_prev, &ui_button_styles()->style_bg, LV_STATE_DEFAULT);
|
||||
lv_obj_add_style(btn_play_prev, &ui_button_styles()->style_focus_no_outline,
|
||||
LV_STATE_FOCUS_KEY);
|
||||
lv_obj_add_style(btn_play_prev, &ui_button_styles()->style_focus_no_outline,
|
||||
LV_STATE_FOCUSED);
|
||||
lv_obj_add_style(btn_play_prev, &ui_button_styles()->style_bg,
|
||||
LV_STATE_FOCUS_KEY);
|
||||
lv_obj_add_style(btn_play_prev, &ui_button_styles()->style_bg,
|
||||
LV_STATE_FOCUSED);
|
||||
lv_obj_add_style(btn_play_prev, &ui_button_styles()->style_bg,
|
||||
LV_STATE_DEFAULT);
|
||||
|
||||
lv_obj_t *label_prev = lv_label_create(btn_play_prev);
|
||||
lv_label_set_text_static(label_prev, LV_SYMBOL_PREV);
|
||||
lv_obj_set_style_text_font(label_prev, &lv_font_montserrat_24, LV_STATE_DEFAULT);
|
||||
lv_obj_set_style_text_color(label_prev, lv_color_make(0, 0, 0), LV_STATE_DEFAULT);
|
||||
lv_obj_center(label_prev);
|
||||
lv_obj_set_user_data(btn_play_prev, (void *) label_prev);
|
||||
lv_obj_add_event_cb(btn_play_prev, btn_prev_next_cb, LV_EVENT_CLICKED, (void *) false);
|
||||
lv_obj_t* label_prev = lv_label_create(btn_play_prev);
|
||||
lv_label_set_text_static(label_prev, LV_SYMBOL_PREV);
|
||||
lv_obj_set_style_text_font(label_prev, &lv_font_montserrat_24,
|
||||
LV_STATE_DEFAULT);
|
||||
lv_obj_set_style_text_color(label_prev, lv_color_make(0, 0, 0),
|
||||
LV_STATE_DEFAULT);
|
||||
lv_obj_center(label_prev);
|
||||
lv_obj_set_user_data(btn_play_prev, (void*)label_prev);
|
||||
lv_obj_add_event_cb(btn_play_prev, btn_prev_next_cb, LV_EVENT_CLICKED,
|
||||
(void*)false);
|
||||
|
||||
/* 创建下一首控制按键 */
|
||||
lv_obj_t *btn_play_next = lv_btn_create(lv_scr_act());
|
||||
lv_obj_set_size(btn_play_next, 50, 50);
|
||||
lv_obj_set_style_radius(btn_play_next, 25, LV_STATE_DEFAULT);
|
||||
lv_obj_clear_flag(btn_play_next, LV_OBJ_FLAG_CHECKABLE);
|
||||
lv_obj_align_to(btn_play_next, btn_play_pause, LV_ALIGN_OUT_RIGHT_MID, 40, 0);
|
||||
/* 创建下一首控制按键 */
|
||||
lv_obj_t* btn_play_next = lv_btn_create(lv_scr_act());
|
||||
lv_obj_set_size(btn_play_next, 50, 50);
|
||||
lv_obj_set_style_radius(btn_play_next, 25, LV_STATE_DEFAULT);
|
||||
lv_obj_clear_flag(btn_play_next, LV_OBJ_FLAG_CHECKABLE);
|
||||
lv_obj_align_to(btn_play_next, btn_play_pause, LV_ALIGN_OUT_RIGHT_MID, 40, 0);
|
||||
|
||||
lv_obj_add_style(btn_play_next, &ui_button_styles()->style_focus_no_outline, LV_STATE_FOCUS_KEY);
|
||||
lv_obj_add_style(btn_play_next, &ui_button_styles()->style_focus_no_outline, LV_STATE_FOCUSED);
|
||||
lv_obj_add_style(btn_play_next, &ui_button_styles()->style_bg, LV_STATE_FOCUS_KEY);
|
||||
lv_obj_add_style(btn_play_next, &ui_button_styles()->style_bg, LV_STATE_FOCUSED);
|
||||
lv_obj_add_style(btn_play_next, &ui_button_styles()->style_bg, LV_STATE_DEFAULT);
|
||||
lv_obj_add_style(btn_play_next, &ui_button_styles()->style_focus_no_outline,
|
||||
LV_STATE_FOCUS_KEY);
|
||||
lv_obj_add_style(btn_play_next, &ui_button_styles()->style_focus_no_outline,
|
||||
LV_STATE_FOCUSED);
|
||||
lv_obj_add_style(btn_play_next, &ui_button_styles()->style_bg,
|
||||
LV_STATE_FOCUS_KEY);
|
||||
lv_obj_add_style(btn_play_next, &ui_button_styles()->style_bg,
|
||||
LV_STATE_FOCUSED);
|
||||
lv_obj_add_style(btn_play_next, &ui_button_styles()->style_bg,
|
||||
LV_STATE_DEFAULT);
|
||||
|
||||
lv_obj_t *label_next = lv_label_create(btn_play_next);
|
||||
lv_label_set_text_static(label_next, LV_SYMBOL_NEXT);
|
||||
lv_obj_set_style_text_font(label_next, &lv_font_montserrat_24, LV_STATE_DEFAULT);
|
||||
lv_obj_set_style_text_color(label_next, lv_color_make(0, 0, 0), LV_STATE_DEFAULT);
|
||||
lv_obj_center(label_next);
|
||||
lv_obj_set_user_data(btn_play_next, (void *) label_next);
|
||||
lv_obj_add_event_cb(btn_play_next, btn_prev_next_cb, LV_EVENT_CLICKED, (void *) true);
|
||||
lv_obj_t* label_next = lv_label_create(btn_play_next);
|
||||
lv_label_set_text_static(label_next, LV_SYMBOL_NEXT);
|
||||
lv_obj_set_style_text_font(label_next, &lv_font_montserrat_24,
|
||||
LV_STATE_DEFAULT);
|
||||
lv_obj_set_style_text_color(label_next, lv_color_make(0, 0, 0),
|
||||
LV_STATE_DEFAULT);
|
||||
lv_obj_center(label_next);
|
||||
lv_obj_set_user_data(btn_play_next, (void*)label_next);
|
||||
lv_obj_add_event_cb(btn_play_next, btn_prev_next_cb, LV_EVENT_CLICKED,
|
||||
(void*)true);
|
||||
|
||||
/* 创建声音调节滑动条 */
|
||||
volume_slider = lv_slider_create(lv_scr_act());
|
||||
lv_obj_set_size(volume_slider, 200, 10);
|
||||
lv_obj_set_ext_click_area(volume_slider, 15);
|
||||
lv_obj_align(volume_slider, LV_ALIGN_BOTTOM_MID, 0, -20);
|
||||
lv_slider_set_range(volume_slider, 0, 100);
|
||||
lv_slider_set_value(volume_slider, g_sys_volume, LV_ANIM_ON);
|
||||
lv_obj_add_event_cb(volume_slider, volume_slider_cb, LV_EVENT_VALUE_CHANGED, NULL);
|
||||
/* 创建声音调节滑动条 */
|
||||
volume_slider = lv_slider_create(lv_scr_act());
|
||||
lv_obj_set_size(volume_slider, 200, 10);
|
||||
lv_obj_set_ext_click_area(volume_slider, 15);
|
||||
lv_obj_align(volume_slider, LV_ALIGN_BOTTOM_MID, 0, -20);
|
||||
lv_slider_set_range(volume_slider, 0, 100);
|
||||
lv_slider_set_value(volume_slider, g_sys_volume, LV_ANIM_ON);
|
||||
lv_obj_add_event_cb(volume_slider, volume_slider_cb, LV_EVENT_VALUE_CHANGED,
|
||||
NULL);
|
||||
|
||||
lv_obj_t *lab_vol_min = lv_label_create(lv_scr_act());
|
||||
lv_label_set_text_static(lab_vol_min, LV_SYMBOL_VOLUME_MID);
|
||||
lv_obj_set_style_text_font(lab_vol_min, &lv_font_montserrat_20, LV_STATE_DEFAULT);
|
||||
lv_obj_align_to(lab_vol_min, volume_slider, LV_ALIGN_OUT_LEFT_MID, -10, 0);
|
||||
lv_obj_t* lab_vol_min = lv_label_create(lv_scr_act());
|
||||
lv_label_set_text_static(lab_vol_min, LV_SYMBOL_VOLUME_MID);
|
||||
lv_obj_set_style_text_font(lab_vol_min, &lv_font_montserrat_20,
|
||||
LV_STATE_DEFAULT);
|
||||
lv_obj_align_to(lab_vol_min, volume_slider, LV_ALIGN_OUT_LEFT_MID, -10, 0);
|
||||
|
||||
lv_obj_t *lab_vol_max = lv_label_create(lv_scr_act());
|
||||
lv_label_set_text_static(lab_vol_max, LV_SYMBOL_VOLUME_MAX);
|
||||
lv_obj_set_style_text_font(lab_vol_max, &lv_font_montserrat_20, LV_STATE_DEFAULT);
|
||||
lv_obj_align_to(lab_vol_max, volume_slider, LV_ALIGN_OUT_RIGHT_MID, 10, 0);
|
||||
lv_obj_t* lab_vol_max = lv_label_create(lv_scr_act());
|
||||
lv_label_set_text_static(lab_vol_max, LV_SYMBOL_VOLUME_MAX);
|
||||
lv_obj_set_style_text_font(lab_vol_max, &lv_font_montserrat_20,
|
||||
LV_STATE_DEFAULT);
|
||||
lv_obj_align_to(lab_vol_max, volume_slider, LV_ALIGN_OUT_RIGHT_MID, 10, 0);
|
||||
|
||||
/* 创建音乐标题 */
|
||||
lv_obj_t *lab_title = lv_label_create(lv_scr_act());
|
||||
lv_obj_set_user_data(lab_title, (void *) btn_play_pause);
|
||||
lv_label_set_text_static(lab_title, "Scanning Files...");
|
||||
lv_obj_set_style_text_font(lab_title, &lv_font_montserrat_32, LV_STATE_DEFAULT);
|
||||
lv_obj_align(lab_title, LV_ALIGN_TOP_MID, 0, 20);
|
||||
/* 创建音乐标题 */
|
||||
lv_obj_t* lab_title = lv_label_create(lv_scr_act());
|
||||
lv_obj_set_user_data(lab_title, (void*)btn_play_pause);
|
||||
lv_label_set_text_static(lab_title, "Scanning Files...");
|
||||
lv_obj_set_style_text_font(lab_title, &lv_font_montserrat_32,
|
||||
LV_STATE_DEFAULT);
|
||||
lv_obj_align(lab_title, LV_ALIGN_TOP_MID, 0, 20);
|
||||
|
||||
/* 创建音乐列表 */
|
||||
music_list = lv_dropdown_create(lv_scr_act());
|
||||
lv_dropdown_clear_options(music_list);
|
||||
lv_dropdown_set_options_static(music_list, "Scanning...");
|
||||
lv_obj_set_style_text_font(music_list, &lv_font_montserrat_20, LV_STATE_ANY);
|
||||
lv_obj_set_width(music_list, 200);
|
||||
lv_obj_align_to(music_list, lab_title, LV_ALIGN_OUT_BOTTOM_MID, 0, 20);
|
||||
lv_obj_set_user_data(music_list, (void *) lab_title);
|
||||
lv_obj_add_event_cb(music_list, music_list_cb, LV_EVENT_VALUE_CHANGED, NULL);
|
||||
/* 创建音乐列表 */
|
||||
music_list = lv_dropdown_create(lv_scr_act());
|
||||
lv_dropdown_clear_options(music_list);
|
||||
lv_dropdown_set_options_static(music_list, "Scanning...");
|
||||
lv_obj_set_style_text_font(music_list, &lv_font_montserrat_20, LV_STATE_ANY);
|
||||
lv_obj_set_width(music_list, 200);
|
||||
lv_obj_align_to(music_list, lab_title, LV_ALIGN_OUT_BOTTOM_MID, 0, 20);
|
||||
lv_obj_set_user_data(music_list, (void*)lab_title);
|
||||
lv_obj_add_event_cb(music_list, music_list_cb, LV_EVENT_VALUE_CHANGED, NULL);
|
||||
|
||||
build_file_list(music_list);
|
||||
build_file_list(music_list);
|
||||
|
||||
lvgl_port_unlock();
|
||||
lvgl_port_unlock();
|
||||
}
|
||||
|
||||
|
||||
// AI人动画
|
||||
LV_IMG_DECLARE(img_bilibili120);
|
||||
|
||||
lv_obj_t *gif_start;
|
||||
lv_obj_t* gif_start;
|
||||
|
||||
// AI人出现在屏幕
|
||||
void ai_gui_in(void)
|
||||
{
|
||||
lvgl_port_lock(0);
|
||||
gif_start = lv_gif_create(lv_scr_act());
|
||||
lv_gif_set_src(gif_start, &img_bilibili120);
|
||||
lv_obj_align(gif_start, LV_ALIGN_CENTER, 0, 0);
|
||||
lvgl_port_unlock();
|
||||
void ai_gui_in(void) {
|
||||
lvgl_port_lock(0);
|
||||
gif_start = lv_gif_create(lv_scr_act());
|
||||
lv_gif_set_src(gif_start, &img_bilibili120);
|
||||
lv_obj_align(gif_start, LV_ALIGN_CENTER, 0, 0);
|
||||
lvgl_port_unlock();
|
||||
}
|
||||
|
||||
// AI人退出屏幕
|
||||
void ai_gui_out(void)
|
||||
{
|
||||
lvgl_port_lock(0);
|
||||
lv_obj_del(gif_start);
|
||||
lvgl_port_unlock();
|
||||
void ai_gui_out(void) {
|
||||
lvgl_port_lock(0);
|
||||
lv_obj_del(gif_start);
|
||||
lvgl_port_unlock();
|
||||
}
|
||||
|
||||
|
||||
// AI播放音乐
|
||||
void ai_play(void)
|
||||
{
|
||||
int index = file_iterator_get_index(file_iterator);
|
||||
ESP_LOGI(TAG, "playing index '%d'", index);
|
||||
play_index(index);
|
||||
lvgl_port_lock(0);
|
||||
lv_label_set_text_static(label_play_pause, LV_SYMBOL_PAUSE); // 显示图标
|
||||
lv_obj_add_state(btn_play_pause, LV_STATE_CHECKED); // 按键设置为选中状态
|
||||
lvgl_port_unlock();
|
||||
void ai_play(void) {
|
||||
int index = file_iterator_get_index(file_iterator);
|
||||
ESP_LOGI(TAG, "playing index '%d'", index);
|
||||
play_index(index);
|
||||
lvgl_port_lock(0);
|
||||
lv_label_set_text_static(label_play_pause, LV_SYMBOL_PAUSE); // 显示图标
|
||||
lv_obj_add_state(btn_play_pause, LV_STATE_CHECKED); // 按键设置为选中状态
|
||||
lvgl_port_unlock();
|
||||
}
|
||||
|
||||
// AI暂停
|
||||
void ai_pause(void)
|
||||
{
|
||||
audio_player_pause();
|
||||
lvgl_port_lock(0);
|
||||
lv_label_set_text_static(label_play_pause, LV_SYMBOL_PLAY); // 显示图标
|
||||
lv_obj_clear_state(btn_play_pause, LV_STATE_CHECKED); // 清除按键的选中状态
|
||||
lvgl_port_unlock();
|
||||
void ai_pause(void) {
|
||||
audio_player_pause();
|
||||
lvgl_port_lock(0);
|
||||
lv_label_set_text_static(label_play_pause, LV_SYMBOL_PLAY); // 显示图标
|
||||
lv_obj_clear_state(btn_play_pause, LV_STATE_CHECKED); // 清除按键的选中状态
|
||||
lvgl_port_unlock();
|
||||
}
|
||||
|
||||
// AI继续
|
||||
void ai_resume(void)
|
||||
{
|
||||
audio_player_resume();
|
||||
lvgl_port_lock(0);
|
||||
lv_label_set_text_static(label_play_pause, LV_SYMBOL_PAUSE); // 显示图标
|
||||
lv_obj_add_state(btn_play_pause, LV_STATE_CHECKED); // 按键设置为选中状态
|
||||
lvgl_port_unlock();
|
||||
void ai_resume(void) {
|
||||
audio_player_resume();
|
||||
lvgl_port_lock(0);
|
||||
lv_label_set_text_static(label_play_pause, LV_SYMBOL_PAUSE); // 显示图标
|
||||
lv_obj_add_state(btn_play_pause, LV_STATE_CHECKED); // 按键设置为选中状态
|
||||
lvgl_port_unlock();
|
||||
}
|
||||
|
||||
// AI上一首
|
||||
void ai_prev_music(void)
|
||||
{
|
||||
// 指向上一首音乐
|
||||
file_iterator_prev(file_iterator);
|
||||
// 修改当前的音乐名称
|
||||
int index = file_iterator_get_index(file_iterator);
|
||||
lvgl_port_lock(0);
|
||||
lv_dropdown_set_selected(music_list, index);
|
||||
lv_obj_t *label_title = (lv_obj_t *) music_list->user_data;
|
||||
lv_label_set_text_static(label_title, file_iterator_get_name_from_index(file_iterator, index));
|
||||
lvgl_port_unlock();
|
||||
// 执行音乐事件
|
||||
audio_player_state_t state = audio_player_get_state();
|
||||
printf("prev_next_state=%d\n", state);
|
||||
if (state == AUDIO_PLAYER_STATE_IDLE) {
|
||||
// Nothing to do
|
||||
}else if (state == AUDIO_PLAYER_STATE_PAUSE){ // 如果当前正在暂停歌曲
|
||||
ESP_LOGI(TAG, "playing index '%d'", index);
|
||||
play_index(index);
|
||||
audio_player_pause();
|
||||
} else if (state == AUDIO_PLAYER_STATE_PLAYING) { // 如果当前正在播放歌曲
|
||||
// 播放歌曲
|
||||
ESP_LOGI(TAG, "playing index '%d'", index);
|
||||
play_index(index);
|
||||
}
|
||||
void ai_prev_music(void) {
|
||||
// 指向上一首音乐
|
||||
file_iterator_prev(file_iterator);
|
||||
// 修改当前的音乐名称
|
||||
int index = file_iterator_get_index(file_iterator);
|
||||
lvgl_port_lock(0);
|
||||
lv_dropdown_set_selected(music_list, index);
|
||||
lv_obj_t* label_title = (lv_obj_t*)music_list->user_data;
|
||||
lv_label_set_text_static(
|
||||
label_title, file_iterator_get_name_from_index(file_iterator, index));
|
||||
lvgl_port_unlock();
|
||||
// 执行音乐事件
|
||||
audio_player_state_t state = audio_player_get_state();
|
||||
printf("prev_next_state=%d\n", state);
|
||||
if (state == AUDIO_PLAYER_STATE_IDLE) {
|
||||
// Nothing to do
|
||||
} else if (state == AUDIO_PLAYER_STATE_PAUSE) { // 如果当前正在暂停歌曲
|
||||
ESP_LOGI(TAG, "playing index '%d'", index);
|
||||
play_index(index);
|
||||
audio_player_pause();
|
||||
} else if (state == AUDIO_PLAYER_STATE_PLAYING) { // 如果当前正在播放歌曲
|
||||
// 播放歌曲
|
||||
ESP_LOGI(TAG, "playing index '%d'", index);
|
||||
play_index(index);
|
||||
}
|
||||
}
|
||||
|
||||
// AI下一首
|
||||
void ai_next_music(void)
|
||||
{
|
||||
// 指向上一首音乐
|
||||
file_iterator_next(file_iterator);
|
||||
// 修改当前的音乐名称
|
||||
int index = file_iterator_get_index(file_iterator);
|
||||
lvgl_port_lock(0);
|
||||
lv_dropdown_set_selected(music_list, index);
|
||||
lv_obj_t *label_title = (lv_obj_t *) music_list->user_data;
|
||||
lv_label_set_text_static(label_title, file_iterator_get_name_from_index(file_iterator, index));
|
||||
lvgl_port_unlock();
|
||||
// 执行音乐事件
|
||||
audio_player_state_t state = audio_player_get_state();
|
||||
printf("prev_next_state=%d\n", state);
|
||||
if (state == AUDIO_PLAYER_STATE_IDLE) {
|
||||
// Nothing to do
|
||||
}else if (state == AUDIO_PLAYER_STATE_PAUSE){ // 如果当前正在暂停歌曲
|
||||
ESP_LOGI(TAG, "playing index '%d'", index);
|
||||
play_index(index);
|
||||
audio_player_pause();
|
||||
} else if (state == AUDIO_PLAYER_STATE_PLAYING) { // 如果当前正在播放歌曲
|
||||
// 播放歌曲
|
||||
ESP_LOGI(TAG, "playing index '%d'", index);
|
||||
play_index(index);
|
||||
}
|
||||
void ai_next_music(void) {
|
||||
// 指向上一首音乐
|
||||
file_iterator_next(file_iterator);
|
||||
// 修改当前的音乐名称
|
||||
int index = file_iterator_get_index(file_iterator);
|
||||
lvgl_port_lock(0);
|
||||
lv_dropdown_set_selected(music_list, index);
|
||||
lv_obj_t* label_title = (lv_obj_t*)music_list->user_data;
|
||||
lv_label_set_text_static(
|
||||
label_title, file_iterator_get_name_from_index(file_iterator, index));
|
||||
lvgl_port_unlock();
|
||||
// 执行音乐事件
|
||||
audio_player_state_t state = audio_player_get_state();
|
||||
printf("prev_next_state=%d\n", state);
|
||||
if (state == AUDIO_PLAYER_STATE_IDLE) {
|
||||
// Nothing to do
|
||||
} else if (state == AUDIO_PLAYER_STATE_PAUSE) { // 如果当前正在暂停歌曲
|
||||
ESP_LOGI(TAG, "playing index '%d'", index);
|
||||
play_index(index);
|
||||
audio_player_pause();
|
||||
} else if (state == AUDIO_PLAYER_STATE_PLAYING) { // 如果当前正在播放歌曲
|
||||
// 播放歌曲
|
||||
ESP_LOGI(TAG, "playing index '%d'", index);
|
||||
play_index(index);
|
||||
}
|
||||
}
|
||||
|
||||
// AI声音大一点
|
||||
void ai_volume_up(void)
|
||||
{
|
||||
if (g_sys_volume < 100){
|
||||
g_sys_volume = g_sys_volume + 5;
|
||||
if (g_sys_volume > 100){
|
||||
g_sys_volume = 100;
|
||||
}
|
||||
bsp_codec_volume_set(g_sys_volume, NULL); // 设置声音大小
|
||||
lvgl_port_lock(0);
|
||||
lv_slider_set_value(volume_slider, g_sys_volume, LV_ANIM_ON); // 设置slider
|
||||
lvgl_port_unlock();
|
||||
void ai_volume_up(void) {
|
||||
if (g_sys_volume < 100) {
|
||||
g_sys_volume = g_sys_volume + 5;
|
||||
if (g_sys_volume > 100) {
|
||||
g_sys_volume = 100;
|
||||
}
|
||||
ESP_LOGI(TAG, "volume '%d'", g_sys_volume);
|
||||
bsp_codec_volume_set(g_sys_volume, NULL); // 设置声音大小
|
||||
lvgl_port_lock(0);
|
||||
lv_slider_set_value(volume_slider, g_sys_volume, LV_ANIM_ON); // 设置slider
|
||||
lvgl_port_unlock();
|
||||
}
|
||||
ESP_LOGI(TAG, "volume '%d'", g_sys_volume);
|
||||
}
|
||||
|
||||
// AI声音小一点
|
||||
void ai_volume_down(void)
|
||||
{
|
||||
if (g_sys_volume > 0){
|
||||
if (g_sys_volume < 5){
|
||||
g_sys_volume = 0;
|
||||
}else{
|
||||
g_sys_volume = g_sys_volume - 5;
|
||||
}
|
||||
bsp_codec_volume_set(g_sys_volume, NULL); // 设置声音大小
|
||||
lvgl_port_lock(0);
|
||||
lv_slider_set_value(volume_slider, g_sys_volume, LV_ANIM_ON); // 设置slider
|
||||
lvgl_port_unlock();
|
||||
void ai_volume_down(void) {
|
||||
if (g_sys_volume > 0) {
|
||||
if (g_sys_volume < 5) {
|
||||
g_sys_volume = 0;
|
||||
} else {
|
||||
g_sys_volume = g_sys_volume - 5;
|
||||
}
|
||||
ESP_LOGI(TAG, "volume '%d'", g_sys_volume);
|
||||
bsp_codec_volume_set(g_sys_volume, NULL); // 设置声音大小
|
||||
lvgl_port_lock(0);
|
||||
lv_slider_set_value(volume_slider, g_sys_volume, LV_ANIM_ON); // 设置slider
|
||||
lvgl_port_unlock();
|
||||
}
|
||||
ESP_LOGI(TAG, "volume '%d'", g_sys_volume);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
#pragma once
|
||||
|
||||
|
||||
void mp3_player_init(void);
|
||||
void music_ui(void);
|
||||
|
||||
|
|
@ -14,6 +13,3 @@ void ai_prev_music(void);
|
|||
void ai_next_music(void);
|
||||
void ai_volume_up(void);
|
||||
void ai_volume_down(void);
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
1167
main/esp32_s3_szp.c
1167
main/esp32_s3_szp.c
File diff suppressed because it is too large
Load Diff
|
|
@ -1,170 +1,166 @@
|
|||
#pragma once
|
||||
|
||||
#include <string.h>
|
||||
#include "math.h"
|
||||
#include "esp_err.h"
|
||||
#include "esp_log.h"
|
||||
#include "esp_check.h"
|
||||
#include "driver/i2c.h"
|
||||
#include "driver/spi_master.h"
|
||||
#include "driver/ledc.h"
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/task.h"
|
||||
#include "esp_lcd_types.h"
|
||||
#include "esp_lcd_panel_io.h"
|
||||
#include "esp_lcd_panel_vendor.h"
|
||||
#include "esp_lcd_panel_ops.h"
|
||||
#include "esp_lcd_touch_ft5x06.h"
|
||||
#include "esp_lvgl_port.h"
|
||||
|
||||
#include "driver/i2c.h"
|
||||
#include "driver/i2s_std.h"
|
||||
#include "driver/ledc.h"
|
||||
#include "driver/sdmmc_host.h"
|
||||
#include "driver/spi_master.h"
|
||||
#include "esp_check.h"
|
||||
#include "esp_codec_dev.h"
|
||||
#include "esp_codec_dev_defaults.h"
|
||||
#include "driver/spi_master.h"
|
||||
#include "driver/i2s_std.h"
|
||||
|
||||
#include "esp_err.h"
|
||||
#include "esp_lcd_panel_io.h"
|
||||
#include "esp_lcd_panel_ops.h"
|
||||
#include "esp_lcd_panel_vendor.h"
|
||||
#include "esp_lcd_touch_ft5x06.h"
|
||||
#include "esp_lcd_types.h"
|
||||
#include "esp_log.h"
|
||||
#include "esp_lvgl_port.h"
|
||||
#include "esp_spiffs.h"
|
||||
#include "esp_vfs_fat.h"
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/task.h"
|
||||
#include "math.h"
|
||||
#include "sdmmc_cmd.h"
|
||||
#include "driver/sdmmc_host.h"
|
||||
|
||||
/******************************************************************************/
|
||||
/*************************** I2C ↓ *******************************************/
|
||||
#define BSP_I2C_SDA (GPIO_NUM_1) // SDA引脚
|
||||
#define BSP_I2C_SCL (GPIO_NUM_2) // SCL引脚
|
||||
#define BSP_I2C_SDA (GPIO_NUM_1) // SDA引脚
|
||||
#define BSP_I2C_SCL (GPIO_NUM_2) // SCL引脚
|
||||
|
||||
#define BSP_I2C_NUM (0) // I2C外设
|
||||
#define BSP_I2C_FREQ_HZ 100000 // 100kHz
|
||||
#define BSP_I2C_NUM (0) // I2C外设
|
||||
#define BSP_I2C_FREQ_HZ 100000 // 100kHz
|
||||
|
||||
esp_err_t bsp_i2c_init(void); // 初始化I2C接口
|
||||
/*************************** I2C ↑ *******************************************/
|
||||
esp_err_t bsp_i2c_init(void); // 初始化I2C接口
|
||||
/*************************** I2C ↑ *******************************************/
|
||||
/*******************************************************************************/
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
/*************************** 姿态传感器 QMI8658 ↓ ****************************/
|
||||
#define QMI8658_SENSOR_ADDR 0x6A // QMI8658 I2C地址
|
||||
/*************************** 姿态传感器 QMI8658 ↓ ****************************/
|
||||
#define QMI8658_SENSOR_ADDR 0x6A // QMI8658 I2C地址
|
||||
|
||||
// QMI8658寄存器地址
|
||||
enum qmi8658_reg
|
||||
{
|
||||
QMI8658_WHO_AM_I,
|
||||
QMI8658_REVISION_ID,
|
||||
QMI8658_CTRL1,
|
||||
QMI8658_CTRL2,
|
||||
QMI8658_CTRL3,
|
||||
QMI8658_CTRL4,
|
||||
QMI8658_CTRL5,
|
||||
QMI8658_CTRL6,
|
||||
QMI8658_CTRL7,
|
||||
QMI8658_CTRL8,
|
||||
QMI8658_CTRL9,
|
||||
QMI8658_CATL1_L,
|
||||
QMI8658_CATL1_H,
|
||||
QMI8658_CATL2_L,
|
||||
QMI8658_CATL2_H,
|
||||
QMI8658_CATL3_L,
|
||||
QMI8658_CATL3_H,
|
||||
QMI8658_CATL4_L,
|
||||
QMI8658_CATL4_H,
|
||||
QMI8658_FIFO_WTM_TH,
|
||||
QMI8658_FIFO_CTRL,
|
||||
QMI8658_FIFO_SMPL_CNT,
|
||||
QMI8658_FIFO_STATUS,
|
||||
QMI8658_FIFO_DATA,
|
||||
QMI8658_STATUSINT = 45,
|
||||
QMI8658_STATUS0,
|
||||
QMI8658_STATUS1,
|
||||
QMI8658_TIMESTAMP_LOW,
|
||||
QMI8658_TIMESTAMP_MID,
|
||||
QMI8658_TIMESTAMP_HIGH,
|
||||
QMI8658_TEMP_L,
|
||||
QMI8658_TEMP_H,
|
||||
QMI8658_AX_L,
|
||||
QMI8658_AX_H,
|
||||
QMI8658_AY_L,
|
||||
QMI8658_AY_H,
|
||||
QMI8658_AZ_L,
|
||||
QMI8658_AZ_H,
|
||||
QMI8658_GX_L,
|
||||
QMI8658_GX_H,
|
||||
QMI8658_GY_L,
|
||||
QMI8658_GY_H,
|
||||
QMI8658_GZ_L,
|
||||
QMI8658_GZ_H,
|
||||
QMI8658_COD_STATUS = 70,
|
||||
QMI8658_dQW_L = 73,
|
||||
QMI8658_dQW_H,
|
||||
QMI8658_dQX_L,
|
||||
QMI8658_dQX_H,
|
||||
QMI8658_dQY_L,
|
||||
QMI8658_dQY_H,
|
||||
QMI8658_dQZ_L,
|
||||
QMI8658_dQZ_H,
|
||||
QMI8658_dVX_L,
|
||||
QMI8658_dVX_H,
|
||||
QMI8658_dVY_L,
|
||||
QMI8658_dVY_H,
|
||||
QMI8658_dVZ_L,
|
||||
QMI8658_dVZ_H,
|
||||
QMI8658_TAP_STATUS = 89,
|
||||
QMI8658_STEP_CNT_LOW,
|
||||
QMI8658_STEP_CNT_MIDL,
|
||||
QMI8658_STEP_CNT_HIGH,
|
||||
QMI8658_RESET = 96
|
||||
enum qmi8658_reg {
|
||||
QMI8658_WHO_AM_I,
|
||||
QMI8658_REVISION_ID,
|
||||
QMI8658_CTRL1,
|
||||
QMI8658_CTRL2,
|
||||
QMI8658_CTRL3,
|
||||
QMI8658_CTRL4,
|
||||
QMI8658_CTRL5,
|
||||
QMI8658_CTRL6,
|
||||
QMI8658_CTRL7,
|
||||
QMI8658_CTRL8,
|
||||
QMI8658_CTRL9,
|
||||
QMI8658_CATL1_L,
|
||||
QMI8658_CATL1_H,
|
||||
QMI8658_CATL2_L,
|
||||
QMI8658_CATL2_H,
|
||||
QMI8658_CATL3_L,
|
||||
QMI8658_CATL3_H,
|
||||
QMI8658_CATL4_L,
|
||||
QMI8658_CATL4_H,
|
||||
QMI8658_FIFO_WTM_TH,
|
||||
QMI8658_FIFO_CTRL,
|
||||
QMI8658_FIFO_SMPL_CNT,
|
||||
QMI8658_FIFO_STATUS,
|
||||
QMI8658_FIFO_DATA,
|
||||
QMI8658_STATUSINT = 45,
|
||||
QMI8658_STATUS0,
|
||||
QMI8658_STATUS1,
|
||||
QMI8658_TIMESTAMP_LOW,
|
||||
QMI8658_TIMESTAMP_MID,
|
||||
QMI8658_TIMESTAMP_HIGH,
|
||||
QMI8658_TEMP_L,
|
||||
QMI8658_TEMP_H,
|
||||
QMI8658_AX_L,
|
||||
QMI8658_AX_H,
|
||||
QMI8658_AY_L,
|
||||
QMI8658_AY_H,
|
||||
QMI8658_AZ_L,
|
||||
QMI8658_AZ_H,
|
||||
QMI8658_GX_L,
|
||||
QMI8658_GX_H,
|
||||
QMI8658_GY_L,
|
||||
QMI8658_GY_H,
|
||||
QMI8658_GZ_L,
|
||||
QMI8658_GZ_H,
|
||||
QMI8658_COD_STATUS = 70,
|
||||
QMI8658_dQW_L = 73,
|
||||
QMI8658_dQW_H,
|
||||
QMI8658_dQX_L,
|
||||
QMI8658_dQX_H,
|
||||
QMI8658_dQY_L,
|
||||
QMI8658_dQY_H,
|
||||
QMI8658_dQZ_L,
|
||||
QMI8658_dQZ_H,
|
||||
QMI8658_dVX_L,
|
||||
QMI8658_dVX_H,
|
||||
QMI8658_dVY_L,
|
||||
QMI8658_dVY_H,
|
||||
QMI8658_dVZ_L,
|
||||
QMI8658_dVZ_H,
|
||||
QMI8658_TAP_STATUS = 89,
|
||||
QMI8658_STEP_CNT_LOW,
|
||||
QMI8658_STEP_CNT_MIDL,
|
||||
QMI8658_STEP_CNT_HIGH,
|
||||
QMI8658_RESET = 96
|
||||
};
|
||||
|
||||
// 倾角结构体
|
||||
typedef struct{
|
||||
int16_t acc_x;
|
||||
int16_t acc_y;
|
||||
int16_t acc_z;
|
||||
int16_t gyr_x;
|
||||
int16_t gyr_y;
|
||||
int16_t gyr_z;
|
||||
float AngleX;
|
||||
float AngleY;
|
||||
float AngleZ;
|
||||
}t_sQMI8658;
|
||||
typedef struct {
|
||||
int16_t acc_x;
|
||||
int16_t acc_y;
|
||||
int16_t acc_z;
|
||||
int16_t gyr_x;
|
||||
int16_t gyr_y;
|
||||
int16_t gyr_z;
|
||||
float AngleX;
|
||||
float AngleY;
|
||||
float AngleZ;
|
||||
} t_sQMI8658;
|
||||
|
||||
void qmi8658_init(void); // QMI8658初始化
|
||||
void qmi8658_fetch_angleFromAcc(t_sQMI8658 *p); // 获取倾角
|
||||
void qmi8658_init(void); // QMI8658初始化
|
||||
void qmi8658_fetch_angleFromAcc(t_sQMI8658* p); // 获取倾角
|
||||
|
||||
/*************************** 姿态传感器 QMI8658 ↑ ****************************/
|
||||
/*************************** 姿态传感器 QMI8658 ↑ ****************************/
|
||||
/*******************************************************************************/
|
||||
|
||||
/******************************************************************************/
|
||||
/*************************** I2S ↓ **************************************/
|
||||
|
||||
/* Example configurations */
|
||||
#define EXAMPLE_RECV_BUF_SIZE (2400)
|
||||
#define EXAMPLE_SAMPLE_RATE (16000)
|
||||
#define EXAMPLE_MCLK_MULTIPLE (384) // If not using 24-bit data width, 256 should be enough
|
||||
#define EXAMPLE_MCLK_FREQ_HZ (EXAMPLE_SAMPLE_RATE * EXAMPLE_MCLK_MULTIPLE)
|
||||
#define EXAMPLE_VOICE_VOLUME (70)
|
||||
#define EXAMPLE_RECV_BUF_SIZE (2400)
|
||||
#define EXAMPLE_SAMPLE_RATE (16000)
|
||||
#define EXAMPLE_MCLK_MULTIPLE \
|
||||
(384) // If not using 24-bit data width, 256 should be enough
|
||||
#define EXAMPLE_MCLK_FREQ_HZ (EXAMPLE_SAMPLE_RATE * EXAMPLE_MCLK_MULTIPLE)
|
||||
#define EXAMPLE_VOICE_VOLUME (70)
|
||||
|
||||
/* I2S port and GPIOs */
|
||||
#define I2S_NUM (0)
|
||||
#define I2S_MCK_IO (GPIO_NUM_38)
|
||||
#define I2S_BCK_IO (GPIO_NUM_14)
|
||||
#define I2S_WS_IO (GPIO_NUM_13)
|
||||
#define I2S_DO_IO (GPIO_NUM_45)
|
||||
#define I2S_DI_IO (-1)
|
||||
|
||||
#define I2S_NUM (0)
|
||||
#define I2S_MCK_IO (GPIO_NUM_38)
|
||||
#define I2S_BCK_IO (GPIO_NUM_14)
|
||||
#define I2S_WS_IO (GPIO_NUM_13)
|
||||
#define I2S_DO_IO (GPIO_NUM_45)
|
||||
#define I2S_DI_IO (-1)
|
||||
|
||||
/***********************************************************/
|
||||
/*************** IO扩展芯片 ↓ *************************/
|
||||
#define PCA9557_INPUT_PORT 0x00
|
||||
#define PCA9557_OUTPUT_PORT 0x01
|
||||
#define PCA9557_INPUT_PORT 0x00
|
||||
#define PCA9557_OUTPUT_PORT 0x01
|
||||
#define PCA9557_POLARITY_INVERSION_PORT 0x02
|
||||
#define PCA9557_CONFIGURATION_PORT 0x03
|
||||
#define PCA9557_CONFIGURATION_PORT 0x03
|
||||
|
||||
#define LCD_CS_GPIO BIT(0) // PCA9557_GPIO_NUM_1
|
||||
#define PA_EN_GPIO BIT(1) // PCA9557_GPIO_NUM_2
|
||||
#define DVP_PWDN_GPIO BIT(2) // PCA9557_GPIO_NUM_3
|
||||
#define LCD_CS_GPIO BIT(0) // PCA9557_GPIO_NUM_1
|
||||
#define PA_EN_GPIO BIT(1) // PCA9557_GPIO_NUM_2
|
||||
#define DVP_PWDN_GPIO BIT(2) // PCA9557_GPIO_NUM_3
|
||||
|
||||
#define PCA9557_SENSOR_ADDR 0x19 /*!< Slave address of the MPU9250 sensor */
|
||||
#define PCA9557_SENSOR_ADDR 0x19 /*!< Slave address of the MPU9250 sensor */
|
||||
|
||||
#define SET_BITS(_m, _s, _v) ((_v) ? (_m)|((_s)) : (_m)&~((_s)))
|
||||
#define SET_BITS(_m, _s, _v) ((_v) ? (_m) | ((_s)) : (_m) & ~((_s)))
|
||||
|
||||
void pca9557_init(void);
|
||||
void lcd_cs(uint8_t level);
|
||||
|
|
@ -173,27 +169,26 @@ void dvp_pwdn(uint8_t level);
|
|||
/*************** IO扩展芯片 ↑ *************************/
|
||||
/***********************************************************/
|
||||
|
||||
|
||||
/***********************************************************/
|
||||
/**************** LCD显示屏 ↓ *************************/
|
||||
#define BSP_LCD_PIXEL_CLOCK_HZ (80 * 1000 * 1000)
|
||||
#define BSP_LCD_SPI_NUM (SPI3_HOST)
|
||||
#define LCD_CMD_BITS (8)
|
||||
#define LCD_PARAM_BITS (8)
|
||||
#define BSP_LCD_BITS_PER_PIXEL (16)
|
||||
#define LCD_LEDC_CH LEDC_CHANNEL_0
|
||||
#define BSP_LCD_PIXEL_CLOCK_HZ (80 * 1000 * 1000)
|
||||
#define BSP_LCD_SPI_NUM (SPI3_HOST)
|
||||
#define LCD_CMD_BITS (8)
|
||||
#define LCD_PARAM_BITS (8)
|
||||
#define BSP_LCD_BITS_PER_PIXEL (16)
|
||||
#define LCD_LEDC_CH LEDC_CHANNEL_0
|
||||
|
||||
#define BSP_LCD_H_RES (320)
|
||||
#define BSP_LCD_V_RES (240)
|
||||
#define BSP_LCD_H_RES (320)
|
||||
#define BSP_LCD_V_RES (240)
|
||||
|
||||
#define BSP_LCD_SPI_MOSI (GPIO_NUM_40)
|
||||
#define BSP_LCD_SPI_CLK (GPIO_NUM_41)
|
||||
#define BSP_LCD_SPI_CS (GPIO_NUM_NC)
|
||||
#define BSP_LCD_DC (GPIO_NUM_39)
|
||||
#define BSP_LCD_RST (GPIO_NUM_NC)
|
||||
#define BSP_LCD_BACKLIGHT (GPIO_NUM_42)
|
||||
#define BSP_LCD_SPI_MOSI (GPIO_NUM_40)
|
||||
#define BSP_LCD_SPI_CLK (GPIO_NUM_41)
|
||||
#define BSP_LCD_SPI_CS (GPIO_NUM_NC)
|
||||
#define BSP_LCD_DC (GPIO_NUM_39)
|
||||
#define BSP_LCD_RST (GPIO_NUM_NC)
|
||||
#define BSP_LCD_BACKLIGHT (GPIO_NUM_42)
|
||||
|
||||
#define BSP_LCD_DRAW_BUF_HEIGHT (20)
|
||||
#define BSP_LCD_DRAW_BUF_HEIGHT (20)
|
||||
|
||||
esp_err_t bsp_display_brightness_init(void);
|
||||
esp_err_t bsp_display_brightness_set(int brightness_percent);
|
||||
|
|
@ -201,15 +196,15 @@ esp_err_t bsp_display_backlight_off(void);
|
|||
esp_err_t bsp_display_backlight_on(void);
|
||||
esp_err_t bsp_lcd_init(void);
|
||||
void lcd_set_color(uint16_t color);
|
||||
void lcd_draw_pictrue(int x_start, int y_start, int x_end, int y_end, const unsigned char *gImage);
|
||||
void lcd_draw_pictrue(int x_start, int y_start, int x_end, int y_end,
|
||||
const unsigned char* gImage);
|
||||
void bsp_lvgl_start(void);
|
||||
/*************** LCD显示屏 ↑ *************************/
|
||||
/***********************************************************/
|
||||
|
||||
|
||||
/***********************************************************/
|
||||
/**************** 摄像头 ↓ ****************************/
|
||||
#define CAMERA_EN 0
|
||||
#define CAMERA_EN 0
|
||||
#if CAMERA
|
||||
#include "esp_camera.h"
|
||||
|
||||
|
|
@ -231,7 +226,6 @@ void bsp_lvgl_start(void);
|
|||
#define CAMERA_PIN_HREF 46
|
||||
#define CAMERA_PIN_PCLK 7
|
||||
|
||||
|
||||
#define XCLK_FREQ_HZ 24000000
|
||||
|
||||
void bsp_camera_init(void);
|
||||
|
|
@ -241,49 +235,48 @@ void app_camera_lcd(void);
|
|||
/******************** 摄像头 ↑ *************************/
|
||||
/***********************************************************/
|
||||
|
||||
|
||||
|
||||
|
||||
/***********************************************************/
|
||||
/*************** SPIFFS文件系统 ↓ *********************/
|
||||
#define SPIFFS_BASE "/spiffs"
|
||||
#define SPIFFS_BASE "/spiffs"
|
||||
|
||||
esp_err_t bsp_spiffs_mount(void);
|
||||
|
||||
/*************** SPIFFS文件系统 ↑ *********************/
|
||||
/**********************************************************/
|
||||
|
||||
|
||||
|
||||
/***********************************************************/
|
||||
/********************* 音频 ↓ *************************/
|
||||
#define ADC_I2S_CHANNEL 4
|
||||
|
||||
#define VOLUME_DEFAULT 70
|
||||
#define VOLUME_DEFAULT 70
|
||||
|
||||
#define CODEC_DEFAULT_SAMPLE_RATE (16000)
|
||||
#define CODEC_DEFAULT_BIT_WIDTH (32)
|
||||
#define CODEC_DEFAULT_ADC_VOLUME (24.0)
|
||||
#define CODEC_DEFAULT_CHANNEL (2)
|
||||
#define CODEC_DEFAULT_SAMPLE_RATE (16000)
|
||||
#define CODEC_DEFAULT_BIT_WIDTH (32)
|
||||
#define CODEC_DEFAULT_ADC_VOLUME (24.0)
|
||||
#define CODEC_DEFAULT_CHANNEL (2)
|
||||
|
||||
#define BSP_I2S_NUM I2S_NUM_1
|
||||
#define BSP_I2S_NUM I2S_NUM_1
|
||||
|
||||
#define GPIO_I2S_LRCK (GPIO_NUM_13)
|
||||
#define GPIO_I2S_MCLK (GPIO_NUM_38)
|
||||
#define GPIO_I2S_SCLK (GPIO_NUM_14)
|
||||
#define GPIO_I2S_SDIN (GPIO_NUM_12)
|
||||
#define GPIO_I2S_DOUT (GPIO_NUM_45)
|
||||
#define GPIO_PWR_CTRL (GPIO_NUM_NC)
|
||||
#define GPIO_I2S_LRCK (GPIO_NUM_13)
|
||||
#define GPIO_I2S_MCLK (GPIO_NUM_38)
|
||||
#define GPIO_I2S_SCLK (GPIO_NUM_14)
|
||||
#define GPIO_I2S_SDIN (GPIO_NUM_12)
|
||||
#define GPIO_I2S_DOUT (GPIO_NUM_45)
|
||||
#define GPIO_PWR_CTRL (GPIO_NUM_NC)
|
||||
|
||||
esp_err_t bsp_codec_init(void);
|
||||
esp_err_t bsp_i2s_write(void *audio_buffer, size_t len, size_t *bytes_written, uint32_t timeout_ms);
|
||||
esp_err_t bsp_codec_set_fs(uint32_t rate, uint32_t bits_cfg, i2s_slot_mode_t ch);
|
||||
esp_err_t bsp_speaker_set_fs(uint32_t rate, uint32_t bits_cfg, i2s_slot_mode_t ch);
|
||||
esp_err_t bsp_i2s_write(void* audio_buffer, size_t len, size_t* bytes_written,
|
||||
uint32_t timeout_ms);
|
||||
esp_err_t bsp_codec_set_fs(uint32_t rate, uint32_t bits_cfg,
|
||||
i2s_slot_mode_t ch);
|
||||
esp_err_t bsp_speaker_set_fs(uint32_t rate, uint32_t bits_cfg,
|
||||
i2s_slot_mode_t ch);
|
||||
esp_err_t bsp_codec_mute_set(bool enable);
|
||||
esp_err_t bsp_codec_volume_set(int volume, int *volume_set);
|
||||
esp_err_t bsp_codec_volume_set(int volume, int* volume_set);
|
||||
|
||||
int bsp_get_feed_channel(void);
|
||||
esp_err_t bsp_get_feed_data(bool is_get_raw_channel, int16_t *buffer, int buffer_len);
|
||||
esp_err_t bsp_get_feed_data(bool is_get_raw_channel, int16_t* buffer,
|
||||
int buffer_len);
|
||||
|
||||
/********************* 音频 ↑ *************************/
|
||||
/***********************************************************/
|
||||
File diff suppressed because it is too large
Load Diff
23
main/main.c
23
main/main.c
|
|
@ -1,18 +1,17 @@
|
|||
#include <stdio.h>
|
||||
#include "esp32_s3_szp.h"
|
||||
#include "app_ui.h"
|
||||
|
||||
#include "app_sr.h"
|
||||
#include "app_ui.h"
|
||||
#include "esp32_s3_szp.h"
|
||||
|
||||
void app_main(void) {
|
||||
bsp_i2c_init(); // I2C初始化
|
||||
pca9557_init(); // IO扩展芯片初始化
|
||||
bsp_lvgl_start(); // 初始化液晶屏lvgl接口
|
||||
|
||||
void app_main(void)
|
||||
{
|
||||
bsp_i2c_init(); // I2C初始化
|
||||
pca9557_init(); // IO扩展芯片初始化
|
||||
bsp_lvgl_start(); // 初始化液晶屏lvgl接口
|
||||
bsp_spiffs_mount(); // SPIFFS文件系统初始化
|
||||
bsp_codec_init(); // 音频初始化
|
||||
mp3_player_init(); // MP3播放器初始化
|
||||
|
||||
bsp_spiffs_mount(); // SPIFFS文件系统初始化
|
||||
bsp_codec_init(); // 音频初始化
|
||||
mp3_player_init(); // MP3播放器初始化
|
||||
|
||||
app_sr_init(); // 语音识别初始化
|
||||
app_sr_init(); // 语音识别初始化
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue