kopia lustrzana https://github.com/FreeSpacenav/spacenavd
- introduced explicit swap-yz config state, which acts separately to the
axis mapping. This way mappings won't swap around by themselves when swap is turned on or off. - fixed automatic LED handling.pull/68/head
rodzic
bea696f24f
commit
01e59bed7a
|
@ -57,7 +57,7 @@ static int add_cfgopt_devid(int vid, int pid);
|
|||
|
||||
enum {TX, TY, TZ, RX, RY, RZ};
|
||||
|
||||
static const int def_axmap[] = {0, 2, 1, 3, 5, 4};
|
||||
static const int def_axmap[] = {0, 1, 2, 3, 4, 5};
|
||||
static const int def_axinv[] = {0, 1, 1, 0, 1, 1};
|
||||
|
||||
struct cfgline {
|
||||
|
@ -85,6 +85,7 @@ void default_cfg(struct cfg *cfg)
|
|||
cfg->dead_threshold[i] = 2;
|
||||
}
|
||||
|
||||
cfg->swapyz = 1;
|
||||
cfg->led = LED_ON;
|
||||
cfg->grab_device = 1;
|
||||
|
||||
|
@ -329,26 +330,20 @@ int read_cfg(const char *fname, struct cfg *cfg)
|
|||
}
|
||||
|
||||
} else if(strcmp(key_str, "swap-yz") == 0) {
|
||||
int swap_yz = 0;
|
||||
|
||||
lptr->opt = CFG_SWAPYZ;
|
||||
if(isint) {
|
||||
swap_yz = ival;
|
||||
cfg->swapyz = ival;
|
||||
} else {
|
||||
if(strcmp(val_str, "true") == 0 || strcmp(val_str, "on") == 0 || strcmp(val_str, "yes") == 0) {
|
||||
swap_yz = 1;
|
||||
cfg->swapyz = 1;
|
||||
} else if(strcmp(val_str, "false") == 0 || strcmp(val_str, "off") == 0 || strcmp(val_str, "no") == 0) {
|
||||
swap_yz = 0;
|
||||
cfg->swapyz = 0;
|
||||
} else {
|
||||
logmsg(LOG_WARNING, "invalid configuration value for %s, expected a boolean value.\n", key_str);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
for(i=0; i<6; i++) {
|
||||
cfg->map_axis[i] = swap_yz ? i : def_axmap[i];
|
||||
}
|
||||
|
||||
} else if(sscanf(key_str, "axismap%d", &axisidx) == 1) {
|
||||
EXPECT(isint);
|
||||
if(axisidx < 0 || axisidx >= MAX_AXES) {
|
||||
|
@ -565,6 +560,10 @@ int write_cfg(const char *fname, struct cfg *cfg)
|
|||
}
|
||||
}
|
||||
|
||||
if(cfg->swapyz != def.swapyz) {
|
||||
add_cfgopt(CFG_SWAPYZ, 0, "swap-yz = %s", cfg->swapyz ? "true" : "false");
|
||||
}
|
||||
|
||||
if(cfg->led != def.led) {
|
||||
add_cfgopt(CFG_LED, 0, "led = %s", (cfg->led ? (cfg->led == LED_AUTO ? "auto" : "on") : "off"));
|
||||
}
|
||||
|
|
|
@ -52,6 +52,7 @@ struct cfg {
|
|||
int bnact[MAX_BUTTONS];
|
||||
int kbmap[MAX_BUTTONS];
|
||||
char *kbmap_str[MAX_BUTTONS];
|
||||
int swapyz;
|
||||
int led, grab_device;
|
||||
char serial_dev[PATH_MAX];
|
||||
int repeat_msec;
|
||||
|
|
29
src/event.c
29
src/event.c
|
@ -125,6 +125,21 @@ static struct dev_event *device_event_in_use(struct device *dev)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static inline int map_axis(int devaxis)
|
||||
{
|
||||
const static int swaptab[] = {0, 2, 1, 3, 5, 4};
|
||||
|
||||
int axis = cfg.map_axis[devaxis];
|
||||
if(axis < 0 || axis >= 6) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(!cfg.swapyz) {
|
||||
return swaptab[axis];
|
||||
}
|
||||
return axis;
|
||||
}
|
||||
|
||||
/* process_input processes an device input event, and dispatches
|
||||
* spacenav events to the clients by calling dispatch_event.
|
||||
* relative inputs (INP_MOTION) are accumulated, and dispatched when
|
||||
|
@ -133,7 +148,7 @@ static struct dev_event *device_event_in_use(struct device *dev)
|
|||
*/
|
||||
void process_input(struct device *dev, struct dev_input *inp)
|
||||
{
|
||||
int sign;
|
||||
int sign, axis;
|
||||
struct dev_event *dev_ev;
|
||||
float sens_rot, sens_trans;
|
||||
|
||||
|
@ -142,15 +157,15 @@ void process_input(struct device *dev, struct dev_input *inp)
|
|||
if(abs(inp->val) < cfg.dead_threshold[inp->idx] ) {
|
||||
inp->val = 0;
|
||||
}
|
||||
if((inp->idx = cfg.map_axis[inp->idx]) < 0) {
|
||||
if((axis = map_axis(inp->idx)) == -1) {
|
||||
break;
|
||||
}
|
||||
sign = cfg.invert[inp->idx] ? -1 : 1;
|
||||
sign = cfg.invert[axis] ? -1 : 1;
|
||||
|
||||
sens_rot = disable_rotation ? 0 : cfg.sens_rot[inp->idx - 3];
|
||||
sens_trans = disable_translation ? 0 : cfg.sens_trans[inp->idx];
|
||||
sens_rot = disable_rotation ? 0 : cfg.sens_rot[axis - 3];
|
||||
sens_trans = disable_translation ? 0 : cfg.sens_trans[axis];
|
||||
|
||||
inp->val = (int)((float)inp->val * cfg.sensitivity * (inp->idx < 3 ? sens_trans : sens_rot));
|
||||
inp->val = (int)((float)inp->val * cfg.sensitivity * (axis < 3 ? sens_trans : sens_rot));
|
||||
|
||||
dev_ev = device_event_in_use(dev);
|
||||
if(verbose && dev_ev == NULL)
|
||||
|
@ -161,7 +176,7 @@ void process_input(struct device *dev, struct dev_input *inp)
|
|||
}
|
||||
dev_ev->event.type = EVENT_MOTION;
|
||||
dev_ev->event.motion.data = (int*)&dev_ev->event.motion.x;
|
||||
dev_ev->event.motion.data[inp->idx] = sign * inp->val;
|
||||
dev_ev->event.motion.data[axis] = sign * inp->val;
|
||||
dev_ev->pending = 1;
|
||||
break;
|
||||
|
||||
|
|
|
@ -63,6 +63,8 @@ enum {
|
|||
REQ_GCFG_BNACTION, /* get button action: Q[0] bidx - R[0] bidx R[1] action R[6] status */
|
||||
REQ_SCFG_KBMAP, /* set keyboard mapping: Q[0] bidx Q[1] keysym - R[6] status */
|
||||
REQ_GCFG_KBMAP, /* get keyboard mapping: Q[0] bidx - R[0] bidx R[1] keysym R[6] status */
|
||||
REQ_SCFG_SWAPYZ, /* set Y-Z axis swap: Q[0] swap - R[6] status */
|
||||
REQ_GCFG_SWAPYZ, /* get Y-Z axis swap: R[0] swap R[6] status */
|
||||
REQ_SCFG_LED, /* set LED state: Q[0] state - R[6] status */
|
||||
REQ_GCFG_LED, /* get LED state: R[0] state R[6] status */
|
||||
REQ_SCFG_GRAB, /* set device grabbing: Q[0] state - R[6] status */
|
||||
|
|
|
@ -543,11 +543,22 @@ static int handle_request(struct client *c, struct reqresp *req)
|
|||
#endif
|
||||
break;
|
||||
|
||||
case REQ_SCFG_SWAPYZ:
|
||||
cfg.swapyz = req->data[0] ? 1 : 0;
|
||||
sendresp(c, req, 0);
|
||||
|
||||
case REQ_GCFG_SWAPYZ:
|
||||
req->data[0] = cfg.swapyz;
|
||||
sendresp(c, req, 0);
|
||||
break;
|
||||
|
||||
case REQ_SCFG_LED:
|
||||
cfg.led = req->data[0] ? 1 : 0;
|
||||
if((dev = get_client_device(c)) && dev->set_led) {
|
||||
dev->set_led(dev, cfg.led);
|
||||
if(req->data[0] < 0 || req->data[0] >= 3) {
|
||||
sendresp(c, req, -1);
|
||||
break;
|
||||
}
|
||||
cfg.led = req->data[0];
|
||||
cfg_changed();
|
||||
sendresp(c, req, 0);
|
||||
break;
|
||||
|
||||
|
|
|
@ -448,9 +448,13 @@ void cfg_changed(void)
|
|||
while(dev) {
|
||||
if(is_device_valid(dev)) {
|
||||
if(verbose) {
|
||||
logmsg(LOG_INFO, "turn led %s, device: %s\n", cfg.led ? "on": "off", dev->name);
|
||||
logmsg(LOG_INFO, "led %s, device: %s\n", cfg.led ? (cfg.led == LED_AUTO ? "auto" : "on"): "off", dev->name);
|
||||
}
|
||||
if(cfg.led == LED_ON || (cfg.led == LED_AUTO && first_client())) {
|
||||
set_device_led(dev, 1);
|
||||
} else {
|
||||
set_device_led(dev, 0);
|
||||
}
|
||||
set_device_led(dev, cfg.led);
|
||||
}
|
||||
dev = dev->next;
|
||||
}
|
||||
|
|
Ładowanie…
Reference in New Issue