LINUX.ORG.RU

# Битовые коды

Слушаю мышь, вот так вот определяется одна из трех стандартных нажатых кнопок. У мыши всего 7 кнопок включая колесо, 1 из нестандартных сигналит как средня, 2 как левая. Как определить 2 нестандартные кнопки?

``````button=ptr[0];
bLeft = button & 0x1;
bMiddle = ( button & 0x4 ) > 0;
bRight = ( button & 0x2 ) > 0;``````
``````/*
* Relative axes
*/

#define REL_X			0x00
#define REL_Y			0x01
#define REL_Z			0x02
#define REL_RX			0x03
#define REL_RY			0x04
#define REL_RZ			0x05
#define REL_HWHEEL		0x06
#define REL_DIAL		0x07
#define REL_WHEEL		0x08
#define REL_MISC		0x09
#define REL_MAX			0x0f
#define REL_CNT			(REL_MAX+1)

/*
* Absolute axes
*/

#define ABS_X			0x00
#define ABS_Y			0x01
#define ABS_Z			0x02
#define ABS_RX			0x03
#define ABS_RY			0x04
#define ABS_RZ			0x05
#define ABS_THROTTLE		0x06
#define ABS_RUDDER		0x07
#define ABS_WHEEL		0x08
#define ABS_GAS			0x09
#define ABS_BRAKE		0x0a
#define ABS_HAT0X		0x10
#define ABS_HAT0Y		0x11
#define ABS_HAT1X		0x12
#define ABS_HAT1Y		0x13
#define ABS_HAT2X		0x14
#define ABS_HAT2Y		0x15
#define ABS_HAT3X		0x16
#define ABS_HAT3Y		0x17
#define ABS_PRESSURE		0x18
#define ABS_DISTANCE		0x19
#define ABS_TILT_X		0x1a
#define ABS_TILT_Y		0x1b
#define ABS_TOOL_WIDTH		0x1c

#define ABS_VOLUME		0x20

#define ABS_MISC		0x28

#define ABS_MT_SLOT		0x2f	/* MT slot being modified */
#define ABS_MT_TOUCH_MAJOR	0x30	/* Major axis of touching ellipse */
#define ABS_MT_TOUCH_MINOR	0x31	/* Minor axis (omit if circular) */
#define ABS_MT_WIDTH_MAJOR	0x32	/* Major axis of approaching ellipse */
#define ABS_MT_WIDTH_MINOR	0x33	/* Minor axis (omit if circular) */
#define ABS_MT_ORIENTATION	0x34	/* Ellipse orientation */
#define ABS_MT_POSITION_X	0x35	/* Center X touch position */
#define ABS_MT_POSITION_Y	0x36	/* Center Y touch position */
#define ABS_MT_TOOL_TYPE	0x37	/* Type of touching device */
#define ABS_MT_BLOB_ID		0x38	/* Group a set of packets as a blob */
#define ABS_MT_TRACKING_ID	0x39	/* Unique ID of initiated contact */
#define ABS_MT_PRESSURE		0x3a	/* Pressure on contact area */
#define ABS_MT_DISTANCE		0x3b	/* Contact hover distance */
#define ABS_MT_TOOL_X		0x3c	/* Center X tool position */
#define ABS_MT_TOOL_Y		0x3d	/* Center Y tool position */

#define ABS_MAX			0x3f
#define ABS_CNT			(ABS_MAX+1)

``````

xev

beastie ★★★★★ ()

вопрос остается открытым, как правильно использовать битовые поля?

ferz ()
Ответ на: комментарий от ferz

Я не понимаю, что ты написал. Если тебе нужен протокол hid устройства, по которому мышка работает, то возьми hid дескриптор мышки(где-то в в /sys кажется) и распарси его(в интернете есть программа)

urquan ()
Ответ на: комментарий от ferz

# @here

Народ, а почему в ведре не используются enum'ы, почему только препроцессор?

Stil ★★★★★ ()
Ответ на: @here от Stil

используются только подругому

ferz ()
Ответ на: комментарий от ferz

Какой файл, ты о чём?

urquan ()

bLeft = button & 0x1;

эх, быдлокодеры! когда ж вы уже волшебные константы перестанете в код пихать

anonymous ()
Ответ на: комментарий от anonymous

Это даже не волшебная константа, а просто проверка первого бита.

Ты волшебных констант в волшебных регистрах видимо не видел.

Dark_SavanT ★★★★★ ()
Ответ на: комментарий от Dark_SavanT

Это даже не волшебная константа, а просто проверка первого бита.

нет, это она самая, для проверки битов есть именованые маски через define, вроде FIRST_BUTTON_MASK

Ты волшебных констант в волшебных регистрах видимо не видел.

я и не такое видел, не думай что ты один тут быдлокод читал

anonymous ()
19 июня 2017 г.

Вопрос к ТС. Хочу тут плагин геймпада пропатчить, чтоб в старом дистре работал. Поменять ABS_CNT на ABS_MAX + 1. Но у меня не получается - не собирается или не работает. Можешь помочь?

ZenitharChampion ★★★★★ ()

Кусочек твоего кода помог. Оказалось что эти переменные добавили в ядре 2.6.31, а у меня - 2.6.18.

``````#ifndef ABS_CNT
#define ABS_CNT	(ABS_MAX+1)
#endif
#ifndef KEY_CNT
#define KEY_CNT	(KEY_MAX+1)
#endif
#ifndef REL_CNT
#define REL_CNT	(REL_MAX+1)
#endif
``````

Сейчас буду пробовать на самом устройстве.

ZenitharChampion ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.