mirror of
https://github.com/m5stack/StackChan.git
synced 2026-04-27 11:02:40 +00:00
5001b7081b
* add firmware source code
171 lines
4.2 KiB
C++
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();
|
|
}
|
|
};
|