/* Copyright (c) 2025 Rodrigo Arias Mallo * SPDX-License-Identifier: GPL-3.0-or-later */ #include "led.h" #include void led_on(struct led *led) { led->mode = LED_ON; } void led_off(struct led *led) { led->mode = LED_OFF; } void led_pattern(struct led *led, unsigned long t_ms, unsigned long period_ms, const char *pattern) { int n = strlen(pattern); unsigned long step_ms = period_ms / n; /* Don't change the current state */ if (led->mode == LED_PATTERN && led->step_ms == step_ms && led->pattern == pattern) return; led->mode = LED_PATTERN; led->pat_i = 0; led->pat_n = n; led->pattern = pattern; led->step_ms = step_ms; led->t_ms = t_ms; } /* Return led level brightness in [0, 255] at current time */ int led_level(struct led *led, unsigned long t_ms) { if (led->mode == LED_OFF) return 0; if (led->mode == LED_ON) return 255; if (led->mode == LED_PATTERN) { while (led->t_ms + led->step_ms < t_ms) { led->t_ms += led->step_ms; led->pat_i++; if (led->pat_i >= led->pat_n) led->pat_i = 0; } int c = led->pattern[led->pat_i]; int level; if (c >= '0' && c <= '9') level = 17 * (c - '0'); else level = 17 * (10 + (c - 'a')); if (level < 0) level = 0; else if (level > 255) level = 255; return level; } /* Unknown mode, turn off */ return 0; }