1 #include <rtthread.h>
2 #include <rtdevice.h>
3 #include <stdint.h>
4 #include <stdlib.h>
5 #include "drv_lcd.h"
6
drawarea(rt_device_t dev,struct rt_device_graphic_info * info,int x,int y,int w,int h,uint16_t c)7 static void drawarea(rt_device_t dev, struct rt_device_graphic_info *info,
8 int x, int y, int w, int h, uint16_t c)
9 {
10 struct rt_device_rect_info rect;
11 uint16_t *fb;
12 int i, j;
13
14 fb = (uint16_t *)info->framebuffer;
15 fb += (info->width * y);
16 fb += x;
17
18 for (j = 0; j < h; j++)
19 {
20 for (i = 0; i < w; i++)
21 {
22 fb[i] = c;
23 }
24 fb += info->width;
25 }
26
27 rect.x = x;
28 rect.y = y;
29 rect.width = w;
30 rect.height = h;
31
32 rt_device_control(dev, RTGRAPHIC_CTRL_RECT_UPDATE, &rect);
33 }
34
showcolor(int argc,char ** argv)35 static int showcolor(int argc, char **argv)
36 {
37 unsigned char r = 0, g = 0, b = 0;
38 char *devname = "lcd";
39 rt_device_t dev;
40 struct rt_device_graphic_info info;
41 int result;
42 int x = 0, y = 0;
43 int i;
44 uint16_t c;
45
46 for (i = 1; i < argc; i++)
47 {
48 switch (i)
49 {
50 case 1:
51 r = atoi(argv[i]);
52 break;
53 case 2:
54 g = atoi(argv[i]);
55 break;
56 case 3:
57 b = atoi(argv[i]);
58 break;
59 }
60 }
61
62 dev = rt_device_find(devname);
63 if (!dev)
64 {
65 rt_kprintf("lcd: %s not found\n", devname);
66 return -1;
67 }
68
69 if (rt_device_open(dev, 0) != 0)
70 {
71 rt_kprintf("lcd open fail\n");
72 return -1;
73 }
74
75 result = rt_device_control(dev, RTGRAPHIC_CTRL_GET_INFO, &info);
76 if (result != RT_EOK)
77 {
78 rt_kprintf("get device information failed\n");
79 return result;
80 }
81
82 c = (uint16_t)(((r >> 3) << 11) | ((g >> 2) << 6) | ((b >> 3)));
83 drawarea(dev, &info, x, y, 24, 24, c);
84
85 lcd_set_color(BLACK, BLUE);
86 lcd_show_string(0, 40, 16, "hello world");
87 lcd_show_string(0, 60, 24, "hello world");
88 lcd_show_string(0, 90, 32, "hello world");
89 lcd_draw_line(0, 200, 319, 200);
90 lcd_draw_circle(270, 120, 30);
91
92 lcd_set_color(BLACK, RED);
93 lcd_show_string(0, 130, 32, "after set color");
94 lcd_draw_line(0, 0, 319, 239);
95 lcd_draw_rectangle(50, 10, 170, 145);
96 lcd_draw_circle(160, 120, 50);
97
98 rt_device_close(dev);
99 return 0;
100 }
101 MSH_CMD_EXPORT(showcolor, showcolor R G B-- R / G / B : 0 ~255);
102