From 1fb54b51353a1e5c6accea6a348c521aa38b0a43 Mon Sep 17 00:00:00 2001 From: Leon Kiefer Date: Thu, 2 Jul 2020 20:37:46 +0200 Subject: [PATCH 01/12] updated OpenRGB Badge #153 --- extra/images/OpenRGBBadge.png | Bin 23675 -> 39590 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/extra/images/OpenRGBBadge.png b/extra/images/OpenRGBBadge.png index 8c6ec3665cc317d3d0b1d0c702032b2aad75aaf6..2b0a53bea9895624947e9c41551e052b39871a60 100644 GIT binary patch literal 39590 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 ZkMFOMqb+@gQxRi$tzMbFq9I8+{uhAp+4}$h literal 23675 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 Date: Tue, 7 Jul 2020 17:59:08 +0200 Subject: [PATCH 02/12] added LT100 Smart Lighting Towers to readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5f2df0f5..c5533061 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ _This is not an official corsair project._ * Commander PRO * Lighting Node CORE * LS100 Smart Lighting Controller +* LT100 Smart Lighting Towers ![Overview](extra/images/overview.png) From 48744a3267b0b2faaee1c63ae026a1c070b66736 Mon Sep 17 00:00:00 2001 From: Leon Kiefer Date: Tue, 21 Jul 2020 17:13:16 +0200 Subject: [PATCH 03/12] Create dependabot.yml --- .github/dependabot.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..12301490 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,6 @@ +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "daily" From add68e2e995d9afec5cc309fca04f6638f25dfd0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Jul 2020 15:13:39 +0000 Subject: [PATCH 04/12] Update actions/checkout requirement to v2.3.1 Updates the requirements on [actions/checkout](/~https://github.com/actions/checkout) to permit the latest version. - [Release notes](/~https://github.com/actions/checkout/releases) - [Changelog](/~https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](/~https://github.com/actions/checkout/commits/28c7f3d2b5162b5ddd3dfd9a45aa55eaf396478b) Signed-off-by: dependabot[bot] --- .github/workflows/documentation.yml | 2 +- .github/workflows/lint.yml | 2 +- .github/workflows/push.yml | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index 330e2038..b543f1d0 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2.3.1 - name: Install doxygen run: sudo apt install doxygen graphviz - name: Fix Readme title diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index ceef5292..70e2c4b5 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -7,7 +7,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2.3.1 - name: Check src format uses: DoozyX/clang-format-lint-action@v0.5 with: diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index aefdef2a..dce404a6 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -13,7 +13,7 @@ jobs: "Legion2:avr:promicro3vclp", ] steps: - - uses: actions/checkout@master + - uses: actions/checkout@v2.3.1 - name: Build for ${{ matrix.board }} uses: ArminJo/arduino-test-compile@v2.0.0 with: @@ -43,7 +43,7 @@ jobs: matrix: board: ["arduino:avr:uno", "arduino:avr:mega:cpu=atmega2560"] steps: - - uses: actions/checkout@master + - uses: actions/checkout@v2.3.1 - name: Build for ${{ matrix.board }} uses: ArminJo/arduino-test-compile@v2.0.0 with: @@ -58,7 +58,7 @@ jobs: matrix: board: ["Legion2:avr:HoodLoader2atmega16u2clp"] steps: - - uses: actions/checkout@master + - uses: actions/checkout@v2.3.1 - name: Build for ${{ matrix.board }} uses: ArminJo/arduino-test-compile@v2.0.0 with: From f285683749ff76e5e8c94a9e20fafcae49e1b51e Mon Sep 17 00:00:00 2001 From: Leon Kiefer Date: Tue, 21 Jul 2020 17:23:31 +0200 Subject: [PATCH 05/12] use actions/checkout@v2 --- .github/workflows/documentation.yml | 2 +- .github/workflows/lint.yml | 2 +- .github/workflows/push.yml | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index b543f1d0..361aeb45 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2.3.1 + - uses: actions/checkout@v2 - name: Install doxygen run: sudo apt install doxygen graphviz - name: Fix Readme title diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 70e2c4b5..f6170204 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -7,7 +7,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2.3.1 + - uses: actions/checkout@v2 - name: Check src format uses: DoozyX/clang-format-lint-action@v0.5 with: diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index dce404a6..ad60fee5 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -13,7 +13,7 @@ jobs: "Legion2:avr:promicro3vclp", ] steps: - - uses: actions/checkout@v2.3.1 + - uses: actions/checkout@v2 - name: Build for ${{ matrix.board }} uses: ArminJo/arduino-test-compile@v2.0.0 with: @@ -43,7 +43,7 @@ jobs: matrix: board: ["arduino:avr:uno", "arduino:avr:mega:cpu=atmega2560"] steps: - - uses: actions/checkout@v2.3.1 + - uses: actions/checkout@v2 - name: Build for ${{ matrix.board }} uses: ArminJo/arduino-test-compile@v2.0.0 with: @@ -58,7 +58,7 @@ jobs: matrix: board: ["Legion2:avr:HoodLoader2atmega16u2clp"] steps: - - uses: actions/checkout@v2.3.1 + - uses: actions/checkout@v2 - name: Build for ${{ matrix.board }} uses: ArminJo/arduino-test-compile@v2.0.0 with: From 20a53aba5297cef86c4871751b235f65b54a3895 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Jul 2020 15:28:39 +0000 Subject: [PATCH 06/12] Bump ArminJo/arduino-test-compile from v2.0.0 to v2.6.0 Bumps [ArminJo/arduino-test-compile](/~https://github.com/ArminJo/arduino-test-compile) from v2.0.0 to v2.6.0. - [Release notes](/~https://github.com/ArminJo/arduino-test-compile/releases) - [Commits](/~https://github.com/ArminJo/arduino-test-compile/compare/v2.0.0...c7a69f7cf03e2cf10b6dde9bc1823f9295151078) Signed-off-by: dependabot[bot] --- .github/workflows/push.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index ad60fee5..be6370a6 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -15,7 +15,7 @@ jobs: steps: - uses: actions/checkout@v2 - name: Build for ${{ matrix.board }} - uses: ArminJo/arduino-test-compile@v2.0.0 + uses: ArminJo/arduino-test-compile@v2.6.0 with: arduino-board-fqbn: ${{ matrix.board }} platform-url: https://raw.githubusercontent.com/sparkfun/Arduino_Boards/master/IDE_Board_Manager/package_sparkfun_index.json,https://raw.githubusercontent.com/Legion2/CorsairLightingProtocolBoards/master/package_Legion2_CorsairLightingProtocolBoards_index.json @@ -45,7 +45,7 @@ jobs: steps: - uses: actions/checkout@v2 - name: Build for ${{ matrix.board }} - uses: ArminJo/arduino-test-compile@v2.0.0 + uses: ArminJo/arduino-test-compile@v2.6.0 with: arduino-board-fqbn: ${{ matrix.board }} arduino-platform: arduino:avr@1.8.2 @@ -60,7 +60,7 @@ jobs: steps: - uses: actions/checkout@v2 - name: Build for ${{ matrix.board }} - uses: ArminJo/arduino-test-compile@v2.0.0 + uses: ArminJo/arduino-test-compile@v2.6.0 with: arduino-board-fqbn: ${{ matrix.board }} platform-url: https://raw.githubusercontent.com/NicoHood/HoodLoader2/master/package_NicoHood_HoodLoader2_index.json,https://raw.githubusercontent.com/Legion2/CorsairLightingProtocolBoards/master/package_Legion2_CorsairLightingProtocolBoards_index.json From 99bbb177be363051adc471c1fc958448d1ff4aaa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Jul 2020 15:28:40 +0000 Subject: [PATCH 07/12] Bump DoozyX/clang-format-lint-action from v0.5 to v0.7 Bumps [DoozyX/clang-format-lint-action](/~https://github.com/DoozyX/clang-format-lint-action) from v0.5 to v0.7. - [Release notes](/~https://github.com/DoozyX/clang-format-lint-action/releases) - [Commits](/~https://github.com/DoozyX/clang-format-lint-action/compare/v0.5...d9291de89073123284f7c394a41619ba0bfe5e2e) Signed-off-by: dependabot[bot] --- .github/workflows/lint.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index f6170204..14c3564e 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -9,13 +9,13 @@ jobs: steps: - uses: actions/checkout@v2 - name: Check src format - uses: DoozyX/clang-format-lint-action@v0.5 + uses: DoozyX/clang-format-lint-action@v0.7 with: source: './src' extensions: 'h,cpp' clangFormatVersion: 9 - name: Check examples format - uses: DoozyX/clang-format-lint-action@v0.5 + uses: DoozyX/clang-format-lint-action@v0.7 with: source: './examples' extensions: 'h,cpp,ino' From 3165fe5df0c057b306b80a1013a2ac60f4313617 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Jul 2020 06:25:20 +0000 Subject: [PATCH 08/12] Bump DoozyX/clang-format-lint-action from v0.7 to v0.8 Bumps [DoozyX/clang-format-lint-action](/~https://github.com/DoozyX/clang-format-lint-action) from v0.7 to v0.8. - [Release notes](/~https://github.com/DoozyX/clang-format-lint-action/releases) - [Commits](/~https://github.com/DoozyX/clang-format-lint-action/compare/v0.7...492fc0f21714bbc8f2dfe0c26df3d8bffc0270bc) Signed-off-by: dependabot[bot] --- .github/workflows/lint.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 14c3564e..10908086 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -9,13 +9,13 @@ jobs: steps: - uses: actions/checkout@v2 - name: Check src format - uses: DoozyX/clang-format-lint-action@v0.7 + uses: DoozyX/clang-format-lint-action@v0.8 with: source: './src' extensions: 'h,cpp' clangFormatVersion: 9 - name: Check examples format - uses: DoozyX/clang-format-lint-action@v0.7 + uses: DoozyX/clang-format-lint-action@v0.8 with: source: './examples' extensions: 'h,cpp,ino' From 42ab560fa3fd3262a3d4112e0155946729bb7d8c Mon Sep 17 00:00:00 2001 From: Leon Kiefer Date: Wed, 22 Jul 2020 12:54:44 +0200 Subject: [PATCH 09/12] created contribution guide close #146 --- .github/CONTRIBUTING.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 .github/CONTRIBUTING.md diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 00000000..4afc1285 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,34 @@ +# How to contribute + +You can contribute in many different ways, for example report a bug or come up with an idea for improvement. +If you are good at programming you could also provide a fix for bugs or Pull Requests with improvements. +If you want to help others using CLP you are welcome to extend the [Wiki on GitHub](/~https://github.com/Legion2/CorsairLightingProtocol/wiki). + +## Finding information + +General information can be found in the [Readme](/~https://github.com/Legion2/CorsairLightingProtocol) file at the root of the project. +Information about specific topics are written in the [Wiki](/~https://github.com/Legion2/CorsairLightingProtocol/wiki). +For developer there is also an [API documentation](https://legion2.github.io/CorsairLightingProtocol/) for all the public methods and types. + +## Writing code + +For writing code I recommend [VS Code](https://code.visualstudio.com/) with the [Clang-Format](https://marketplace.visualstudio.com/items?itemName=xaver.clang-format) and [C/C++](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools) extensions. +For uploading to Arduino boards I use the ArduinoIDE. + +This project consists of two major parts, the CLP library itself, for which the source code can be found in `src/` directory and the example sketches in the `examples/` subdirectories. +The main logic for processing commands and creating the LED colors is part of the library source code. +The examples only show how to use the library and what can be configured. +The library is modular so communication with iCUE and the processing of commands is decoupled and can be extended by other developers. +Single parts of the library, such as the LEDController can also be used without iCUE, by just calling the public API of these classes. + +The examples are used by most users as a template which they only modified slightly, so the basic examples should be simple and explicitly show the main configuration options. +Not all users are developers and may not understand the syntax or semantics of the code, they just alter some values and upload the sketches. +Examples can also be used to show how some additional or special features can be used, these sketches are not meant to be used by the users directly. +To verify that the library can be compiled on all supported platforms, all the examples are compiled in the CI pipeline for different boards. + +## Coding conventions + +Public methods must be documented with JavaDoc style comments. +When introducing new methods you should think about if the method should be part of the public API or only used internally. +Always use descriptive names for variables, only use acronyms if they are well known and frequently used. +The coding style is defined using ClangFormat and automatically checked when you submit a Pull Request. From 559bc19cc2cdf3de972d546173e01372d48a4daf Mon Sep 17 00:00:00 2001 From: Leon Kiefer Date: Wed, 5 Aug 2020 21:38:28 +0200 Subject: [PATCH 10/12] added unit tests with AUnit --- examples/UnitTests/UnitTests.ino | 268 +++++++++++++++++++++++++++++++ 1 file changed, 268 insertions(+) create mode 100644 examples/UnitTests/UnitTests.ino diff --git a/examples/UnitTests/UnitTests.ino b/examples/UnitTests/UnitTests.ino new file mode 100644 index 00000000..7704ba5a --- /dev/null +++ b/examples/UnitTests/UnitTests.ino @@ -0,0 +1,268 @@ +/* + Copyright 2020 Leon Kiefer + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +#line 17 "UnitTests.ino" + +#include + +#include "FastLEDControllerUtils.h" + +using namespace aunit; + +class FastLEDControllerTest : public TestOnce { +protected: + void assertCRGB(const CRGB& actual, const CRGB& expected) { + assertEqual(actual.r, expected.r); + assertEqual(actual.g, expected.g); + assertEqual(actual.b, expected.b); + } +}; + +test(getLEDs) { + CRGB leds[10]; + FastLEDController ledController(false); + ledController.addLEDs(0, leds, 10); + assertEqual(ledController.getLEDs(0), leds); + assertEqual(ledController.getLEDs(1), nullptr); +} + +testF(FastLEDControllerTest, simpleScaleUp) { + CRGB leds[20]; + FastLEDController ledController(false); + fill_solid(leds, 20, CRGB::Black); + ledController.addLEDs(0, leds, 10); + + fill_solid(leds, 10, CRGB::White); + CLP::scale(&ledController, 0, 20); + + for (int i = 0; i < 10; i++) { + assertCRGB(leds[i], CRGB::White); + } +} + +testF(FastLEDControllerTest, simpleScaleDown) { + CRGB leds[20]; + FastLEDController ledController(false); + fill_solid(leds, 20, CRGB::Black); + ledController.addLEDs(0, leds, 20); + + fill_solid(leds, 10, CRGB::White); + CLP::scale(&ledController, 0, 10); + + for (int i = 0; i < 5; i++) { + assertCRGB(leds[i], CRGB::White); + } + for (int i = 5; i < 10; i++) { + assertCRGB(leds[i], CRGB::Black); + } +} + +testF(FastLEDControllerTest, simpleScaleIdentity) { + CRGB leds[20]; + FastLEDController ledController(false); + fill_solid(leds, 20, CRGB::Black); + ledController.addLEDs(0, leds, 10); + + fill_solid(leds, 10, CRGB::White); + CLP::scale(&ledController, 0, 10); + + for (int i = 0; i < 10; i++) { + assertCRGB(leds[i], CRGB::White); + } + for (int i = 10; i < 20; i++) { + assertCRGB(leds[i], CRGB::Black); + } +} + +testF(FastLEDControllerTest, LT100) { + CRGB leds[30]; + FastLEDController ledController(false); + fill_solid(leds, 30, CRGB::Black); + ledController.addLEDs(0, leds, 30); + + leds[0] = CRGB::White; + fill_solid(leds + 1, 26, CRGB::Blue); + CLP::SegmentScaling segments[2] = {{1, 4}, {26, 26}}; + CLP::scaleSegments(&ledController, 0, segments, 2); + + for (int i = 0; i < 4; i++) { + assertCRGB(leds[i], CRGB::White); + } + for (int i = 4; i < 30; i++) { + assertCRGB(leds[i], CRGB::Blue); + } +} + +testF(FastLEDControllerTest, singleSegmentScaleUp) { + CRGB leds[20]; + FastLEDController ledController(false); + fill_solid(leds, 20, CRGB::Black); + ledController.addLEDs(0, leds, 20); + + fill_solid(leds, 10, CRGB::White); + CLP::SegmentScaling segments[] = {{10, 20}}; + CLP::scaleSegments(&ledController, 0, segments, 1); + + for (int i = 0; i < 20; i++) { + assertCRGB(leds[i], CRGB::White); + } +} + +testF(FastLEDControllerTest, multiScaleUp) { + CRGB leds[30]; + FastLEDController ledController(false); + fill_solid(leds, 30, CRGB::Black); + ledController.addLEDs(0, leds, 10); + + fill_solid(leds + 5, 5, CRGB::White); + CLP::SegmentScaling segments[] = {{5, 10}, {5, 20}}; + CLP::scaleSegments(&ledController, 0, segments, 2); + + for (int i = 0; i < 10; i++) { + assertCRGB(leds[i], CRGB::Black); + } + for (int i = 10; i < 30; i++) { + assertCRGB(leds[i], CRGB::White); + } +} + +testF(FastLEDControllerTest, multiScaleDown) { + CRGB leds[30]; + FastLEDController ledController(false); + fill_solid(leds, 30, CRGB::Black); + ledController.addLEDs(0, leds, 30); + + fill_solid(leds + 10, 20, CRGB::White); + CLP::SegmentScaling segments[] = {{10, 5}, {20, 5}}; + CLP::scaleSegments(&ledController, 0, segments, 2); + + for (int i = 0; i < 5; i++) { + assertCRGB(leds[i], CRGB::Black); + } + for (int i = 5; i < 10; i++) { + assertCRGB(leds[i], CRGB::White); + } +} + +testF(FastLEDControllerTest, singleSegmentScaleDown) { + CRGB leds[20]; + FastLEDController ledController(false); + fill_solid(leds, 20, CRGB::Black); + ledController.addLEDs(0, leds, 20); + + fill_solid(leds, 10, CRGB::White); + CLP::SegmentScaling segments[] = {{20, 10}}; + CLP::scaleSegments(&ledController, 0, segments, 1); + + for (int i = 0; i < 5; i++) { + assertCRGB(leds[i], CRGB::White); + } + for (int i = 5; i < 10; i++) { + assertCRGB(leds[i], CRGB::Black); + } +} + +testF(FastLEDControllerTest, SegmentScaleOverlap) { + CRGB leds[15]; + FastLEDController ledController(false); + fill_solid(leds, 15, CRGB::Black); + ledController.addLEDs(0, leds, 15); + + fill_solid(leds, 5, CRGB::White); + CLP::SegmentScaling segments[] = {{5, 10}, {10, 5}}; + CLP::scaleSegments(&ledController, 0, segments, 2); + + for (int i = 0; i < 10; i++) { + assertCRGB(leds[i], CRGB::White); + } + for (int i = 10; i < 15; i++) { + assertCRGB(leds[i], CRGB::Black); + } +} + +testF(FastLEDControllerTest, SegmentScaleOverlapInverted) { + CRGB leds[15]; + FastLEDController ledController(false); + fill_solid(leds, 15, CRGB::Black); + ledController.addLEDs(0, leds, 15); + + fill_solid(leds, 10, CRGB::White); + CLP::SegmentScaling segments[] = {{10, 5}, {5, 10}}; + CLP::scaleSegments(&ledController, 0, segments, 2); + + for (int i = 0; i < 5; i++) { + assertCRGB(leds[i], CRGB::White); + } + for (int i = 5; i < 15; i++) { + assertCRGB(leds[i], CRGB::Black); + } +} + +testF(FastLEDControllerTest, SegmentScaleMix) { + CRGB leds[30]; + FastLEDController ledController(false); + fill_solid(leds, 30, CRGB::Black); + ledController.addLEDs(0, leds, 30); + + fill_solid(leds, 5, CRGB::White); + fill_solid(leds + 5, 20, CRGB::Red); + fill_solid(leds + 25, 5, CRGB::Blue); + CLP::SegmentScaling segments[] = {{5, 10}, {20, 5}, {5, 10}}; + CLP::scaleSegments(&ledController, 0, segments, 3); + + for (int i = 0; i < 10; i++) { + assertCRGB(leds[i], CRGB::White); + } + for (int i = 10; i < 15; i++) { + assertCRGB(leds[i], CRGB::Red); + } + for (int i = 15; i < 25; i++) { + assertCRGB(leds[i], CRGB::Blue); + } +} + +testF(FastLEDControllerTest, SegmentScaleMixInverted) { + CRGB leds[30]; + FastLEDController ledController(false); + fill_solid(leds, 30, CRGB::Black); + ledController.addLEDs(0, leds, 25); + + fill_solid(leds, 10, CRGB::White); + fill_solid(leds + 10, 5, CRGB::Red); + fill_solid(leds + 15, 10, CRGB::Blue); + CLP::SegmentScaling segments[] = {{10, 5}, {5, 20}, {10, 5}}; + CLP::scaleSegments(&ledController, 0, segments, 3); + + for (int i = 0; i < 5; i++) { + assertCRGB(leds[i], CRGB::White); + } + for (int i = 5; i < 25; i++) { + assertCRGB(leds[i], CRGB::Red); + } + for (int i = 25; i < 30; i++) { + assertCRGB(leds[i], CRGB::Blue); + } +} + +void setup() { + delay(1000); + Serial.begin(115200); + while (!Serial) + ; +} + +void loop() { + TestRunner::run(); +} From 8fa7aab518af48dbf3578f75ad525e59e13f57f8 Mon Sep 17 00:00:00 2001 From: Leon Kiefer Date: Wed, 5 Aug 2020 21:50:38 +0200 Subject: [PATCH 11/12] corrected incorrect rounding when scaling fix #163 --- src/FastLEDControllerUtils.cpp | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/FastLEDControllerUtils.cpp b/src/FastLEDControllerUtils.cpp index 93aff4f7..4f867f85 100644 --- a/src/FastLEDControllerUtils.cpp +++ b/src/FastLEDControllerUtils.cpp @@ -33,16 +33,27 @@ void CLP::transformLLFanToStrip(FastLEDController* controller, uint8_t channelIn } } +/** + * Instead of scaling the zero based index we must scale the one based position. + * So, we first add 1 to the index, scale it, round it up to the next integer + * and then substract 1 to get the index. + * + * @param index the index which should be scaled + * @param scaleFactor the factor for the scaling + * @return the scaled index + */ +int scaleIndexAsPosition(int index, const float scaleFactor) { return ceil((index + 1) * scaleFactor) - 1; } + void CLP::scale(FastLEDController* controller, uint8_t channelIndex, int scaleToSize) { auto leds = controller->getLEDs(channelIndex); const float scaleFactor = (float)controller->getLEDCount(channelIndex) / scaleToSize; if (scaleFactor < 1.0f) { for (int ledIndex = scaleToSize - 1; ledIndex >= 0; ledIndex--) { - leds[ledIndex] = leds[lround(ledIndex * scaleFactor)]; + leds[ledIndex] = leds[scaleIndexAsPosition(ledIndex, scaleFactor)]; } } else { for (int ledIndex = 0; ledIndex < scaleToSize; ledIndex++) { - leds[ledIndex] = leds[lround(ledIndex * scaleFactor)]; + leds[ledIndex] = leds[scaleIndexAsPosition(ledIndex, scaleFactor)]; } } } @@ -66,12 +77,12 @@ void CLP::scaleSegments(FastLEDController* controller, uint8_t channelIndex, con // scale down segments and move all segments together so there is space for upscaling for (int i = 0; i < segmentsCount; i++) { const int segmentLength = segments[i].segmentLength; - const int scaleToSize = segments[i].scaleToSize < segmentLength ? segments[i].scaleToSize : segmentLength; + const int scaleToSize = min(segments[i].scaleToSize, segmentLength); const float scaleFactor = (float)segmentLength / scaleToSize; for (int ledIndex = 0; ledIndex < scaleToSize; ledIndex++) { leds[ledStripIndexAfterScaling + ledIndex] = - leds[ledStripIndexBeforeScaling + lround(ledIndex * scaleFactor)]; + leds[ledStripIndexBeforeScaling + scaleIndexAsPosition(ledIndex, scaleFactor)]; } ledStripIndexAfterScaling += scaleToSize; ledStripIndexBeforeScaling += segmentLength; @@ -89,7 +100,7 @@ void CLP::scaleSegments(FastLEDController* controller, uint8_t channelIndex, con ledStripIndexBeforeScaling -= downScaledSegments[i].segmentLength; for (int ledIndex = downScaledSegments[i].scaleToSize - 1; ledIndex >= 0; ledIndex--) { leds[ledStripIndexAfterScaling + ledIndex] = - leds[ledStripIndexBeforeScaling + lround(ledIndex * scaleFactor)]; + leds[ledStripIndexBeforeScaling + scaleIndexAsPosition(ledIndex, scaleFactor)]; } } } From 7ad904de1203575c3865e50be9878e348fbdc920 Mon Sep 17 00:00:00 2001 From: Leon Kiefer Date: Wed, 5 Aug 2020 22:12:37 +0200 Subject: [PATCH 12/12] release 0.14.1 --- extra/doxygen.conf | 2 +- library.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/extra/doxygen.conf b/extra/doxygen.conf index 6e73d280..7df7e6e1 100644 --- a/extra/doxygen.conf +++ b/extra/doxygen.conf @@ -38,7 +38,7 @@ PROJECT_NAME = "Corsair Lighting Protocol" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 0.14.0 +PROJECT_NUMBER = 0.14.1 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/library.properties b/library.properties index 301373fb..a3d67dc1 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=Corsair Lighting Protocol -version=0.14.0 +version=0.14.1 author=Leon Kiefer maintainer=Leon Kiefer sentence=Control LED strips via USB from a PC.