📄 screen.h
字号:
#include <unistd.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/ioctl.h>
#include <pthread.h>
#include <fcntl.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <linux/fb.h>
#include <sys/mman.h>
struct SCREEN_CTRL
{
int fb;
void * fb_mem;
int fb_width, fb_height, fb_line_len, fb_size;
int fb_bpp;
};
#define SCREEN_WIDTH 640
#define SCREEN_LENGTH 480
#define CAHRROW 30
#define CAHRLINE 20
int Get_Max(int max ,int min);
int Get_Min(int max ,int min);
static void DrawRectangle(int x0 ,int y0 ,int x1, int y1, int color);
static void DrawRound(int centre_x ,int centre_y ,int radius, int color);
static void Screen_Color_Ctrl(int *buffer, int position );
static void ShowPicture(int (*buffer)[SCREEN_WIDTH]);
static void DrawChar(int point_x, int point_y, int (*mychar)[CAHRLINE] ,int color);
int framebuffer_open ();
void framebuffer_close();
//屏幕的三个方法
static struct SCREEN_CTRL Fb_dev;
#define SCREEN_Fb_dev "/dev/fb0" //屏幕驱动程序路径
static char *default_framebuffer = SCREEN_Fb_dev;//定义了一个屏幕
static int ad_driver_fd = -1;//打开的文件指针
//////////////////////////////////////////////////////////////////////////////
static void DrawChar(int point_x, int point_y, int(*mychar)[CAHRLINE] ,int color)
{
int i = 0;
int j = 0;
unsigned short int *point = (unsigned short int *)Fb_dev.fb_mem;
for ( i= 0; i< CAHRROW; i++)
for (j= 0; j< CAHRLINE; j++)
{
if(mychar[i][j]==1)
point[(point_y+i)*640+point_x+j] = color;
}
}
////////////////////////////////////////////////////////////////////////////
static void ShowPicture(int (*buffer)[SCREEN_WIDTH])
{
int i = 0;
int j = 0;
unsigned short int *point = (unsigned short int *)Fb_dev.fb_mem;
for ( i= 0; i<480 ; i++)
for (j= 0; j< 640; j++)
{
point[i*640+j] = buffer[i][j];
}
}
////////////////////////////////////////////////////////////////////////////
static void Screen_Color_Ctrl(int *buffer, int position )
{
int i=0;
unsigned short int *point = (unsigned short int *)Fb_dev.fb_mem;
for ( i= 0; i<640; i++)
{
point[position*640+i]= buffer[i];
}
}
/////////////////////////////////////////////////////////////////////////////////////
int Get_Max(int max ,int min)
{
return max>min?max:min;
}
int Get_Min(int max ,int min)
{
return max<min?max:min;
}
static void DrawRectangle(int x0 ,int y0 ,int x1, int y1, int color)
{
int x , y;
int start_point_x;
int start_point_y;
int end_point_x;
int end_point_y;
unsigned short int *point = (unsigned short int *)Fb_dev.fb_mem;
start_point_x = Get_Min(x0,x1);
start_point_y = Get_Min(y0,y1);
end_point_x = Get_Max(x0,x1);
end_point_y = Get_Max(y0,y1);
for( x = start_point_x;x<end_point_x&&x>=0;x++)
for(y = start_point_y;y<end_point_y&&y>=0;y++)
{
point[y*SCREEN_WIDTH+x] = color ;
}
// point = NULL;
// delete point;
}
static void DrawRound(int centre_x ,int centre_y ,int radius , int color)
{
int x , y;
int start_point_x;
int start_point_y;
int end_point_x;
int end_point_y;
unsigned short int *point = (unsigned short int *)Fb_dev.fb_mem;
start_point_x = centre_x -radius;
start_point_y = centre_y - radius;
end_point_x = centre_x +radius;
end_point_y = centre_y+radius;
for( x = start_point_x;x<end_point_x;x++)
for(y = start_point_y;y<end_point_y;y++)
{
if((x - centre_x)*(x - centre_x)+(y - centre_y)*(y - centre_y)<(radius*radius))
point[y*SCREEN_WIDTH+x] = color ;
}
// point = NULL;
// delete point;
}
int framebuffer_open()
{
int fb;
struct fb_var_screeninfo fb_vinfo;
struct fb_fix_screeninfo fb_finfo;
char * fb_dev_name = NULL;
if (!(fb_dev_name = getenv("FRAMEBUFFER")))
fb_dev_name = default_framebuffer;
fb = open (fb_dev_name, O_RDWR);
if (fb < 0 )
{
printf("device %s open failed.\n", fb_dev_name);
return -1;
}
if (ioctl(fb, FBIOGET_VSCREENINFO, &fb_vinfo))
{
printf("Can't get VSCREENINFO: %s\n", strerror(errno));
close(fb);
return -1;
}
if (ioctl(fb, FBIOGET_FSCREENINFO, &fb_finfo))
{
printf("Can't get FSCREENINFO: %s\n", strerror(errno));
return 1;
}
Fb_dev.fb_bpp = fb_vinfo.red.length + fb_vinfo.green.length + fb_vinfo.blue.length + fb_vinfo.transp.length;
Fb_dev.fb_width = fb_vinfo.xres;
Fb_dev.fb_height = fb_vinfo.yres;
Fb_dev.fb_line_len = fb_finfo.line_length;
Fb_dev.fb_size = fb_finfo.smem_len;
if (Fb_dev.fb_bpp != 16)
{
printf ("frame buffer must be 16bpp mode. \n");
exit(0);
}
Fb_dev.fb_mem = mmap (NULL, Fb_dev.fb_size, PROT_READ | PROT_WRITE, MAP_SHARED, fb, 0);
if (Fb_dev.fb_mem == NULL || (int) Fb_dev.fb_mem == -1)
{
Fb_dev.fb_mem = NULL;
printf("mmap failed.\n");
close(fb);
return -1;
}
Fb_dev.fb = fb;
memset (Fb_dev.fb_mem, 0x0, Fb_dev.fb_size);
return 0;
}
void framebuffer_close()
{
if (Fb_dev.fb_mem)
{
munmap (Fb_dev.fb_mem, Fb_dev.fb_size);
Fb_dev.fb_mem = NULL;
}
if (Fb_dev.fb)
{
close (Fb_dev.fb);
Fb_dev.fb = 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -