diff --git a/libs/LedKit/CMakeLists.txt b/libs/LedKit/CMakeLists.txt index b738e67d24..28a92ae7c1 100644 --- a/libs/LedKit/CMakeLists.txt +++ b/libs/LedKit/CMakeLists.txt @@ -14,6 +14,7 @@ target_sources(LedKit PRIVATE source/AfraidBlue.cpp source/AfraidRed.cpp + source/AngryShort.cpp source/Bubbles.cpp source/Disgusted.cpp source/Fly.cpp diff --git a/libs/LedKit/include/internal/AngryShort.h b/libs/LedKit/include/internal/AngryShort.h new file mode 100644 index 0000000000..27ad952bf6 --- /dev/null +++ b/libs/LedKit/include/internal/AngryShort.h @@ -0,0 +1,70 @@ +// Leka - LekaOS +// Copyright 2022 APF France handicap +// SPDX-License-Identifier: Apache-2.0 + +// + Stage 1 + Stage 2 + Stage 3 + Stage 4+ Stage 5 + Stage 6 + +// | | | | | | | +// | |\ | -| | -| | --- Red +// | /| \ | / |\ | / |\ | +// | / | \ | / | \ | / | \ | +// | / | \ | / | \ | / | \ | +// | / | \ | / | \ | / | \ | +// | / | \ | / | \ | / | \ | +// | / | \ | / | \ | / | \ | +// | / | \ | / | \ | / | \ | +// | / | \| / | \| / | \ | +// | / | |/ | |/ | \ | +// | / | | | | | \ | +// | / | | | | | \ | +// | / | | | | | \ | +// | / | | | | | \ | +// | / | | | | | \ | +// | / | | | | | \ | +// | / | | | | | \ | +// | / | | | | | \ | +// | / | | | | | \ | +// |/ | | | | | \| --- Black +// | | | | | | | +// | | | | | | | + +#pragma once + +// ? LCOV_EXCL_START - Exclude from coverage report + +#include "LEDAnimation.h" + +namespace leka::led::animation { + +class AngryShort : public interface::LEDAnimation +{ + public: + explicit AngryShort(interface::LED &ears, interface::LED &belt) : _ears(ears), _belt(belt) {}; + + void start() final; + void run() final; + void stop() final; + + private: + interface::LED &_ears; + interface::LED &_belt; + uint8_t _step = 0; + uint8_t _stage = 1; + + [[nodiscard]] auto mapStep(uint8_t step) const -> float; + + void stage1(); + void stage2(); + void stage3(); + void stage4(); + void stage5(); + void stage6(); + + void increaseBrightness(float treshold); + void decreaseBrightness(float treshold); + + void turnLedBlack(); +}; + +} // namespace leka::led::animation + +// ? LCOV_EXCL_STOP - Exclude from coverage report diff --git a/libs/LedKit/source/AngryShort.cpp b/libs/LedKit/source/AngryShort.cpp new file mode 100644 index 0000000000..55ac56f6d5 --- /dev/null +++ b/libs/LedKit/source/AngryShort.cpp @@ -0,0 +1,120 @@ +// Leka - LekaOS +// Copyright 2022 APF France handicap +// SPDX-License-Identifier: Apache-2.0 + +// ? LCOV_EXCL_START - Exclude from coverage report + +#include "AngryShort.h" + +#include "MathUtils.h" + +namespace leka::led::animation { + +void AngryShort::start() +{ + turnLedBlack(); +} + +void AngryShort::stop() +{ + turnLedBlack(); +} + +void AngryShort::run() +{ + switch (_stage) { + case 1: + stage1(); + break; + case 2: + stage2(); + break; + case 3: + stage3(); + break; + case 4: + stage4(); + break; + case 5: + stage5(); + break; + case 6: + stage6(); + break; + default: + break; + } + _belt.show(); +} + +auto AngryShort::mapStep(uint8_t step) const -> float +{ + constexpr auto kMaxInputValue = uint8_t {40}; + return utils::math::map(step, uint8_t {0}, kMaxInputValue, 0.F, 1.F); +} + +void AngryShort::stage1() +{ + increaseBrightness(1.F); +} + +void AngryShort::stage2() +{ + static constexpr auto kTreshold = 0.7F; + decreaseBrightness(kTreshold); +} + +void AngryShort::stage3() +{ + increaseBrightness(1.F); +} + +void AngryShort::stage4() +{ + static constexpr auto kTreshold = 0.7F; + decreaseBrightness(kTreshold); +} + +void AngryShort::stage5() +{ + increaseBrightness(1.F); +} + +void AngryShort::stage6() +{ + decreaseBrightness(0.F); +} + +void AngryShort::increaseBrightness(float treshold) +{ + if (auto pos = mapStep(_step); pos != treshold) { + RGB color = ColorKit::colorGradient(RGB::black, RGB::pure_red, pos); + _belt.setColor(color); + _step++; + } else { + _stage++; + } +} + +void AngryShort::decreaseBrightness(float treshold) +{ + if (auto pos = mapStep(_step); pos != treshold) { + RGB color = ColorKit::colorGradient(RGB::black, RGB::pure_red, pos); + _belt.setColor(color); + _step--; + } else { + _stage++; + } +} + +void AngryShort::turnLedBlack() +{ + _ears.setColor(RGB::black); + _belt.setColor(RGB::black); + _ears.show(); + _belt.show(); +} + +} // namespace leka::led::animation + +// ? LCOV_EXCL_STOP - Exclude from coverage report diff --git a/spikes/lk_led_kit/main.cpp b/spikes/lk_led_kit/main.cpp index 1d60c53bca..41da6ab2e3 100644 --- a/spikes/lk_led_kit/main.cpp +++ b/spikes/lk_led_kit/main.cpp @@ -9,6 +9,7 @@ #include "AfraidBlue.h" #include "AfraidRed.h" +#include "AngryShort.h" #include "Bubbles.h" #include "CoreLED.h" #include "CoreSPI.h" @@ -38,6 +39,7 @@ auto ledkit = LedKit {animation_thread, animation_event_queue, ears, belt}; led::animation::AfraidBlue animation_afraid_blue(ears, belt); led::animation::AfraidRed animation_afraid_red(ears, belt); +led::animation::AngryShort animation_angry_short(ears, belt); led::animation::Bubbles animation_bubbles(ears, belt); led::animation::Disgusted animation_disgusted(ears, belt); led::animation::Fly animation_fly {ears, belt}; @@ -78,6 +80,9 @@ auto main() -> int ledkit.start(animation_afraid_blue); rtos::ThisThread::sleep_for(10s); + ledkit.start(animation_angry_short); + rtos::ThisThread::sleep_for(10s); + ledkit.stop(); rtos::ThisThread::sleep_for(1s); }