#ifndef ASSETS_H #define ASSETS_H #include #include #include #include #include #include #include #include #if HAVE_LVGL #include #endif struct Asset { size_t size; size_t offset; }; class Assets { public: static Assets& GetInstance() { static Assets instance; return instance; } ~Assets(); bool Download(std::string url, std::function progress_callback); bool Apply(); bool GetAssetData(const std::string& name, void*& ptr, size_t& size); inline bool partition_valid() const { return partition_valid_; } inline std::string default_assets_url() const { return default_assets_url_; } private: Assets(); Assets(const Assets&) = delete; Assets& operator=(const Assets&) = delete; bool InitializePartition(); void UnApplyPartition(); static bool FindPartition(Assets* assets); static bool LoadSrmodelsFromIndex(Assets* assets, cJSON* root = nullptr); class AssetStrategy { public: virtual ~AssetStrategy() = default; virtual bool Apply(Assets* assets) = 0; virtual bool InitializePartition(Assets* assets) = 0; virtual void UnApplyPartition(Assets* assets) = 0; virtual bool GetAssetData(Assets* assets, const std::string& name, void*& ptr, size_t& size) = 0; }; class LvglStrategy : public AssetStrategy { public: bool Apply(Assets* assets) override; bool InitializePartition(Assets* assets) override; void UnApplyPartition(Assets* assets) override; bool GetAssetData(Assets* assets, const std::string& name, void*& ptr, size_t& size) override; private: static uint32_t CalculateChecksum(const char* data, uint32_t length); std::map assets_; esp_partition_mmap_handle_t mmap_handle_ = 0; const char* mmap_root_ = nullptr; bool checksum_valid_ = false; }; class EmoteStrategy : public AssetStrategy { public: bool Apply(Assets* assets) override; bool InitializePartition(Assets* assets) override; void UnApplyPartition(Assets* assets) override; bool GetAssetData(Assets* assets, const std::string& name, void*& ptr, size_t& size) override; }; // Strategy instance std::unique_ptr strategy_; protected: const esp_partition_t* partition_ = nullptr; bool partition_valid_ = false; std::string default_assets_url_; srmodel_list_t* models_list_ = nullptr; }; #endif