首页 > 其他分享 >粗浅的设计一个登录平台

粗浅的设计一个登录平台

时间:2024-05-14 18:54:34浏览次数:24  
标签:粗浅 登录 int 平台 cinfo lcd jpg && event

代码

/**
 *
 *   file name:系统登陆以及主界面
 *   author   :[email protected]
 *   date     :2024/05/14
 *   brief    :登录系统(无密码)
 *   note     :None
 *
 *   CopyRight (c) 2024    [email protected]    All Right Reseverd
 *
 */
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include "jpeglib.h"
#include <linux/input.h>
#include <string.h>

int x1, y1;
int x2, y2;
int x, y;
int state = 0;
int *lcd_mp;
struct input_event lcd_event; // 定义结构体变量

void *get_xy()
{

    // 打开触摸屏文件
    int lcd_fd2 = open("/dev/input/event0", O_RDWR);
    if (lcd_fd2 == -1)
        perror("lcd open error!!\n");
    while (1)
    {
        read(lcd_fd2, &lcd_event, sizeof(lcd_event));
        // printf("lcd_event.type = %d,lcd_event.code = %d,lcd_event.value = %d\n",lcd_event.type,lcd_event.code,lcd_event.value);
        if (lcd_event.type == 3)
        {
            if (lcd_event.code == 0)
                x = lcd_event.value * 800 / 1024;
            if (lcd_event.code == 1)
                y = lcd_event.value * 480 / 600;
        }
        if (lcd_event.type == 1 && lcd_event.code == BTN_TOUCH && lcd_event.value == 1) // 按下输出坐标
        {
            x1 = x;
            y1 = y;
            printf("x1: %d, y1: %d\n", x1, y1);
        }
        if (lcd_event.type == 1 && lcd_event.code == BTN_TOUCH && lcd_event.value == 0) // 松开输出坐标
        {
            x2 = x;
            y2 = y;
            printf("x2: %d, y2: %d\n\n", x2, y2);
            state = 1;
            break;
        }
    }
    close(lcd_fd2);
}

// 成功返回1 失败返回0
int show_jpg(char *filename, int start_x, int start_y)
{

    // 为JPEG对象分配空间并初始化
    struct jpeg_decompress_struct cinfo; // JPEG对象
    struct jpeg_error_mgr jerr;          // 错误处理对象

    /* More stuff */
    FILE *infile;          // 文件标识符
    unsigned char *buffer; // 缓冲区
    int row_stride;        // 单行字节大小

    cinfo.err = jpeg_std_error(&jerr); // 将错误处理对象绑定到JPEG对象上

    jpeg_create_decompress(&cinfo); // 初始化cinfo结构

    // 指定解压缩数据源
    if ((infile = fopen(filename, "rb")) == NULL)
    {
        fprintf(stderr, "can't open %s\n", filename);
        return 0;
    }

    jpeg_stdio_src(&cinfo, infile); // 指定读取

    // 获取文件信息
    (void)jpeg_read_header(&cinfo, TRUE);

    // 开始解压缩图像
    (void)jpeg_start_decompress(&cinfo);

    // 取出数据
    row_stride = cinfo.output_width * cinfo.output_components; // 计算一行的大小(宽度*色深)

    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;
        }
    }

    // 解压缩完毕
    (void)jpeg_finish_decompress(&cinfo);

    // 释放资源
    jpeg_destroy_decompress(&cinfo);
    fclose(infile);

    return 1;
}

int main()
{
    // 1.打开LCD   open
    int lcd_fd = open("/dev/fb0", O_RDWR);

    // 2.对LCD进行内存映射  mmap
    lcd_mp = (int *)mmap(NULL, 800 * 480 * 4, PROT_READ | PROT_WRITE, MAP_SHARED, lcd_fd, 0);

    int i = 0;
    int flag = 0;
    // 开机动画
    char gif_path[128] = {0};
    for (int i = 0; i < 82; ++i)//替换成你的gif图片总数
    {
        sprintf(gif_path, "./gif/Frame%d.jpg", i); //将对应的路径写入gif_path中
        show_jpg(gif_path, 0, 0);                  //输出gif图片
        usleep(1000 * 10);                         // FPS = 100HZ
    }

    show_jpg("./pic/background.jpg", 0, 0); // 背景 图片大小800*480
    show_jpg("./pic/login.jpg", 230, 150);  // 登录 图片大小100*100
    show_jpg("./pic/exit.jpg", 530, 150);   // 退出 图片大小100*100

    while (1)
    {
        get_xy();

        if (flag == 0) // 处在登陆界面下
        {
            if (x2 > 230 && x2 < 330 && y2 < 250 && y2 > 150) // 登录 图片大小100*100
            {
                show_jpg("./pic/main.jpg", 0, 0);
                show_jpg("./pic/back.jpg", 700, 0);
                flag = 1;
            }

            if (x2 > 530 && x2 < 630 && y2 < 250 && y2 > 150) // 退出 图片大小100*100
            {
                show_jpg("./pic/exit2.jpg", 0, 0);//将界面刷为纯黑退出程序
                return 0;
            }
        }

        if (flag == 1) // 处在主界面下
        {
            if (x2 > 700 && x2 < 800 && y2 < 100 && y2 > 0) // 返回 图片大小100*100
            {
                show_jpg("./pic/background.jpg", 0, 0); // 背景 图片大小800*480
                show_jpg("./pic/login.jpg", 230, 150);  // 登录 图片大小100*100
                show_jpg("./pic/exit.jpg", 530, 150);   // 退出 图片大小100*100
                flag = 0;
            }
        }
    }

    return 0;
}

