mirror of
https://github.com/hyperion-project/hyperion.ng.git
synced 2023-10-10 13:36:59 +02:00
Adalight - HyperSerial Support (#1515)
* HyperSerial support * Migrate Adalight records to new structure * Serial Devices - Select baud rate and allow providing a custom one
This commit is contained in:
parent
e8fc8a9855
commit
9df21b9ddd
@ -542,6 +542,8 @@
|
||||
"edt_dev_general_heading_title": "General Settings",
|
||||
"edt_dev_general_name_title": "Configuration name",
|
||||
"edt_dev_general_rewriteTime_title": "Refresh time",
|
||||
"edt_dev_spec_ada_mode_title": "Adalight - Standard",
|
||||
"edt_dev_spec_awa_mode_title": "HyperSerial - High speed",
|
||||
"edt_dev_spec_FCledToOn_title": "Fadecandy LED set to on",
|
||||
"edt_dev_spec_FCmanualControl_title": "Manual control of fadecandy LED",
|
||||
"edt_dev_spec_FCsetConfig_title": "Set fadecandy configuration",
|
||||
@ -612,6 +614,11 @@
|
||||
"edt_dev_spec_razer_device_title": "Razer Chroma Device",
|
||||
"edt_dev_spec_restoreOriginalState_title": "Restore lights' state",
|
||||
"edt_dev_spec_restoreOriginalState_title_info": "Restore the device's original state when device is disabled",
|
||||
"edt_dev_spec_rgbw_calibration_enable" : "White channel calibration (RGBW only)",
|
||||
"edt_dev_spec_rgbw_calibration_limit" : "White channel limit",
|
||||
"edt_dev_spec_rgbw_calibration_red" : "Red/White channel aspect",
|
||||
"edt_dev_spec_rgbw_calibration_green" : "Green/White channel aspect",
|
||||
"edt_dev_spec_rgbw_calibration_blue" : "Blue/White channel aspect",
|
||||
"edt_dev_spec_serial_title": "Serial number",
|
||||
"edt_dev_spec_spipath_title": "SPI Device",
|
||||
"edt_dev_spec_sslHSTimeoutMax_title": "Streamer handshake timeout maximum",
|
||||
|
@ -1187,6 +1187,18 @@ $(document).ready(function () {
|
||||
}
|
||||
break;
|
||||
|
||||
case "adalight":
|
||||
case "atmo":
|
||||
case "karate":
|
||||
case "dmx":
|
||||
case "sedu":
|
||||
case "tpm2":
|
||||
var rate = conf_editor.getEditor("root.specificOptions.rate").getValue();
|
||||
if (rate > 0) {
|
||||
canSave = true;
|
||||
}
|
||||
break;
|
||||
|
||||
case "philipshue":
|
||||
var host = conf_editor.getEditor("root.specificOptions.host").getValue();
|
||||
var username = conf_editor.getEditor("root.specificOptions.username").getValue();
|
||||
@ -1381,6 +1393,15 @@ $(document).ready(function () {
|
||||
default:
|
||||
}
|
||||
|
||||
if ($.inArray(ledType, devSerial) != -1) {
|
||||
var rateList = conf_editor.getEditor("root.specificOptions.rateList").getValue();
|
||||
var showRate = false;
|
||||
if (rateList == "CUSTOM") {
|
||||
showRate = true;
|
||||
}
|
||||
showInputOptionForItem(conf_editor, 'specificOptions', 'rate', showRate);
|
||||
}
|
||||
|
||||
if (!conf_editor.validate().length) {
|
||||
if (canIdentify) {
|
||||
$("#btn_test_controller").show();
|
||||
@ -1409,6 +1430,61 @@ $(document).ready(function () {
|
||||
}
|
||||
});
|
||||
|
||||
conf_editor.watch('root.specificOptions.streamProtocol', () => {
|
||||
var streamProtocol = conf_editor.getEditor("root.specificOptions.streamProtocol").getValue();
|
||||
|
||||
switch (ledType) {
|
||||
case "adalight":
|
||||
var rate;
|
||||
if (streamProtocol === window.serverConfig.device.streamProtocol) {
|
||||
rate = window.serverConfig.device.rate.toString();
|
||||
} else {
|
||||
// Set default rates per protocol type
|
||||
switch (streamProtocol) {
|
||||
case "2":
|
||||
rate = "2000000";
|
||||
break;
|
||||
case "0":
|
||||
case "1":
|
||||
default:
|
||||
rate = "115200";
|
||||
}
|
||||
}
|
||||
conf_editor.getEditor("root.specificOptions.rateList").setValue(rate);
|
||||
break;
|
||||
default:
|
||||
}
|
||||
});
|
||||
|
||||
conf_editor.watch('root.specificOptions.rateList', () => {
|
||||
var specOptPath = 'root.specificOptions.';
|
||||
var rateList = conf_editor.getEditor("root.specificOptions.rateList");
|
||||
if (rateList) {
|
||||
var val = rateList.getValue();
|
||||
var rate = conf_editor.getEditor("root.specificOptions.rate");
|
||||
|
||||
switch (val) {
|
||||
case 'CUSTOM':
|
||||
case '':
|
||||
rate.enable();
|
||||
//Populate existing rate for current custom config
|
||||
if (ledType === window.serverConfig.device.type) {
|
||||
rate.setValue(window.serverConfig.device.rate);
|
||||
} else {
|
||||
rate.setValue("");
|
||||
}
|
||||
break;
|
||||
default:
|
||||
rate.disable();
|
||||
rate.setValue(val);
|
||||
//Trigger getProperties via rate value
|
||||
conf_editor.notifyWatchers(specOptPath + "rate");
|
||||
break;
|
||||
}
|
||||
}
|
||||
showInputOptionForItem(conf_editor, 'specificOptions', 'rate', rate.isEnabled());
|
||||
});
|
||||
|
||||
conf_editor.watch('root.specificOptions.token', () => {
|
||||
var token = conf_editor.getEditor("root.specificOptions.token").getValue();
|
||||
|
||||
@ -1852,8 +1928,13 @@ var updateSelectList = function (ledType, discoveryInfo) {
|
||||
// Select configured device
|
||||
var configuredDeviceType = window.serverConfig.device.type;
|
||||
var configuredOutput = window.serverConfig.device.output;
|
||||
if (ledType === configuredDeviceType && $.inArray(configuredOutput, enumVals) != -1) {
|
||||
if (ledType === configuredDeviceType) {
|
||||
if ($.inArray(configuredOutput, enumVals) != -1) {
|
||||
enumDefaultVal = configuredOutput;
|
||||
} else {
|
||||
enumVals.push(window.serverConfig.device.output);
|
||||
enumDefaultVal = configuredOutput;
|
||||
}
|
||||
}
|
||||
else {
|
||||
addSelect = true;
|
||||
@ -2108,3 +2189,4 @@ function disableAutoResolvedGeneralOptions() {
|
||||
conf_editor.getEditor("root.generalOptions.hardwareLedCount").disable();
|
||||
conf_editor.getEditor("root.generalOptions.colorOrder").disable();
|
||||
}
|
||||
|
||||
|
@ -699,6 +699,59 @@ bool SettingsManager::handleConfigUpgrade(QJsonObject& config)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Migration steps for versions <= 2.0.13
|
||||
targetVersion.setVersion("2.0.13");
|
||||
if (_previousVersion <= targetVersion)
|
||||
{
|
||||
Info(_log, "Instance [%u]: Migrate from version [%s] to version [%s] or later", _instance, _previousVersion.getVersion().c_str(), targetVersion.getVersion().c_str());
|
||||
|
||||
|
||||
// Have Hostname/IP-address separate from port for LED-Devices
|
||||
if (config.contains("device"))
|
||||
{
|
||||
QJsonObject newDeviceConfig = config["device"].toObject();
|
||||
|
||||
if (newDeviceConfig.contains("type"))
|
||||
{
|
||||
QString type = newDeviceConfig["type"].toString();
|
||||
|
||||
const QStringList serialDevices {"adalight", "dmx", "atmo", "sedu", "tpm2", "karate"};
|
||||
if ( serialDevices.contains(type ))
|
||||
{
|
||||
if (!newDeviceConfig.contains("rateList"))
|
||||
{
|
||||
newDeviceConfig["rateList"] = "CUSTOM";
|
||||
migrated = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (type == "adalight")
|
||||
{
|
||||
if (newDeviceConfig.contains("lightberry_apa102_mode"))
|
||||
{
|
||||
bool lightberry_apa102_mode = newDeviceConfig["lightberry_apa102_mode"].toBool();
|
||||
if (lightberry_apa102_mode)
|
||||
{
|
||||
newDeviceConfig["streamProtocol"] = "1";
|
||||
}
|
||||
else
|
||||
{
|
||||
newDeviceConfig["streamProtocol"] = "0";
|
||||
}
|
||||
newDeviceConfig.remove("lightberry_apa102_mode");
|
||||
migrated = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (migrated)
|
||||
{
|
||||
config["device"] = newDeviceConfig;
|
||||
Debug(_log, "LED-Device records migrated");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return migrated;
|
||||
|
@ -2,12 +2,23 @@
|
||||
|
||||
#include <QtEndian>
|
||||
|
||||
#include <cassert>
|
||||
// Constants
|
||||
namespace {
|
||||
|
||||
// Configuration settings
|
||||
const char CONFIG_STREAM_PROTOCOL[] = "streamProtocol";
|
||||
|
||||
const char CONFIG_WHITE_CHANNEL_CALLIBRATION[] = "white_channel_calibration";
|
||||
const char CONFIG_WHITE_CHANNEL_LIMIT[] = "white_channel_limit";
|
||||
const char CONFIG_WHITE_CHANNEL_RED[] = "white_channel_red";
|
||||
const char CONFIG_WHITE_CHANNEL_GREEN[] = "white_channel_green";
|
||||
const char CONFIG_WHITE_CHANNEL_BLUE[] = "white_channel_blue";
|
||||
constexpr int HEADER_SIZE {6};
|
||||
|
||||
} //End of constants
|
||||
|
||||
LedDeviceAdalight::LedDeviceAdalight(const QJsonObject &deviceConfig)
|
||||
: ProviderRs232(deviceConfig)
|
||||
, _headerSize(6)
|
||||
, _ligthBerryAPA102Mode(false)
|
||||
{
|
||||
}
|
||||
|
||||
@ -23,66 +34,158 @@ bool LedDeviceAdalight::init(const QJsonObject &deviceConfig)
|
||||
// Initialise sub-class
|
||||
if ( ProviderRs232::init(deviceConfig) )
|
||||
{
|
||||
_streamProtocol = static_cast<Adalight::PROTOCOLTYPE>(deviceConfig[CONFIG_STREAM_PROTOCOL].toString().toInt());
|
||||
switch (_streamProtocol) {
|
||||
|
||||
_ligthBerryAPA102Mode = deviceConfig["lightberry_apa102_mode"].toBool(false);
|
||||
|
||||
// create ledBuffer
|
||||
unsigned int totalLedCount = _ledCount;
|
||||
|
||||
if (_ligthBerryAPA102Mode)
|
||||
case Adalight::AWA:
|
||||
{
|
||||
const unsigned int startFrameSize = 4;
|
||||
const unsigned int bytesPerRGBLed = 4;
|
||||
const unsigned int endFrameSize = qMax<unsigned int>(((_ledCount + 15) / 16), bytesPerRGBLed);
|
||||
_ledBuffer.resize(_headerSize + (_ledCount * bytesPerRGBLed) + startFrameSize + endFrameSize, 0x00);
|
||||
Debug( _log, "Adalight driver uses Hyperserial protocol");
|
||||
_white_channel_calibration = deviceConfig[CONFIG_WHITE_CHANNEL_CALLIBRATION].toBool(false);
|
||||
double _white_channel_limit_percent = deviceConfig[CONFIG_WHITE_CHANNEL_LIMIT].toDouble(1);
|
||||
_white_channel_limit = static_cast<uint8_t>(qMin(qRound(_white_channel_limit_percent * 255.0 / 100.0), 255));
|
||||
_white_channel_red = static_cast<uint8_t>(qMin(deviceConfig[CONFIG_WHITE_CHANNEL_RED].toInt(255), 255));
|
||||
_white_channel_green = static_cast<uint8_t>(qMin(deviceConfig[CONFIG_WHITE_CHANNEL_GREEN].toInt(255), 255));
|
||||
_white_channel_blue = static_cast<uint8_t>(qMin(deviceConfig[CONFIG_WHITE_CHANNEL_BLUE].toInt(255), 255));
|
||||
|
||||
// init constant data values
|
||||
for (signed iLed=1; iLed<= static_cast<int>( _ledCount); iLed++)
|
||||
{
|
||||
_ledBuffer[iLed*4+_headerSize] = 0xFF;
|
||||
DebugIf(_white_channel_calibration, _log, "White channel limit: %i (%.2f%), red: %i, green: %i, blue: %i", _white_channel_limit, _white_channel_limit_percent, _white_channel_red, _white_channel_green, _white_channel_blue);
|
||||
}
|
||||
Debug( _log, "Adalight driver with activated LightBerry APA102 mode");
|
||||
}
|
||||
else
|
||||
{
|
||||
totalLedCount -= 1;
|
||||
_ledBuffer.resize(_headerSize + _ledRGBCount, 0x00);
|
||||
break;
|
||||
|
||||
case Adalight::LBAPA:
|
||||
Debug( _log, "Adalight driver uses LightBerry APA102 protocol");
|
||||
break;
|
||||
|
||||
case Adalight::ADA:
|
||||
Debug( _log, "Adalight driver uses standard Adalight protocol");
|
||||
break;
|
||||
default:
|
||||
Error( _log, "Adalight driver - unsupported protocol");
|
||||
return false;
|
||||
}
|
||||
|
||||
_ledBuffer[0] = 'A';
|
||||
_ledBuffer[1] = 'd';
|
||||
_ledBuffer[2] = 'a';
|
||||
qToBigEndian<quint16>(static_cast<quint16>(totalLedCount), &_ledBuffer[3]);
|
||||
_ledBuffer[5] = _ledBuffer[3] ^ _ledBuffer[4] ^ 0x55; // Checksum
|
||||
|
||||
Debug( _log, "Adalight header for %d leds: %c%c%c 0x%02x 0x%02x 0x%02x", _ledCount,
|
||||
_ledBuffer[0], _ledBuffer[1], _ledBuffer[2], _ledBuffer[3], _ledBuffer[4], _ledBuffer[5] );
|
||||
|
||||
prepareHeader();
|
||||
isInitOK = true;
|
||||
}
|
||||
return isInitOK;
|
||||
}
|
||||
|
||||
void LedDeviceAdalight::prepareHeader()
|
||||
{
|
||||
// create ledBuffer
|
||||
uint totalLedCount = _ledCount;
|
||||
_bufferLength = static_cast<qint64>(HEADER_SIZE + _ledRGBCount);
|
||||
|
||||
switch (_streamProtocol) {
|
||||
case Adalight::LBAPA:
|
||||
{
|
||||
const unsigned int startFrameSize = 4;
|
||||
const unsigned int bytesPerRGBLed = 4;
|
||||
const unsigned int endFrameSize = qMax<unsigned int>(((_ledCount + 15) / 16), bytesPerRGBLed);
|
||||
_bufferLength = HEADER_SIZE + (_ledCount * bytesPerRGBLed) + startFrameSize + endFrameSize;
|
||||
|
||||
_ledBuffer.resize(static_cast<size_t>(_bufferLength), 0x00);
|
||||
|
||||
// init constant data values
|
||||
for (uint iLed=1; iLed <= _ledCount; iLed++)
|
||||
{
|
||||
_ledBuffer[iLed*4+HEADER_SIZE] = 0xFF;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case Adalight::AWA:
|
||||
_bufferLength += 7;
|
||||
[[clang::fallthrough]];
|
||||
case Adalight::ADA:
|
||||
[[clang::fallthrough]];
|
||||
default:
|
||||
totalLedCount -= 1;
|
||||
_ledBuffer.resize(static_cast<size_t>(_bufferLength), 0x00);
|
||||
break;
|
||||
}
|
||||
|
||||
_ledBuffer[0] = 'A';
|
||||
if (_streamProtocol == Adalight::AWA )
|
||||
{
|
||||
_ledBuffer[1] = 'w';
|
||||
_ledBuffer[2] = _white_channel_calibration ? 'A' : 'a';
|
||||
}
|
||||
else
|
||||
{
|
||||
_ledBuffer[1] = 'd';
|
||||
_ledBuffer[2] = 'a';
|
||||
}
|
||||
|
||||
qToBigEndian<quint16>(static_cast<quint16>(totalLedCount), &_ledBuffer[3]);
|
||||
_ledBuffer[5] = _ledBuffer[3] ^ _ledBuffer[4] ^ 0x55; // Checksum
|
||||
|
||||
Debug( _log, "Adalight header for %d leds: %c%c%c 0x%02x 0x%02x 0x%02x", _ledCount,
|
||||
_ledBuffer[0], _ledBuffer[1], _ledBuffer[2], _ledBuffer[3], _ledBuffer[4], _ledBuffer[5] );
|
||||
}
|
||||
|
||||
|
||||
int LedDeviceAdalight::write(const std::vector<ColorRgb> & ledValues)
|
||||
{
|
||||
if(_ligthBerryAPA102Mode)
|
||||
if (_ledCount != ledValues.size())
|
||||
{
|
||||
Warning(_log, "Adalight LED count has changed (old: %d, new: %d). Rebuilding header.", _ledCount, ledValues.size());
|
||||
_ledCount = static_cast<uint>(ledValues.size());
|
||||
_ledRGBCount = _ledCount * 3;
|
||||
prepareHeader();
|
||||
}
|
||||
|
||||
if (_bufferLength > static_cast<qint64>(_ledBuffer.size()))
|
||||
{
|
||||
Warning(_log, "Adalight buffer's size has changed. Skipping refresh.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (_streamProtocol == Adalight::LBAPA )
|
||||
{
|
||||
for (signed iLed=1; iLed<=static_cast<int>( _ledCount); iLed++)
|
||||
{
|
||||
const ColorRgb& rgb = ledValues[iLed-1];
|
||||
_ledBuffer[iLed*4+7] = rgb.red;
|
||||
_ledBuffer[iLed*4+8] = rgb.green;
|
||||
_ledBuffer[iLed*4+9] = rgb.blue;
|
||||
const ColorRgb& rgb = ledValues[static_cast<size_t>(iLed-1)];
|
||||
_ledBuffer[static_cast<size_t>(iLed*4+7)] = rgb.red;
|
||||
_ledBuffer[static_cast<size_t>(iLed*4+8)] = rgb.green;
|
||||
_ledBuffer[static_cast<size_t>(iLed*4+9)] = rgb.blue;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
assert(_headerSize + ledValues.size() * sizeof(ColorRgb) <= _ledBuffer.size());
|
||||
uint8_t* writer = _ledBuffer.data() + HEADER_SIZE;
|
||||
uint8_t* hasher = writer;
|
||||
|
||||
memcpy(_headerSize + _ledBuffer.data(), ledValues.data(), ledValues.size() * sizeof(ColorRgb));
|
||||
memcpy(writer, ledValues.data(), ledValues.size() * sizeof(ColorRgb));
|
||||
writer += ledValues.size() * sizeof(ColorRgb);
|
||||
|
||||
if (_streamProtocol == Adalight::AWA)
|
||||
{
|
||||
whiteChannelExtension(writer);
|
||||
|
||||
uint16_t fletcher1 = 0, fletcher2 = 0;
|
||||
while (hasher < writer)
|
||||
{
|
||||
fletcher1 = (fletcher1 + *(hasher++)) % 255;
|
||||
fletcher2 = (fletcher2 + fletcher1) % 255;
|
||||
}
|
||||
*(writer++) = static_cast<uint8_t>(fletcher1);
|
||||
*(writer++) = static_cast<uint8_t>(fletcher2);
|
||||
}
|
||||
_bufferLength = writer - _ledBuffer.data();
|
||||
}
|
||||
|
||||
int rc = writeBytes(_ledBuffer.size(), _ledBuffer.data());
|
||||
int rc = writeBytes(_bufferLength, _ledBuffer.data());
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
void LedDeviceAdalight::whiteChannelExtension(uint8_t*& writer)
|
||||
{
|
||||
if (_streamProtocol == Adalight::AWA && _white_channel_calibration)
|
||||
{
|
||||
*(writer++) = _white_channel_limit;
|
||||
*(writer++) = _white_channel_red;
|
||||
*(writer++) = _white_channel_green;
|
||||
*(writer++) = _white_channel_blue;
|
||||
}
|
||||
}
|
||||
|
@ -4,6 +4,16 @@
|
||||
// hyperion includes
|
||||
#include "ProviderRs232.h"
|
||||
|
||||
namespace Adalight
|
||||
{
|
||||
typedef enum ProtocolType
|
||||
{
|
||||
ADA = 0,
|
||||
LBAPA,
|
||||
AWA
|
||||
} PROTOCOLTYPE;
|
||||
}
|
||||
|
||||
///
|
||||
/// Implementation of the LedDevice interface for writing to an Adalight LED-device.
|
||||
///
|
||||
@ -37,6 +47,11 @@ private:
|
||||
///
|
||||
bool init(const QJsonObject &deviceConfig) override;
|
||||
|
||||
///
|
||||
/// @brief Prepare the protocol's header
|
||||
///
|
||||
void prepareHeader();
|
||||
|
||||
///
|
||||
/// @brief Writes the RGB-Color values to the LEDs.
|
||||
///
|
||||
@ -45,8 +60,17 @@ private:
|
||||
///
|
||||
int write(const std::vector<ColorRgb> & ledValues) override;
|
||||
|
||||
const short _headerSize;
|
||||
bool _ligthBerryAPA102Mode;
|
||||
void whiteChannelExtension(uint8_t*& writer);
|
||||
|
||||
qint64 _bufferLength;
|
||||
|
||||
Adalight::PROTOCOLTYPE _streamProtocol;
|
||||
|
||||
bool _white_channel_calibration;
|
||||
uint8_t _white_channel_limit;
|
||||
uint8_t _white_channel_red;
|
||||
uint8_t _white_channel_green;
|
||||
uint8_t _white_channel_blue;
|
||||
};
|
||||
|
||||
#endif // LEDEVICETADALIGHT_H
|
||||
|
@ -8,12 +8,112 @@
|
||||
"default":"auto",
|
||||
"propertyOrder" : 1
|
||||
},
|
||||
"streamProtocol": {
|
||||
"type": "string",
|
||||
"title": "edt_dev_spec_stream_protocol_title",
|
||||
"enum": [ "0", "1", "2" ],
|
||||
"default": "0",
|
||||
"options": {
|
||||
"enum_titles": [ "edt_dev_spec_ada_mode_title", "edt_dev_spec_LBap102Mode_title","edt_dev_spec_awa_mode_title" ]
|
||||
},
|
||||
"propertyOrder": 2
|
||||
},
|
||||
"rateList": {
|
||||
"type": "string",
|
||||
"title":"edt_dev_spec_baudrate_title",
|
||||
"enum": [ "CUSTOM","9600","14400","19200","28800","33600","38400","56000","57600","76800","115200","128000","153600","230400","256000","307200","460800","921600","1000000","1500000","2000000","3000000","4000000" ],
|
||||
"options": {
|
||||
"enum_titles": [ "edt_conf_enum_custom" ]
|
||||
},
|
||||
"default": "115200",
|
||||
"access": "advanced",
|
||||
"propertyOrder" : 3
|
||||
},
|
||||
"rate": {
|
||||
"type": "integer",
|
||||
"title":"edt_dev_spec_baudrate_title",
|
||||
"title":"",
|
||||
"default": 115200,
|
||||
"access": "advanced",
|
||||
"propertyOrder" : 2
|
||||
"propertyOrder" : 4
|
||||
},
|
||||
"white_channel_calibration": {
|
||||
"type": "boolean",
|
||||
"format": "checkbox",
|
||||
"title":"edt_dev_spec_rgbw_calibration_enable",
|
||||
"required" : true,
|
||||
"default": false,
|
||||
"options": {
|
||||
"dependencies": {
|
||||
"streamProtocol": "2"
|
||||
}
|
||||
},
|
||||
"access": "advanced",
|
||||
"propertyOrder" : 5
|
||||
},
|
||||
"white_channel_limit": {
|
||||
"type": "number",
|
||||
"title":"edt_dev_spec_rgbw_calibration_limit",
|
||||
"required" : true,
|
||||
"default" : 100,
|
||||
"step": 0.25,
|
||||
"minimum" : 0,
|
||||
"maximum" : 100,
|
||||
"append" : "edt_append_percent",
|
||||
"options": {
|
||||
"dependencies": {
|
||||
"white_channel_calibration": true
|
||||
}
|
||||
},
|
||||
"access": "advanced",
|
||||
"propertyOrder" : 6
|
||||
},
|
||||
"white_channel_red": {
|
||||
"type": "integer",
|
||||
"title":"edt_dev_spec_rgbw_calibration_red",
|
||||
"required" : true,
|
||||
"default" : 255,
|
||||
"step": 1,
|
||||
"minimum" : 0,
|
||||
"maximum" : 255,
|
||||
"options": {
|
||||
"dependencies": {
|
||||
"white_channel_calibration": true
|
||||
}
|
||||
},
|
||||
"access": "advanced",
|
||||
"propertyOrder" : 7
|
||||
},
|
||||
"white_channel_green": {
|
||||
"type": "integer",
|
||||
"title":"edt_dev_spec_rgbw_calibration_green",
|
||||
"required" : true,
|
||||
"default" : 255,
|
||||
"step": 1,
|
||||
"minimum" : 0,
|
||||
"maximum" : 255,
|
||||
"options": {
|
||||
"dependencies": {
|
||||
"white_channel_calibration": true
|
||||
}
|
||||
},
|
||||
"access": "advanced",
|
||||
"propertyOrder" : 8
|
||||
},
|
||||
"white_channel_blue": {
|
||||
"type": "integer",
|
||||
"title":"edt_dev_spec_rgbw_calibration_blue",
|
||||
"required" : true,
|
||||
"default" : 255,
|
||||
"step": 1,
|
||||
"minimum" : 0,
|
||||
"maximum" : 255,
|
||||
"options": {
|
||||
"dependencies": {
|
||||
"white_channel_calibration": true
|
||||
}
|
||||
},
|
||||
"access": "advanced",
|
||||
"propertyOrder" : 9
|
||||
},
|
||||
"delayAfterConnect": {
|
||||
"type": "integer",
|
||||
@ -21,15 +121,7 @@
|
||||
"default": 0,
|
||||
"append" : "ms",
|
||||
"access" : "expert",
|
||||
"propertyOrder" : 3
|
||||
},
|
||||
"lightberry_apa102_mode": {
|
||||
"type": "boolean",
|
||||
"title": "edt_dev_spec_LBap102Mode_title",
|
||||
"default": false,
|
||||
"required": true,
|
||||
"access": "advanced",
|
||||
"propertyOrder": 4
|
||||
"propertyOrder" : 10
|
||||
},
|
||||
"latchTime": {
|
||||
"type": "integer",
|
||||
@ -42,7 +134,7 @@
|
||||
"options": {
|
||||
"infoText": "edt_dev_spec_latchtime_title_info"
|
||||
},
|
||||
"propertyOrder": 5
|
||||
"propertyOrder": 11
|
||||
},
|
||||
"rewriteTime": {
|
||||
"type": "integer",
|
||||
@ -51,7 +143,7 @@
|
||||
"append" : "edt_append_ms",
|
||||
"minimum": 0,
|
||||
"access" : "expert",
|
||||
"propertyOrder" : 5
|
||||
"propertyOrder" : 12
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
|
@ -8,18 +8,31 @@
|
||||
"default":"ttyUSB0",
|
||||
"propertyOrder" : 1
|
||||
},
|
||||
"rateList": {
|
||||
"type": "string",
|
||||
"title":"edt_dev_spec_baudrate_title",
|
||||
"enum": [ "CUSTOM","9600","14400","19200","28800","33600","38400","56000","57600","76800","115200","128000","153600","230400","256000","307200","460800","921600","1000000","1500000","2000000","3000000","4000000" ],
|
||||
"options": {
|
||||
"enum_titles": [ "edt_conf_enum_custom" ]
|
||||
},
|
||||
"default": "1000000",
|
||||
"access": "advanced",
|
||||
"propertyOrder" : 2
|
||||
},
|
||||
"rate": {
|
||||
"type": "integer",
|
||||
"title":"edt_dev_spec_baudrate_title",
|
||||
"title":"",
|
||||
"default": 1000000,
|
||||
"propertyOrder" : 2
|
||||
"access": "advanced",
|
||||
"propertyOrder" : 3
|
||||
},
|
||||
"delayAfterConnect": {
|
||||
"type": "integer",
|
||||
"title":"edt_dev_spec_delayAfterConnect_title",
|
||||
"default": 250,
|
||||
"append" : "ms",
|
||||
"propertyOrder" : 3
|
||||
"access" : "expert",
|
||||
"propertyOrder" : 4
|
||||
},
|
||||
"latchTime": {
|
||||
"type": "integer",
|
||||
@ -29,7 +42,7 @@
|
||||
"minimum": 0,
|
||||
"maximum": 1000,
|
||||
"access" : "expert",
|
||||
"propertyOrder" : 4
|
||||
"propertyOrder" : 5
|
||||
},
|
||||
"rewriteTime": {
|
||||
"type": "integer",
|
||||
@ -38,7 +51,7 @@
|
||||
"append" : "edt_append_ms",
|
||||
"minimum": 0,
|
||||
"access" : "expert",
|
||||
"propertyOrder" : 5
|
||||
"propertyOrder" : 6
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
|
@ -20,17 +20,30 @@
|
||||
"default":"ttyUSB0",
|
||||
"propertyOrder" : 2
|
||||
},
|
||||
"rateList": {
|
||||
"type": "string",
|
||||
"title":"edt_dev_spec_baudrate_title",
|
||||
"enum": [ "CUSTOM","9600","14400","19200","28800","33600","38400","56000","57600","76800","115200","128000","153600","230400","250000","256000","307200","460800","921600","1000000","1500000","2000000","3000000","4000000" ],
|
||||
"options": {
|
||||
"enum_titles": [ "edt_conf_enum_custom" ]
|
||||
},
|
||||
"default": "250000",
|
||||
"access": "advanced",
|
||||
"propertyOrder" : 3
|
||||
},
|
||||
"rate": {
|
||||
"type": "integer",
|
||||
"title":"edt_dev_spec_baudrate_title",
|
||||
"title":"",
|
||||
"default": 250000,
|
||||
"propertyOrder" : 3
|
||||
"access": "advanced",
|
||||
"propertyOrder" : 4
|
||||
},
|
||||
"delayAfterConnect": {
|
||||
"type": "integer",
|
||||
"title":"edt_dev_spec_delayAfterConnect_title",
|
||||
"default": 250,
|
||||
"propertyOrder" : 4
|
||||
"access" : "expert",
|
||||
"propertyOrder" : 5
|
||||
},
|
||||
"latchTime": {
|
||||
"type": "integer",
|
||||
@ -40,7 +53,7 @@
|
||||
"minimum": 0,
|
||||
"maximum": 1000,
|
||||
"access" : "expert",
|
||||
"propertyOrder" : 5
|
||||
"propertyOrder" : 6
|
||||
},
|
||||
"rewriteTime": {
|
||||
"type": "integer",
|
||||
@ -49,7 +62,7 @@
|
||||
"append" : "edt_append_ms",
|
||||
"minimum": 0,
|
||||
"access" : "expert",
|
||||
"propertyOrder" : 6
|
||||
"propertyOrder" : 7
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
|
@ -8,18 +8,31 @@
|
||||
"default":"ttyACM0",
|
||||
"propertyOrder" : 1
|
||||
},
|
||||
"rateList": {
|
||||
"type": "string",
|
||||
"title":"edt_dev_spec_baudrate_title",
|
||||
"enum": [ "CUSTOM","9600","14400","19200","28800","33600","38400","56000","57600","76800","115200","128000","153600","230400","256000","307200","460800","921600","1000000","1500000","2000000","3000000","4000000" ],
|
||||
"options": {
|
||||
"enum_titles": [ "edt_conf_enum_custom" ]
|
||||
},
|
||||
"default": "1000000",
|
||||
"access": "advanced",
|
||||
"propertyOrder" : 2
|
||||
},
|
||||
"rate": {
|
||||
"type": "integer",
|
||||
"title":"edt_dev_spec_baudrate_title",
|
||||
"title":"",
|
||||
"default": 1000000,
|
||||
"propertyOrder" : 2
|
||||
"access": "advanced",
|
||||
"propertyOrder" : 3
|
||||
},
|
||||
"delayAfterConnect": {
|
||||
"type": "integer",
|
||||
"title":"edt_dev_spec_delayAfterConnect_title",
|
||||
"default": 1500,
|
||||
"append" : "ms",
|
||||
"propertyOrder" : 3
|
||||
"access" : "expert",
|
||||
"propertyOrder" : 4
|
||||
},
|
||||
"latchTime": {
|
||||
"type": "integer",
|
||||
@ -29,7 +42,7 @@
|
||||
"minimum": 0,
|
||||
"maximum": 1000,
|
||||
"access" : "expert",
|
||||
"propertyOrder" : 4
|
||||
"propertyOrder" : 5
|
||||
},
|
||||
"rewriteTime": {
|
||||
"type": "integer",
|
||||
@ -38,7 +51,7 @@
|
||||
"append" : "edt_append_ms",
|
||||
"minimum": 0,
|
||||
"access" : "expert",
|
||||
"propertyOrder" : 5
|
||||
"propertyOrder" : 6
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
|
@ -8,17 +8,30 @@
|
||||
"default":"ttyACM0",
|
||||
"propertyOrder" : 1
|
||||
},
|
||||
"rateList": {
|
||||
"type": "string",
|
||||
"title":"edt_dev_spec_baudrate_title",
|
||||
"enum": [ "CUSTOM","9600","14400","19200","28800","33600","38400","56000","57600","76800","115200","128000","153600","230400","256000","307200","460800","921600","1000000","1500000","2000000","3000000","4000000" ],
|
||||
"options": {
|
||||
"enum_titles": [ "edt_conf_enum_custom" ]
|
||||
},
|
||||
"default": "1000000",
|
||||
"access": "advanced",
|
||||
"propertyOrder" : 2
|
||||
},
|
||||
"rate": {
|
||||
"type": "integer",
|
||||
"title":"edt_dev_spec_baudrate_title",
|
||||
"title":"",
|
||||
"default": 1000000,
|
||||
"propertyOrder" : 2
|
||||
"access": "advanced",
|
||||
"propertyOrder" : 3
|
||||
},
|
||||
"delayAfterConnect": {
|
||||
"type": "integer",
|
||||
"title":"edt_dev_spec_delayAfterConnect_title",
|
||||
"default": 250,
|
||||
"propertyOrder" : 3
|
||||
"access" : "expert",
|
||||
"propertyOrder" : 4
|
||||
},
|
||||
"latchTime": {
|
||||
"type": "integer",
|
||||
@ -28,7 +41,7 @@
|
||||
"minimum": 0,
|
||||
"maximum": 1000,
|
||||
"access" : "expert",
|
||||
"propertyOrder" : 4
|
||||
"propertyOrder" : 5
|
||||
},
|
||||
"rewriteTime": {
|
||||
"type": "integer",
|
||||
@ -37,7 +50,7 @@
|
||||
"append" : "edt_append_ms",
|
||||
"minimum": 0,
|
||||
"access" : "expert",
|
||||
"propertyOrder" : 5
|
||||
"propertyOrder" : 6
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
|
@ -8,17 +8,30 @@
|
||||
"default":"ttyACM0",
|
||||
"propertyOrder" : 1
|
||||
},
|
||||
"rateList": {
|
||||
"type": "string",
|
||||
"title":"edt_dev_spec_baudrate_title",
|
||||
"enum": [ "CUSTOM","9600","14400","19200","28800","33600","38400","56000","57600","76800","115200","128000","153600","230400","256000","307200","460800","921600","1000000","1500000","2000000","3000000","4000000" ],
|
||||
"options": {
|
||||
"enum_titles": [ "edt_conf_enum_custom" ]
|
||||
},
|
||||
"default": "1000000",
|
||||
"access": "advanced",
|
||||
"propertyOrder" : 2
|
||||
},
|
||||
"rate": {
|
||||
"type": "integer",
|
||||
"title":"edt_dev_spec_baudrate_title",
|
||||
"title":"",
|
||||
"default": 1000000,
|
||||
"propertyOrder" : 2
|
||||
"access": "advanced",
|
||||
"propertyOrder" : 3
|
||||
},
|
||||
"delayAfterConnect": {
|
||||
"type": "integer",
|
||||
"title":"edt_dev_spec_delayAfterConnect_title",
|
||||
"default": 250,
|
||||
"propertyOrder" : 3
|
||||
"access" : "expert",
|
||||
"propertyOrder" : 4
|
||||
},
|
||||
"latchTime": {
|
||||
"type": "integer",
|
||||
@ -28,7 +41,7 @@
|
||||
"minimum": 0,
|
||||
"maximum": 1000,
|
||||
"access" : "expert",
|
||||
"propertyOrder" : 4
|
||||
"propertyOrder" : 5
|
||||
},
|
||||
"rewriteTime": {
|
||||
"type": "integer",
|
||||
@ -37,7 +50,7 @@
|
||||
"append" : "edt_append_ms",
|
||||
"minimum": 0,
|
||||
"access" : "expert",
|
||||
"propertyOrder" : 5
|
||||
"propertyOrder" : 6
|
||||
} },
|
||||
"additionalProperties": true
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user