]> git.karo-electronics.de Git - oswald.git/blobdiff - ui/LcdDisplay.c
Starting to get rid of borrowed code (LcdDisplay, Fonts), integrate
[oswald.git] / ui / LcdDisplay.c
index ee88652ec12ed50b71ea9d5de9b309bf67423846..ae4aea52b4497d950654593e88b2a5776908b1e9 100644 (file)
-#include <time.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "oswald-ui.h"
+#include "oswald.h"
+#include "oswald_hal.h"
+#include "oswald_strings.h"
 #include "Fonts.h"
+
 #include "LcdDisplay.h"
 
-#define NUM_LCD_ROWS  96
-#define NUM_LCD_COL_BYTES  ( 12 )
-#define MAX_FONT_ROWS ( 19 )
 
+void DrawLcdLineBresenham(const uint8_t xstart, const uint8_t ystart, const uint8_t xend, const uint8_t yend)
+{
+       int x, y, t, dx, dy, incx, incy, pdx, pdy, ddx, ddy, es, el, err;
+       dx = xend - xstart;
+       dy = yend - ystart;
+       incx = (dx >= 0) ? 1 : -1;
+       incy = (dy >= 0) ? 1 : -1;
+
+       if (dx<0)
+               dx = -dx;
+       if (dy<0)
+               dy = -dy;
+       if (dx>dy) {
+               pdx = incx; pdy = 0;
+               ddx=incx; ddy=incy;
+               es =dy;   el =dx;
+       } else {
+               pdx=0;    pdy=incy;
+               ddx=incx; ddy=incy;
+               es =dx;   el =dy;
+       }
+       x = xstart;
+       y = ystart;
+       err = el/2;
+       hal_lcd_set_pixel(x, y, TRUE);
+       for (t = 0; t < el; ++t) {
+               err -= es; 
+               if (err < 0) {
+                       err += el;
+                       x += ddx;
+                       y += ddy;
+               } else {
+                       x += pdx;
+                       y += pdy;
+               }
+               hal_lcd_set_pixel(x, y, TRUE);
+       }
+       // lcd_update_display();
+}
+
+void DrawLcdLineBresenhamWW(const uint8_t xstart, const uint8_t ystart, const uint8_t xend, const uint8_t yend, const uint8_t thickness)
+{
+       int i, x, y, t, dx, dy, incx, incy, pdx, pdy, ddx, ddy, es, el, err;
+       dx = xend - xstart;
+       dy = yend - ystart;
+       incx = (dx >= 0) ? 1 : -1;
+       incy = (dy >= 0) ? 1 : -1;
+
+       if (dx<0)
+               dx = -dx;
+       if (dy<0)
+               dy = -dy;
+       if (dx>dy) {
+               pdx = incx; pdy = 0;
+               ddx=incx; ddy=incy;
+               es =dy;   el =dx;
+       } else {
+               pdx=0;    pdy=incy;
+               ddx=incx; ddy=incy;
+               es =dx;   el =dy;
+       }
+       x = xstart;
+       y = ystart;
+       err = el/2;
+       hal_lcd_set_pixel(x, y, TRUE);
+       for (i=1; i<thickness; i++) {
+               hal_lcd_set_pixel(x-i, y, TRUE);
+               hal_lcd_set_pixel(x+i, y, TRUE);
+               hal_lcd_set_pixel(x, y-i, TRUE);
+               hal_lcd_set_pixel(x, y+i, TRUE);
+       }
+       for (t = 0; t < el; ++t) {
+               err -= es; 
+               if (err < 0) {
+                       err += el;
+                       x += ddx;
+                       y += ddy;
+               } else {
+                       x += pdx;
+                       y += pdy;
+               }
+               hal_lcd_set_pixel(x, y, TRUE);
+               for (i=1; i<thickness; i++) {
+                       hal_lcd_set_pixel(x-i, y, TRUE);
+                       hal_lcd_set_pixel(x+i, y, TRUE);
+                       hal_lcd_set_pixel(x, y-i, TRUE);
+                       hal_lcd_set_pixel(x, y+i, TRUE);
+               }
+       }
+       // lcd_update_display();
+}
 
