《智能家居系统》6

一、字库的使用

编译命令:

arm-linux-gcc showchar.c libfont.a -o showchar

函数介绍:

int   Init_Font(void);  //显示字体库前先调用本函数进行初始化
void  UnInit_Font(void); //程序退出前,调用本函数
int   Clean_Area(			int X,  //x坐标起始点
                 			int Y,  //y坐标起始点
				 int width, //背景绘制的宽度  像素
				 int height,//背景绘制的高度
				 unsigned long color); //往屏幕指定区域填充颜色
				 
int   Display_characterX(		unsigned int x,  //x坐标起始点
                         			unsigned int y, //y坐标起始点
				unsigned char *string,   //GB2312 中文字符串
				unsigned int color ,     //字体颜色值
				int size);               //字体放大倍数 1~8

需要注意的地方:在用notepad++编写代码的时候,必须将你的中文编码设置为GB2312(在编码–》编码字符集中选择中文)

CRT设置:

如何进行中文设置:
Options—>Session options–>Appearance—>Character encoding(选择ANSI/OEM-简体中文GBK)

二、触摸板的滑屏算法

#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>

int main(void)
{
	struct input_event info;
	int x1,y1,x2,y2;
	//打开触摸屏
	int tsfd = open("/dev/input/event0",O_RDWR);
	if(tsfd == -1)
	{
		perror("open event0 error");
		return -1;
	}
	
	while(1)
	{
		x1=0,x2=0,y1=0,y2=0;
		//获取x1,y1的坐标
		while(1)
		{
			//读取触摸屏的坐标
			read(tsfd,&info,sizeof(info));
			
			//获取X轴的坐标
			if(info.type == EV_ABS && info.code == ABS_X)
				x1 = info.value;
			if(info.type == EV_ABS && info.code == ABS_Y)
				y1 = info.value;
			if(x1 !=0 && y1 != 0)
				break;
		}
		//获取x2,y2的坐标
		while(1)
		{
			//读取触摸屏的坐标
			read(tsfd,&info,sizeof(info));
			
			//获取X轴的坐标
			if(info.type == EV_ABS && info.code == ABS_X)
				x2 = info.value;
			if(info.type == EV_ABS && info.code == ABS_Y)
				y2 = info.value;
			//检测手松开的时候,才打印坐标
			if(info.type == EV_KEY && info.code == BTN_TOUCH && info.value == 0)
				break;
		}
		
		if(x2-x1>50 && (y1-y2<30 || y2-y1<30))
			printf("向右划屏\n");
		if(x1-x2>50 && (y1-y2<30 || y2-y1<30))
			printf("向左划屏\n");
		
		
		
	}

	close(tsfd);
	
	return 0;
}

三、linux视频编程

1、音视频编解码器 —mplayer

2、需要将mplayer下载到开发版的/bin

cp mplayer  /bin

3、如何使用

查看用法
mplayer   -help

MPlayer 1.0rc2-4.5.1 © 2000-2007 MPlayer Team
CPU: ARM
用法: mplayer [选项] [URL|路径/]文件名

基本选项: (完整列表参见手册页)

 -vo <drv>        选择视频输出驱动 (查看驱动列表用“-vo help”)
 -ao <drv>        选择音频输出驱动 (查看驱动列表用“-ao help”)
 vcd://<trackno>  播放 (S)VCD 轨迹号 (原始设备, 无需安挂)
 dvd://<titleno>  从设备而不是普通文件上播放 DVD 标题号
 -alang/-slang    选择 DVD 音轨/字幕的语言(使用两字符的国家代号)
 -ss <position>   寻找到给定(多少秒或时分秒 hh:mm:ss 的)位置
 -nosound         不播放声音
 -fs              全屏播放 (或者用 -vm, -zoom, 详见于手册页)
 -x <x> -y <y>    设置显示的分辨率(提供给 -vm 或者 -zoom 使用)
 -sub <file>      指定字幕文件 (参见 -subfps, -subdelay)
 -playlist <file> 指定播放列表文件
 -vid x -aid y    选择用于播放的 x 视频流和 y 音频流通道号
 -fps x -srate y  改变视频率为 x 帧秒(fps)和音频率为 y 赫兹(Hz)
 -pp <quality>    使用后期处理过滤器/滤镜 (详见于手册页)
 -framedrop       使用丢帧(用于慢机器)

