Skip to content

Commit 76fff98

Browse files
authored
Implement ftdi led device - 2 (#1746)
1 parent 897e4aa commit 76fff98

24 files changed

+1037
-25
lines changed

.github/workflows/codeql.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ jobs:
3636
if: ${{ matrix.language == 'cpp' }}
3737
run: |
3838
sudo apt-get update
39-
sudo apt-get install --yes git cmake build-essential qtbase5-dev libqt5serialport5-dev libqt5sql5-sqlite libqt5svg5-dev libqt5x11extras5-dev libusb-1.0-0-dev python3-dev libcec-dev libxcb-image0-dev libxcb-util0-dev libxcb-shm0-dev libxcb-render0-dev libxcb-randr0-dev libxrandr-dev libxrender-dev libavahi-core-dev libavahi-compat-libdnssd-dev libasound2-dev libturbojpeg0-dev libjpeg-dev libssl-dev
39+
sudo apt-get install --yes git cmake build-essential qtbase5-dev libqt5serialport5-dev libqt5sql5-sqlite libqt5svg5-dev libqt5x11extras5-dev libusb-1.0-0-dev python3-dev libcec-dev libxcb-image0-dev libxcb-util0-dev libxcb-shm0-dev libxcb-render0-dev libxcb-randr0-dev libxrandr-dev libxrender-dev libavahi-core-dev libavahi-compat-libdnssd-dev libasound2-dev libturbojpeg0-dev libjpeg-dev libssl-dev libftdi1-dev
4040
4141
- name: 🔁 Initialize CodeQL
4242
uses: github/codeql-action/init@v3

.github/workflows/qt5_6.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ jobs:
117117
echo '::group::Update/Install dependencies'
118118
brew untap --force homebrew/core homebrew/cask
119119
brew update || true
120-
brew install qt@${{ inputs.qt_version }} vulkan-headers ninja || true
120+
brew install qt@${{ inputs.qt_version }} vulkan-headers ninja libftdi || true
121121
echo '::endgroup::'
122122
123123
- name: 👷 Build

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1313

1414
### Added
1515

16+
- Support for ftdi chip based LED-devices with ws2812, sk6812 apa102 LED types (Many thanks to @nurikk) (#1746)
1617
- Support gaps on Matrix Layout (#1696)
1718
- Windows: Added a new grabber that uses the DXGI DDA (Desktop Duplication API). This has much better performance than the DX grabber as it does more of its work on the GPU.
1819

CMakeLists.txt

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ set(DEFAULT_DEV_SPI OFF)
9494
set(DEFAULT_DEV_TINKERFORGE OFF)
9595
set(DEFAULT_DEV_USB_HID OFF)
9696
set(DEFAULT_DEV_WS281XPWM OFF)
97+
set(DEFAULT_DEV_FTDI ON )
9798

9899
# Services
99100
set(DEFAULT_EFFECTENGINE ON )
@@ -121,9 +122,10 @@ if(${CMAKE_SYSTEM} MATCHES "Linux")
121122
set(DEFAULT_DEV_USB_HID ON)
122123
set(DEFAULT_CEC ON)
123124
elseif (WIN32)
124-
set(DEFAULT_DX ON)
125-
set(DEFAULT_DDA ON)
126-
set(DEFAULT_MF ON)
125+
set(DEFAULT_DX ON )
126+
set(DEFAULT_DDA ON )
127+
set(DEFAULT_MF ON )
128+
set(DEFAULT_DEV_FTDI OFF)
127129
else()
128130
set(DEFAULT_FB OFF)
129131
set(DEFAULT_V4L2 OFF)
@@ -353,6 +355,9 @@ message(STATUS "ENABLE_DEV_USB_HID = ${ENABLE_DEV_USB_HID}")
353355
option(ENABLE_DEV_WS281XPWM "Enable the WS281x-PWM device" ${DEFAULT_DEV_WS281XPWM})
354356
message(STATUS "ENABLE_DEV_WS281XPWM = ${ENABLE_DEV_WS281XPWM}")
355357

358+
option(ENABLE_DEV_FTDI "Enable the FTDI devices" ${DEFAULT_DEV_FTDI} )
359+
message(STATUS "ENABLE_DEV_FTDI = ${ENABLE_DEV_FTDI}")
360+
356361
removeIndent()
357362

358363
message(STATUS "Services options:")

assets/webconfig/i18n/en.json

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,11 +161,12 @@
161161
"conf_leds_note_layout_overwrite": "Note: Overwrite creates a default layout for {{plural:$1| one LED| all $1 LEDs}} given by the hardware LED count",
162162
"conf_leds_optgroup_RPiGPIO": "RPi GPIO",
163163
"conf_leds_optgroup_RPiPWM": "RPi PWM",
164-
"conf_leds_optgroup_RPiSPI": "RPi SPI",
164+
"conf_leds_optgroup_SPI": "SPI",
165165
"conf_leds_optgroup_debug": "Debug",
166166
"conf_leds_optgroup_network": "Network",
167167
"conf_leds_optgroup_other": "Other",
168168
"conf_leds_optgroup_usb": "USB/Serial",
169+
"conf_leds_optgroup_ftdi": "USB/Ftdi",
169170
"conf_logging_btn_autoscroll": "Auto scrolling",
170171
"conf_logging_btn_clipboard": "Copy Log to Clipboard",
171172
"conf_logging_btn_pbupload": "Upload a report for support requests",
@@ -619,6 +620,11 @@
619620
"edt_dev_enum_sub_min_cool_adjust": "Subtract cool white",
620621
"edt_dev_enum_sub_min_warm_adjust": "Subtract warm white",
621622
"edt_dev_enum_subtract_minimum": "Subtract minimum",
623+
"edt_dev_enum_cold_white": "Cold white",
624+
"edt_dev_enum_neutral_white": "Neutral white",
625+
"edt_dev_enum_auto": "Auto",
626+
"edt_dev_enum_auto_max": "Auto max",
627+
"edt_dev_enum_auto_accurate": "Auto accurate",
622628
"edt_dev_enum_white_off": "White off",
623629
"edt_dev_general_autostart_title": "Autostart",
624630
"edt_dev_general_autostart_title_info": "The LED device is switched-on during startup or not",

assets/webconfig/js/content_leds.js

Lines changed: 85 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ var bottomRight2bottomLeft = null;
1818
var bottomLeft2topLeft = null;
1919
var toggleKeystoneCorrectionArea = false;
2020

21-
var devRPiSPI = ['apa102', 'apa104', 'ws2801', 'lpd6803', 'lpd8806', 'p9813', 'sk6812spi', 'sk6822spi', 'sk9822', 'ws2812spi'];
21+
var devSPI = ['apa102', 'apa104', 'ws2801', 'lpd6803', 'lpd8806', 'p9813', 'sk6812spi', 'sk6822spi', 'sk9822', 'ws2812spi'];
22+
var devFTDI = ['apa102_ftdi', 'sk6812_ftdi', 'ws2812_ftdi'];
2223
var devRPiPWM = ['ws281x'];
2324
var devRPiGPIO = ['piblaster'];
2425
var devNET = ['atmoorb', 'cololight', 'fadecandy', 'philipshue', 'nanoleaf', 'razer', 'tinkerforge', 'tpm2net', 'udpe131', 'udpartnet', 'udpddp', 'udph801', 'udpraw', 'wled', 'yeelight'];
@@ -1121,6 +1122,12 @@ $(document).ready(function () {
11211122
case "karate":
11221123
case "sedu":
11231124
case "tpm2":
1125+
1126+
//FTDI devices
1127+
case "apa102_ftdi":
1128+
case "sk6812_ftdi":
1129+
case "ws2812_ftdi":
1130+
11241131
if (storedAccess === 'expert') {
11251132
filter.discoverAll = true;
11261133
}
@@ -1139,6 +1146,7 @@ $(document).ready(function () {
11391146
.catch(error => {
11401147
showNotification('danger', "Device discovery for " + ledType + " failed with error:" + error);
11411148
});
1149+
11421150
break;
11431151

11441152
case "philipshue": {
@@ -1441,6 +1449,9 @@ $(document).ready(function () {
14411449
case "sk9822":
14421450
case "ws2812spi":
14431451
case "piblaster":
1452+
case "apa102_ftdi":
1453+
case "sk6812_ftdi":
1454+
case "ws2812_ftdi":
14441455
default:
14451456
}
14461457

@@ -1657,9 +1668,10 @@ $(document).ready(function () {
16571668
optArr[3] = [];
16581669
optArr[4] = [];
16591670
optArr[5] = [];
1671+
optArr[6] = [];
16601672

16611673
for (var idx = 0; idx < ledDevices.length; idx++) {
1662-
if ($.inArray(ledDevices[idx], devRPiSPI) != -1)
1674+
if ($.inArray(ledDevices[idx], devSPI) != -1)
16631675
optArr[0].push(ledDevices[idx]);
16641676
else if ($.inArray(ledDevices[idx], devRPiPWM) != -1)
16651677
optArr[1].push(ledDevices[idx]);
@@ -1671,18 +1683,23 @@ $(document).ready(function () {
16711683
optArr[4].push(ledDevices[idx]);
16721684
else if ($.inArray(ledDevices[idx], devHID) != -1)
16731685
optArr[4].push(ledDevices[idx]);
1686+
else if (ledDevices[idx].endsWith("_ftdi")) {
1687+
var title = ledDevices[idx].replace('_ftdi','');
1688+
optArr[5].push(ledDevices[idx] + ":" + title);
1689+
}
16741690
else
1675-
optArr[5].push(ledDevices[idx]);
1691+
optArr[6].push(ledDevices[idx]);
16761692
}
16771693

16781694
$("#leddevices").append(createSel(optArr[0], $.i18n('conf_leds_optgroup_RPiSPI')));
16791695
$("#leddevices").append(createSel(optArr[1], $.i18n('conf_leds_optgroup_RPiPWM')));
16801696
$("#leddevices").append(createSel(optArr[2], $.i18n('conf_leds_optgroup_RPiGPIO')));
16811697
$("#leddevices").append(createSel(optArr[3], $.i18n('conf_leds_optgroup_network')));
16821698
$("#leddevices").append(createSel(optArr[4], $.i18n('conf_leds_optgroup_usb')));
1699+
$("#leddevices").append(createSel(optArr[5], $.i18n('conf_leds_optgroup_ftdi'), true));
16831700

16841701
if (storedAccess === 'expert' || window.serverConfig.device.type === "file") {
1685-
$("#leddevices").append(createSel(optArr[5], $.i18n('conf_leds_optgroup_other')));
1702+
$("#leddevices").append(createSel(optArr[6], $.i18n('conf_leds_optgroup_other')));
16861703
}
16871704

16881705
$("#leddevices").val(window.serverConfig.device.type);
@@ -1886,6 +1903,9 @@ function saveLedConfig(genDefLayout = false) {
18861903
case "sk9822":
18871904
case "ws2812spi":
18881905
case "piblaster":
1906+
case "apa102_ftdi":
1907+
case "sk6812_ftdi":
1908+
case "ws2812_ftdi":
18891909
default:
18901910
if (genDefLayout === true) {
18911911
ledConfig = {
@@ -1938,8 +1958,10 @@ var updateOutputSelectList = function (ledType, discoveryInfo) {
19381958
ledTypeGroup = "devNET";
19391959
} else if ($.inArray(ledType, devSerial) != -1) {
19401960
ledTypeGroup = "devSerial";
1941-
} else if ($.inArray(ledType, devRPiSPI) != -1) {
1942-
ledTypeGroup = "devRPiSPI";
1961+
} else if ($.inArray(ledType, devSPI) != -1) {
1962+
ledTypeGroup = "devSPI";
1963+
} else if ($.inArray(ledType, devFTDI) != -1) {
1964+
ledTypeGroup = "devFTDI";
19431965
} else if ($.inArray(ledType, devRPiGPIO) != -1) {
19441966
ledTypeGroup = "devRPiGPIO";
19451967
} else if ($.inArray(ledType, devRPiPWM) != -1) {
@@ -2062,7 +2084,63 @@ var updateOutputSelectList = function (ledType, discoveryInfo) {
20622084
}
20632085
}
20642086
break;
2065-
case "devRPiSPI":
2087+
2088+
case "devFTDI":
2089+
key = "output";
2090+
2091+
if (discoveryInfo.devices.length == 0) {
2092+
enumVals.push("NONE");
2093+
enumTitleVals.push($.i18n('edt_dev_spec_devices_discovered_none'));
2094+
$('#btn_submit_controller').prop('disabled', true);
2095+
showAllDeviceInputOptions(key, false);
2096+
}
2097+
else {
2098+
switch (ledType) {
2099+
case "ws2812_ftdi":
2100+
case "sk6812_ftdi":
2101+
case "apa102_ftdi":
2102+
for (const device of discoveryInfo.devices) {
2103+
enumVals.push(device.ftdiOpenString);
2104+
2105+
var title = "FTDI";
2106+
if (device.manufacturer) {
2107+
title = device.manufacturer;
2108+
}
2109+
2110+
if (device.serialNumber) {
2111+
title += " - " + device.serialNumber;
2112+
}
2113+
title += " (" + device.vendorIdentifier + "|" + device.productIdentifier + ")";
2114+
2115+
if (device.description) {
2116+
title += " " + device.description;
2117+
}
2118+
2119+
enumTitleVals.push(title);
2120+
}
2121+
2122+
// Select configured device
2123+
var configuredDeviceType = window.serverConfig.device.type;
2124+
var configuredOutput = window.serverConfig.device.output;
2125+
if (ledType === configuredDeviceType) {
2126+
if ($.inArray(configuredOutput, enumVals) != -1) {
2127+
enumDefaultVal = configuredOutput;
2128+
} else {
2129+
enumVals.push(window.serverConfig.device.output);
2130+
enumDefaultVal = configuredOutput;
2131+
}
2132+
}
2133+
else {
2134+
addSelect = true;
2135+
}
2136+
2137+
break;
2138+
default:
2139+
}
2140+
}
2141+
break;
2142+
2143+
case "devSPI":
20662144
case "devRPiGPIO":
20672145
key = "output";
20682146

@@ -2128,7 +2206,6 @@ var updateOutputSelectList = function (ledType, discoveryInfo) {
21282206
async function discover_device(ledType, params) {
21292207

21302208
const result = await requestLedDeviceDiscovery(ledType, params);
2131-
21322209
var discoveryResult = {};
21332210
if (result) {
21342211
if (result.error) {

doc/development/CompileHowto.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,14 +61,14 @@ cd $HYPERION_HOME
6161

6262
```console
6363
sudo apt-get update
64-
sudo apt-get install git cmake build-essential qtbase5-dev libqt5serialport5-dev libqt5sql5-sqlite libqt5svg5-dev libqt5x11extras5-dev libusb-1.0-0-dev python3-dev libasound2-dev libturbojpeg0-dev libjpeg-dev libssl-dev
64+
sudo apt-get install git cmake build-essential qtbase5-dev libqt5serialport5-dev libqt5sql5-sqlite libqt5svg5-dev libqt5x11extras5-dev libusb-1.0-0-dev python3-dev libasound2-dev libturbojpeg0-dev libjpeg-dev libssl-dev libftdi1-dev
6565
```
6666

6767
**Ubuntu (22.04+) - Qt6 based**
6868

6969
```console
7070
sudo apt-get update
71-
sudo apt-get install git cmake build-essential qt6-base-dev libqt6serialport6-dev libxkbcommon-dev libvulkan-dev libgl1-mesa-dev libusb-1.0-0-dev python3-dev libasound2-dev libturbojpeg0-dev libjpeg-dev libssl-dev pkg-config
71+
sudo apt-get install git cmake build-essential qt6-base-dev libqt6serialport6-dev libxkbcommon-dev libvulkan-dev libgl1-mesa-dev libusb-1.0-0-dev python3-dev libasound2-dev libturbojpeg0-dev libjpeg-dev libssl-dev pkg-config libftdi1-dev
7272
```
7373

7474
**For Linux X11/XCB grabber support**
@@ -110,7 +110,7 @@ See [AUR](https://aur.archlinux.org/packages/?O=0&SeB=nd&K=hyperion&outdated=&SB
110110
The following dependencies are needed to build hyperion.ng on fedora.
111111
```console
112112
sudo dnf -y groupinstall "Development Tools"
113-
sudo dnf install python3-devel qt-devel qt5-qtbase-devel qt5-qtserialport-devel xrandr xcb-util-image-devel qt5-qtx11extras-devel alsa-lib-devel turbojpeg-devel libusb-devel xcb-util-devel dbus-devel openssl-devel fedora-packager rpmdevtools gcc libcec-devel
113+
sudo dnf install python3-devel qt-devel qt5-qtbase-devel qt5-qtserialport-devel xrandr xcb-util-image-devel qt5-qtx11extras-devel alsa-lib-devel turbojpeg-devel libusb-devel xcb-util-devel dbus-devel openssl-devel fedora-packager rpmdevtools gcc libcec-devel libftdi1-dev
114114
```
115115
After installing the dependencies, you can continue with the compile instructions later on this page (the more detailed way..).
116116

@@ -119,7 +119,7 @@ To install on OS X you either need [Homebrew](https://brew.sh/) or [Macport](htt
119119

120120
First you need to install the dependencies:
121121
```console
122-
brew install git qt@5 python3 cmake libusb [email protected]
122+
brew install git qt@5 python3 cmake libusb [email protected] libftdi
123123
```
124124

125125
## Windows

include/utils/RgbToRgbw.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,12 @@ namespace RGBW {
1111
SUBTRACT_MINIMUM,
1212
SUB_MIN_WARM_ADJUST,
1313
SUB_MIN_COOL_ADJUST,
14-
WHITE_OFF
14+
WHITE_OFF,
15+
COLD_WHITE,
16+
NEUTRAL_WHITE,
17+
AUTO,
18+
AUTO_MAX,
19+
AUTO_ACCURATE
1520
};
1621

1722
WhiteAlgorithm stringToWhiteAlgorithm(const QString& str);

libsrc/leddevice/CMakeLists.txt

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ include_directories(
1919
dev_spi
2020
dev_rpi_pwm
2121
dev_tinker
22+
dev_ftdi
2223
)
2324

2425
file (GLOB Leddevice_SOURCES
@@ -63,7 +64,11 @@ if(ENABLE_DEV_WS281XPWM)
6364
file (GLOB Leddevice_PWM_SOURCES "${CURRENT_SOURCE_DIR}/dev_rpi_pwm/*.h" "${CURRENT_SOURCE_DIR}/dev_rpi_pwm/*.cpp")
6465
endif()
6566

66-
set(LedDevice_RESOURCES ${CURRENT_SOURCE_DIR}/LedDeviceSchemas.qrc)
67+
if (ENABLE_DEV_FTDI)
68+
FILE ( GLOB Leddevice_FTDI_SOURCES "${CURRENT_SOURCE_DIR}/dev_ftdi/*.h" "${CURRENT_SOURCE_DIR}/dev_ftdi/*.cpp")
69+
endif()
70+
71+
set(LedDevice_RESOURCES ${CURRENT_SOURCE_DIR}/LedDeviceSchemas.qrc )
6772

6873
set(Leddevice_SOURCES
6974
${Leddevice_SOURCES}
@@ -74,6 +79,7 @@ set(Leddevice_SOURCES
7479
${Leddevice_SPI_SOURCES}
7580
${Leddevice_TINKER_SOURCES}
7681
${Leddevice_USB_HID_SOURCES}
82+
${Leddevice_FTDI_SOURCES}
7783
)
7884

7985
# auto generate header file that include all available leddevice headers
@@ -165,3 +171,10 @@ if(ENABLE_MDNS)
165171
target_link_libraries(leddevice mdns)
166172
endif()
167173

174+
if( ENABLE_DEV_FTDI )
175+
find_package(PkgConfig REQUIRED)
176+
pkg_check_modules(LIB_FTDI REQUIRED IMPORTED_TARGET libftdi1 )
177+
target_include_directories(leddevice PRIVATE PkgConfig::LIB_FTDI)
178+
target_link_libraries(leddevice PkgConfig::LIB_FTDI)
179+
endif()
180+

libsrc/leddevice/LedDeviceSchemas.qrc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,8 @@
3838
<file alias="schema-yeelight">schemas/schema-yeelight.json</file>
3939
<file alias="schema-razer">schemas/schema-razer.json</file>
4040
<file alias="schema-cololight">schemas/schema-cololight.json</file>
41+
<file alias="schema-ws2812_ftdi">schemas/schema-ws2812_ftdi.json</file>
42+
<file alias="schema-apa102_ftdi">schemas/schema-apa102_ftdi.json</file>
43+
<file alias="schema-sk6812_ftdi">schemas/schema-sk6812_ftdi.json</file>
4144
</qresource>
4245
</RCC>

0 commit comments

Comments
 (0)