Files
quadrotor/led.c
Gavan Fantom b482b85ffd Firmware changes to match rewired control board.
This is a bit more difficult than just reassigning pins as the usage
of the timers has changed to the point of using 16 bit timers where 32 bit
timers would have been ideal. This makes the use of the prescaler necessary,
and we need to cope with a different prescaler value being used on different
timers.
2013-05-25 19:24:39 +00:00

60 lines
1.2 KiB
C

/* 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();
}