- added client event type selection (evmask)

- added new types of events (dev/cfg) for proto v1
pull/15/head
John Tsiombikas 2022-03-21 08:53:15 +02:00
rodzic 97b2deda3a
commit 75aea89e55
3 zmienionych plików z 80 dodań i 8 usunięć

12
proto.h
Wyświetl plik

@ -4,6 +4,16 @@
/* maximum supported protocol version */
#define MAX_PROTO_VER 1
enum {
UEV_MOTION,
UEV_PRESS,
UEV_RELEASE,
UEV_DEV,
UEV_CFG,
MAX_UEV
};
struct reqresp {
int type;
int data[7];
@ -23,6 +33,8 @@ enum {
REQ_SET_NAME = REQ_BASE,/* set client name: Q[0-6] name - R[6] status */
REQ_SET_SENS, /* set client sensitivity: Q[0] float - R[6] status */
REQ_GET_SENS, /* get client sensitivity: R[0] float R[6] status */
REQ_SET_EVMASK, /* set event mask: Q[0] mask - R[6] status */
REQ_GET_EVMASK, /* get event mask: R[0] mask R[6] status */
/* device queries */
REQ_DEV_NAME = 0x2000, /* get device name: R[0] length R[6] status followed

36
spnav.c
Wyświetl plik

@ -390,20 +390,46 @@ static int read_event(int s, spnav_event *event)
return 0;
}
if(data[0] < 0 || data[0] > 2) {
return proc_event(data, event);
}
static int proc_event(int *data, spnav_event *event)
{
if(data[0] < 0 || data[0] >= MAX_UEV) {
return 0;
}
event->type = data[0] ? SPNAV_EVENT_BUTTON : SPNAV_EVENT_MOTION;
if(data[0] == UEV_PRESS || data[0] == UEV_RELEASE) {
event->type = SPNAV_EVENT_BUTTON;
} else {
event->type = data[0];
}
if(event->type == SPNAV_EVENT_MOTION) {
switch(event->type) {
case SPNAV_EVENT_MOTION:
event->motion.data = &event->motion.x;
for(i=0; i<6; i++) {
event->motion.data[i] = data[i + 1];
}
event->motion.period = data[7];
} else {
event->button.press = data[0] == 1 ? 1 : 0;
break;
case SPNAV_EVENT_BUTTON:
event->button.press = data[0] == UEV_PRESS ? 1 : 0;
event->button.bnum = data[1];
break;
case SPNAV_EVENT_DEV:
event->dev.op = data[1];
event->dev.id = data[2];
event->dev.devtype = data[3];
event->dev.usbid[0] = data[4];
event->dev.usbid[1] = data[5];
break;
case SPNAV_EVENT_CFG:
event->cfg.cfg = data[1];
memcpy(event->cfg.data, data + 2, sizeof event->cfg.data);
break;
}
return event->type;

40
spnav.h
Wyświetl plik

@ -36,11 +36,16 @@ OF SUCH DAMAGE.
enum {
SPNAV_EVENT_ANY, /* used by spnav_remove_events() */
SPNAV_EVENT_MOTION,
SPNAV_EVENT_BUTTON /* includes both press and release */
SPNAV_EVENT_BUTTON, /* includes both press and release */
SPNAV_EVENT_DEV = 4,/* add/remove device event */
SPNAV_EVENT_CFG /* configuration change event */
};
enum { SPNAV_DEV_ADD, SPNAV_DEV_RM };
struct spnav_event_motion {
int type;
int type; /* SPNAV_EVENT_MOTION */
int x, y, z;
int rx, ry, rz;
unsigned int period;
@ -48,15 +53,31 @@ struct spnav_event_motion {
};
struct spnav_event_button {
int type;
int type; /* SPNAV_EVENT_BUTTON */
int press;
int bnum;
};
struct spnav_event_dev {
int type; /* SPNAV_EVENT_DEV */
int op; /* SPNAV_DEV_ADD / SPNAV_DEV_RM */
int id;
int devtype; /* see spnav_dev_type() */
int usbid[2]; /* USB id if it's a USB device, 0:0 if it's a serial device */
};
struct spnav_event_cfg {
int type; /* SPNAV_EVENT_CFG */
int cfg; /* same as protocol REQ_GCFG* enum */
int data[6]; /* same as protocol response data 0-5 */
};
typedef union spnav_event {
int type;
struct spnav_event_motion motion;
struct spnav_event_button button;
struct spnav_event_dev dev;
struct spnav_event_cfg cfg;
} spnav_event;
@ -146,6 +167,19 @@ int spnav_protocol(void);
/* Set client name */
int spnav_client_name(const char *name);
/* Select the types of events the client is interested in receiving */
enum {
SPNAV_EVMASK_MOTION = 1, /* 6dof motion events */
SPNAV_EVMASK_BUTTON = 2, /* button events */
SPNAV_EVMASK_DEV = 4, /* device change events */
SPNAV_EVMASK_CFG = 8, /* configuration change events */
SPNAV_EVMASK_INPUT = SPNAV_EVMASK_MOTION | SPNAV_EVMASK_BUTTON,
SPNAV_EVMASK_DEFAULT = SPNAV_EVMASK_INPUT | SPNAV_EVMASK_DEV,
SPNAV_EVMASK_ALL = 0xffff
};
int spnav_evmask(unsigned int mask);
/* TODO multi-device support and device selection not implemented yet
int spnav_num_devices(void);
int spnav_select_device(int dev);