嵌入式电梯多媒体设计的代码实现,里面有部分注释

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <strings.h>
#include <malloc.h>
#include <stdbool.h>
#include <pthread.h>

#include <linux/input.h>

//定义链表中的节点
typedef struct node
{
int member;//节点中的成员
struct node *pNext;//指向下一个节点的指针
}Node, *pNode;

int *init_mmap(void)
{
int file_fd = open("/dev/fb0", O_RDWR);//打开LCD显示屏
if(file_fd == -1)
{
printf(“open /dev/fb0 fail!\n”);
return NULL;
}

int *init_mmap_fd = malloc(sizeof(int *));//定义映射指针,建立映射关系。
init_mmap_fd = mmap(NULL, 800*480*4, PROT_READ|PROT_WRITE,  MAP_SHARED, file_fd, 0);
if(init_mmap_fd == MAP_FAILED)
{printf("mmap lcd fail!\n");return NULL;
}return init_mmap_fd;

}

/*
功能:断开映射关系,释放资源。
形参:
int *end_mmap:映射指针。
返回值:成功 0
失败 -1
/
int close_mmap(int end_mmap)
{
int ret = munmap(end_mmap, 800
480
4);//断开映射关系,释放资源。
if(ret == -1)
{
return -1;
}

return 0;

}

extern pNode pHead;//调用main函数中定义的结构体指针。

/*
功能:创建链表,处理楼层按下信息。
形参:
int info:存储按下楼层的楼层号。
返回值:
成功:返回一个结构体指针。
失败:返回NULL
*/
pNode CreateList(int info)
{
pNode pHead = (pNode)malloc(sizeof(Node));//分配一个不存放有效数据的头结点
pNode pTail = pHead;//链表的最后一个节点
pTail->pNext = NULL;//最后一个节点的指针置为空

pNode pNew = (pNode)malloc(sizeof(Node));//为新节点分配空间
pNew->member = info;//将用户输入的数据赋给节点的成员
pTail->pNext = pNew;//将最后一个节点的指针指向下一个新的节点
pNew->pNext = NULL;//将新节点中的指针置为空
pTail = pNew;//将新节点赋给最后的一个节点return pHead;//返回头节点

}

/*
功能:链表节点插入函数。
形参:
pNode pHead:头节点。
int front:在第几个节点前插入。
int data:要插入的数据。
返回值:
成功:ture。
失败:false。
*/
bool Insert_Node(pNode pHead, int front, int data)
{
int i = 0;
pNode Node = pHead;
pNode pSwap;//用于交换

if ( ( front<1 ) && ( Node!=NULL ) )//判断用户输入的数据是否大于等于1,及Node是否为空
{return false;
}while ( i<( front-1 ) )//通过循环使指针指向要插入哪个节点前的节点。
{Node = Node->pNext;++i;
}pNode pNew = (pNode)malloc(sizeof(Node));pNew->member = data;//把输入的数据赋给要插入的节点
pSwap = Node->pNext;//把下一个节点的地址,给用于交换的pSwap
Node->pNext = pNew;//把要插入的节点的地址,给上个节点的指针域
pNew->pNext = pSwap;//把插入节点的下一个节点的地址,给插入节点的指针域return true;

}

/*
功能:查询当前楼层是否存在于链表,c 1(找到) 0(没找到)
形参:
pNode pHead:头节点。
int number:要查找的数据。
返回值:
成功:返回1或0。
失败:-1。
*/
int Search(pNode pHead, int number)
{
int b = 1;
int c = 0;

pNode p;
p = pHead->pNext;
while( ( p!=NULL ) && ( ( p->member )!=number ))//查找对应的楼层
{p = p->pNext;b++;
}  if( p && ( p->member )==number )
{c = b;
}return c;

}

/*
功能:处理触发楼层,删除触发楼层信息。
形参:
pNode pHead:头节点。
int number:要删除的数据。
返回值:
成功:返回1或0。
失败:-1。
*/
int Del_Node(pNode pHead, int delete)
{
int j = 0;
int data = 0;

pNode pSwap;
pNode Node = pHead;if ( ( delete<1 ) && (Node->pNext == NULL) )//判断是否有删除的数据
{printf("delete node fail!\n");return 0;
}while( j<( delete-1 ) )
{Node = Node->pNext;++j;
}pSwap = Node->pNext;
data = pSwap->member;
Node->pNext = pSwap->pNext;free(pSwap);return data;

}

