diff --git a/include/framebuffer.h b/include/framebuffer.h new file mode 100644 index 0000000..a6c36d8 --- /dev/null +++ b/include/framebuffer.h @@ -0,0 +1,11 @@ +#ifndef __INCLUDE_FRAMEBUFFER_H__ +#define __INCLUDE_FRAMEBUFFER_H__ + +#include + +void fb_draw_pixel(uint16_t *image, uint16_t x, uint16_t y, uint16_t color); +void fb_draw_line(uint16_t *image, int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color); +void fb_load_image(uint16_t *dst, uint16_t *src, uint32_t length); +void fb_set_image(uint16_t *dst, uint16_t value, uint32_t length); + +#endif \ No newline at end of file diff --git a/src/framebuffer.c b/src/framebuffer.c new file mode 100644 index 0000000..661ca8a --- /dev/null +++ b/src/framebuffer.c @@ -0,0 +1,77 @@ +#include +#include +#include + +#include "framebuffer.h" + +void fb_draw_pixel(uint16_t *image, uint16_t x, uint16_t y, uint16_t color) +{ + assert(image != NULL); + + image[x + 240 * y] = color; +} + +#ifndef _swap_int16_t +#define _swap_int16_t(a, b) { int16_t t = a; a = b; b = t; } +#endif + +void fb_draw_line(uint16_t *image, int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color) +{ + assert(image != NULL); + + int16_t steep = abs(y1 - y0) > abs(x1 - x0); + if(steep) { + _swap_int16_t(x0, y0); + _swap_int16_t(x1, y1); + } + if(x0 > x1) { + _swap_int16_t(x0, x1); + _swap_int16_t(y0, y1); + } + + int16_t dx, dy; + dx = x1 - x0; + dy = abs(y1 - y0); + + int16_t err = dx / 2; + int16_t ystep; + + if(y0 < y1) { + ystep = 1; + } else { + ystep = -1; + } + + for(; x0 <= x1; x0++) { + if(steep) { + fb_draw_pixel(image, y0, x0, color); + } else { + fb_draw_pixel(image, x0, y0, color); + } + err -= dy; + if (err < 0) { + y0 += ystep; + err += dx; + } + } +} + +void fb_load_image(uint16_t *dst, uint16_t *src, uint32_t length) +{ + assert(NULL != dst); + assert(NULL != src); + + for(uint32_t i = 0; i < length; i++) { + dst[i] = src[i]; + } +} + +void fb_set_image(uint16_t *dst, uint16_t value, uint32_t length) +{ + assert(NULL != dst); + + for (uint32_t i = 0; i < length; i++) { + dst[i] = value; + } +} + diff --git a/src/main.c b/src/main.c index fbb6506..c698956 100644 --- a/src/main.c +++ b/src/main.c @@ -9,75 +9,10 @@ #include "board.h" #include "driver.h" #include "clock_face.h" +#include "framebuffer.h" uint16_t image[240 * 240]; -static void bmp_draw_pixel(uint16_t *image, uint16_t x, uint16_t y, uint16_t color) -{ - assert(image != NULL); - - image[x + 240 * y] = color; -} - -#ifndef _swap_int16_t -#define _swap_int16_t(a, b) { int16_t t = a; a = b; b = t; } -#endif - -static void img_draw_line(uint16_t *image, int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color) -{ - assert(image != NULL); - - int16_t steep = abs(y1 - y0) > abs(x1 - x0); - if(steep) { - _swap_int16_t(x0, y0); - _swap_int16_t(x1, y1); - } - if(x0 > x1) { - _swap_int16_t(x0, x1); - _swap_int16_t(y0, y1); - } - - int16_t dx, dy; - dx = x1 - x0; - dy = abs(y1 - y0); - - int16_t err = dx / 2; - int16_t ystep; - - if(y0 < y1) { - ystep = 1; - } else { - ystep = -1; - } - - for(; x0 <= x1; x0++) { - if(steep) { - bmp_draw_pixel(image, y0, x0, color); - } else { - bmp_draw_pixel(image, x0, y0, color); - } - err -= dy; - if (err < 0) { - y0 += ystep; - err += dx; - } - } -} - -static void img_load(uint16_t *dst, uint16_t *src, uint32_t length) -{ - for(uint32_t i = 0; i < length; i++) { - dst[i] = src[i]; - } -} - -static void img_set(uint16_t *dst, uint16_t value, uint32_t length) -{ - for (uint32_t i = 0; i < length; i++) { - image[i] = value; - } -} - int main(void) { drv_open(&lcd_drv); @@ -95,12 +30,12 @@ int main(void) struct tm tm; while(1) { - img_load(image, clock_face, 240 * 240); + fb_load_image(image, clock_face, 240 * 240); // just to shown image orientation - img_draw_line(image, 10, 10, 12, 12, 0x00f8); - img_draw_line(image, 10, 11, 12, 12, 0x00f8); - img_draw_line(image, 10, 12, 12, 12, 0x00f8); + fb_draw_line(image, 10, 10, 12, 12, 0x00f8); + fb_draw_line(image, 10, 11, 12, 12, 0x00f8); + fb_draw_line(image, 10, 12, 12, 12, 0x00f8); T = time(NULL); tm = *localtime(&T); @@ -112,7 +47,7 @@ int main(void) dest_x = root_x + min_len * cos(min_angle * M_PI / 180); dest_y = root_y + min_len * sin(min_angle * M_PI / 180); - img_draw_line(image, (uint16_t)root_x, (uint16_t)root_y, (uint16_t)dest_x, (uint16_t)dest_y, 0xffff); + fb_draw_line(image, (uint16_t)root_x, (uint16_t)root_y, (uint16_t)dest_x, (uint16_t)dest_y, 0xffff); std_angle = 0.5 * (60 * tm.tm_hour + tm.tm_min); if(std_angle >= 360.0) { @@ -121,7 +56,7 @@ int main(void) dest_x = root_x + std_len * cos(std_angle * M_PI / 180); dest_y = root_y + std_len * sin(std_angle * M_PI / 180); - img_draw_line(image, (uint16_t)root_x, (uint16_t)root_y, (uint16_t)dest_x, (uint16_t)dest_y, 0xffff); + fb_draw_line(image, (uint16_t)root_x, (uint16_t)root_y, (uint16_t)dest_x, (uint16_t)dest_y, 0xffff); drv_write(&lcd_drv, (const char *)image, 240 * 240); sleep(1);