#include #include "nsyshid.h" #include "Backend.h" #include "Common/FileStream.h" namespace nsyshid { class DimensionsToypadDevice final : public Device { public: DimensionsToypadDevice(); ~DimensionsToypadDevice() = default; bool Open() override; void Close() override; bool IsOpened() override; ReadResult Read(ReadMessage* message) override; WriteResult Write(WriteMessage* message) override; bool GetDescriptor(uint8 descType, uint8 descIndex, uint8 lang, uint8* output, uint32 outputMaxLength) override; bool SetProtocol(uint8 ifIndex, uint8 protocol) override; bool SetReport(ReportMessage* message) override; private: bool m_IsOpened; }; class DimensionsUSB { public: struct DimensionsMini final { std::unique_ptr dimFile; std::array data{}; uint8 index = 255; uint8 pad = 255; uint32 id = 0; void Save(); }; void SendCommand(std::span buf); std::array GetStatus(); void GenerateRandomNumber(std::span buf, uint8 sequence, std::array& replyBuf); void InitializeRNG(uint32 seed); void GetChallengeResponse(std::span buf, uint8 sequence, std::array& replyBuf); void QueryBlock(uint8 index, uint8 page, std::array& replyBuf, uint8 sequence); void WriteBlock(uint8 index, uint8 page, std::span toWriteBuf, std::array& replyBuf, uint8 sequence); void GetModel(std::span buf, uint8 sequence, std::array& replyBuf); bool RemoveFigure(uint8 pad, uint8 index, bool fullRemove); bool TempRemove(uint8 index); bool CancelRemove(uint8 index); uint32 LoadFigure(const std::array& buf, std::unique_ptr file, uint8 pad, uint8 index); bool CreateFigure(fs::path pathName, uint32 id); bool MoveFigure(uint8 pad, uint8 index, uint8 oldPad, uint8 oldIndex); static std::map GetListMinifigs(); static std::map GetListTokens(); std::string FindFigure(uint32 figNum); protected: std::mutex m_dimensionsMutex; std::array m_figures{}; private: void RandomUID(std::array& uidBuffer); uint8 GenerateChecksum(const std::array& data, int numOfBytes) const; std::array Decrypt(std::span buf, std::optional> key); std::array Encrypt(std::span buf, std::optional> key); std::array GenerateFigureKey(const std::array& uid); std::array PWDGenerate(const std::array& uid); std::array DimensionsRandomize(const std::vector key, uint8 count); uint32 GetFigureId(const std::array& buf); uint32 Scramble(const std::array& uid, uint8 count); uint32 GetNext(); DimensionsMini& GetFigureByIndex(uint8 index); uint32 m_randomA; uint32 m_randomB; uint32 m_randomC; uint32 m_randomD; bool m_isAwake = false; std::queue> m_figureAddedRemovedResponses; std::queue> m_queries; }; extern DimensionsUSB g_dimensionstoypad; } // namespace nsyshid