基本控制键: (完整的列表参见于手册页, 同时也请核查 input.conf)

 <-  or  ->       后退/快进 10 秒
 down or up       后退/快进 1 分钟
 pgdown or pgup   后退/快进 10 分钟
 < or >           跳到播放列表中的前一个/后一个
 p or SPACE       暂停播放(按任意键继续)
 q or ESC         停止播放并退出程序
 + or -           调整音频延迟增加/减少 0.1 秒
 o                循环 OSD 模式:/搜索条/搜索条加计时器
 * or /           增加或减少 PCM 音量
 x or z           调整字幕延迟增加/减少 0.1 秒
 r or t           上/下调整字幕位置, 参见“-vf expand”
      • 详细内容,更多的(高级)选项和控制键,请参见手册页 * * *

4、如何控制视频的状态

1、使用键盘
		
2、使用slave命令

5、slave命令的用法

查询slave的用法
mplayer -input cmdlist
seek                 Float [Integer]     快进 :  "seek +10\n"   快退: "seek -10\n" 
quit                 [Integer]           停止
pause   				 暂停、继续播放
mute                 [Integer]           静音
volume               Float [Integer]     音量+"volume  +1000\n"   音量-"volume  -1000\n"

6、管道文件的创建

mkfifo
   #include <sys/types.h>
   #include <sys/stat.h>

   int mkfifo(const char *pathname, mode_t mode);
函数功能:新建一个管道文件
参数:pathname  ----》你要创建管道文件的路径名    ---比如:  /tmp/fifo
      mode      ---->文件的权限        0777   0666

返回值:成功   0
	失败   -1

7、指定视频播放的位置

-geometry  100:50       ----指定视频播放的起始位置在 x == 100   y == 50 的位置播放

8、控制视频的大小

-zoom  -x  -y     比如   -zoom  -x 600  -y 400

9、播放

system("mplayer -slave -quiet -input file=/tmp/fifo -geometry 100:50 -zoom -x 600 -y 400 faded.avi &");

练习1:制作一个视频播放器
1、要有主界面,触摸控制状态
2、实现的功能:暂停、播放、停止、音量±、快进、快退、静音

扩展:上一段视频、下一段视频
sprintf

四、摄像头编程

1、当前市场

jpg格式    yuv格式(你们手中拿到的摄像头)

2、摄像头的工作原理

当摄像头开始工作的时候,会拍摄出一张张指定格式的图片,在内部编程形成视频流播放出来

3、摄像头开发架构 —v4l2架构

/usr/include/linux/videodev2.h

4、摄像头显示的流程

//初始化摄像头

linux_v4l2_yuyv_init("/dev/video7"); —/dev/video7 是摄像头的设备驱动文件
如何检测摄像头的设备驱动文件

1、删除所有video文件
rm  video*
2、拔插摄像头设备,查看/dev/里面的驱动设备文件
//开启摄像头捕捉
	
	linux_v4l2_start_yuyv_capturing();
//获取摄像头捕捉的画面
		
	linux_v4l2_get_yuyv_data(&video_buf);
	
		
//显示摄像头捕捉的画面
		
	show_video_data(0, 0, video_buf.jpg_data , video_buf.jpg_size);
//摄像头解除初始化
	
	linux_v4l2_yuyv_quit();

5、需要注意的地方

1)将C:\Users\STU01\Desktop\linuxshare\yuv_v4l2\jpeg文件夹中两个库文件下载到开发版中/lib

libapi_v4l2_arm1.so
libjpeg.so.8

6、如何进行编译

make

7、自拍的实现

