Add spnav_set_nonblocking
This commit is contained in:
parent
f37537fa83
commit
f654a62bdb
4
main.c
4
main.c
@ -24,8 +24,10 @@ int main(int argc, char const* argv[]) {
|
|||||||
spnav_open(SPNAV_VENDOR_ID, SPNAV_3D_EXPLORER_PRODUCT_ID);
|
spnav_open(SPNAV_VENDOR_ID, SPNAV_3D_EXPLORER_PRODUCT_ID);
|
||||||
spnav_sensitivity(0.1);
|
spnav_sensitivity(0.1);
|
||||||
spnav_deadzone(10);
|
spnav_deadzone(10);
|
||||||
|
spnav_set_nonblocking(true);
|
||||||
for (;;) {
|
for (;;) {
|
||||||
spnav_wait_event_timeout(&ev, 400);
|
// spnav_wait_event_timeout(&ev, 400);
|
||||||
|
spnav_wait_event(&ev);
|
||||||
|
|
||||||
switch (ev.type) {
|
switch (ev.type) {
|
||||||
case MOTION:
|
case MOTION:
|
||||||
|
29
spnav.c
29
spnav.c
@ -15,6 +15,8 @@
|
|||||||
} while (false)
|
} while (false)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define EVENT_BUF 64
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
TRANSLATION = 1,
|
TRANSLATION = 1,
|
||||||
ROTATION = 2,
|
ROTATION = 2,
|
||||||
@ -56,8 +58,15 @@ bool in_deadzone(unsigned char *data, int threshold) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int read_event(hid_device *device, spnav_event *ev, int ms) {
|
int read_event(hid_device *device, spnav_event *ev, int ms) {
|
||||||
unsigned char buf[64];
|
unsigned char buf[EVENT_BUF];
|
||||||
int nbytes = hid_read_timeout(device, buf, sizeof(buf), ms);
|
int nbytes;
|
||||||
|
|
||||||
|
if (ms == -1) {
|
||||||
|
nbytes = hid_read(device, buf, sizeof(buf));
|
||||||
|
} else {
|
||||||
|
nbytes = hid_read_timeout(device, buf, sizeof(buf), ms);
|
||||||
|
}
|
||||||
|
|
||||||
if (nbytes < 0) {
|
if (nbytes < 0) {
|
||||||
DEBUG_PRINT("hid_read_timeout() error");
|
DEBUG_PRINT("hid_read_timeout() error");
|
||||||
return -1;
|
return -1;
|
||||||
@ -67,6 +76,7 @@ int read_event(hid_device *device, spnav_event *ev, int ms) {
|
|||||||
}
|
}
|
||||||
ev->type = buf[0];
|
ev->type = buf[0];
|
||||||
|
|
||||||
|
// Fill spnav_event struct
|
||||||
switch (ev->type) {
|
switch (ev->type) {
|
||||||
case TRANSLATION:
|
case TRANSLATION:
|
||||||
if (in_deadzone(buf, SPNAV_DEADZONE_THRESHOLD)) {
|
if (in_deadzone(buf, SPNAV_DEADZONE_THRESHOLD)) {
|
||||||
@ -134,25 +144,35 @@ int spnav_open(unsigned short vendor_id, unsigned short product_id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int spnav_close() {
|
int spnav_close() {
|
||||||
DEBUG_PRINT("spnav_close()\n");
|
|
||||||
if (!IS_OPEN) {
|
if (!IS_OPEN) {
|
||||||
|
DEBUG_PRINT("Device is not opened!\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
set_led(device, 0);
|
set_led(device, 0);
|
||||||
hid_close(device);
|
hid_close(device);
|
||||||
|
DEBUG_PRINT("Connection to HID device closed!\n");
|
||||||
hid_exit();
|
hid_exit();
|
||||||
IS_OPEN = false;
|
IS_OPEN = false;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int spnav_set_nonblocking(bool nonblock) {
|
||||||
|
int ret = hid_set_nonblocking(device, nonblock);
|
||||||
|
if (ret == -1) {
|
||||||
|
DEBUG_PRINT("Call to hid_set_nonblocking() failed\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
DEBUG_PRINT("Nonblocking state is now %d\n", nonblock);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int spnav_wait_event(spnav_event *event) {
|
int spnav_wait_event(spnav_event *event) {
|
||||||
if (device == NULL) {
|
if (device == NULL) {
|
||||||
DEBUG_PRINT("spnav_wait_event(): device not connected.\n");
|
DEBUG_PRINT("spnav_wait_event(): device not connected.\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return read_event(device, event, -1);
|
return read_event(device, event, -1);
|
||||||
;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int spnav_wait_event_timeout(spnav_event *event, int milliseconds) {
|
int spnav_wait_event_timeout(spnav_event *event, int milliseconds) {
|
||||||
@ -161,7 +181,6 @@ int spnav_wait_event_timeout(spnav_event *event, int milliseconds) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return read_event(device, event, milliseconds);
|
return read_event(device, event, milliseconds);
|
||||||
;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int spnav_sensitivity(double sens) {
|
int spnav_sensitivity(double sens) {
|
||||||
|
1
spnav.h
1
spnav.h
@ -46,6 +46,7 @@ extern "C" {
|
|||||||
|
|
||||||
int SPNAV_API_EXPORT_CALL spnav_open(unsigned short vendor_id, unsigned short product_id);
|
int SPNAV_API_EXPORT_CALL spnav_open(unsigned short vendor_id, unsigned short product_id);
|
||||||
int SPNAV_API_EXPORT_CALL spnav_close(void);
|
int SPNAV_API_EXPORT_CALL spnav_close(void);
|
||||||
|
int SPNAV_API_EXPORT_CALL spnav_set_nonblocking(bool nonblock);
|
||||||
int SPNAV_API_EXPORT_CALL spnav_wait_event(spnav_event *event);
|
int SPNAV_API_EXPORT_CALL spnav_wait_event(spnav_event *event);
|
||||||
int SPNAV_API_EXPORT_CALL spnav_wait_event_timeout(spnav_event *event, int timeout);
|
int SPNAV_API_EXPORT_CALL spnav_wait_event_timeout(spnav_event *event, int timeout);
|
||||||
int SPNAV_API_EXPORT_CALL spnav_sensitivity(double sens);
|
int SPNAV_API_EXPORT_CALL spnav_sensitivity(double sens);
|
||||||
|
Loading…
Reference in New Issue
Block a user