From c65fe4c5230af7bc501cfdacac7eb016f9767178 Mon Sep 17 00:00:00 2001 From: Sebastian 'iggy' Steuer Date: Tue, 19 Jul 2011 02:43:15 +0200 Subject: [PATCH] lcdBuffer scrolling --- firmware/applications/scroll.c | 54 +++++++++++++++++++ firmware/lcd/display.c | 94 ++++++++++++++++++++++++++++++++++ firmware/lcd/display.h | 2 +- 3 files changed, 149 insertions(+), 1 deletion(-) create mode 100644 firmware/applications/scroll.c diff --git a/firmware/applications/scroll.c b/firmware/applications/scroll.c new file mode 100644 index 0000000..db41c14 --- /dev/null +++ b/firmware/applications/scroll.c @@ -0,0 +1,54 @@ +#include + +#include "basic/basic.h" + +#include "lcd/render.h" +#include "lcd/display.h" +#include "lcd/allfonts.h" + +void backlightInit(void); + +/**************************************************************************/ + +void main_scroll(void) { + int dx=0; + char key; + backlightInit(); + font_direction = FONT_DIR_LTR; // LeftToRight is the default + + font=&Font_7x8; + dx=DoString(0,0,"Hello World"); + + while (1) { + lcdDisplay(); +//// delayms(10); + + key= getInput(); + + // Easy flashing + if(key==BTN_ENTER){ + DoString(0,8,"Enter ISP!"); + lcdDisplay(); + ISPandReset(); + } + if(key==BTN_RIGHT){ + lcdShift(1,0,true); + } + if(key==BTN_LEFT){ + lcdShift(-1,0,true); + } + if(key==BTN_UP){ + lcdShift(0,1,true); + } + if(key==BTN_DOWN){ + lcdShift(0,-1,true); + } + + //font = &Font_Ubuntu36pt; + } + return; +} + +void tick_scroll(void){ + return; +}; diff --git a/firmware/lcd/display.c b/firmware/lcd/display.c index 23e0b04..e18fdaf 100644 --- a/firmware/lcd/display.c +++ b/firmware/lcd/display.c @@ -158,3 +158,97 @@ inline void lcdInvert(void) { void lcdToggleFlag(int flag) { lcd_layout=lcd_layout ^ flag; } + + + +void lcdShiftH(bool right, bool wrap) { + uint8_t tmp; + for (int yb = 0; yb 0; y--){ + lcdBuffer[x+(y*RESX)] = (lcdBuffer[x+(y*RESX)] << 1) |( lcdBuffer[x+((y-1)*RESX)] >> 7); + } + if (wrap) lcdBuffer[x] = ( lcdBuffer[x] << 1) | ((tmp[x]>>3)&1); + } + + } else { + if (wrap) memmove(tmp,lcdBuffer,RESX); + for (int x = 0; x> 1) |( lcdBuffer[x+((y+1)*RESX)] << 7); + } + if (wrap) lcdBuffer[x+((RESY_B-1)*RESX)] = ( lcdBuffer[x+((RESY_B-1)*RESX)] >> 1) | ((tmp[x]<<3)&8); + } + + } +} + +void lcdShift(int x, int y, bool wrap) { + int yb, yr, ya; + bool dir; + + if (x>0) { + for (int cx = 0; cx < x; cx++) { + lcdShiftH(true, wrap); + } + } else if (x<0) { + for (int cx = x; cx < 0; cx++) { + lcdShiftH(false, wrap); + } + } + + + if (y != 0) { + if (y>0) { + ya = y; + yb = y/8; + yr = y%8; + dir = true; + + } else if (y<0) { + ya = -y; + yb = (-y)/8; + yr = (-y)%8; + dir = false; + } + + //for (int cyb = 0; cyb < yb; cyb++) { + // lcdShiftV8(dir, wrap); + //} + //for (int cyr = 0; cyr < yr; cyr++) { + // lcdShiftV(dir, wrap); + //} + for (int cya = 0; cya < ya; cya++) { + lcdShiftV(dir, wrap); + } + } +} diff --git a/firmware/lcd/display.h b/firmware/lcd/display.h index b27ca59..5d92540 100644 --- a/firmware/lcd/display.h +++ b/firmware/lcd/display.h @@ -28,5 +28,5 @@ void lcdToggleFlag(int flag); void lcdSetPixel(char x, char y, bool f); void lcdSafeSetPixel(char x, char y, bool f); bool lcdGetPixel(char x, char y); - +void lcdShift(int x, int y, bool wrap); #endif