72 lines
1.3 KiB
C
72 lines
1.3 KiB
C
/* Copyright (c) 2025 Rodrigo Arias Mallo <rodarima@gmail.com>
|
|
* SPDX-License-Identifier: GPL-3.0-or-later */
|
|
|
|
#include "led.h"
|
|
#include <string.h>
|
|
|
|
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;
|
|
}
|