#include "LedDeviceSedu.h" struct FrameSpec { uint8_t id; size_t size; }; LedDeviceSedu::LedDeviceSedu(const QJsonObject &deviceConfig) : ProviderRs232() { _devConfig = deviceConfig; _deviceReady = false; } LedDevice* LedDeviceSedu::construct(const QJsonObject &deviceConfig) { return new LedDeviceSedu(deviceConfig); } bool LedDeviceSedu::init(const QJsonObject &deviceConfig) { bool isInitOK = ProviderRs232::init(deviceConfig); std::vector frameSpecs{{0xA1, 256}, {0xA2, 512}, {0xB0, 768}, {0xB1, 1536}, {0xB2, 3072} }; for (const FrameSpec& frameSpec : frameSpecs) { if ((unsigned)_ledRGBCount <= frameSpec.size) { _ledBuffer.clear(); _ledBuffer.resize(frameSpec.size + 3, 0); _ledBuffer[0] = 0x5A; _ledBuffer[1] = frameSpec.id; _ledBuffer.back() = 0xA5; break; } } if (_ledBuffer.size() == 0) { //Warning(_log, "More rgb-channels required then available"); QString errortext = "More rgb-channels required then available"; this->setInError(errortext); isInitOK = false; } return isInitOK; } int LedDeviceSedu::write(const std::vector &ledValues) { memcpy(_ledBuffer.data()+2, ledValues.data(), ledValues.size() * sizeof(ColorRgb)); return writeBytes(_ledBuffer.size(), _ledBuffer.data()); }