#pragma once #include "DeviceCommandStatusInfo.h" #include #include #include namespace Incart::Usb { class ComplexCommand; class ComplexCommand : public QObject { protected: std::string m_name; uint32_t m_uid; std::unordered_map> m_executedInnerCommands; // хранит список внутренних сложных команд, которые в данный момент выполняются public: ComplexCommand(const std::string& name, uint32_t uid, QObject* parent = nullptr) : QObject(parent) , m_name(name), m_uid(uid) { } virtual ~ComplexCommand() { } virtual std::shared_ptr execute()=0; std::string getName() { return m_name; } uint32_t getUid() { return m_uid; } protected: void addExecutedInnerCommand(std::shared_ptr command) { m_executedInnerCommands[command.get()] = command; } void removeExecutedInnerCommand(ComplexCommand* command) { auto it = m_executedInnerCommands.find(command); if (it != m_executedInnerCommands.end()) { m_executedInnerCommands.erase(it); } } std::shared_ptr executeCommand(std::shared_ptr command) { std::shared_ptr status = command->execute(); if (status->status != Usb::DeviceCommand::EStatus::OK) { removeExecutedInnerCommand(command.get()); } return status; } }; } // namespace Incart::Usb