diff --git a/lantern/main.c b/lantern/main.c index 01ff068..ac07def 100644 --- a/lantern/main.c +++ b/lantern/main.c @@ -20,16 +20,17 @@ You should have received a copy of the GNU General Public License along with thi #include #include -#define ANIMATION_FRAMES 5 -#define FPS 15 -#define FRAME_DELAY_MS 1000 / FPS +#define FPS 15 +#define FRAME_DELAY_MS 1000 / FPS // #define FRAME_DELAY_MS 1000 -#define LIGHT_COUNT 3 +#define LIGHT_COUNT 3 +#define PULSE_OFF_COUNT FPS * 5 +#define PULSE_ON_COUNT 5 typedef enum { test, normal, - creepy, + spooky, eerie, flash } color_scheme_e; @@ -44,17 +45,10 @@ uint8_t bound_uint8(int value, uint8_t min, uint8_t max) { } } -uint8_t random_step(display_t *display, uint8_t value, uint8_t min, uint8_t max, rng_t *rng) { - // int8_t step = (rng_sample(rng) % 40) - 20; +uint8_t random_step(uint8_t value, uint8_t min, uint8_t max, rng_t *rng) { int8_t step = (rand() % 40) - 20; int new_value = value + step; - // char msg[20]; - // snprintf(msg, 20, "[%x] %x -> %x", step, value, new_value); - // display_clear(display); - // display_write_message(display, msg); - // _delay_ms(1000); - return bound_uint8(new_value, min, max); } @@ -133,40 +127,82 @@ void lantern_start_test(lantern_t *self) { 255, 0, 0, - ANIMATION_FRAMES); + 5); animation_begin( &self->animations[1], 0, 255, 0, - ANIMATION_FRAMES); + 5); animation_begin( &self->animations[2], 0, 0, 255, - ANIMATION_FRAMES); + 5); } -void lantern_start_normal(display_t *display, lantern_t *self, rng_t *rng) { +void lantern_start_normal(lantern_t *self, rng_t *rng) { animation_begin( &self->animations[0], - random_step(display, self->animations[0].color.r, 180, 255, rng), - random_step(display, self->animations[0].color.g, 20, 50, rng), + random_step(self->animations[0].color.r, 180, 255, rng), + random_step(self->animations[0].color.g, 20, 50, rng), 0, - FPS); + 5); animation_begin( &self->animations[1], - random_step(display, self->animations[1].color.r, 160, 230, rng), - random_step(display, self->animations[1].color.g, 10, 30, rng), + random_step(self->animations[1].color.r, 160, 230, rng), + random_step(self->animations[1].color.g, 10, 30, rng), 0, - FPS); + 5); animation_begin( &self->animations[2], - random_step(display, self->animations[2].color.r, 140, 170, rng), - random_step(display, self->animations[2].color.g, 0, 10, rng), + random_step(self->animations[2].color.r, 140, 170, rng), + random_step(self->animations[2].color.g, 0, 10, rng), 0, - FPS); + 5); +} + +void lantern_start_spooky(lantern_t *self, rng_t *rng) { + animation_begin( + &self->animations[0], + 0, + random_step(self->animations[0].color.g, 80, 120, rng), + 0, + 15); + animation_begin( + &self->animations[1], + 0, + random_step(self->animations[1].color.g, 60, 100, rng), + 0, + 15); + animation_begin( + &self->animations[2], + 0, + random_step(self->animations[2].color.g, 20, 40, rng), + 0, + 15); +} + +void lantern_start_eerie(lantern_t *self, rng_t *rng) { + animation_begin( + &self->animations[0], + random_step(self->animations[0].color.g, 20, 40, rng), + random_step(self->animations[0].color.g, 20, 40, rng), + random_step(self->animations[0].color.g, 80, 120, rng), + 15); + animation_begin( + &self->animations[1], + random_step(self->animations[0].color.g, 0, 30, rng), + random_step(self->animations[0].color.g, 0, 30, rng), + random_step(self->animations[1].color.g, 60, 100, rng), + 15); + animation_begin( + &self->animations[2], + random_step(self->animations[0].color.g, 0, 10, rng), + random_step(self->animations[0].color.g, 0, 10, rng), + random_step(self->animations[2].color.g, 20, 40, rng), + 15); } void lantern_set_mode(lantern_t *self, color_scheme_e scheme) { @@ -181,11 +217,13 @@ void lantern_step(lantern_t *self, display_t *display, rng_t *rng, rgb_t colors[ lantern_start_test(self); break; case normal: - lantern_start_normal(display, self, rng); + lantern_start_normal(self, rng); break; - case creepy: + case spooky: + lantern_start_spooky(self, rng); break; case eerie: + lantern_start_eerie(self, rng); break; case flash: break; @@ -223,10 +261,18 @@ void display_lantern(display_t *display, lantern_t *lantern) { display_write_message(display, msg2); } +typedef struct { + bool on; + int timeout; +} power_pulse_t; + int main(void) { dio_t status_light = { .ddr = &DDRC, .port = &PORTC, .pin = &PINC, .addr = 7 }; dio_set_direction(&status_light, LINE_OUT); + dio_t power_pulse = { .ddr = &DDRF, .port = &PORTF, .pin = &PINF, .addr = 0 }; + dio_set_direction(&power_pulse, LINE_OUT); + display_t display = { .reg = { .output = { .ddr = &DDRF, .port = &PORTF, .pin = &PINF, .addr = 7 }, @@ -255,57 +301,35 @@ int main(void) { rgb_t colors[LIGHT_COUNT]; lantern_t lantern = lantern_new(lights); - lantern_set_mode(&lantern, normal); + lantern_set_mode(&lantern, eerie); rng_t rng = rng_new(15); - // display_clear(&display); - // display_write_message(&display, "ready"); - - // _delay_ms(5000); - lantern_step(&lantern, &display, &rng, colors); sk9822_send(&lights, colors, LIGHT_COUNT); + power_pulse_t timer = { .on = false, .timeout = PULSE_OFF_COUNT }; + while(1) { lantern_step(&lantern, &display, &rng, colors); sk9822_send(&lights, colors, LIGHT_COUNT); + + if (timer.timeout > 0) { + timer.timeout--; + } else { + if (timer.on) { + timer.on = false; + dio_set(&power_pulse, 0); + timer.timeout = PULSE_OFF_COUNT; + } else { + timer.on = true; + dio_set(&power_pulse, 1); + timer.timeout = PULSE_ON_COUNT; + } + } + _delay_ms(FRAME_DELAY_MS); } - /* - rgb_t colors[3] = { - { .brightness = 1, .r = 128, .g = 0, .b = 0, }, - { .brightness = 1, .r = 0, .g = 128, .b = 0, }, - { .brightness = 1, .r = 0, .g = 0, .b = 128, }, - }; - */ - - /* - sk9822_init(&lights); - sk9822_send(&lights, colors, 3); - - int flash_recovery = 0; - - set_sleep_mode(SLEEP_MODE_PWR_DOWN); - - while (1) { - if (flash_recovery == 0) { - uint8_t value = dio_read(&buttons[0]); - if (value != 0) { - flash_status(&status_light); - flash_recovery = 128; - } - } else { - colors[0] = (rgb_t){ .brightness = bound(flash_recovery / 4, 1, 31), .r = 128 + flash_recovery, .g = flash_recovery * 2, .b = flash_recovery * 2 }, - colors[1] = (rgb_t){ .brightness = bound(flash_recovery / 4, 1, 31), .r = flash_recovery * 2, .g = 128 + flash_recovery, .b = flash_recovery * 2 }, - colors[2] = (rgb_t){ .brightness = bound(flash_recovery / 4, 1, 31), .r = flash_recovery * 2, .g = flash_recovery * 2, .b = 128 + flash_recovery }, - sk9822_send(&lights, colors, 3); - flash_recovery -= 2; - } - _delay_ms(ANIMATION_DELAY); - } - */ - return 0; }