/* * This program source code file is part of SystemK, a library in the KTag project. * * 🛡️ 🃞 * * Copyright © 2016-2025 Joseph P. Kearney and the KTag developers. * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Affero General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more * details. * * There should be a copy of the GNU Affero General Public License in the LICENSE * file in the root of this repository. If not, see . */ #include "SystemK.h" static color_t All_On_Color = COLOR_WHITE; static DisplayStyle_T All_On_Style = DISPLAY_STYLE_DEFAULT; static uint8_t Heartbeat_Phase = 0; static const uint8_t MIN_HEARTBEAT_BRIGHTNESS = 50; static uint16_t Time_in_Animation_in_ms = 0; static void Reset(void *Data) { All_On_Color = ((All_On_Data_T *)Data)->color; All_On_Style = ((All_On_Data_T *)Data)->style; Time_in_Animation_in_ms = 0; } static AnimationStepResult_T NextStep(void) { if (All_On_Style == DISPLAY_STYLE_ALTERNATE) { if ((Time_in_Animation_in_ms % 500) < 250) { #if (CONFIG_KTAG_N_NEOPIXEL_CHANNELS == 1) Set_Barrel_Flash(All_On_Color); Set_Heart(COLOR_BLACK); Set_Square(All_On_Color); Set_Circle(COLOR_BLACK); Set_Arrow(All_On_Color); #elif (CONFIG_KTAG_N_NEOPIXEL_CHANNELS == 4) for (uint_fast8_t pixel = 0; pixel < CONFIG_KTAG_MAX_NEOPIXELS_PER_CHANNEL; pixel++) { if (pixel % 2) { NeoPixels_Set_Color(NEOPIXEL_CHANNEL_BARREL, pixel, All_On_Color); NeoPixels_Set_Color(NEOPIXEL_CHANNEL_RECEIVER, pixel, All_On_Color); NeoPixels_Set_Color(NEOPIXEL_CHANNEL_DISPLAY, pixel, All_On_Color); NeoPixels_Set_Color(NEOPIXEL_CHANNEL_EFFECTS, pixel, All_On_Color); } else { NeoPixels_Set_Color(NEOPIXEL_CHANNEL_BARREL, pixel, COLOR_BLACK); NeoPixels_Set_Color(NEOPIXEL_CHANNEL_RECEIVER, pixel, COLOR_BLACK); NeoPixels_Set_Color(NEOPIXEL_CHANNEL_DISPLAY, pixel, COLOR_BLACK); NeoPixels_Set_Color(NEOPIXEL_CHANNEL_EFFECTS, pixel, COLOR_BLACK); } } #endif // CONFIG_KTAG_N_NEOPIXEL_CHANNELS } else { #if (CONFIG_KTAG_N_NEOPIXEL_CHANNELS == 1) Set_Barrel_Flash(COLOR_BLACK); Set_Heart(All_On_Color); Set_Square(COLOR_BLACK); Set_Circle(All_On_Color); Set_Arrow(COLOR_BLACK); #elif (CONFIG_KTAG_N_NEOPIXEL_CHANNELS == 4) for (uint_fast8_t pixel = 0; pixel < CONFIG_KTAG_MAX_NEOPIXELS_PER_CHANNEL; pixel++) { if (pixel % 2) { NeoPixels_Set_Color(NEOPIXEL_CHANNEL_BARREL, pixel, COLOR_BLACK); NeoPixels_Set_Color(NEOPIXEL_CHANNEL_RECEIVER, pixel, COLOR_BLACK); NeoPixels_Set_Color(NEOPIXEL_CHANNEL_DISPLAY, pixel, COLOR_BLACK); NeoPixels_Set_Color(NEOPIXEL_CHANNEL_EFFECTS, pixel, COLOR_BLACK); } else { NeoPixels_Set_Color(NEOPIXEL_CHANNEL_BARREL, pixel, All_On_Color); NeoPixels_Set_Color(NEOPIXEL_CHANNEL_RECEIVER, pixel, All_On_Color); NeoPixels_Set_Color(NEOPIXEL_CHANNEL_DISPLAY, pixel, All_On_Color); NeoPixels_Set_Color(NEOPIXEL_CHANNEL_EFFECTS, pixel, All_On_Color); } } #endif // CONFIG_KTAG_N_NEOPIXEL_CHANNELS } } else if (All_On_Style == DISPLAY_STYLE_BLINK) { if ((Time_in_Animation_in_ms % 200) < 100) { NeoPixels_Set_Color_Range_On_All_Channels(0, CONFIG_KTAG_MAX_NEOPIXELS_PER_CHANNEL - 1, All_On_Color); } else { NeoPixels_Set_Color_Range_On_All_Channels(0, CONFIG_KTAG_MAX_NEOPIXELS_PER_CHANNEL - 1, COLOR_BLACK); } } else if (All_On_Style == DISPLAY_STYLE_HEARTBEAT) { uint8_t Brightness = Sine8[Heartbeat_Phase]; Heartbeat_Phase += 2; if (Brightness < MIN_HEARTBEAT_BRIGHTNESS) { Brightness = MIN_HEARTBEAT_BRIGHTNESS; } NeoPixels_Set_Color_Range_On_All_Channels(0, CONFIG_KTAG_MAX_NEOPIXELS_PER_CHANNEL - 1, ApplyMask(All_On_Color, Brightness)); } else { NeoPixels_Set_Color_Range_On_All_Channels(0, CONFIG_KTAG_MAX_NEOPIXELS_PER_CHANNEL - 1, All_On_Color); } Time_in_Animation_in_ms += CONFIG_KTAG_ANIMATION_STEP_TIME_IN_ms; return ANIMATION_ONGOING; } Animation_T All_On_Animation = { .Reset = Reset, .NextStep = NextStep};