-gint WriteLcdCharacter(oswald_ui *ui, gint x, gint y, unsigned char Character)
+u8t WriteLcdCharacter(const uint8_t x, const uint8_t y, const uint8_t Character)
 {
-       gint CharacterHeight = GetCharacterHeight();
-       gint CharacterWidth = GetCharacterWidth(Character);
-       unsigned int bitmap[MAX_FONT_ROWS];
-       gint lx, ly;
+       u8t CharacterHeight = GetCharacterHeight();
+       u8t CharacterWidth = GetCharacterWidth(Character);
+       u16t bitmap[MAX_FONT_ROWS];
+       int lx, ly;
 
-       GetCharacterBitmap(Character,(unsigned int*)&bitmap);
+       GetCharacterBitmap(Character, bitmap);
 
        // printf("cw=%d ch=%d\n", CharacterWidth, CharacterHeight);
        for (ly=0; ly<CharacterHeight; ly++) {
                for (lx=0; lx<CharacterWidth; lx++) {
                        if (bitmap[ly] & (1<<lx)) {
-                               set_pixel(ui, lx+x, ly+y, TRUE);
+                               hal_lcd_set_pixel(lx+x, ly+y, TRUE);
                                // printf(".");
-                       } else {
-                               set_pixel(ui, lx+x, ly+y, FALSE);
+                       } /*else {
+                               hal_lcd_set_pixel(lx+x, ly+y, FALSE);
                                // printf(" ");
-                       }
+                       }*/
                }
                // printf("\n");
        }
-
+       // lcd_update_display();
        return CharacterWidth + GetFontSpacing();
 }
 
-void WriteLcdString(oswald_ui *ui, gint x, gint y, gchar *str)
+u8t WriteLcdString(const uint8_t x, const uint8_t y, const char *str)
 {
-       gint lx, i;
+       int lx, i, strl;
 
-       if (str == NULL || strlen(str)==0)
-               return;
+       strl = oswald_strlen((char *)str);
+       if (strl == 0)
+               return 0;
 
        lx = x;
-       for (i=0; i<strlen(str); i++) {
-               lx += WriteLcdCharacter(ui, lx, y, str[i]);
+       for (i=0; i<strl; i++) {
+               lx += WriteLcdCharacter(lx, y, str[i]);
        }
+       return lx;
 }
 
 
-void update_idle_time_date(oswald_ui *ui)
+void WriteLcdNumber(const uint8_t x, const uint8_t y, const int16_t number)
 {
-       gint gRow = 3;
-       gint gColumn = 4;
-       static gchar secs = 0;
-
-       SetFont(MetaWatchTime);
-
-       //gRow += WriteLcdCharacter(ui, gRow, gColumn, TIME_CHARACTER_SPACE_INDEX);
-       gRow += WriteLcdCharacter(ui, gRow, gColumn, 2);
-       gRow += WriteLcdCharacter(ui, gRow, gColumn, 3);
-       gRow += WriteLcdCharacter(ui, gRow, gColumn, TIME_CHARACTER_COLON_INDEX);
-       gRow += WriteLcdCharacter(ui, gRow, gColumn, 1);
-       gRow += WriteLcdCharacter(ui, gRow, gColumn, 7);
-       gRow += WriteLcdCharacter(ui, gRow, gColumn, TIME_CHARACTER_COLON_INDEX);
-       gRow += WriteLcdCharacter(ui, gRow, gColumn, (secs / 10));
-       gRow += WriteLcdCharacter(ui, gRow, gColumn, (secs % 10));
-       secs = ++secs % 60;
+       int lx, i, strl;
+       char str[8];
+
+       itoa(number, str, 10);
+       strl = oswald_strlen(str);
+       if (strl == 0)
+               return;
+
+       lx = x;
+       for (i=0; i<strl; i++) {
+               lx += WriteLcdCharacter(lx, y, str[i]);
+       }
 }