五子棋 framebuffer版
发布时间:2020-12-16 09:17:54 所属栏目:百科 来源:网络整理
导读:要在家目录下 makefile 1 main : main.o fun.o input.o fb_draw.o 2 gcc -Wall -o [email?protected] $^ 3 clean : 4 rm -rf *.o main ? fb_draw.h #ifndef __FB_DRAW_H #define __FB_DRAW_H int fb_open( void ); void fb_close( void ); void fb_draw_poin
要在家目录下 makefile 1 main : main.o fun.o input.o fb_draw.o 2 gcc -Wall -o [email?protected] $^
3 clean : 4 rm -rf *.o main
? fb_draw.h #ifndef __FB_DRAW_H #define __FB_DRAW_H
int fb_open(void); void fb_close(void); void fb_draw_point(int x,int y,unsigned int color); int xres(void); int yres(void); #endif
fun.h #ifndef __INPUT_H #define __INPUT_H
#define KEYBOARDMODE 0
#define CHARMODE 1
void input_init(void); int input_choice_mode(int mode); int input_kb_mode(void); int input_char_mode(void); void input_recover(void); #endif
inc.h #ifndef __INC_H #define __INC_H #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/ioctl.h> #include <linux/fb.h> #include <linux/input.h> #include <unistd.h> #include <sys/mman.h> #include <string.h> #include <termios.h> #include "input.h" #include "fb_draw.h"
#endif
input.h #ifndef __INPUT_H #define __INPUT_H
#define KEYBOARDMODE 0
#define CHARMODE 1
void input_init(void); int input_choice_mode(int mode); int input_kb_mode(void); int input_char_mode(void); void input_recover(void); #endif
fb_draw.c #include "include/inc.h"
/*********************************************** 结构体中保存了有关操作framebuffer设备所需的成员 fix : 本地的fb数据 var : 可变的fb数据 bpp : 一个像素点所占位数 fd : 保存fb文件的文件描述符 fbp : 获取映射空间地址 fbpi: 获取映射空间地址 ************************************************/
struct { struct fb_fix_screeninfo fix;//本地fb数据
struct fb_var_screeninfo var;//可变fb数据
unsigned int bpp;//一个像素点所占位数
int fd;//保存fb文件的文件描述符
unsigned char *fbp;//获取映射空间地址
unsigned int *fbpi;//获取映射空间地址
}fb_st; /*********************************************** int fb_open(void); 功 能 : 把fb文件打开,通过ioctl控制fb设备 通过mmap映射fb文件 返回值 : 无 参 数 : 成功返回0,失败返回-1 ************************************************/
int fb_open(void) { int ret; fb_st.fd = open("/dev/fb0",O_RDWR); if(-1 == fb_st.fd) { perror("open"); goto error; } /* get fb_var_screeninfo */ ret = ioctl(fb_st.fd,FBIOGET_VSCREENINFO,&fb_st.var); if(-1 == ret) { perror("ioctl(fb_st.var)"); goto close_fd; } fb_st.bpp = fb_st.var.bits_per_pixel >> 3; /* get fb_fix_screeninfo */ ret = ioctl(fb_st.fd,FBIOGET_FSCREENINFO,&fb_st.fix); if(-1 == ret) { perror("ioctl(fb_st.fix)"); goto close_fd; } /* get framebuffer start address */ fb_st.fbp = mmap(0,fb_st.fix.smem_len,PROT_READ | PROT_WRITE,MAP_SHARED,fb_st.fd,0); if((void *)-1 == fb_st.fbp) { perror("mmap"); goto close_fd; } return 0; close_fd: close(fb_st.fd); error: return -1; } /*********************************************** void fb_close(); 功 能 : 解除设备文件的映射,关闭文件 返回值 : 无 参 数 : 无 ************************************************/
void fb_close() { munmap(fb_st.fbp,fb_st.fix.smem_len); close(fb_st.fd); } /*********************************************** void fb_draw_point(int x,int y,int color); 功 能 : 通过framebuff画点 返回值 : 无 参 数 : x 横坐标 y 纵坐标 color 要显示的颜色(现只支持白色0xFF 黑色0x00) ************************************************/
void fb_draw_point(int x,unsigned int color) { unsigned long offset; offset = fb_st.bpp * x + y * fb_st.fix.line_length; //memset(fb_st.fbp + offset,color,fb_st.bpp);
fb_st.fbpi = (unsigned int *)(fb_st.fbp + offset); *(fb_st.fbpi) = color; } /*********************************************** int xres(void); 功 能 : 获取x轴坐标 返回值 : 获取到的x轴坐标 参 数 : 无 ************************************************/
int xres(void) { return fb_st.var.xres; } /*********************************************** int yres(void); 功 能 : 获取y轴坐标 返回值 : 获取到的y轴坐标 参 数 : 无 ************************************************/
int yres(void) { return fb_st.var.yres; }
input.c #include "include/inc.h"
/*********************************************** 结构体中保存了有关键盘操作或者终端设置的一些成员 old : 保存原始终端信息 new : 改变之后的终端信息 kb_fd : 保存键盘设备的设备号 ev : 保存输入设备的信息数据 ************************************************/
struct { struct termios old; struct termios new; int kb_fd; struct input_event ev; }input_st; /*********************************************** void input_init(void); 功 能 : 用来在接收输入值之前设置终端 返回值 : 无 参 数 : 无 ************************************************/
void input_init(void) { tcgetattr(0,&input_st.old); input_st.new = input_st.old; input_st.new.c_lflag &= ~ICANON; input_st.new.c_lflag &= ~ECHO; tcsetattr(0,TCSANOW,&input_st.new); } /*********************************************** char *mystrcpy(char *dest,const char *src); 功 能 : 用来拷贝字符串,碰到尾0或者空格停止 返回值 : 指向dest的指针 参 数 : dest 拷贝的目标,dest指向拷贝的空间 src 拷贝的源,指向要拷贝的字符串 ************************************************/
char *mystrcpy(char *dest,const char *src) { int i = 0; for(i = 0; src[i] != ‘ |