亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? joystick-api.txt

?? 嵌入式系統設計與實例開發源碼
?? TXT
字號:
		      Joystick API Documentation                -*-Text-*-		        Ragnar Hojland Espinosa			  <ragnar@macula.net>			      7 Aug 1998	$Id: joystick-api.txt,v 1.2 2001/05/08 21:21:23 vojtech Exp $1. Initialization~~~~~~~~~~~~~~~~~Open the joystick device following the usual semantics (that is, with open).Since the driver now reports events instead of polling for changes,immediately after the open it will issue a series of synthetic events(JS_EVENT_INIT) that you can read to check the initial state of thejoystick.By default, the device is opened in blocking mode.	int fd = open ("/dev/js0", O_RDONLY);2. Event Reading~~~~~~~~~~~~~~~~	struct js_event e;	read (fd, &e, sizeof(struct js_event));where js_event is defined as	struct js_event {		__u32 time;     /* event timestamp in milliseconds */		__s16 value;    /* value */		__u8 type;      /* event type */		__u8 number;    /* axis/button number */	};If the read is successful, it will return sizeof(struct js_event), unlessyou wanted to read more than one event per read as described in section 3.1.2.1 js_event.type~~~~~~~~~~~~~~~~~The possible values of ``type'' are	#define JS_EVENT_BUTTON         0x01    /* button pressed/released */	#define JS_EVENT_AXIS           0x02    /* joystick moved */	#define JS_EVENT_INIT           0x80    /* initial state of device */As mentioned above, the driver will issue synthetic JS_EVENT_INIT ORedevents on open. That is, if it's issuing a INIT BUTTON event, thecurrent type value will be	int type = JS_EVENT_BUTTON | JS_EVENT_INIT;	/* 0x81 */If you choose not to differentiate between synthetic or real eventsyou can turn off the JS_EVENT_INIT bits	type &= ~JS_EVENT_INIT;				/* 0x01 */2.2 js_event.number~~~~~~~~~~~~~~~~~~~The values of ``number'' correspond to the axis or button thatgenerated the event. Note that they carry separate numeration (thatis, you have both an axis 0 and a button 0). Generally,			number	1st Axis X	0	1st Axis Y	1	2nd Axis X	2	2nd Axis Y	3	...and so onHats vary from one joystick type to another. Some can be moved in 8directions, some only in 4, The driver, however, always reports a hat as twoindependent axis, even if the hardware doesn't allow independent movement.2.3 js_event.value~~~~~~~~~~~~~~~~~~For an axis, ``value'' is a signed integer between -32767 and +32767representing the position of the joystick along that axis. If youdon't read a 0 when the joystick is `dead', or if it doesn't span thefull range, you should recalibrate it (with, for example, jscal).For a button, ``value'' for a press button event is 1 and for a releasebutton event is 0.Though this	if (js_event.type == JS_EVENT_BUTTON) {		buttons_state ^= (1 << js_event.number);	}may work well if you handle JS_EVENT_INIT events separately,	if ((js_event.type & ~JS_EVENT_INIT) == JS_EVENT_BUTTON) {		if (js_event.value)	        	buttons_state |= (1 << js_event.number);	   	else	      		buttons_state &= ~(1 << js_event.number);	}is much safer since it can't lose sync with the driver. As you wouldhave to write a separate handler for JS_EVENT_INIT events in the firstsnippet, this ends up being shorter.2.4 js_event.time~~~~~~~~~~~~~~~~~The time an event was generated is stored in ``js_event.time''. It's a timein milliseconds since ... well, since sometime in the past.  This eases thetask of detecting double clicks, figuring out if movement of axis and buttonpresses happened at the same time, and similar.3. Reading~~~~~~~~~~If you open the device in blocking mode, a read will block (that is,wait) forever until an event is generated and effectively read. Thereare two alternatives if you can't afford to wait forever (which is,admittedly, a long time;)	a) use select to wait until there's data to be read on fd, or	   until it timeouts. There's a good example on the select(2)	   man page.	b) open the device in non-blocking mode (O_NONBLOCK)3.1 O_NONBLOCK~~~~~~~~~~~~~~If read returns -1 when reading in O_NONBLOCK mode, this isn'tnecessarily a "real" error (check errno(3)); it can just mean thereare no events pending to be read on the driver queue. You should readall events on the queue (that is, until you get a -1).For example,	while (1) {		while (read (fd, &e, sizeof(struct js_event)) > 0) {	        	process_event (e);	   	}	   	/* EAGAIN is returned when the queue is empty */	   	if (errno != EAGAIN) {	      		/* error */	   	}	   	/* do something interesting with processed events */	}One reason for emptying the queue is that if it gets full you'll startmissing events since the queue is finite, and older events will getoverwritten.The other reason is that you want to know all what happened, and notdelay the processing till later.Why can get the queue full? Because you don't empty the queue asmentioned, or because too much time elapses from one read to anotherand too many events to store in the queue get generated. Note thathigh system load may contribute to space those reads even more.If time between reads is enough to fill the queue and loose an event,the driver will switch to startup mode and next time you read it,synthetic events (JS_EVENT_INIT) will be generated to inform you ofthe actual state of the joystick.[As for version 1.2.8, the queue is circular and able to hold 64 events. You can increment this size bumping up JS_BUFF_SIZE in joystick.h and recompiling the driver.]In the above code, you might as well want to read more than one eventat a time using the typical read(2) functionality. For that, you wouldreplace the read above with something like	struct js_event mybuffer[0xff];	int i = read (fd, mybuffer, sizeof(struct mybuffer));In this case, read would return -1 if the queue was empty, or someother value in which the number of events read would be i /sizeof(js_event)  Again, if the buffer was full, it's a good idea toprocess the events and keep reading it until you empty the driver queue.4. IOCTLs~~~~~~~~~The joystick driver defines the following ioctl(2) operations.				/* function			3rd arg  */	#define JSIOCGAXES	/* get number of axes		char	 */	#define JSIOCGBUTTONS	/* get number of buttons	char	 */	#define JSIOCGVERSION	/* get driver version		int	 */	#define JSIOCGNAME(len) /* get identifier string	char	 */	#define JSIOCSCORR	/* set correction values	&js_corr */	#define JSIOCGCORR	/* get correction values	&js_corr */For example, to read the number of axes	char number_of_axes;	ioctl (fd, JSIOCGAXES, &number_of_axes);4.1 JSIOGCVERSION~~~~~~~~~~~~~~~~~JSIOGCVERSION is a good way to check in run-time whether the runningdriver is 1.0+ and supports the event interface. If it is not, theIOCTL will fail. For a compile-time decision, you can test theJS_VERSION symbol	#ifdef JS_VERSION	#if JS_VERSION > 0xsomething4.2 JSIOCGNAME~~~~~~~~~~~~~~JSIOCGNAME(len) allows you to get the name string of the joystick - the sameas is being printed at boot time. The 'len' argument is the length of thebuffer provided by the application asking for the name. It is used to avoidpossible overrun should the name be too long.	char name[128];	if (ioctl(fd, JSIOCGNAME(sizeof(name)), name) < 0)		strncpy(name, "Unknown", sizeof(name));	printf("Name: %s\n", name);4.3 JSIOC[SG]CORR~~~~~~~~~~~~~~~~~For usage on JSIOC[SG]CORR I suggest you to look into jscal.c  They arenot needed in a normal program, only in joystick calibration softwaresuch as jscal or kcmjoy. These IOCTLs and data types aren't consideredto be in the stable part of the API, and therefore may change withoutwarning in following releases of the driver.Both JSIOCSCORR and JSIOCGCORR expect &js_corr to be able to holdinformation for all axis. That is, struct js_corr corr[MAX_AXIS];struct js_corr is defined as	struct js_corr {		__s32 coef[8];		__u16 prec;		__u16 type;	};and ``type''	#define JS_CORR_NONE            0x00    /* returns raw values */	#define JS_CORR_BROKEN          0x01    /* broken line */5. Backward compatibility~~~~~~~~~~~~~~~~~~~~~~~~~The 0.x joystick driver API is quite limited and its usage is deprecated.The driver offers backward compatibility, though. Here's a quick summary:	struct JS_DATA_TYPE js;	while (1) {		if (read (fd, &js, JS_RETURN) != JS_RETURN) {	      		/* error */	   	}	   	usleep (1000);	}As you can figure out from the example, the read returns immediately,with the actual state of the joystick.	struct JS_DATA_TYPE {		int buttons;    /* immediate button state */		int x;          /* immediate x axis value */		int y;          /* immediate y axis value */	};and JS_RETURN is defined as	#define JS_RETURN       sizeof(struct JS_DATA_TYPE)To test the state of the buttons,	first_button_state  = js.buttons & 1;	second_button_state = js.buttons & 2;The axis values do not have a defined range in the original 0.x driver,except for that the values are non-negative. The 1.2.8+ drivers use afixed range for reporting the values, 1 being the minimum, 128 thecenter, and 255 maximum value.The v0.8.0.2 driver also had an interface for 'digital joysticks', (nowcalled Multisystem joysticks in this driver), under /dev/djsX. This driverdoesn't try to be compatible with that interface.6. Final Notes~~~~~~~~~~~~~~____/|	Comments, additions, and specially corrections are welcome.\ o.O|	Documentation valid for at least version 1.2.8 of the joystick =(_)=	driver and as usual, the ultimate source for documentation is   U	to "Use The Source Luke" or, at your convenience, Vojtech ;)					- RagnarEOF

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕日韩一区| 亚洲国产精品成人综合色在线婷婷 | www.亚洲免费av| 91美女视频网站| 91精品国产色综合久久不卡电影| 久久亚洲一区二区三区明星换脸| 国产精品国产a| 亚洲第一狼人社区| 久久99精品国产麻豆婷婷洗澡| 精品一区二区三区在线观看| 成人成人成人在线视频| 欧美午夜宅男影院| 精品久久久久久久人人人人传媒 | 国产精品99久久久久久久vr| 91免费国产在线| 精品奇米国产一区二区三区| 亚洲欧美偷拍另类a∨色屁股| 日本午夜一区二区| 成人丝袜高跟foot| 欧美另类videos死尸| 久久欧美中文字幕| 一区二区三区不卡在线观看| 久88久久88久久久| 欧洲中文字幕精品| 中文字幕欧美激情一区| 一区二区视频在线看| 精品在线观看视频| 欧美亚洲禁片免费| 中文乱码免费一区二区| 日韩av一区二区三区| proumb性欧美在线观看| 日韩三级视频中文字幕| 中文字幕在线不卡国产视频| 麻豆免费看一区二区三区| 国产91露脸合集magnet | 日本成人在线不卡视频| 91丨porny丨中文| 精品三级在线观看| 日韩一区在线播放| 在线亚洲精品福利网址导航| 国产片一区二区| 蜜臀精品久久久久久蜜臀| 91精品福利视频| 国产亚洲午夜高清国产拍精品 | 免费成人在线视频观看| 国产精品视频yy9299一区| 91香蕉视频在线| 久久久精品黄色| 麻豆91免费看| 欧美性做爰猛烈叫床潮| 1000部国产精品成人观看| 国产一区二区三区视频在线播放| 欧美日韩亚州综合| 亚洲香蕉伊在人在线观| 色综合天天综合网天天看片| 欧美国产日韩a欧美在线观看| 麻豆91免费观看| 欧美一区二区三区四区高清| 一区二区久久久| 国产高清不卡一区二区| 日韩免费福利电影在线观看| 亚洲一区二区欧美日韩| heyzo一本久久综合| www国产亚洲精品久久麻豆| 午夜国产精品影院在线观看| 99精品久久久久久| 日本一区二区三区四区| 麻豆成人av在线| 制服丝袜亚洲播放| 亚洲综合视频网| 99精品欧美一区二区蜜桃免费| 久久久久久久久久久久久夜| 婷婷成人综合网| 91网站最新网址| 日本一区二区动态图| 国产曰批免费观看久久久| 91精品国产高清一区二区三区 | 欧美精品第一页| 亚洲欧洲综合另类| 99久久精品国产网站| 日韩美女啊v在线免费观看| 99精品偷自拍| 亚洲国产高清在线| 国产河南妇女毛片精品久久久| 欧美激情在线一区二区三区| 床上的激情91.| 国产精品久久久久久久岛一牛影视| 成人黄页毛片网站| 亚洲欧洲综合另类在线| 欧美色综合天天久久综合精品| 午夜精品视频一区| 欧美电视剧免费观看| 国产真实乱偷精品视频免| 久久久久久久国产精品影院| 成人妖精视频yjsp地址| 亚洲天堂免费看| 91精品国产综合久久香蕉的特点| 美女精品一区二区| 欧美国产日产图区| 欧美午夜片在线观看| 日韩高清不卡一区二区三区| 欧美三级蜜桃2在线观看| 欧美成人性战久久| 国产成人aaa| 亚洲码国产岛国毛片在线| 欧美日韩一区不卡| 精品亚洲国产成人av制服丝袜| 国产欧美日韩不卡| 欧美无乱码久久久免费午夜一区| 日韩电影在线观看一区| 久久精品网站免费观看| 日本久久一区二区| 毛片一区二区三区| 国产精品理论片| 欧美日韩色一区| 福利电影一区二区三区| 亚洲人成网站精品片在线观看| 制服丝袜在线91| 成人精品视频一区| 欧美a一区二区| 国产精品久久久久久久裸模| 欧美日韩成人综合| 国产成人午夜精品影院观看视频 | 色婷婷综合中文久久一本| 天天做天天摸天天爽国产一区| 久久亚洲影视婷婷| 欧美色成人综合| 粉嫩绯色av一区二区在线观看| 亚洲国产精品麻豆| 国产日韩精品一区二区三区 | 麻豆成人久久精品二区三区红| 国产精品久久久久久户外露出 | 日本美女一区二区三区| 国产精品日产欧美久久久久| 777亚洲妇女| 99久久精品免费精品国产| 精品制服美女久久| 一级精品视频在线观看宜春院 | 精品亚洲成a人| 中文字幕一区视频| 91久久精品网| 亚洲综合图片区| 久久色在线观看| 在线看国产日韩| 韩日精品视频一区| 亚洲欧美偷拍卡通变态| 91精品一区二区三区久久久久久 | 国产成人免费av在线| 亚洲午夜羞羞片| 国产日产亚洲精品系列| 精品视频1区2区| 国产成人免费视频网站高清观看视频| 亚洲激情男女视频| 久久久久久一二三区| 欧美揉bbbbb揉bbbbb| 国产精品一二三四五| 一区二区三区在线观看视频| 欧美v日韩v国产v| 欧美日韩在线播| 欧美视频三区在线播放| 91免费观看视频在线| 床上的激情91.| 国产成人自拍在线| 久草热8精品视频在线观看| 日韩va欧美va亚洲va久久| 一区二区三区在线视频观看58| 中文字幕一区日韩精品欧美| 久久视频一区二区| 久久伊99综合婷婷久久伊| 欧美一级片在线| 欧美肥大bbwbbw高潮| 欧美日韩亚州综合| 欧美日韩日日骚| 欧美日韩成人一区二区| 在线观看成人免费视频| 91国产丝袜在线播放| 91一区二区三区在线观看| kk眼镜猥琐国模调教系列一区二区| 懂色av一区二区三区免费看| 国产寡妇亲子伦一区二区| 国产宾馆实践打屁股91| 国产精品一区二区果冻传媒| 国产精品1区二区.| 国产精品99久久久久| 国产·精品毛片| 丁香激情综合国产| av福利精品导航| 一本大道久久a久久综合| 91免费观看国产| 欧美三级视频在线观看| 在线成人av影院| 欧美一区二区三区四区视频| 欧美成人一区二区三区片免费 | 成人av电影免费观看| 99久精品国产| 色播五月激情综合网| 制服丝袜亚洲播放| 久久你懂得1024| 亚洲视频一二区| 亚洲成人黄色影院|