|
|
@@ -9,6 +9,8 @@
|
|
|
#include <unistd.h>
|
|
|
#include <string.h>
|
|
|
#include <inttypes.h>
|
|
|
+
|
|
|
+#include "app_io.h"
|
|
|
#include "freertos/FreeRTOS.h"
|
|
|
#include "freertos/task.h"
|
|
|
#include "freertos/queue.h"
|
|
|
@@ -49,7 +51,7 @@ typedef enum {
|
|
|
} audio_mode_t;
|
|
|
|
|
|
static audio_mode_t current_audio_mode = AUDIO_MODE_NORMAL;
|
|
|
-static QueueHandle_t gpio_evt_queue = NULL;
|
|
|
+
|
|
|
|
|
|
/********************************
|
|
|
* STATIC FUNCTION DECLARATIONS
|
|
|
@@ -65,8 +67,7 @@ static void bt_av_hdl_stack_evt(uint16_t event, void *p_param);
|
|
|
|
|
|
/* GPIO interrupt handler */
|
|
|
static void IRAM_ATTR gpio_isr_handler(void* arg);
|
|
|
-/* GPIO task to handle events */
|
|
|
-static void gpio_task(void* arg);
|
|
|
+
|
|
|
/* Switch audio mode */
|
|
|
static void switch_audio_mode(void);
|
|
|
/* Update GPIO output based on audio mode */
|
|
|
@@ -210,58 +211,6 @@ static void bt_av_hdl_stack_evt(uint16_t event, void *p_param)
|
|
|
}
|
|
|
|
|
|
|
|
|
-static void IRAM_ATTR gpio_isr_handler(void* arg)
|
|
|
-{
|
|
|
- uint32_t gpio_num = (uint32_t) arg;
|
|
|
- xQueueSendFromISR(gpio_evt_queue, &gpio_num, NULL);
|
|
|
-}
|
|
|
-
|
|
|
-static void gpio_task(void* arg)
|
|
|
-{
|
|
|
- uint32_t io_num;
|
|
|
- for(;;) {
|
|
|
- if(xQueueReceive(gpio_evt_queue, &io_num, portMAX_DELAY)) {
|
|
|
- // 消抖处理
|
|
|
- vTaskDelay(50 / portTICK_PERIOD_MS);
|
|
|
- if(gpio_get_level(io_num) == 0) { // 确认仍然是低电平
|
|
|
- ESP_LOGI(BT_AV_TAG, "GPIO%"PRIu32" interrupt, button pressed", io_num);
|
|
|
- switch_audio_mode();
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-static void switch_audio_mode(void)
|
|
|
-{
|
|
|
- // 切换音频模式
|
|
|
- current_audio_mode = (current_audio_mode + 1) % AUDIO_MODE_MAX;
|
|
|
-
|
|
|
- const char* mode_names[] = {
|
|
|
- "NORMAL",
|
|
|
- "BASS_BOOST",
|
|
|
- };
|
|
|
-
|
|
|
- ESP_LOGI(BT_AV_TAG, "Audio mode switched to: %s", mode_names[current_audio_mode]);
|
|
|
-
|
|
|
- // 更新GPIO输出状态
|
|
|
- update_gpio_output();
|
|
|
-}
|
|
|
-static void update_gpio_output(void)
|
|
|
-{
|
|
|
- // 根据音频模式设置GPIO19输出状态
|
|
|
- switch(current_audio_mode) {
|
|
|
- case AUDIO_MODE_NORMAL:
|
|
|
- gpio_set_level(GPIO_OUTPUT, 0); // 低电平
|
|
|
- break;
|
|
|
- case AUDIO_MODE_BASS_BOOST:
|
|
|
- gpio_set_level(GPIO_OUTPUT, 1); // 高电平
|
|
|
- break;
|
|
|
- default:
|
|
|
- gpio_set_level(GPIO_OUTPUT, 0);
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- ESP_LOGI(BT_AV_TAG, "GPIO19 set to: %d", gpio_get_level(GPIO_OUTPUT));
|
|
|
-}
|
|
|
|
|
|
/*******************************
|
|
|
* MAIN ENTRY POINT
|
|
|
@@ -277,107 +226,9 @@ void app_main(void)
|
|
|
err = nvs_flash_init();
|
|
|
}
|
|
|
ESP_ERROR_CHECK(err);
|
|
|
-
|
|
|
- // todo 拉低引脚 io32
|
|
|
- // todo 拉低引脚 io32 - 已完善
|
|
|
- // 配置GPIO32为输出模式并拉低电平
|
|
|
- gpio_config_t io_conf = {
|
|
|
- .pin_bit_mask = (1ULL << GPIO_NUM_32), // GPIO32
|
|
|
- .mode = GPIO_MODE_OUTPUT, // 输出模式
|
|
|
- .pull_up_en = GPIO_PULLUP_DISABLE, // 禁用上拉
|
|
|
- .pull_down_en = GPIO_PULLDOWN_DISABLE, // 禁用下拉
|
|
|
- .intr_type = GPIO_INTR_DISABLE // 禁用中断
|
|
|
- };
|
|
|
-
|
|
|
- // 配置GPIO
|
|
|
- err = gpio_config(&io_conf);
|
|
|
- if (err != ESP_OK) {
|
|
|
- ESP_LOGE(BT_AV_TAG, "GPIO32 config failed: %s", esp_err_to_name(err));
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- // 拉低GPIO32
|
|
|
- err = gpio_set_level(GPIO_NUM_32, 0);
|
|
|
- if (err != ESP_OK) {
|
|
|
- ESP_LOGE(BT_AV_TAG, "Set GPIO32 low failed: %s", esp_err_to_name(err));
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- // system state led
|
|
|
- gpio_config_t led_io_conf = {
|
|
|
- .pin_bit_mask = (1ULL << GPIO_NUM_15), // GPIO15
|
|
|
- .mode = GPIO_MODE_OUTPUT, // 输出模式
|
|
|
- .pull_up_en = GPIO_PULLUP_DISABLE, // 禁用上拉
|
|
|
- .pull_down_en = GPIO_PULLDOWN_DISABLE, // 禁用下拉
|
|
|
- .intr_type = GPIO_INTR_DISABLE // 禁用中断
|
|
|
- };
|
|
|
-
|
|
|
- // 配置GPIO
|
|
|
- err = gpio_config(&led_io_conf);
|
|
|
- if (err != ESP_OK) {
|
|
|
- ESP_LOGE(BT_AV_TAG, "GPIO15 config failed: %s", esp_err_to_name(err));
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- // 拉低GPIO15
|
|
|
- err = gpio_set_level(GPIO_NUM_15, 0);
|
|
|
- if (err != ESP_OK) {
|
|
|
- ESP_LOGE(BT_AV_TAG, "Set GPIO15 low failed: %s", esp_err_to_name(err));
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- ESP_LOGI(BT_AV_TAG, "GPIO15 set to low level");
|
|
|
-
|
|
|
- // 配置GPIO2为输入模式,用于低电平中断
|
|
|
- gpio_config_t btn_conf = {
|
|
|
- .pin_bit_mask = (1ULL << GPIO_BTN),
|
|
|
- .mode = GPIO_MODE_INPUT,
|
|
|
- .pull_up_en = GPIO_PULLUP_ENABLE, // 启用上拉,按钮按下时拉低
|
|
|
- .pull_down_en = GPIO_PULLDOWN_DISABLE,
|
|
|
- .intr_type = GPIO_INTR_NEGEDGE // 下降沿触发(按下按钮)
|
|
|
- };
|
|
|
-
|
|
|
- err = gpio_config(&btn_conf);
|
|
|
- if (err != ESP_OK) {
|
|
|
- ESP_LOGE(BT_AV_TAG, "GPIO2 config failed: %s", esp_err_to_name(err));
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- // 配置GPIO19为输出模式
|
|
|
- gpio_config_t output_conf = {
|
|
|
- .pin_bit_mask = (1ULL << GPIO_OUTPUT),
|
|
|
- .mode = GPIO_MODE_OUTPUT,
|
|
|
- .pull_up_en = GPIO_PULLUP_DISABLE,
|
|
|
- .pull_down_en = GPIO_PULLDOWN_DISABLE,
|
|
|
- .intr_type = GPIO_INTR_DISABLE
|
|
|
- };
|
|
|
-
|
|
|
- err = gpio_config(&output_conf);
|
|
|
- if (err != ESP_OK) {
|
|
|
- ESP_LOGE(BT_AV_TAG, "GPIO19 config failed: %s", esp_err_to_name(err));
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- // 初始化GPIO19为低电平
|
|
|
- gpio_set_level(GPIO_OUTPUT, 0);
|
|
|
-
|
|
|
- // 创建GPIO事件队列
|
|
|
- gpio_evt_queue = xQueueCreate(10, sizeof(uint32_t));
|
|
|
-
|
|
|
- // 启动GPIO任务
|
|
|
- xTaskCreate(gpio_task, "gpio_task", 2048, NULL, 10, NULL);
|
|
|
-
|
|
|
- // 安装GPIO ISR服务
|
|
|
- gpio_install_isr_service(0);
|
|
|
-
|
|
|
- // 注册GPIO2的中断处理函数
|
|
|
- gpio_isr_handler_add(GPIO_BTN, gpio_isr_handler, (void*) GPIO_BTN);
|
|
|
-
|
|
|
- ESP_LOGI(BT_AV_TAG, "GPIO2 interrupt and GPIO19 output initialized");
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
+ ESP_LOGI(BT_AV_TAG, "Initializing hw gpio ...");
|
|
|
+ init_io();
|
|
|
+ ESP_LOGI(BT_AV_TAG, "Initializing bluetooth ...");
|
|
|
|
|
|
/*
|
|
|
* This example only uses the functions of Classical Bluetooth.
|
|
|
@@ -424,7 +275,6 @@ void app_main(void)
|
|
|
pin_code[2] = '3';
|
|
|
pin_code[3] = '4';
|
|
|
esp_bt_gap_set_pin(pin_type, 4, pin_code);
|
|
|
-
|
|
|
ESP_LOGI(BT_AV_TAG, "Own address:[%s]", bda2str((uint8_t *)esp_bt_dev_get_address(), bda_str, sizeof(bda_str)));
|
|
|
bt_app_task_start_up();
|
|
|
/* bluetooth device name, connection mode and profile set up */
|