Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions include/led-drivers/serial/DriverSerialSP616E.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#pragma once

#include "ProviderSerial.h"

class DriverSerialSP616E : public ProviderSerial
{
public:
explicit DriverSerialSP616E(const QJsonObject& deviceConfig);
static LedDevice* construct(const QJsonObject& deviceConfig);

private:
bool init(QJsonObject deviceConfig) override;
int writeFiniteColors(const std::vector<ColorRgb>& ledValues) override;

static bool isRegistered;
};
1 change: 1 addition & 0 deletions sources/led-drivers/LedDeviceSchemas.qrc
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
<file alias="schema-piblaster">schemas/schema-piblaster.json</file>
<file alias="schema-rawhid">schemas/schema-rawhid.json</file>
<file alias="schema-sedu">schemas/schema-sedu.json</file>
<file alias="schema-sp616e">schemas/schema-sp616e.json</file>
<file alias="schema-sk6812spi">schemas/schema-sk6812spi.json</file>
<file alias="schema-sk6822spi">schemas/schema-sk6822spi.json</file>
<file alias="schema-sk9822">schemas/schema-sk9822.json</file>
Expand Down
25 changes: 25 additions & 0 deletions sources/led-drivers/schemas/schema-sp616e.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"type":"object",
"required":true,
"properties":{
"output": {
"type": "string",
"title":"edt_dev_spec_outputPath_title",
"default":"ttyACM0",
"propertyOrder" : 1
},
"rate": {
"type": "integer",
"title":"edt_dev_spec_baudrate_title",
"default": 115200,
"propertyOrder" : 2
},
"delayAfterConnect": {
"type": "integer",
"title":"edt_dev_spec_delayAfterConnect_title",
"default": 250,
"propertyOrder" : 3
}
},
"additionalProperties": true
}
51 changes: 51 additions & 0 deletions sources/led-drivers/serial/DriverSerialSP616E.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
#include <led-drivers/serial/DriverSerialSP616E.h>

// SP616E protocol:
// - RGB pixels followed by a 0xFF terminator
// - Frame size is dynamic: (_ledRGBCount) + 1 bytes
// - No header, no checksum, no length field

static const uint8_t SP616E_TERMINATOR = 0xFF;

DriverSerialSP616E::DriverSerialSP616E(const QJsonObject& deviceConfig)
: ProviderSerial(deviceConfig)
{
}

bool DriverSerialSP616E::init(QJsonObject deviceConfig)
{
bool isInitOK = false;

// Initialise sub-class
if (ProviderSerial::init(deviceConfig))
{

_ledBuffer.resize(_ledRGBCount + 1, 0x00);
_ledBuffer.back() = SP616E_TERMINATOR; // block-end byte

isInitOK = true;
}
return isInitOK;
}

int DriverSerialSP616E::writeFiniteColors(const std::vector<ColorRgb>& ledValues)
{
if (_ledCount != ledValues.size())
{
Warning(_log, "SP616E led count has changed (old: {:d}, new: {:d}). Rebuilding buffer.", _ledCount, ledValues.size());
setLedCount(static_cast<int>(ledValues.size()));
_ledBuffer.resize(_ledRGBCount + 1, 0x00);
_ledBuffer.back() = SP616E_TERMINATOR;
}

memcpy(_ledBuffer.data(), ledValues.data(), _ledRGBCount);
Comment thread
awawa-dev marked this conversation as resolved.
return writeBytes(_ledBuffer.size(), _ledBuffer.data());
}

LedDevice* DriverSerialSP616E::construct(const QJsonObject& deviceConfig)
{
return new DriverSerialSP616E(deviceConfig);
}

bool DriverSerialSP616E::isRegistered = hyperhdr::leds::REGISTER_LED_DEVICE(
"sp616e", "leds_group_3_serial", DriverSerialSP616E::construct);