/
blink.c
52 lines (45 loc) · 1.28 KB
/
blink.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <stdbool.h>
#include <mchck.h>
#include "blink.h"
struct led_blink {
int nblinks; // number of transitions remaining, -1 for continuous blinking
unsigned int on_time; // in milliseconds
unsigned int off_time; // in milliseconds
struct timeout_ctx timeout;
int state;
bool running;
};
struct led_blink blink;
static void
blink_timeout_cb(void *cbdata)
{
struct led_blink *blink = cbdata;
if (blink->nblinks > 0)
blink->nblinks--;
if (blink->nblinks == 0)
blink->running = false;
if (blink->running) {
blink->state = !blink->state;
unsigned int timeout = blink->state ? blink->on_time : blink->off_time;
timeout_add(&blink->timeout, timeout, blink_timeout_cb, blink);
} else {
blink->state = false;
}
onboard_led(blink->state);
}
void
start_blink(int nblinks, unsigned int on_time, unsigned int off_time)
{
if (blink.running) return;
blink.nblinks = 2*nblinks;
blink.on_time = on_time;
blink.off_time = off_time;
blink.state = 0;
blink.running = true;
blink_timeout_cb((void*) &blink);
}
void
stop_blink()
{
blink.running = false;
}