标签:粗浅,登录,int,平台,cinfo,lcd,jpg,&&,event
From: https://www.cnblogs.com/eon4051/p/18191935

相关文章

  • 第三方网站集成钉钉登录
    相关概念服务商:钉钉用户:自己第三方网站:开发的web应用 用户登入一些第三方网站时,可能是第一次登录需要繁琐的注册,可能距离上一次登录太久而忘记密码;故为了让用户更便捷的使用第三方网站的功能,引入了Auth授权登录。 Auth授权登录用户在服务商(拥有极其庞大的用户量)那......
  • idea拉取代码认证失败重新登录
    一、背景在更改了github登录密码后,在本地idea的代码无法正常拉取,显示认证失败却没有弹出重新认证入口。二、目标idea在认证失败之后能够自动弹出认证窗口,进行重新认证。三、实现1、先删除存留在本地的github普通凭据,路径在控制版面→用户账户→凭据管理器下的管......
  • 2024 AI中转计费平台系统源码
    简介:2024AI中转计费平台系统源码图片:    点击下载 ......
  • root用户远程登录云服务器失败 No supported authentication methods available (serv
     1、平台:亚马逊AWS云、腾讯云服务器、MobaXterm2、问题:云服务器实例远程登录失败,显示:“Nosupportedauthenticationmethodsavailable(serversent:publickey)”翻译:不支持可用的身份验证方法(服务器发送:publickey)3、解决过程:初步判断:服务器远程登录配置文件问题尝试1:a.......
  • JPEG库的移植(arm平台)
    JPEG库的移植(arm平台)目录JPEG库的移植(arm平台)介绍头文件及全局变量1、图片显示2、其他图片压缩到jpg图片3、主函数及验证程序输出结果介绍图解头文件及全局变量#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#in......
  • k8s部署实时计算平台dinky1.0
    k8s部署实时计算平台dinky1.0.2源码编译IDEA编译推荐使用IDEA进行编译,因为IDEA在打开项目时会自动下载依赖,而且编译速度快,方便调试.Clone项目注意:本次直接clone的是Dinky主仓库,如果你想要二次开发/基于自己的仓库进行二次开发,请先fork项目,然后再c......
  • 单点登录(SSO)
    单点登录单点登录的英文名叫做:SingleSignOn(简称SSO),指在同一帐号平台下的多个应用系统中,用户只需登录一次,即可访问所有相互信任的系统。简而言之,多个系统,统一登陆。SESSION+COOKIE模式特点:一个独立的认证中心控制各个系统所有用户的登录状态;认证中心的压力很大,可能要为......
  • 虚仿云实训教学平台优势、意义【虚拟仿真】
    虚拟仿真云实验教学平台作为一种新型的教学方法,近年来在高校教育中得到了十分广泛的应用。它通过模拟真实的实验场景和实验操作,让学生在计算机上进行实验操作和数据处理,为学生提供了更加便捷、可靠、有效的实验学习环境。本文,3DCAT实时渲染云将从虚拟仿真云平台在教育应用中的优势......
  • VMware Avi Load Balancer 30.2.1 发布 - 多云负载均衡平台
    VMwareAviLoadBalancer30.2.1发布-多云负载均衡平台应用交付:多云负载均衡、Web应用防火墙和容器Ingress服务请访问原文链接:VMwareAviLoadBalancer30.2.1-多云负载均衡平台,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org负载均衡平台VMwareAviLoa......
  • VMware NSX Advanced Load Balancer (NSX ALB) 30.2.1 - 多云负载均衡平台
    VMwareNSXAdvancedLoadBalancer(NSXALB)30.2.1-多云负载均衡平台应用交付:多云负载均衡、Web应用防火墙和容器Ingress服务请访问原文链接:VMwareNSXAdvancedLoadBalancer(NSXALB)30.2.1-多云负载均衡平台,查看最新版。原创作品,转载请保留出处。作者主页:sysin......