Skip to content

Commit

Permalink
add iot framework
Browse files Browse the repository at this point in the history
  • Loading branch information
78 committed Dec 6, 2024
1 parent 43b1046 commit d31901e
Show file tree
Hide file tree
Showing 27 changed files with 686 additions and 76 deletions.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
# CMakeLists in this exact order for cmake to work correctly
cmake_minimum_required(VERSION 3.16)

set(PROJECT_VER "0.9.6")
set(PROJECT_VER "0.9.7")

include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(xiaozhi)
9 changes: 9 additions & 0 deletions main/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ set(SOURCES "audio_codecs/audio_codec.cc"
"protocols/protocol.cc"
"protocols/mqtt_protocol.cc"
"protocols/websocket_protocol.cc"
"iot/thing.cc"
"iot/thing_manager.cc"
"system_info.cc"
"application.cc"
"ota.cc"
Expand All @@ -19,6 +21,10 @@ set(SOURCES "audio_codecs/audio_codec.cc"

set(INCLUDE_DIRS "." "display" "audio_codecs" "protocols" "audio_processing")

# 添加 IOT 相关文件
file(GLOB IOT_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/iot/things/*.cc)
list(APPEND SOURCES ${IOT_SOURCES})

# 字体
file(GLOB FONT_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/fonts/*.c)
list(APPEND SOURCES ${FONT_SOURCES})
Expand All @@ -44,6 +50,8 @@ elseif(CONFIG_BOARD_TYPE_KEVIN_C3)
set(BOARD_TYPE "kevin-c3")
elseif(CONFIG_BOARD_TYPE_LICHUANG_DEV)
set(BOARD_TYPE "lichuang-dev")
elseif(CONFIG_BOARD_TYPE_TERRENCE_C3_DEV)
set(BOARD_TYPE "terrence-c3-dev")
endif()
file(GLOB BOARD_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/boards/${BOARD_TYPE}/*.cc)
list(APPEND SOURCES ${BOARD_SOURCES})
Expand All @@ -55,6 +63,7 @@ endif()
idf_component_register(SRCS ${SOURCES}
EMBED_FILES "assets/err_reg.p3" "assets/err_pin.p3" "assets/err_wificonfig.p3"
INCLUDE_DIRS ${INCLUDE_DIRS}
WHOLE_ARCHIVE
)

# 使用 target_compile_definitions 来定义 BOARD_TYPE
Expand Down
32 changes: 28 additions & 4 deletions main/application.cc
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
#include "application.h"
#include "board.h"
#include "display.h"
#include "system_info.h"
#include "ml307_ssl_transport.h"
#include "audio_codec.h"
#include "mqtt_protocol.h"
#include "websocket_protocol.h"
#include "font_awesome_symbols.h"
#include "iot/thing_manager.h"

#include <cstring>
#include <esp_log.h>
Expand Down Expand Up @@ -183,8 +186,6 @@ void Application::StopListening() {

void Application::Start() {
auto& board = Board::GetInstance();
board.Initialize();

auto builtin_led = board.GetBuiltinLed();
builtin_led->SetBlue();
builtin_led->StartContinuousBlink(100);
Expand Down Expand Up @@ -308,18 +309,22 @@ void Application::Start() {
}
});
protocol_->OnAudioChannelOpened([this, codec, &board]() {
board.SetPowerSaveMode(false);
if (protocol_->server_sample_rate() != codec->output_sample_rate()) {
ESP_LOGW(TAG, "服务器的音频采样率 %d 与设备输出的采样率 %d 不一致,重采样后可能会失真",
protocol_->server_sample_rate(), codec->output_sample_rate());
}
SetDecodeSampleRate(protocol_->server_sample_rate());
board.SetPowerSaveMode(false);
// 物联网设备描述符
last_iot_states_.clear();
auto& thing_manager = iot::ThingManager::GetInstance();
protocol_->SendIotDescriptors(thing_manager.GetDescriptorsJson());
});
protocol_->OnAudioChannelClosed([this, &board]() {
board.SetPowerSaveMode(true);
Schedule([this]() {
SetChatState(kChatStateIdle);
});
board.SetPowerSaveMode(true);
});
protocol_->OnIncomingJson([this, display](const cJSON* root) {
// Parse JSON data
Expand Down Expand Up @@ -363,6 +368,15 @@ void Application::Start() {
if (emotion != NULL) {
display->SetEmotion(emotion->valuestring);
}
} else if (strcmp(type->valuestring, "iot") == 0) {
auto commands = cJSON_GetObjectItem(root, "commands");
if (commands != NULL) {
auto& thing_manager = iot::ThingManager::GetInstance();
for (int i = 0; i < cJSON_GetArraySize(commands); ++i) {
auto command = cJSON_GetArrayItem(commands, i);
thing_manager.Invoke(command);
}
}
}
});

Expand Down Expand Up @@ -557,6 +571,7 @@ void Application::SetChatState(ChatState state) {
#if CONFIG_IDF_TARGET_ESP32S3
audio_processor_.Start();
#endif
UpdateIotStates();
break;
case kChatStateSpeaking:
builtin_led->SetGreen();
Expand Down Expand Up @@ -591,3 +606,12 @@ void Application::SetDecodeSampleRate(int sample_rate) {
output_resampler_.Configure(opus_decode_sample_rate_, codec->output_sample_rate());
}
}

void Application::UpdateIotStates() {
auto& thing_manager = iot::ThingManager::GetInstance();
auto states = thing_manager.GetStatesJson();
if (states != last_iot_states_) {
last_iot_states_ = states;
protocol_->SendIotStates(states);
}
}
14 changes: 7 additions & 7 deletions main/application.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,16 @@
#include <freertos/FreeRTOS.h>
#include <freertos/event_groups.h>
#include <freertos/task.h>
#include <opus.h>

#include <string>
#include <mutex>
#include <list>
#include <condition_variable>

#include "opus_encoder.h"
#include "opus_decoder.h"
#include "opus_resampler.h"
#include <opus_encoder.h>
#include <opus_decoder.h>
#include <opus_resampler.h>

#include "protocol.h"
#include "display.h"
#include "board.h"
#include "ota.h"
#include "background_task.h"

Expand Down Expand Up @@ -58,6 +56,7 @@ class Application {
void ToggleChatState();
void StartListening();
void StopListening();
void UpdateIotStates();

private:
Application();
Expand All @@ -75,6 +74,7 @@ class Application {
volatile ChatState chat_state_ = kChatStateUnknown;
bool keep_listening_ = false;
bool aborted_ = false;
std::string last_iot_states_;

// Audio encode / decode
BackgroundTask background_task_;
Expand Down
21 changes: 11 additions & 10 deletions main/boards/bread-compact-ml307/compact_ml307_board.cc
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include "button.h"
#include "led.h"
#include "config.h"
#include "iot/thing_manager.h"

#include <esp_log.h>
#include <driver/i2c_master.h>
Expand Down Expand Up @@ -59,8 +60,7 @@ class CompactMl307Board : public Ml307Board {
});

volume_up_button_.OnLongPress([this]() {
auto codec = GetAudioCodec();
codec->SetOutputVolume(100);
GetAudioCodec()->SetOutputVolume(100);
GetDisplay()->ShowNotification("最大音量");
});

Expand All @@ -75,30 +75,31 @@ class CompactMl307Board : public Ml307Board {
});

volume_down_button_.OnLongPress([this]() {
auto codec = GetAudioCodec();
codec->SetOutputVolume(0);
GetAudioCodec()->SetOutputVolume(0);
GetDisplay()->ShowNotification("已静音");
});
}

// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Lamp"));
}

public:
CompactMl307Board() : Ml307Board(ML307_TX_PIN, ML307_RX_PIN, 4096),
boot_button_(BOOT_BUTTON_GPIO),
touch_button_(TOUCH_BUTTON_GPIO),
volume_up_button_(VOLUME_UP_BUTTON_GPIO),
volume_down_button_(VOLUME_DOWN_BUTTON_GPIO),
system_reset_(RESET_NVS_BUTTON_GPIO, RESET_FACTORY_BUTTON_GPIO) {
}

virtual void Initialize() override {
ESP_LOGI(TAG, "Initializing CompactMl307Board");
// Check if the reset button is pressed
system_reset_.CheckButtons();

InitializeDisplayI2c();
InitializeButtons();

Ml307Board::Initialize();
InitializeIot();
}

virtual Led* GetBuiltinLed() override {
Expand Down
23 changes: 12 additions & 11 deletions main/boards/bread-compact-wifi/compact_wifi_board.cc
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include "button.h"
#include "led.h"
#include "config.h"
#include "iot/thing_manager.h"

#include <wifi_station.h>
#include <esp_log.h>
Expand Down Expand Up @@ -64,8 +65,7 @@ class CompactWifiBoard : public WifiBoard {
});

volume_up_button_.OnLongPress([this]() {
auto codec = GetAudioCodec();
codec->SetOutputVolume(100);
GetAudioCodec()->SetOutputVolume(100);
GetDisplay()->ShowNotification("最大音量");
});

Expand All @@ -80,30 +80,31 @@ class CompactWifiBoard : public WifiBoard {
});

volume_down_button_.OnLongPress([this]() {
auto codec = GetAudioCodec();
codec->SetOutputVolume(0);
GetAudioCodec()->SetOutputVolume(0);
GetDisplay()->ShowNotification("已静音");
});
}

// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Lamp"));
}

public:
CompactWifiBoard() :
boot_button_(BOOT_BUTTON_GPIO),
touch_button_(TOUCH_BUTTON_GPIO, 1),
touch_button_(TOUCH_BUTTON_GPIO),
volume_up_button_(VOLUME_UP_BUTTON_GPIO),
volume_down_button_(VOLUME_DOWN_BUTTON_GPIO),
system_reset_(RESET_NVS_BUTTON_GPIO, RESET_FACTORY_BUTTON_GPIO) {
}

virtual void Initialize() override {
ESP_LOGI(TAG, "Initializing CompactWifiBoard");
// Check if the reset button is pressed
system_reset_.CheckButtons();

InitializeDisplayI2c();
InitializeButtons();

WifiBoard::Initialize();
InitializeIot();
}

virtual Led* GetBuiltinLed() override {
Expand Down
5 changes: 4 additions & 1 deletion main/boards/common/board.cc
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@
#include <esp_ota_ops.h>
#include <esp_chip_info.h>

// static const char *TAG = "Board";
#define TAG "Board"

Board::Board() {
}

bool Board::GetBatteryLevel(int &level, bool& charging) {
return false;
Expand Down
3 changes: 1 addition & 2 deletions main/boards/common/board.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class Board {
virtual std::string GetBoardJson() = 0;

protected:
Board() = default;
Board();

public:
static Board& GetInstance() {
Expand All @@ -30,7 +30,6 @@ class Board {
return *instance;
}

virtual void Initialize() = 0;
virtual void StartNetwork() = 0;
virtual ~Board() = default;
virtual Led* GetBuiltinLed() = 0;
Expand Down
7 changes: 4 additions & 3 deletions main/boards/common/ml307_board.cc
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
#include "ml307_board.h"

#include "application.h"
#include "display.h"
#include "font_awesome_symbols.h"

#include <esp_log.h>
Expand Down Expand Up @@ -72,10 +74,9 @@ void Ml307Board::WaitForNetworkReady() {
ESP_LOGI(TAG, "ML307 Module: %s", module_name.c_str());
ESP_LOGI(TAG, "ML307 IMEI: %s", imei.c_str());
ESP_LOGI(TAG, "ML307 ICCID: %s", iccid.c_str());
}

void Ml307Board::Initialize() {
ESP_LOGI(TAG, "Initializing Ml307Board");
// Close all previous connections
modem_.ResetConnections();
}

Http* Ml307Board::CreateHttp() {
Expand Down
1 change: 0 additions & 1 deletion main/boards/common/ml307_board.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ class Ml307Board : public Board {

public:
Ml307Board(gpio_num_t tx_pin, gpio_num_t rx_pin, size_t rx_buffer_size = 4096);
virtual void Initialize() override;
virtual void StartNetwork() override;
virtual Http* CreateHttp() override;
virtual WebSocket* CreateWebSocket() override;
Expand Down
6 changes: 2 additions & 4 deletions main/boards/common/wifi_board.cc
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
#include "wifi_board.h"

#include "display.h"
#include "application.h"
#include "system_info.h"
#include "font_awesome_symbols.h"
Expand Down Expand Up @@ -70,10 +72,6 @@ void WifiBoard::StartNetwork() {
}
}

void WifiBoard::Initialize() {
ESP_LOGI(TAG, "Initializing WifiBoard");
}

Http* WifiBoard::CreateHttp() {
return new EspHttp();
}
Expand Down
1 change: 0 additions & 1 deletion main/boards/common/wifi_board.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ class WifiBoard : public Board {
virtual std::string GetBoardJson() override;

public:
virtual void Initialize() override;
virtual void StartNetwork() override;
virtual Http* CreateHttp() override;
virtual WebSocket* CreateWebSocket() override;
Expand Down
5 changes: 0 additions & 5 deletions main/boards/esp-box-3/esp_box3_board.cc
Original file line number Diff line number Diff line change
Expand Up @@ -41,13 +41,8 @@ class EspBox3Board : public WifiBoard {

public:
EspBox3Board() : boot_button_(BOOT_BUTTON_GPIO) {
}

virtual void Initialize() override {
ESP_LOGI(TAG, "Initializing EspBox3Board");
InitializeI2c();
InitializeButtons();
WifiBoard::Initialize();
}

virtual Led* GetBuiltinLed() override {
Expand Down
Loading

0 comments on commit d31901e

Please sign in to comment.