设计一个程序,该程序在运行之后自动播放一段开机动画,开机动画结束后可以调转到登录界面,登录界面有2个按钮,分别是登录和退出,点击登录之后可以显示系统主界面。主界面自拟,要求主界面有一个返回按钮,点击返回按钮可以回到登录界面。(不使用goto)
定义全局变量
int cnt = 0;
int x, y;
int *lcd_mp;
将JPG格式的图片显示在lcd屏幕的函数接口:
/******************************************************
*
* name : read_JPEG_file
* function : 将JPG格式的图片显示在lcd屏幕
* argument
* @filename :图片路径
* @start_x :图片显示在lcd屏幕的x轴
* @start_y :图片显示在lcd屏幕的y轴
*
* retval : 成功为1,否则为0
* author : Dazz
* date : 2024/5/14
* note : None
*
* *******************************************************/
int read_JPEG_file(char *filename, int start_x, int start_y)
{
//(1) 创建解码对象,并且对解码对象进行初始化,另外需要创建错误处理对象,并和解码对象进行关联
// 创建jpeg解码对象
struct jpeg_decompress_struct cinfo;
// 创建错误处理对象
struct jpeg_error_mgr jerr;
// 将错误对象和解码对象进行关联
cinfo.err = jpeg_std_error(&jerr);
// 初始化解码对象
jpeg_create_decompress(&cinfo);
//(2) 打开待解码的jpg图片,使用fopen的时候需要添加选项”b”,以二进制方式打开文件!
FILE *infile;
if ((infile = fopen(filename, "rb")) == NULL)
{
fprintf(stderr, "can't open %s\n", filename);
return 0;
}
// 指定数据
jpeg_stdio_src(&cinfo, infile);
//(3) 读取待解码图片的文件头,并把图像信息和解码对象进行关联,通过解码对象对jpg图片进行解码
(void)jpeg_read_header(&cinfo, TRUE);
//(5) 开始对jpg图片进行解码,调用函数之后开始解码,可以得到图像宽、图像高等信息!
(void)jpeg_start_decompress(&cinfo);
int row_stride;
row_stride = cinfo.output_width * cinfo.output_components; // 计算一行的大小
unsigned char *buffer; /* Output row buffer 定义一个缓冲区 */
buffer = calloc(1, row_stride);
int data = 0;
while (cinfo.output_scanline < cinfo.output_height)
{
(void)jpeg_read_scanlines(&cinfo, &buffer, 1); // 从上到下,从左到右 RGB RGB RGB RGB
for (int i = 0; i < cinfo.output_width; ++i) // 012 345
{
data |= buffer[3 * i] << 16; // R
data |= buffer[3 * i + 1] << 8; // G
data |= buffer[3 * i + 2]; // B
// 把像素点写入到LCD的指定位置
lcd_mp[800 * start_y + start_x + 800 * (cinfo.output_scanline - 1) + i] = data;
data = 0;
}
}
//(7) 在所有的图像数据都已经解码完成后,则调用函数完成解码即可,然后释放相关资源!
(void)jpeg_finish_decompress(&cinfo);
// 释放解码对象
jpeg_destroy_decompress(&cinfo);
fclose(infile);
return 1;
}
打开触摸屏,直到用户点击"登录"的位置的函数接口:
/******************************************************
*
* name : GeTouchVal_st
* function : 打开触摸屏,直到用户点击"登录"的位置
* argument : 打开触摸屏的返回值
* retval : None
* author : Dazz
* date : 2024/5/14
* note : None
*
* *******************************************************/
void GeTouchVal_st(int ts_fd)
{
// 2.读取输入设备的信息
struct input_event ts_event;
while (1)
{
read(ts_fd, &ts_event, sizeof(ts_event));
// 3.分析读取的设备信息 (type + code + value)
if (ts_event.type == EV_ABS) // 说明是触摸屏
{
if (ts_event.code == ABS_X) // 说明是X轴
{
cnt++;
x = ts_event.value * 800 / 1024;
}
if (ts_event.code == ABS_Y) // 说明是Y轴
{
cnt++;
y = ts_event.value * 480 / 600;
}
if (cnt >= 2)
{
printf("x = %d\t", x); // 输出X轴坐标
printf("y = %d\n", y); // 输出Y轴坐标
cnt = 0;
}
}
if (x > 585 && x < 789 && y > 100 && y < 209)
break;
}
}
打开触摸屏,直到用户点击"返回"的位置的函数接口:
/******************************************************
*
* name : GeTouchVal_sp
* function : 打开触摸屏,直到用户点击"返回"的位置
* argument : 打开触摸屏的返回值
* retval : None
* author : Dazz
* date : 2024/5/14
* note : None
*
* *******************************************************/
void GeTouchVal_sp(int ts_fd)
{
// 2.读取输入设备的信息
struct input_event ts_event;
while (1)
{
read(ts_fd, &ts_event, sizeof(ts_event));
// 3.分析读取的设备信息 (type + code + value)
if (ts_event.type == EV_ABS) // 说明是触摸屏
{
if (ts_event.code == ABS_X) // 说明是X轴
{
cnt++;
x = ts_event.value * 800 / 1024;
}
if (ts_event.code == ABS_Y) // 说明是Y轴
{
cnt++;
y = ts_event.value * 480 / 600;
}
if (cnt >= 2)
{
printf("x = %d\t", x); // 输出X轴坐标
printf("y = %d\n", y); // 输出Y轴坐标
cnt = 0;
}
}
if (x > 35 && x < 135 && y > 2 && y < 111)
break;
}
}
主函数:
int main(int argc, char const *argv[])
{
//打开LCD open
int lcd_fd = open("/dev/fb0", O_RDWR);
// 对LCD进行内存映射 mmap
lcd_mp = (int *)mmap(NULL, 800 * 480 * 4, PROT_READ | PROT_WRITE, MAP_SHARED, lcd_fd, 0);
// 显示gif
char gif_buf[128] = "0";
for (int i = 0; i < 60; i++)
{
sprintf(gif_buf, "./gif/Frame%d.jpg", i);
read_JPEG_file(gif_buf, 0, 0);
usleep(1000 * 1000 / 24);
}
// 打开触摸屏
int ts_fd = open("/dev/input/event0", O_RDWR);
while (1)
{
read_JPEG_file("./start.jpg", 0, 0);
GeTouchVal_st(ts_fd);
read_JPEG_file("./stop.jpg", 0, 0);
GeTouchVal_sp(ts_fd);
}
//关闭文件
close(ts_fd);
return 0;
}
标签:粗浅,登录,int,解码,平台,ts,cinfo,fd,event
From: https://www.cnblogs.com/Dazz24/p/18192267