分享
 
 
 

一个简单的IAL分析(红外遥控)

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

一、程序说明

1.下面程序是基于一个红外的设备文件,从该设备中能接收到红外遥控的硬件编码。

2.两个文件需要覆盖掉libmingiui*/src/ial/中的两个文件编译时加上 --enable-video-qvfb

3.为了简单,就直接在qvfb引擎上进行修改

二、程序源码及代码说明

/*

qvfb.h

*/

#ifndef _IAL_qvfb_h

#define _IAL_qvfb_h

#define kb_dev "/dev/ir"

#define TIME_KEYUP 30

struct QVFbKeyData

{

unsigned int unicode;

//unsigned int modifiers;

//BYTE press;

//BYTE repeat;

};

#ifdef __cplusplus

extern "C" {

#endif /* __cplusplus */

BOOL InitQVFBInput (INPUT* input, const char* mdev, const char* mtype);

void TermQVFBInput (void);

#ifdef __cplusplus

}

#endif /* __cplusplus */

#endif /* _IAL_qvfb_h */

***文件结束************************************

/*

qvfb.c

*/

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <errno.h>

#include <fcntl.h>

#include "common.h"

#ifdef _QVFB_IAL

#include <sys/ioctl.h>

#include <sys/poll.h>

#include <sys/types.h>

#include <sys/stat.h>

#include "minigui.h"

#include "misc.h"

#include "ial.h"

#include "qvfb.h"

extern unsigned int __mg_timer_counter;

static int mouse_fd = -1;

static int kbd_fd = -1;

//static POINT mouse_pt;

//static int mouse_buttons;

static struct QVFbKeyData kbd_data;

static unsigned char kbd_state [NR_KEYS];

static unsigned char last = 0;

static int time_pre = -1 ;

static int keycode_scancode[0x21] =

{

SCANCODE_CURSORBLOCKUP, /*0x00 UP0 UP*/

SCANCODE_CURSORBLOCKDOWN, /*0x01 Down DOWN*/

SCANCODE_CURSORBLOCKRIGHT, /*0x02 Right RIGHT*/

SCANCODE_CURSORBLOCKLEFT, /*0x03 Left LEFT*/

0x003C, /*0x04 Audio F2*/

SCANCODE_LEFTALT, /*0x05 MENU*/

0x0040, /*0x06 Radio 电/广F6*/

SCANCODE_ESCAPE, /*0x07 Exit ESC*/

0x003D, /*0x08 Pause F3*/

0x003B, /*0x09 FAV F1*/

0x0044, /*0x0A OWER F10*/

0x003F, /*0x0B TV 缩放F5*/

0x0057, /*0x0C MUTE F11*/

0x0000, /*0x0D 没有该按钮*/

0x0042, /*0x0E TV/Sat 搜台F8*/

0x003E, /*0x0F TXT F4*/

SCANCODE_0, /*0x10 0 0*/

SCANCODE_1, /*0x11 1 1*/

SCANCODE_2, /*0x12 2 2*/

SCANCODE_3, /*0x13 3 3*/

SCANCODE_4, /*0x14 4 4*/

SCANCODE_5, /*0x15 5 5*/

SCANCODE_6, /*0x16 6 6*/

SCANCODE_7, /*0x17 7 7*/

SCANCODE_8, /*0x18 8 8*/

SCANCODE_9, /*0x19 9 9*/

SCANCODE_CAPSLOCK, /*0x1A quality CAPLOCK*/

SCANCODE_BACKSPACE, /*0x1B recall BACKSPACE*/

SCANCODE_PAGEUP, /*0x1C Sat PAGEUP*/

SCANCODE_PAGEDOWN, /*0x1D Skew PAGEDOWN*/

0x0043, /*0x1E Guid F9*/

SCANCODE_ENTER, /*0x1F OK ENTER*/

0x0041 /*0x40 Info F7*/

};

static unsigned char keycode_to_scancode (unsigned int keycode)

{

keycode >>= 16;

keycode &= 0x0FF;

fprintf (stderr, "IAL:keycode = %d!\n",keycode);

if(keycode >= 0x20)

{

keycode = 0x20;

}

return keycode_scancode[keycode];

}

/************************ Low Level Input Operations **********************/

/*

* Mouse operations -- Event

*/

static int mouse_update (void)

{

return 1;

}

