|
|
|
/* led.c */
|
|
|
|
|
|
|
|
#include "led.h"
|
|
|
|
#include "timer.h"
|
|
|
|
|
|
|
|
#define FP0XVAL (*((volatile unsigned int *) 0x3FFFC014))
|
|
|
|
|
|
|
|
led_pattern *led_current_pattern;
|
|
|
|
led_pattern *led_current_pointer;
|
|
|
|
unsigned int led_next_time;
|
|
|
|
bool led_next_state;
|
|
|
|
|
|
|
|
led_pattern led_pattern_active[] = {250, 250, 0};
|
|
|
|
led_pattern led_pattern_unknown[] = {100, 100, 0};
|
|
|
|
|
|
|
|
void led_set(bool on)
|
|
|
|
{
|
|
|
|
if (on)
|
|
|
|
FP0XVAL &= ~0x04000000;
|
|
|
|
else
|
|
|
|
FP0XVAL |= 0x04000000;
|
|
|
|
}
|
|
|
|
|
|
|
|
void led_update(void)
|
|
|
|
{
|
|
|
|
unsigned int time = timer_read();
|
|
|
|
|
|
|
|
/* This should never be possible, but let's just be sure. */
|
|
|
|
if (!led_current_pattern)
|
|
|
|
return;
|
|
|
|
if (!led_current_pointer)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (((signed int) (((signed int)led_next_time)-time)) > 0)
|
|
|
|
return;
|
|
|
|
|
|
|
|
led_set(led_next_state);
|
|
|
|
led_next_state = !led_next_state;
|
|
|
|
led_next_time += *led_current_pointer * TIMER0_MS;
|
|
|
|
led_current_pointer++;
|
|
|
|
if (*led_current_pointer == 0)
|
|
|
|
led_current_pointer = led_current_pattern;
|
|
|
|
}
|
|
|
|
|
|
|
|
void led_set_pattern(led_pattern *pattern)
|
|
|
|
{
|
|
|
|
if (led_current_pattern == pattern)
|
|
|
|
return;
|
|
|
|
led_current_pattern = pattern;
|
|
|
|
}
|
|
|
|
|
|
|
|
void led_init(void)
|
|
|
|
{
|
|
|
|
led_current_pattern = led_pattern_unknown;
|
|
|
|
led_current_pointer = led_pattern_unknown;
|
|
|
|
led_next_state = TRUE;
|
|
|
|
led_next_time = timer_read();
|
|
|
|
led_update();
|
|
|
|
}
|