int main(int argc, char **argv) { int ret = 0; char *path = NULL; struct xwii_iface *iface; if (argc > 2 || (argc == 2 && (strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "--help") == 0))) { printf("This is %s version %s.\n\n", PACKAGE, VERSION); printf("Usage: %s [-h | --help] [-o | --once]\n", argv[0]); printf("\t-h\t--help\tShow this information.\n"); printf("\t-o\t--once\tFind one device and do not try to rediscover.\n"); return 1; } while (true) { struct xwii_monitor *mon = xwii_monitor_new(false, false); if (!mon) { printf("Cannot create monitor\n"); return 2; } path = xwii_monitor_poll(mon); xwii_monitor_unref(mon); usleep(100000); if (path != NULL) { ret = xwii_iface_new(&iface, path); if (ret) { printf("Error newing '%s' err:%d\n", path, ret); } else { ret = xwii_iface_open(iface, XWII_IFACE_CORE | XWII_IFACE_WRITABLE); if (ret) { printf("Error opening '%s' err:%d\n", path, ret); } else { ret = run_once(iface); if (ret) { printf("Event-Loop exit with status %d\n", ret); } } } free(path); xwii_iface_unref(iface); } if (argc >= 2 && (strcmp(argv[1], "-o") == 0 || strcmp(argv[1], "--once") == 0)) break; } return ret; }
int dev_create(struct wiimote_dev *dev) { int ret = 0; struct udev *udev; struct udev_device *d, *p; struct stat st; const char *root, *snum, *driver, *subs; int num; if (!dev->device) { ret = EINVAL; goto exit; } if (stat(dev->device, &st)) { ret = errno; goto exit; } udev = udev_new(); if (!udev) { fputs("could not connect to udev\n", stderr); ret = errno; goto exit; } d = udev_device_new_from_devnum(udev, 'c', st.st_rdev); if (!d) { fputs("could not find udev device\n", stderr); ret = errno; goto exit_udev; } p = udev_device_get_parent_with_subsystem_devtype(d, "hid", NULL); if (!p) { fputs("could not find parent HID device\n", stderr); ret = errno; goto exit_dev; } driver = udev_device_get_driver(p); subs = udev_device_get_subsystem(p); if (!driver || strcmp(driver, "wiimote") || !subs || strcmp(subs, "hid")) { fputs("parent is not a HID Wiimote\n", stderr); ret = errno; goto exit_dev; } root = udev_device_get_syspath(p); snum = udev_device_get_sysname(p); snum = snum ? strchr(snum, '.') : NULL; if (!root || !snum) { fputs("Could not get root path\n", stderr); ret = errno; goto exit_dev; } num = strtol(&snum[1], NULL, 16); if (num < 0) { fputs("Negative device number!\n", stderr); ret = errno; goto exit_dev; } dev->dev_id = num; dev->root = strdup(root); if (!dev->root) { fputs("Could not set device root\n", stderr); ret = errno; goto exit_dev; } printf("using device %d from root %s for %s\n", dev->dev_id, dev->root, dev->device); dev->ifs = XWII_IFACE_CORE | XWII_IFACE_ACCEL; ret = xwii_iface_new(&dev->iface, dev->root); if (ret) { fputs("Could not create xwiimote interface\n", stderr); ret = errno; goto exit_wii; } ret = xwii_iface_open(dev->iface, dev->ifs); if (ret) { fputs("Could not open xwiimote interface\n", stderr); ret = errno; goto exit_wii; } if (xwii_iface_opened(dev->iface) != dev->ifs) { fputs("Some interfaces failed to open\n", stderr); ret = errno; goto exit_wii; } dev->fd = xwii_iface_get_fd(dev->iface); goto exit_dev; exit_wii: free(dev->root); dev->root = NULL; exit_dev: udev_device_unref(d); exit_udev: udev_unref(udev); exit: return ret; }
static int wiimote_refresh(struct wiimote_dev *dev) { puts("Refreshing\n"); return xwii_iface_open(dev->iface, dev->ifs); }
int open_wii_device(struct wiimoteglue_state *state, struct wii_device* dev) { if (dev->xwii != NULL) { return 0; //Already open. } if (dev->udev == NULL) { return -1; //Not even connected. } int i; struct xwii_iface *wiidev; char* syspath = udev_device_get_syspath(dev->udev); if (syspath == NULL) return -1; xwii_iface_new(&wiidev,syspath); xwii_iface_watch(wiidev,true); xwii_iface_open(wiidev, XWII_IFACE_WRITABLE | (XWII_IFACE_ALL ^ XWII_IFACE_ACCEL ^ XWII_IFACE_IR ^ XWII_IFACE_MOTION_PLUS)); if (!(xwii_iface_available(wiidev) & (XWII_IFACE_CORE | XWII_IFACE_PRO_CONTROLLER | XWII_IFACE_BALANCE_BOARD))) { printf("Tried to open a non-wiimote device...\n"); printf("Or we didn't have permission on the event devices?\n"); printf("You might need to add a udev rule to give permission.\n"); xwii_iface_unref(wiidev); return -1; } dev->xwii = wiidev; dev->ifaces = xwii_iface_opened(wiidev); if (state->ignore_pro && (dev->ifaces & XWII_IFACE_PRO_CONTROLLER)) { xwii_iface_unref(wiidev); dev->xwii = NULL; return 0; } dev->type = REMOTE; if (dev->ifaces & XWII_IFACE_BALANCE_BOARD) { dev->type = BALANCE; } if (dev->ifaces & XWII_IFACE_PRO_CONTROLLER) { dev->type = PRO; } dev->fd = xwii_iface_get_fd(wiidev); wiimoteglue_epoll_watch_wiimote(state->epfd, dev); compute_device_map(state,dev); if (dev->map->accel_active) { xwii_iface_open(wiidev,XWII_IFACE_ACCEL); } else { xwii_iface_close(wiidev,XWII_IFACE_ACCEL); } if (dev->map->IR_count) { xwii_iface_open(wiidev,XWII_IFACE_IR); } else { xwii_iface_close(wiidev,XWII_IFACE_IR); } /*LEDs only checked after opening, *and we want to store the state *only on the very initial opening.*/ if (dev->original_leds[0] == -2) store_led_state(state,dev); return 0; }