#pragma once #include "DeviceInfo.h" #include "ByteArrayProvider.h" #include "StringExtensions.h" #include #include #include #include namespace Incart::Usb { class DeviceBaseInfoAggregator { public: // data - ответ на команду Name static void aggregateDeviceInfo(DeviceInfo& deviceInfo, const std::vector& data) { deviceInfo.hardwareVersion = Common::ByteArrayProvider::getWordFromArray(data, 8); deviceInfo.softwareVersion = Common::ByteArrayProvider::getWordFromArray(data, 10); deviceInfo.deviceVersionExtension = getDeviceExtension(data); } static std::string getDeviceName(const DeviceInfo& deviceInfo) { return (QString("%1(%2):%3:%4").arg(QString::fromStdString(deviceInfo.deviceVersionExtension)).arg(deviceInfo.typeInfo.type, 0, 10) .arg(toVersionText(deviceInfo.hardwareVersion)).arg(toVersionText(deviceInfo.softwareVersion))).toStdString(); } static QString toVersionText(uint32_t _version) { int highWord = static_cast(_version >> 16); int lowWord = static_cast(_version & 0xFFFF); return QString("%1.%2").arg(highWord, 0, 16).arg(lowWord, 0, 16, QChar('0')); } static QString toVersionText(uint16_t _version) { int highByte = static_cast(_version >> 8); int lowByte = static_cast(_version & 0xFF); return QString("%1.%2").arg(highByte, 0, 16).arg(lowByte, 2, 16, QChar('0')); } private: static std::string getDeviceExtension(const std::vector& data) { if (data.size() < 9) { return ""; } int offset = 12; int devExtSize = calcExtCount(data, offset); if (devExtSize <= 0) { return ""; } QByteArray extension; for (int i = 0; (i < devExtSize) && (data[i + offset] != '\0'); i++) { extension.append(data[i + 12]); } return Common::StringExtensions::toUtf8StringFromWindows1251(extension.toStdString()); } static int calcExtCount(const std::vector& data, int _offset) { int extCount = std::min(99, static_cast(data.size()) - _offset - 3); return std::max(0, std::min(extCount, static_cast(data.size()) - _offset)); } }; } // namespace Incart::Usb