diff options
author | Daniel Friesel <derf@finalrewind.org> | 2016-02-29 13:36:34 +0100 |
---|---|---|
committer | Daniel Friesel <derf@finalrewind.org> | 2016-02-29 13:36:34 +0100 |
commit | 9f96509a454174fd10ed9924a9da81dd60bc8195 (patch) | |
tree | 04b699066b525c254beb85af36dafdce2f078eff | |
parent | afbf9bf8e1422d7c810be524365e60973d8ec798 (diff) |
add support for a powerdown image
-rw-r--r-- | src/display.cc | 1 | ||||
-rw-r--r-- | src/system.cc | 74 | ||||
-rw-r--r-- | src/system.h | 12 |
3 files changed, 57 insertions, 30 deletions
diff --git a/src/display.cc b/src/display.cc index 87d863f..b7942e8 100644 --- a/src/display.cc +++ b/src/display.cc @@ -125,6 +125,7 @@ void Display::reset() disp_buf[i] = 0xff; str_pos = 0; char_pos = -1; + need_update = 1; status = RUNNING; } diff --git a/src/system.cc b/src/system.cc index d8c27ab..9867c17 100644 --- a/src/system.cc +++ b/src/system.cc @@ -46,9 +46,28 @@ void System::initialize() sei(); + current_anim_no = 0; + loadPattern(0); +} + +void System::loadPattern(uint8_t anim_no) +{ if (storage.hasData()) { - current_anim_no = 0; - loadPattern(0); + storage.load(anim_no, disp_buf); + + active_anim.type = (AnimationType)(disp_buf[0] >> 4); + active_anim.length = disp_buf[1]; + + if (active_anim.type == AnimationType::TEXT) { + active_anim.speed = (disp_buf[2] & 0xf0) + 15; + active_anim.delay = (disp_buf[2] & 0x0f ) << 4; + active_anim.direction = disp_buf[3] >> 4; + } else if (active_anim.type == AnimationType::FRAMES) { + active_anim.speed = ((disp_buf[2] & 0x0f) << 4) + 15; + active_anim.delay = (disp_buf[3] & 0x0f) << 2; + } + + active_anim.data = disp_buf + 4; } else { active_anim.type = AnimationType::TEXT; active_anim.speed = (2 << 4) + 15; @@ -88,30 +107,6 @@ void System::initialize() display.show(&active_anim); } -void System::loadPattern(uint8_t anim_no) -{ - if (!storage.hasData()) - return; - - storage.load(anim_no, disp_buf); - - active_anim.type = (AnimationType)(disp_buf[0] >> 4); - active_anim.length = disp_buf[1]; - - if (active_anim.type == AnimationType::TEXT) { - active_anim.speed = (disp_buf[2] & 0xf0) + 15; - active_anim.delay = (disp_buf[2] & 0x0f ) << 4; - active_anim.direction = disp_buf[3] >> 4; - } else if (active_anim.type == AnimationType::FRAMES) { - active_anim.speed = ((disp_buf[2] & 0x0f) << 4) + 15; - active_anim.delay = (disp_buf[3] & 0x0f) << 2; - } - - active_anim.data = disp_buf + 4; - - display.show(&active_anim); -} - // ! This function has not been tested yet void System::receive(void) { @@ -268,16 +263,31 @@ void System::loop() void System::shutdown() { - // turn off display to indicate we're about to shut down - display.disable(); - modem.disable(); + // show power down image + disp_buf[0] = systemPowerdownImage[0]; + disp_buf[1] = systemPowerdownImage[1]; + disp_buf[2] = systemPowerdownImage[2]; + disp_buf[3] = systemPowerdownImage[3]; + disp_buf[4] = systemPowerdownImage[4]; + disp_buf[5] = systemPowerdownImage[5]; + disp_buf[6] = systemPowerdownImage[6]; + disp_buf[7] = systemPowerdownImage[7]; + active_anim.data = disp_buf; + active_anim.type = AnimationType::FRAMES; + active_anim.length = 8; + display.show(&active_anim); + display.update(); // we left the main loop, so we need to call this manually + // wait until both buttons are released while (!((PINC & _BV(PC3)) && (PINC & _BV(PC7)))) ; // and some more to debounce the buttons - _delay_ms(10); + _delay_ms(50); + + // turn off display to indicate we're about to shut down + display.disable(); // actual naptime @@ -293,7 +303,11 @@ void System::shutdown() // Don't disable PCICR, something else might need it. PCMSK1 &= ~(_BV(PCINT15) | _BV(PCINT11)); + // debounce + _delay_ms(50); + // turn on display + loadPattern(current_anim_no); display.enable(); // ... and modem diff --git a/src/system.h b/src/system.h index d72fe8a..36e8e37 100644 --- a/src/system.h +++ b/src/system.h @@ -2,6 +2,18 @@ #define SHUTDOWN_THRESHOLD 2048 +// TODO find a nice image +const uint8_t systemPowerdownImage[] = { + 0x00, + 0x00, + 0x08, + 0x08, + 0x08, + 0x08, + 0x00, + 0x00 +}; + /** * Contains the system idle loop. Checks for button presses, handles * standby/resume, reads data from the Modem and updates the Display. |