diff options
author | Daniel Friesel <derf@finalrewind.org> | 2016-02-01 20:55:10 +0100 |
---|---|---|
committer | Daniel Friesel <derf@finalrewind.org> | 2016-02-01 20:55:10 +0100 |
commit | 4bf560b6f3ef6089af04dfc56d078b9978496b07 (patch) | |
tree | 1cf523b8b6224de1305a5619f9373daa82085543 | |
parent | 9d840bb688844458e7ba270ddbb1944d40c317ec (diff) |
add animation delay support
-rw-r--r-- | src/display.cc | 60 | ||||
-rw-r--r-- | src/display.h | 9 | ||||
-rw-r--r-- | src/main.cc | 6 |
3 files changed, 49 insertions, 26 deletions
diff --git a/src/display.cc b/src/display.cc index ce7b466..f9be78e 100644 --- a/src/display.cc +++ b/src/display.cc @@ -58,33 +58,44 @@ void Display::update() { if (need_update) { need_update = 0; - if (active_anim->type == AnimationType::TEXT) { - for (i = 0; i < 7; i++) { - disp_buf[i] = disp_buf[i+1]; + if (status == RUNNING) { + if (active_anim->type == AnimationType::TEXT) { + for (i = 0; i < 7; i++) { + disp_buf[i] = disp_buf[i+1]; + } + + glyph_addr = (uint8_t *)pgm_read_ptr(&font[active_anim->data[str_pos]]); + glyph_len = pgm_read_byte(&glyph_addr[0]); + char_pos++; + + if (char_pos > glyph_len) { + char_pos = 0; + str_pos++; + } + + if (char_pos == 0) { + disp_buf[7] = 0xff; // whitespace + } else { + disp_buf[7] = ~pgm_read_byte(&glyph_addr[char_pos]); + } + } else if (active_anim->type == AnimationType::FRAMES) { + for (i = 0; i < 8; i++) { + disp_buf[i] = ~active_anim->data[str_pos+i]; + } + str_pos += 8; } - - glyph_addr = (uint8_t *)pgm_read_ptr(&font[active_anim->data[str_pos]]); - glyph_len = pgm_read_byte(&glyph_addr[0]); - char_pos++; - - if (char_pos > glyph_len) { - char_pos = 0; - str_pos++; + if (str_pos >= active_anim->length) { + str_pos = 0; + if (active_anim->delay > 0) { + status = PAUSED; + } } - - if (char_pos == 0) { - disp_buf[7] = 0xff; // whitespace - } else { - disp_buf[7] = ~pgm_read_byte(&glyph_addr[char_pos]); + } else if (status == PAUSED) { + str_pos++; + if (str_pos >= active_anim->delay) { + str_pos = 0; + status = RUNNING; } - } else if (active_anim->type == AnimationType::FRAMES) { - for (i = 0; i < 8; i++) { - disp_buf[i] = ~active_anim->data[str_pos+i]; - } - str_pos += 8; - } - if (str_pos >= active_anim->length) { - str_pos = 0; } } } @@ -95,6 +106,7 @@ void Display::reset() disp_buf[i] = 0xff; str_pos = 0; char_pos = -1; + status = RUNNING; } void Display::show(animation_t *anim) diff --git a/src/display.h b/src/display.h index 5dd6bfe..8e1cca1 100644 --- a/src/display.h +++ b/src/display.h @@ -66,6 +66,15 @@ class Display { uint8_t disp_buf[8]; uint8_t str_pos; int8_t char_pos; + + enum AnimationStatus : uint8_t { + RUNNING, + SCROLL_BACK, + PAUSED + }; + + AnimationStatus status; + public: Display(); diff --git a/src/main.cc b/src/main.cc index 160406c..37dc8bd 100644 --- a/src/main.cc +++ b/src/main.cc @@ -12,16 +12,18 @@ int main (void) { ohai.type = AnimationType::TEXT; ohai.speed = (2 << 4) + 15; - ohai.data = (uint8_t *)"\001 Ohai "; + ohai.data = (uint8_t *)" Ohai \001"; ohai.length = 8; + ohai.delay = (0 << 4) + 0; // -> 4bit 0 remains 0 - uint8_t anim_data[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, 0, 0, 0, 0, 0, 0, 0 }; + uint8_t anim_data[] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 }; animation_t test; test.type = AnimationType::FRAMES; test.speed = 14; test.length = 2*8; test.data = anim_data; + test.delay = (1 << 4); rocket.initialize(); |