Files
StackChan/firmware/main/hal/hal.h
T
Forairaaaaa 5001b7081b add firmware source code (#4)
* add firmware source code
2026-01-08 09:18:20 +08:00

171 lines
4.2 KiB
C++

/*
* SPDX-FileCopyrightText: 2026 M5Stack Technology CO LTD
*
* SPDX-License-Identifier: MIT
*/
#pragma once
#include <memory>
#include <cstdint>
#include <string>
#include <lvgl.h>
#include <smooth_ui_toolkit.hpp>
#include <uitk/short_namespace.hpp>
#include <array>
#include <lvgl_image.h>
#include <string_view>
/**
* @brief
*
*/
enum class HeadPetGesture { None, Press, Release, SwipeForward, SwipeBackward };
/**
* @brief
*
*/
enum class WsSignalSource {
Local = 0,
Remote,
};
/**
* @brief
*
*/
struct WsTextMessage_t {
std::string name;
std::string content;
};
/**
* @brief
*
*/
enum class ImuMotionEvent {
None = 0,
Shake,
PickUp,
};
/**
* @brief
*
*/
enum class AppConfigEvent {
None = 0,
AppConnected,
AppDisconnected,
TryWifiConnect,
WifiConnectFailed,
WifiConnected,
};
/**
* @brief
*
*/
class Hal {
public:
void init();
/* --------------------------------- System --------------------------------- */
void delay(std::uint32_t ms);
std::uint32_t millis();
void feedTheDog();
std::array<uint8_t, 6> getFactoryMac();
std::string getFactoryMacString(std::string divider = "");
void reboot();
/* --------------------------------- Display -------------------------------- */
lv_indev_t* lvTouchpad = nullptr;
void lvglLock();
void lvglUnlock();
/* --------------------------------- Xiaozhi -------------------------------- */
void startXiaozhi();
/* ----------------------------------- BLE ---------------------------------- */
uitk::Signal<const char*> onBleMotionData;
uitk::Signal<const char*> onBleAvatarData;
uitk::Signal<const char*> onBleConfigData;
uitk::Signal<const char*> onBleAnimationData;
uitk::Signal<AppConfigEvent> onAppConfigEvent;
void startBleServer();
bool isBleConnected();
void startAppConfigServer();
bool isAppConfiged();
/* --------------------------------- HeadPet -------------------------------- */
uitk::Signal<HeadPetGesture> onHeadPetGesture;
/* -------------------------------- StackChan ------------------------------- */
void startStackChanAutoUpdate(int fps); // Start the auto update with lvgl timer
void stopStackChanAutoUpdate();
/* ----------------------------------- RGB ---------------------------------- */
void setRgbColor(uint8_t index, uint8_t r, uint8_t g, uint8_t b);
void showRgbColor(uint8_t r, uint8_t g, uint8_t b);
void refreshRgb();
/* ---------------------------------- Power --------------------------------- */
void setServoPowerEnabled(bool enabled);
/* -------------------------------- Websocket ------------------------------- */
uitk::Signal<std::string_view> onWsMotionData;
uitk::Signal<std::string_view> onWsAvatarData;
uitk::Signal<std::string> onWsCallRequest;
uitk::Signal<bool> onWsCallResponse;
uitk::Signal<WsSignalSource> onWsCallEnd;
uitk::Signal<const WsTextMessage_t&> onWsTextMessage;
uitk::Signal<bool> onWsVideoModeChange;
uitk::Signal<std::shared_ptr<LvglImage>> onWsVideoFrame;
uitk::Signal<std::string_view> onWsDanceData;
void startWebSocketAvatar();
/* -------------------------------- Reminder -------------------------------- */
uitk::Signal<int, std::string> onReminderTriggered;
int createReminder(int duration_s, const std::string& message);
void stopReminder(int id);
/* ----------------------------------- IMU ---------------------------------- */
uitk::Signal<ImuMotionEvent> onImuMotionEvent;
/* --------------------------------- EspNow --------------------------------- */
uitk::Signal<const std::vector<uint8_t>&> onEspNowData;
void startEspNow(int channel);
bool espNowSend(const std::vector<uint8_t>& data, const uint8_t* destAddr = nullptr);
void setLaserEnabled(bool enabled);
private:
void xiaozhi_board_init();
void lvgl_init();
void xiaozhi_mcp_init();
void ble_init();
void servo_init();
void head_touch_init();
void io_expander_init();
void reminder_init();
void imu_init();
};
Hal& GetHAL();
/**
* @brief
*
*/
class LvglLockGuard {
public:
LvglLockGuard()
{
GetHAL().lvglLock();
}
~LvglLockGuard()
{
GetHAL().lvglUnlock();
}
};