#pragma once #include "ComplexCommand.h" #include "ByteCommandQueue.h" #include "GetWrittenFlashDataCountCommand.h" #include "ByteArrayProvider.h" #include "UsbDeviceManager.h" #include "GetAddressCommand.h" namespace Incart::DeviceComplexCommands { class MicroMonGetWrittenFlashDataCountCommand : public GetWrittenFlashDataCountCommand { private: uint64_t m_minAddress; Usb::UsbDeviceManager* const m_usbDeviceManager; public: MicroMonGetWrittenFlashDataCountCommand(uint32_t uid, Usb::UsbDeviceManager* const usbDeviceManager) : GetWrittenFlashDataCountCommand(uid) , m_usbDeviceManager(usbDeviceManager) { } public: std::shared_ptr execute() override { std::shared_ptr commandData = std::make_shared>(m_usbDeviceManager->getCommandQueue()->generateUid()); std::shared_ptr command = std::dynamic_pointer_cast(m_usbDeviceManager->getCommandSet()->createComplexCommand("GetMinAddress", commandData)); addExecutedInnerCommand(command); connect(command.get(), &GetAddressCommand::answerIsReady, this, &MicroMonGetWrittenFlashDataCountCommand::handleGetMinAddressIsReady); return executeCommand(command); } private slots: void handleGetMinAddressIsReady(Usb::ComplexCommand* command_, uint64_t address_, std::shared_ptr status_) { removeExecutedInnerCommand(command_); if (status_->status != Usb::DeviceCommand::EStatus::OK) { emit answerIsReady(this, 0, status_); return; } m_minAddress = address_; std::shared_ptr commandData = std::make_shared>(m_usbDeviceManager->getCommandQueue()->generateUid()); std::shared_ptr command = std::dynamic_pointer_cast(m_usbDeviceManager->getCommandSet()->createComplexCommand("GetWrittenMaxAddress", commandData)); addExecutedInnerCommand(command); connect(command.get(), &GetAddressCommand::answerIsReady, this, &MicroMonGetWrittenFlashDataCountCommand::handleGetWrittenMaxAddressIsReady); std::shared_ptr statusInfo = executeCommand(command); if (statusInfo->status != Usb::DeviceCommand::EStatus::OK) { emit answerIsReady(this, 0, statusInfo); return; } } void handleGetWrittenMaxAddressIsReady(Usb::ComplexCommand* command_, uint64_t address_, std::shared_ptr status_) { removeExecutedInnerCommand(command_); if (status_->status != Usb::DeviceCommand::EStatus::OK) { emit answerIsReady(this, 0, status_); return; } emit answerIsReady(this, address_ - m_minAddress + 1, status_); } }; } // namespace Incart::DeviceComplexCommands