static void mouse_getxy (int *x, int* y)

{

;

}

static int mouse_getbutton (void)

{

return 0;

}

////////////////////////////////////////////

static int keyboard_update (void)

{

struct QVFbKeyData l_kbd_data;

int ret;

if(!(last & 0x80))

{

ret = read (kbd_fd, &l_kbd_data, sizeof (struct QVFbKeyData));

////////////////////判断是否有数据

if (ret == sizeof (struct QVFbKeyData)) {

kbd_data = l_kbd_data;

}

else

{

return 0;

}

/////////////////////////////////

//按钮未弹起前不接收其他按钮

last = keycode_to_scancode (kbd_data.unicode);

kbd_state[last]=1; //新按钮按下

time_pre = __mg_timer_counter;//开始按钮弹起计时

fprintf (stderr, "IAL:Key Down!\n");

}

else

{

kbd_state[last & 0x7f]=0;

time_pre = -1;

last = 0;

fprintf (stderr, "IAL:Key Up!\n");

}

return NR_KEYS;

}

static const char* keyboard_getstate (void)

{

return kbd_state;

}

/* NOTE by weiym: Do not ignore the fd_set in, out, and except */

#ifdef _LITE_VERSION

static int wait_event (int which, int maxfd, fd_set *in, fd_set *out, fd_set *except,

struct timeval *timeout)

#else

static int wait_event (int which, fd_set *in, fd_set *out, fd_set *except,

struct timeval *timeout)

#endif

{

int interval;

fd_set rfds;

int retvalue = 0;

int fd, e;

////////////////////////////////

if(time_pre > 0)

{

interval= __mg_timer_counter - time_pre;

if (interval > TIME_KEYUP)

{

//kbd_state[last] = 0;

last |= 0x80; //发送按钮弹起数据

retvalue |= IAL_KEYEVENT ;

return retvalue;

}

}

/////////////////////////////////

if (!in) {

in = &rfds;

FD_ZERO (in);

}

if (which & IAL_MOUSEEVENT && mouse_fd >= 0) {

fd = mouse_fd;

FD_SET (fd, in);

#ifdef _LITE_VERSION

if (fd > maxfd) maxfd = fd;

#endif

}

if (which & IAL_KEYEVENT){

fd = kbd_fd;

FD_SET (kbd_fd, in);

#ifdef _LITE_VERSION

if (fd > maxfd) maxfd = fd;

#endif

}

/* FIXME: pass the real set size */

#ifdef _LITE_VERSION

e = select (maxfd + 1, in, out, except, timeout) ;

#else

e = select (FD_SETSIZE, in, out, except, timeout) ;

#endif

if (e > 0 && time_pre < 0) { //按钮按下后就不产生事件,直到按钮弹起

fd = mouse_fd;

/* If data is present on the mouse fd, service it: */

if (fd >= 0 && FD_ISSET (fd, in)) {

FD_CLR (fd, in);

retvalue |= IAL_MOUSEEVENT;

}

fd = kbd_fd;

/* If data is present on the keyboard fd, service it: */

if (fd >= 0 && FD_ISSET (fd, in)) {

FD_CLR (fd, in);

retvalue |= IAL_KEYEVENT;

}

} else if (e < 0 || time_pre > 0) {

return -1;

}

return retvalue;

}

BOOL InitQVFBInput (INPUT* input, const char* mdev, const char* mtype)

{

kbd_fd = open (kb_dev, O_RDONLY);

if (kbd_fd < 0)

{

fprintf (stderr, "IAL:Can not open /dev/ir !\n");

}

/////////////////////////////////////////////////////

input->update_mouse = mouse_update;

input->get_mouse_xy = mouse_getxy;

input->set_mouse_xy = NULL;

input->get_mouse_button = mouse_getbutton;

input->set_mouse_range = NULL;

input->suspend_mouse= NULL;

input->resume_mouse = NULL;

input->update_keyboard = keyboard_update;

input->get_keyboard_state = keyboard_getstate;

input->suspend_keyboard = NULL;

input->resume_keyboard = NULL;

input->set_leds = NULL;

input->wait_event = wait_event;

return TRUE;

}

void TermQVFBInput (void)

{

if (kbd_fd >= 0)

close (kbd_fd);

}

#endif /* _QVFB_IAL */

***文件结束************************************

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有