粗浅设计一个登录平台

设计一个程序,该程序在运行之后自动播放一段开机动画,开机动画结束后可以调转到登录界面,登录界面有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;
}
posted @ 2024-05-14 21:06  Dazz_24  阅读(45)  评论(0)    收藏  举报