1)在开发板的根目录下新建一个目录
mkdir video_jpg
video_jpg  ---这个目录用来存储拍摄出来的图片

8、如何显示Jpeg图片

1、将libjpeg.so.9库文件下载到开发板的/lib
2、使用jpeg_show二进制文件执行图片的显示
chmod 777 jpeg_show
./jpeg_show  0.jpg     

五、目录检索

1、打开目录

#include <sys/types.h>
#include <dirent.h>

DIR *opendir(const char *name);
函数功能:打开指定的目录
参数:name ---你想要打开哪个目录
返回值:成功返回目录指针
	失败  NULL

2、读取目录

#include <dirent.h>

struct dirent *readdir(DIR *dirp);
参数:dirp ---你要读取哪个目录,将该目录指针传递进来
返回值:成功返回 目录项指针,存储读取到的文件信息
失败 或者读取完毕返回 NULL

struct dirent {
            unsigned char  d_type;      /* 文件类型 */
            char           d_name[256]; /* 文件名 */
        };

注意:每一次调用readdir函数,只能读取该目录中一个文件的信息

3、关闭目录

#include <sys/types.h>

#include <dirent.h>

int closedir(DIR *dirp);

六、GEC6818如何把硬盘空余的空间挂载到文件系统中使用

块设备

应用程序和驱动程序之间进行数据交换的时候,是以块(1block=1024B)为单位的。这些数据传递的顺序是不固定的。块设备是有缓存的。块设备是有文件系统的。
块设备:大容量的存储设备:U盘、移动硬盘、SD卡、eMMC、.....
应用程序:挂载--->标准IO函数:fopen()/fread()/fwrite()/.....

例:

[root@GEC6818 /]#df 
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/root               352756    273244     79512  77% /    ---->存放rootfs的电子硬盘分区:352756*1kB = 350MB
devtmpfs                405404         0    405404   0% /dev
tmpfs                   413720         0    413720   0% /dev/shm
tmpfs                   413720         0    413720   0% /tmp
tmpfs                   413720         0    413720   0% /run
[root@GEC6818 /]#cat /proc/partitions 
major minor  #blocks  name

 179        0    7634944 mmcblk0
 179        1      65536 mmcblk0p1
 179        2     772096 mmcblk0p2  ----->rootfs
 179        3     438272 mmcblk0p3
 179        4          1 mmcblk0p4
 179        5       8192 mmcblk0p5
 179        6      22528 mmcblk0p6
 179        7    6324224 mmcblk0p7  ---->没有使用,我们可以把数据放在这个分区。
 179       16       4096 mmcblk0boot1
 179        8       4096 mmcblk0boot0

1> 格式化暂未被使用的分区mmcblk0p7

[root@GEC6818 /]#mkfs.vfat /dev/mmcblk0p7

在开发板的根目录下创建一个目录

mkdir   mdata

2> 使用mount命令把该分区挂载到 /mdata目录中 -t指定文件系统类型为vfat

[root@GEC6818 /]#mount -t vfat /dev/mmcblk0p7 /mdata
[root@GEC6818 /]#df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/root               344.5M    344.5M         0 100% /
devtmpfs                395.9M         0    395.9M   0% /dev
tmpfs                   404.0M         0    404.0M   0% /dev/shm
tmpfs                   404.0M         0    404.0M   0% /tmp
tmpfs                   404.0M         0    404.0M   0% /run
/dev/mmcblk0p7            6.0G     61.9M      6.0G   1% /mdata

//这一步不需要执行

3> 通过挂载点解除挂载

[root@GEC6818 /]#umount /mdata

注意重启后挂在会还原,如果需要开机自动挂载的话需要把步骤<2>写到/etc/profile中,该分区内资料并不会被清除可放心使用

4>将挂载命令输入到启动配置文件中,让开发板开机自动挂载

vi /etc/profile 

在文本最后输入挂载命令

mount -t vfat /dev/mmcblk0p7 /mdata
  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WeSiGJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值