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

粗浅设计一个登录平台

时间:2024-05-14 21:07:52浏览次数:24  
标签:粗浅 登录 int 解码 平台 ts cinfo fd event

设计一个程序,该程序在运行之后自动播放一段开机动画,开机动画结束后可以调转到登录界面,登录界面有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

相关文章

  • arm平台,lcd显示动图,显示图片触屏反应
    #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<linux/input.h>#include<unistd.h>/**Inclu......
  • 粗浅的设计一个登录平台
    代码/****filename:系统登陆以及主界面*author:[email protected]*date:2024/05/14*brief:登录系统(无密码)*note:None**CopyRight(c)[email protected]**/#include<stdio.h>#include<st......
  • 第三方网站集成钉钉登录
    相关概念服务商:钉钉用户:自己第三方网站:开发的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实时渲染云将从虚拟仿真云平台在教育应用中的优势......