#pragma once #include "display/lcd_display.h" #include #include #include #include #include "anim_player.h" #include "mmap_generate_emoji.h" namespace anim { class EmojiPlayer; using FlushIoReadyCallback = std::function; using FlushCallback = std::function; class EmojiPlayer { public: EmojiPlayer(esp_lcd_panel_handle_t panel, esp_lcd_panel_io_handle_t panel_io); ~EmojiPlayer(); void StartPlayer(int aaf, bool repeat, int fps); void StopPlayer(); private: static bool OnFlushIoReady(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_io_event_data_t *edata, void *user_ctx); static void OnFlush(anim_player_handle_t handle, int x_start, int y_start, int x_end, int y_end, const void *color_data); anim_player_handle_t player_handle_; mmap_assets_handle_t assets_handle_; }; class EmojiWidget : public Display { public: EmojiWidget(esp_lcd_panel_handle_t panel, esp_lcd_panel_io_handle_t panel_io); virtual ~EmojiWidget(); virtual void SetEmotion(const char* emotion) override; virtual void SetStatus(const char* status) override; anim::EmojiPlayer* GetPlayer() { return player_.get(); } private: void InitializePlayer(esp_lcd_panel_handle_t panel, esp_lcd_panel_io_handle_t panel_io); virtual bool Lock(int timeout_ms = 0) override; virtual void Unlock() override; std::unique_ptr player_; }; } // namespace anim