/*
功能:计算链表长度,即计算按下楼层总数
形参:
pNode pHead:头节点。
返回值:
成功:0。
失败:-1。
*/
int Length(pNode pHead)
{
int j = 0;
pNode p = pHead;

while( ( p->pNext )!=NULL )
{p = p->pNext;j++;
}return j;

}

int show_location_bmp(char *pathname,int lcd_x_coordinates, int lcd_y_coordinates, int wide, int height,int *show_bmp_lcd_mmap)
{
int i;
int ret;
int x, y;

char bmp_buf[wide*height*3];
int  new_buf[wide*height];
bzero(bmp_buf, sizeof(bmp_buf));
bzero(new_buf, sizeof(new_buf));int bmp_fd = open(pathname, O_RDONLY);//1、打开BMP格式图片
if(bmp_fd == -1)
{printf("show_location_bmp(), open bmp failed\n");return -1;
}ret = lseek(bmp_fd,54,SEEK_SET);//2、跳过bmp图片的前54个位置
if(ret == -1)
{printf("show_location_bmp(), lseek bmp failed\n");       return -1;
}int *new_p = show_bmp_lcd_mmap + 800*lcd_y_coordinates + lcd_x_coordinates;//3、重新确定映射位置。ret = read(bmp_fd, bmp_buf, wide*height*3);//4、取读图片像素
if(ret == -1)
{printf("show_location_bmp(), read bmp failed\n");    return -1;
}close(bmp_fd);//5、关闭图片for(i=0; i<wide*height; i++)//6、24bits 转 32bits控制变量
{new_buf[i] = bmp_buf[i*3]<<0  |  bmp_buf[(i*3)+1]<<8 | bmp_buf[(i*3)+2]<<16;
}for(y=0;y<height;y++)//7、解决图片上下颠倒问题
{for(x=0;x<wide;x++){*(new_p+(800*((height-1)-y))+x) = new_buf[wide*y+x];}
}return 0;

}

static int ts_fd;//打开触控屏设备的套接字

/*
功能:打开触控屏。
形参:无。
返回值:成功 0
失败 -1
*/
int open_ts()
{
ts_fd=open("/dev/input/event0",O_RDWR);
if(ts_fd==-1)
{
perror(“打开触摸屏失败\n”);
return -1;
}
}

