From b02a7f779bb5da598bab17456d0afda65adc863b Mon Sep 17 00:00:00 2001 From: "Jan \"Yenya\" Kasprzak" Date: Mon, 29 Apr 2013 18:42:08 +0200 Subject: [PATCH] pattern.c: ADC-timed blinking patterns --- projects/step-up/Makefile | 2 +- projects/step-up/adc.c | 12 +++++++ projects/step-up/pattern.c | 72 +++++++++++++++++--------------------- 3 files changed, 45 insertions(+), 41 deletions(-) diff --git a/projects/step-up/Makefile b/projects/step-up/Makefile index a0c7739..5c5af30 100644 --- a/projects/step-up/Makefile +++ b/projects/step-up/Makefile @@ -1,6 +1,6 @@ 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) diff --git a/projects/step-up/adc.c b/projects/step-up/adc.c index d7679d3..2bd4bff 100644 --- a/projects/step-up/adc.c +++ b/projects/step-up/adc.c @@ -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; diff --git a/projects/step-up/pattern.c b/projects/step-up/pattern.c index 55b64cc..693df1d 100644 --- a/projects/step-up/pattern.c +++ b/projects/step-up/pattern.c @@ -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() -- 2.39.3