#include "LedDeviceSkydimo.h" #include "utils/Logger.h" #include // Constants namespace { constexpr int HEADER_SIZE {6}; } //End of constants LedDeviceSkydimo::LedDeviceSkydimo(const QJsonObject &deviceConfig) : ProviderRs232(deviceConfig) { } LedDevice* LedDeviceSkydimo::construct(const QJsonObject &deviceConfig) { return new LedDeviceSkydimo(deviceConfig); } bool LedDeviceSkydimo::init(const QJsonObject &deviceConfig) { bool isInitOK = false; // Initialise sub-class if ( ProviderRs232::init(deviceConfig) ) { prepareHeader(); isInitOK = true; } return isInitOK; } void LedDeviceSkydimo::prepareHeader() { _bufferLength = static_cast(HEADER_SIZE + _ledRGBCount); _ledBuffer.resize(static_cast(_bufferLength), 0x00); _ledBuffer[0] = 'A'; _ledBuffer[1] = 'd'; _ledBuffer[2] = 'a'; _ledBuffer[3] = 0; _ledBuffer[4] = 0; _ledBuffer[5] = static_cast(_ledCount); Debug( _log, "Skydimo header for %d leds (size: %d): %c%c%c 0x%02x 0x%02x 0x%02x", _ledCount, _ledBuffer.size(), _ledBuffer[0], _ledBuffer[1], _ledBuffer[2], _ledBuffer[3], _ledBuffer[4], _ledBuffer[5] ); } int LedDeviceSkydimo::write(const std::vector & ledValues) { if (_ledCount != ledValues.size()) { Warning(_log, "Skydimo LED count has changed (old: %d, new: %d). Rebuilding header.", _ledCount, ledValues.size()); _ledCount = static_cast(ledValues.size()); _ledRGBCount = _ledCount * 3; prepareHeader(); } if (_bufferLength > static_cast(_ledBuffer.size())) { Warning(_log, "Skydimo buffer's size has changed. Skipping refresh."); return 0; } assert(HEADER_SIZE + ledValues.size() * sizeof(ColorRgb) <= _ledBuffer.size()); memcpy(HEADER_SIZE + _ledBuffer.data(), ledValues.data(), ledValues.size() * sizeof(ColorRgb)); return writeBytes(_bufferLength, _ledBuffer.data()); }