//获取坐标
int read_ts(int *ts_x,int *ts_y)
{
//定义事件结构体
struct input_event ts_event;

//定义计数
int count=0;while(1)
{//2、读取触摸坐标read(ts_fd,&ts_event,sizeof(ts_event));//3、  处理坐标,判断信息 ifif(ts_event.type==EV_ABS)//判断当前是否为触摸{if(ts_event.code==ABS_X)//判断当前触摸坐标是否是x轴{*ts_x=ts_event.value;//输出x轴坐标count++;}if(ts_event.code==ABS_Y)//判断当前触摸坐标是否是x轴{*ts_y=ts_event.value;//输出x轴坐标count++;}if(count==2)break;}}

}

//关闭触摸
int ts_close()
{
close(ts_fd);
}

void click_event(int);
void floor_sound(int);
void each_floor(int);
void recover();

//变量定义
int *main_mmap;//映射指针
int ts_x, ts_y;//x、y轴坐标

int i = 1;//定义当前楼层
int click;//定义点击楼层
int state;//上升下降状态控制变量 1(电梯上升) -1(电梯下降) 0(未有按键按下)
int flag = 0;
pNode pHead = NULL;

void *elevator_control(void *arg)
{
int increase_num = 0;
int searchnum = 0;

while(1)
{ ts_x = 0;ts_y = 0;read_ts(&ts_x, &ts_y);printf("\n\n======thread_start:(x,y):(%d,%d)======\n\n", ts_x, ts_y);if(ts_x<800)continue;if(ts_x>800 && ts_x<900 && ts_y>500 && ts_y<600)click = 1;if(ts_x>900 && ts_x<1000 && ts_y>500 && ts_y<600)                    click = 2;                 if(ts_x>800 && ts_x<900 && ts_y>400 && ts_y<500)click = 3;if(ts_x>900 && ts_x<1000 && ts_y>400 && ts_y<500)click = 4;if(ts_x>800 && ts_x<900 && ts_y>300 && ts_y<400)click = 5;if(ts_x>900 && ts_x<1000 && ts_y>300 && ts_y<400)click = 6;if(ts_x>800 && ts_x<900 && ts_y>150 && ts_y<250)click = 7;if(ts_x>900 && ts_x<1000 && ts_y>150 && ts_y<250)click = 8;if(ts_x>800 && ts_x<900 && ts_y>0 && ts_y<100)click = 9;if(ts_x>900 && ts_x<1000 && ts_y>0 && ts_y<100)click = 10;if(click != i) click_event(click);     if(pHead == NULL) {if(click > i)//电梯上升{   system("madplay s.mp3 -a +30 &");flag  = 1;    state = 1;show_location_bmp("up.bmp", 480, 110, 120, 120, main_mmap);pHead = CreateList(click);} else//电梯下降{   system("madplay x.mp3 -a +30 &");flag = 1;state = -1;show_location_bmp("down.bmp", 480, 240, 120, 120, main_mmap);pHead = CreateList(click);}   }      else{if(state==1 && click>i){searchnum = Search(pHead, click);if(searchnum == 0){increase_num = Length(pHead);increase_num = increase_num + 1;Insert_Node(pHead, increase_num, click);}}else if(state==-1 && click<i) {searchnum = Search(pHead, click);if(searchnum == 0){increase_num = Length(pHead);increase_num = increase_num + 1;Insert_Node(pHead, increase_num, click);}}}
}//线程退出
pthread_exit(NULL);

}

void *ad(void *arg)
{
while(1)
{

 show_location_bmp("ad1.bmp", 0, 0, 200, 480, main_mmap);sleep(1);show_location_bmp("ad2.bmp", 0, 0, 200, 480, main_mmap);sleep(1);show_location_bmp("ad3.bmp", 0, 0, 200, 480, main_mmap);sleep(1);
}pthread_exit(NULL);//线程退出

}

int main(int argc, char const *argv[])
{
open_ts();//打开触控屏
main_mmap = init_mmap();//建立映射关系

show_location_bmp("main.bmp", 0, 0, 800, 480, main_mmap);while(1)//点击进入电梯显示系统
{ts_x = 0;ts_y = 0;read_ts(&ts_x, &ts_y);if(ts_x>0 && ts_x<1000 && ts_y>0 && ts_y<600){show_location_bmp("elevatorinterface.bmp", 200, 0, 600, 480, main_mmap);show_location_bmp("1.bmp", 210, 140, 200, 200, main_mmap);ts_x = 0;ts_y = 0;break;}
}pthread_t ele_con, advertisement;//创建两条线程,用于电梯控制和广告播放
pthread_create(&ele_con, NULL,&elevator_control, NULL);//电梯控制
pthread_create(&advertisement, NULL, &ad, NULL);//广告播放int b = 0;
int del_num = 0;
int searchnum = 0;while(1)
{       while(1) {    if(flag == 1) {if(state == 1){each_floor(i);searchnum = Search(pHead, i);printf("\n=============debug 1:  searchnum=%d, i=%d!\n\n", searchnum, i);if(searchnum != 0){del_num = Del_Node(pHead, searchnum);printf("=============debug 2: delete number: %d\n", del_num);floor_sound(i);sleep(5);}elsesleep(1);b = Length(pHead); printf("=============debug 2!  Total number of floors=%d\n", b);if(b == 0){flag = 0;pHead = NULL;state = 0;recover();。each_floor(i);each_floor(i);show_location_bmp("restore_up.bmp", 480, 110, 120, 120, main_mmap);break;}   i++;  } else    if(state==-1){each_floor(i);searchnum = Search(pHead, i);if(searchnum != 0){del_num = Del_Node(pHead, searchnum);printf("=============debug 2: delete number: %d\n", del_num);floor_sound(i); sleep(5);        }elsesleep(1);b = Length(pHead);  if (b == 0) {flag = 0;pHead = NULL;state = 0;recover();each_floor(i);show_location_bmp("restore_down.bmp", 480, 240, 120, 120, main_mmap);break;} i--;   } }}
}   close_ts();//关闭触控屏
close_mmap(main_mmap);  //断开映射关系,释放资源。pthread_join(ele_con,NULL);//回收电梯控制线程
pthread_join(advertisement,NULL);//回收广告显示线程return 0;

}

void floor_sound(int select)
{
switch(select)
{
case 1:
show_location_bmp(“01.bmp”, 600, 384, 100, 96, main_mmap);

         break;case 2:show_location_bmp("02.bmp", 700, 384, 100, 96, main_mmap);break;case 3:show_location_bmp("03.bmp", 600, 288, 100, 96, main_mmap);break;case 4: show_location_bmp("04.bmp", 700, 288, 100, 96, main_mmap);break;case 5:show_location_bmp("05.bmp", 600, 192, 100, 96, main_mmap);   break;case 6:   show_location_bmp("06.bmp", 700, 192, 100, 96, main_mmap);break;case 7:show_location_bmp("07.bmp", 600, 96, 100, 96, main_mmap);break;case 8:show_location_bmp("08.bmp", 700, 96, 100, 96, main_mmap);break;case 9:show_location_bmp("09.bmp", 600, 0, 100, 96, main_mmap);break;case 10:show_location_bmp("010.bmp", 700, 0, 100, 96, main_mmap);break;
}

}

void click_event(int click)
{
if( click1 )
show_location_bmp(“001.bmp”, 600, 384, 100, 96, main_mmap);
if( click2 )
show_location_bmp(“002.bmp”, 700, 384, 100, 96, main_mmap);
if( click3 )
show_location_bmp(“003.bmp”, 600, 288, 100, 96, main_mmap);
if( click4 )
show_location_bmp(“004.bmp”, 700, 288, 100, 96, main_mmap);
if( click5 )
show_location_bmp(“005.bmp”, 600, 192, 100, 96, main_mmap);
if( click6 )
show_location_bmp(“006.bmp”, 700, 192, 100, 96, main_mmap);
if( click7 )
show_location_bmp(“007.bmp”, 600, 96, 100, 96, main_mmap);
if( click8 )
show_location_bmp(“008.bmp”, 700, 96, 100, 96, main_mmap);
if( click9 )
show_location_bmp(“009.bmp”, 600, 0, 100, 96, main_mmap);
if( click10 )
show_location_bmp(“0010.bmp”, 700, 0, 100, 96, main_mmap);
}

void each_floor(int select)
{
switch(select)
{
case 1:
show_location_bmp(“1.bmp”, 210, 140, 200, 200, main_mmap);
break;
case 2:
show_location_bmp(“2.bmp”, 210, 140, 200, 200, main_mmap);
break;
case 3:
show_location_bmp(“3.bmp”, 210, 140, 200, 200, main_mmap);
break;
case 4:
show_location_bmp(“4.bmp”, 210, 140, 200, 200, main_mmap);
break;
case 5:
show_location_bmp(“5.bmp”, 210, 140, 200, 200, main_mmap);
break;
case 6:
show_location_bmp(“6.bmp”, 210, 140, 200, 200, main_mmap);
break;
case 7:
show_location_bmp(“7.bmp”, 210, 140, 200, 200, main_mmap);
break;
case 8:
show_location_bmp(“8.bmp”, 210, 140, 200, 200, main_mmap);
break;
case 9:
show_location_bmp(“9.bmp”, 210, 140, 200, 200, main_mmap);
break;
case 10:
show_location_bmp(“10.bmp”, 210, 140, 200, 200, main_mmap);
break;
}
}

void recover(void)
{
show_location_bmp(“elevatorinterface.bmp”, 200, 0, 600, 480, main_mmap);

}

嵌入式电梯多媒体设计相关推荐

  1. 嵌入式系统课程设计题目

    简介:一些嵌入式系统课程设计题目,可以当做对你学习ARM的一个检测. 嵌入式系统课程设计-选题要求及课题 1.嵌入式系统课程设计时长两星期,要求学生分组进行课程设计,每组学生人数为2-3人(可在不超过 ...

  2. linux 远程挂载摄像头_基于Linux的嵌入式网络摄像机设计

    本嵌入式网络摄像机采用高性能ARM9芯片微处理器,内置嵌入式Web服务器. 通过嵌入式多任务操作系统采集摄像机视频数据:采集的视频信号数字化后经MJPEG算法压缩,再通过内部总线送到内置的Web服务器 ...

  3. 嵌入式系统开发设计---嵌入式系统开发设计

    嵌入式系统设计的主要任务是定义系统的功能.决定系统的架构,并将功能映射到系统实现架构上.这里,系统架构既包括软件系统架构也包括硬件系统架构.一种架构可以映射到各种不同的物理实现,每种实现表示不同的取舍 ...

  4. 多核片上系统(SoC)架构的嵌入式DSP软件设计

    多核片上系统(SoC)架构的嵌入式DSP软件设计 Multicore a System-on-a-Chip (SoC) Architecture SoCs的软件开发涉及到基于最强大的计算模型在各种处理 ...

  5. 嵌入式linux设计报告,嵌入式linux课程设计报告

    嵌入式linux课程设计报告 重庆科技学院 课程设计成果 院(系):_电气与信息工程学院_ 班 级: 计科普0802 学生姓名: 庄桐泉 学 号: 2008441067 设计地点(单位)___ _I3 ...

  6. 概要设计实例_多核片上系统(SoC)架构的嵌入式DSP软件设计

    多核片上系统(SoC)架构的嵌入式DSP软件设计 Multicore a System-on-a-Chip (SoC) Architecture SoCs的软件开发涉及到基于最强大的计算模型在各种处理 ...

  7. 计算机广告制作未来发展还行吗,计算机多媒体设计专业和广告设计制作那个好...

    技校网专门为您推荐的类似问题答案 问题1: 计算机多媒体技术和广告设计与制作哪个专业好 计算机多媒体涵盖范围广.广告与制作就业前景好.如果想学更多东西的话选择计算机多媒体.包含广告设计. 问题2: 计 ...

  8. 在linux下进行嵌入式系统设计,一种应用于测控系统的基于Linux的嵌入式系统的设计...

    描述 1.前言 随着网络控制技术的快速发展,工业以太网得到逐步完善,在工业控制领域获得越来越广泛的应用.工业以太网使用了TCP/IP协议,便于联网,并具有高速控制网络的优点.随着32位嵌入式CPU价格 ...

  9. Delphi多媒体设计之播放WAVE文件(API)

    多媒体程序设计是一个名不符实的词组,其道理就是多媒体程序设计包含着广泛的可能性,它尤其包括了Wave音频.MIDI音频.AVI视频和动画等.不要将多媒体程序设计与游戏程序设计混淆了. 游戏设计自然包含 ...

最新文章

  1. 构建dubbo分布式平台-maven构建ant-framework核心代码annotation
  2. 大连理工大学网络教育学院2014年3月份计算机原理课程补考试卷,大连理工大学网络教育2014年3月份自动化控制原理考试模.doc...
  3. android开发超级群(500人)
  4. opengl代码实例_OpenGL-打开一个窗口
  5. jvm监控调优常用命令
  6. 网络工程师必须懂的十五大专业术语!
  7. BurpSuite插件 -- Struts2-RCE
  8. jquery插件dataTables自增序号。
  9. 写程序,流程图很重要!
  10. Codeforces Round #513 总结
  11. postgre 主键_PostgreSQL – 随机主键
  12. gdi和gdi+并用
  13. ipad连接电脑显示不在充电_笔记本电脑和投影仪连接后为什么投影仪不能显示电脑内容?...
  14. 宇视网络视频录像机添加第三方摄像机的配置方法
  15. 今日得闲,完善一下之前用python画的滑稽笑脸的代码,附计算过程
  16. android小米手机变慢,手机越来越慢怎么破?小米手机七大加速绝招
  17. 直击AWE2018:当AI遇见LED,诸葛小明给光更多可能
  18. Gamemaker小课堂#0 如何为 Windows 游戏编写 DLL 扩展
  19. PCB 设计 3. 原理图及其封装制作
  20. 厉害了!你的技术真的到天花板了吗?年薪50W

热门文章

  1. 个人学习_21.8.12-线性回归部分
  2. 软件架构, 软件框架,设计模式的区别
  3. 电脑这个设置不关闭千兆网还不如百兆网!
  4. 集线器 交换机 路由器
  5. 中断与其他函数共享变量、临界资源的保护
  6. 搜索框实现,常用搜索,历史搜索等
  7. 2020年度“CCF优秀博士学位论文奖”初评结果公示
  8. BUG:Win由于找不到iutils.dIl 无法继续执行代码……
  9. vue3的unplugin-auto-import自动引入
  10. 计算机视觉:场景识别(Scene Recognition)