Files

151 lines
4.2 KiB
C++
Raw Permalink Normal View History

2026-01-08 09:18:20 +08:00
/*
* SPDX-FileCopyrightText: 2026 M5Stack Technology CO LTD
*
* SPDX-License-Identifier: MIT
*/
#include "hal_bridge.h"
#include "stackchan_display.h"
#include <esp_log.h>
#include <esp_err.h>
#include <nvs.h>
#include <nvs_flash.h>
#include <driver/gpio.h>
#include <esp_event.h>
#include <application.h>
#include <board.h>
#include <display.h>
#include <mutex>
#include <assets.h>
2026-05-07 16:33:29 +08:00
#include <settings.h>
2026-01-08 09:18:20 +08:00
static const char* _tag = "HAL_BRIDGE";
2026-05-07 16:33:29 +08:00
static constexpr std::string_view _xiaozhi_config_nvs_ns = "xiaozhi";
2026-05-12 10:34:39 +08:00
static constexpr std::string_view _xiaozhi_config_idle_shutdown_time_key = "idle_sec";
static constexpr std::string_view _xiaozhi_config_allow_shutdown_when_charging_key = "ext_pwr";
static constexpr std::string_view _xiaozhi_config_idle_random_movement_key = "idle_lv";
2026-05-07 16:33:29 +08:00
2026-01-08 09:18:20 +08:00
namespace hal_bridge {
/* -------------------------------------------------------------------------- */
/* State and touch point */
/* -------------------------------------------------------------------------- */
static std::mutex _mutex;
static Data_t _data;
void lock()
{
_mutex.lock();
}
void unlock()
{
_mutex.unlock();
}
Data_t& get_data()
{
return _data;
}
void set_touch_point(int num, int x, int y)
{
std::lock_guard<std::mutex> lock(_mutex);
_data.touchPoint.num = num;
_data.touchPoint.x = x;
_data.touchPoint.y = y;
}
TouchPoint_t get_touch_point()
{
std::lock_guard<std::mutex> lock(_mutex);
return _data.touchPoint;
}
bool is_xiaozhi_mode()
{
std::lock_guard<std::mutex> lock(_mutex);
return _data.isXiaozhiMode;
}
void set_xiaozhi_mode(bool mode)
{
std::lock_guard<std::mutex> lock(_mutex);
_data.isXiaozhiMode = mode;
}
/* -------------------------------------------------------------------------- */
/* Display */
/* -------------------------------------------------------------------------- */
#define DISPLAY_TYPE StackChanAvatarDisplay
lv_disp_t* display_get_lvgl_display()
{
auto display = static_cast<DISPLAY_TYPE*>(Board::GetInstance().GetDisplay());
return display->GetLvglDisplay();
}
void disply_lvgl_lock()
{
auto display = static_cast<DISPLAY_TYPE*>(Board::GetInstance().GetDisplay());
display->LvglLock();
}
void disply_lvgl_unlock()
{
auto display = static_cast<DISPLAY_TYPE*>(Board::GetInstance().GetDisplay());
display->LvglUnlock();
}
/* -------------------------------------------------------------------------- */
/* Application */
/* -------------------------------------------------------------------------- */
void xiaozhi_board_init()
{
// Init board
auto& board = Board::GetInstance();
}
void start_xiaozhi_app()
{
set_xiaozhi_mode(true);
2026-03-25 11:11:14 +08:00
// Initialize and run the application
2026-01-08 09:18:20 +08:00
auto& app = Application::GetInstance();
2026-03-25 11:11:14 +08:00
app.Initialize();
app.Run(); // This function runs the main event loop and never returns
2026-01-08 09:18:20 +08:00
}
2026-05-07 16:33:29 +08:00
XiaozhiConfig_t get_xiaozhi_config()
{
XiaozhiConfig_t config;
Settings settings(_xiaozhi_config_nvs_ns.data(), false);
config.idleShutdownTimeSeconds = settings.GetInt(_xiaozhi_config_idle_shutdown_time_key.data(),
static_cast<int>(config.idleShutdownTimeSeconds));
config.allowShutdownWhenCharging =
settings.GetBool(_xiaozhi_config_allow_shutdown_when_charging_key.data(), config.allowShutdownWhenCharging);
2026-05-12 10:34:39 +08:00
config.idleRandomMovementLevel =
settings.GetInt(_xiaozhi_config_idle_random_movement_key.data(), config.idleRandomMovementLevel);
2026-05-07 16:33:29 +08:00
return config;
}
void set_xiaozhi_config(const XiaozhiConfig_t& config)
{
Settings settings(_xiaozhi_config_nvs_ns.data(), true);
settings.SetInt(_xiaozhi_config_idle_shutdown_time_key.data(), config.idleShutdownTimeSeconds);
settings.SetBool(_xiaozhi_config_allow_shutdown_when_charging_key.data(), config.allowShutdownWhenCharging);
2026-05-12 10:34:39 +08:00
settings.SetInt(_xiaozhi_config_idle_random_movement_key.data(), config.idleRandomMovementLevel);
2026-05-07 16:33:29 +08:00
}
2026-01-08 09:18:20 +08:00
void app_play_sound(const std::string_view& sound)
{
auto& app = Application::GetInstance();
app.PlaySound(sound);
}
} // namespace hal_bridge