doit_s3_aibox.cc 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. #include "wifi_board.h"
  2. #include "codecs/no_audio_codec.h"
  3. #include "system_reset.h"
  4. #include "application.h"
  5. #include "button.h"
  6. #include "config.h"
  7. #include "led/gpio_led.h"
  8. #include <wifi_station.h>
  9. #include <esp_log.h>
  10. #include <driver/i2c_master.h>
  11. #include <driver/gpio.h>
  12. #define TAG "DoitS3AiBox"
  13. class DoitS3AiBox : public WifiBoard {
  14. private:
  15. Button boot_button_;
  16. Button touch_button_;
  17. Button volume_up_button_;
  18. Button volume_down_button_;
  19. uint8_t click_times;
  20. uint32_t check_time;
  21. void InitializeButtons() {
  22. click_times = 0;
  23. check_time = 0;
  24. boot_button_.OnClick([this]() {
  25. if(click_times==0) {
  26. check_time = esp_timer_get_time()/1000;
  27. }
  28. if(esp_timer_get_time()/1000-check_time<1000) {
  29. click_times++;
  30. check_time = esp_timer_get_time()/1000;
  31. } else {
  32. click_times = 0;
  33. check_time = 0;
  34. }
  35. auto& app = Application::GetInstance();
  36. if (app.GetDeviceState() == kDeviceStateStarting && !WifiStation::GetInstance().IsConnected()) {
  37. ResetWifiConfiguration();
  38. }
  39. app.ToggleChatState();
  40. });
  41. boot_button_.OnDoubleClick([this]() {
  42. click_times++;
  43. ESP_LOGI(TAG, "DoubleClick times %d", click_times);
  44. if(click_times==3) {
  45. click_times = 0;
  46. ResetWifiConfiguration();
  47. }
  48. });
  49. boot_button_.OnLongPress([this]() {
  50. if(click_times>=3) {
  51. ResetWifiConfiguration();
  52. } else {
  53. click_times = 0;
  54. check_time = 0;
  55. }
  56. });
  57. touch_button_.OnPressDown([this]() {
  58. click_times = 0;
  59. Application::GetInstance().StartListening();
  60. });
  61. touch_button_.OnPressUp([this]() {
  62. click_times = 0;
  63. Application::GetInstance().StopListening();
  64. });
  65. volume_up_button_.OnClick([this]() {
  66. click_times = 0;
  67. auto codec = GetAudioCodec();
  68. auto volume = codec->output_volume() + 10;
  69. if (volume > 100) {
  70. volume = 100;
  71. }
  72. codec->SetOutputVolume(volume);
  73. });
  74. volume_up_button_.OnLongPress([this]() {
  75. click_times = 0;
  76. GetAudioCodec()->SetOutputVolume(100);
  77. });
  78. volume_down_button_.OnClick([this]() {
  79. click_times = 0;
  80. auto codec = GetAudioCodec();
  81. auto volume = codec->output_volume() - 10;
  82. if (volume < 0) {
  83. volume = 0;
  84. }
  85. codec->SetOutputVolume(volume);
  86. });
  87. volume_down_button_.OnLongPress([this]() {
  88. click_times = 0;
  89. GetAudioCodec()->SetOutputVolume(0);
  90. });
  91. }
  92. void InitializeGpio(gpio_num_t gpio_num_) {
  93. gpio_config_t config = {
  94. .pin_bit_mask = (1ULL << gpio_num_),
  95. .mode = GPIO_MODE_OUTPUT,
  96. .pull_up_en = GPIO_PULLUP_ENABLE,
  97. .pull_down_en = GPIO_PULLDOWN_DISABLE,
  98. .intr_type = GPIO_INTR_DISABLE,
  99. };
  100. ESP_ERROR_CHECK(gpio_config(&config));
  101. gpio_set_level(gpio_num_, 1);
  102. }
  103. public:
  104. DoitS3AiBox() :
  105. boot_button_(BOOT_BUTTON_GPIO),
  106. touch_button_(TOUCH_BUTTON_GPIO),
  107. volume_up_button_(VOLUME_UP_BUTTON_GPIO),
  108. volume_down_button_(VOLUME_DOWN_BUTTON_GPIO){
  109. // 上拉io48 置高电平
  110. InitializeGpio(GPIO_NUM_48);
  111. InitializeButtons();
  112. }
  113. virtual Led* GetLed() override {
  114. static GpioLed led(BUILTIN_LED_GPIO, 1);
  115. return &led;
  116. }
  117. virtual AudioCodec* GetAudioCodec() override {
  118. static NoAudioCodecSimplexPdm audio_codec(AUDIO_INPUT_SAMPLE_RATE, AUDIO_OUTPUT_SAMPLE_RATE,
  119. AUDIO_I2S_SPK_GPIO_BCLK, AUDIO_I2S_SPK_GPIO_LRCK, AUDIO_I2S_SPK_GPIO_DOUT, AUDIO_I2S_MIC_GPIO_WS, AUDIO_I2S_MIC_GPIO_DIN);
  120. return &audio_codec;
  121. }
  122. };
  123. DECLARE_BOARD(DoitS3AiBox);