Commit b02a7f77 authored by Jan Kasprzak's avatar Jan Kasprzak
Browse files

pattern.c: ADC-timed blinking patterns

parent 15e2b46e
PROGRAM=lights
SRC=main.c logging.c pwm.c adc.c pwmled.c
SRC=main.c logging.c pwm.c adc.c pwmled.c pattern.c
OBJ=$(SRC:.c=.o)
......
......@@ -140,9 +140,21 @@ static void adc1_gain20_adc(uint16_t adcsum)
}
#endif
static void inline adc_based_timer()
{
static uint16_t pattern_counter;
if (++pattern_counter > 250) {
pattern_counter = 0;
patterns_next_tick();
}
}
ISR(ADC_vect) { // IRQ handler
uint16_t adcval = ADCW;
adc_based_timer();
if (read_zero) {
setup_mux(current_adc);
read_zero = 0;
......
......@@ -3,29 +3,10 @@
#include "lights.h"
#define N_LEDS 1
static unsigned char led_counters[N_LEDS];
static pattern_t *led_patterns[N_LEDS];
static pattern_t boot_pattern[] = {
{ 1, 0x6 },
{ 0, 0x6 },
{ 1, 0x3 },
{ 0, 0x3 },
{ 1, 0x2 },
{ 0, 0x2 },
{ 1, 0x1 },
{ 0, 0x1 },
{ 1, 0x1 },
{ 0, 0x1 },
{ 1, 0x1 },
{ 0, 0x1 },
{ 1, 0x1 },
{ 0, 0x1 },
{ 1, 0x10 },
{ 0, 0x10 },
PATTERN_END
};
static pattern_t pattern_num[] = {
{ 0, 0x5 },
{ 1, 0x1 }, /* 10 */
......@@ -81,12 +62,20 @@ pattern_t off_pattern[] = {
PATTERN_END
};
pattern_t on1_pattern[] = {
{ 1, 1 },
{ 0, 2 },
{ 1, 1 },
{ 0, 8 },
{ 1, 1 },
{ 0, 8 },
PATTERN_END
};
static void led_set_mode(unsigned char n, unsigned char mode)
{
if (n < N_PWMLEDS) {
pwmled_set_mode(n, mode);
} else if (n < N_LEDS) {
gpio_set(n - N_PWMLEDS, mode);
if (n == 0) {
pwmled_on_off(mode);
}
}
......@@ -107,8 +96,6 @@ void init_pattern()
for (i = 0; i < N_LEDS; i++)
led_set_pattern(i, NULL);
led_set_pattern(N_PWMLEDS+1, boot_pattern);
}
pattern_t *number_pattern(unsigned char num, unsigned char inv)
......@@ -129,13 +116,21 @@ pattern_t *number_pattern(unsigned char num, unsigned char inv)
static pattern_t *pattern_select(unsigned char n)
{
static unsigned char count;
static unsigned char mode;
switch(n) {
case 0: return pwmled0_pattern_select();
case 1: return pwmled1_pattern_select();
case 2: return pwmled2_pattern_select();
case 3: return status_led_pattern_select();
case 4: return illumination_led_pattern_select();
case 6: return laser_pattern_select();
case 0:
if (++count > 2) {
count = 0;
if (mode == 0) {
mode = 3;
} else {
mode = 0;
}
pwmled_set_target(mode);
}
return number_pattern(mode ? 2 : 3, 0);
default: return NULL;
}
}
......@@ -154,14 +149,10 @@ static void inline pattern_finished(unsigned char n)
led_patterns[n] = NULL;
if (n < N_PWMLEDS) {
for (i = 0; i < N_PWMLEDS; i++)
if (led_patterns[i])
return;
/* all pwmleds finished; restart them */
for (i = 0; i < N_PWMLEDS; i++)
led_set_pattern(i, pattern_select(i));
if (n == 0) {
led_set_pattern(0, pattern_select(0));
}
#if 0
} else if (n == 3) {
if (!led_patterns[4])
led_set_pattern(4, pattern_select(4));
......@@ -171,6 +162,7 @@ static void inline pattern_finished(unsigned char n)
} else {
led_set_pattern(n, pattern_select(n));
}
#endif
}
void patterns_next_tick()
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment