static void on_monitor_update_moved(enum MonitorEvent event, enum MonitorEventDeviceType device_type, const char *path, const wchar_t *serial, void *user_data) { move_daemon *moved = static_cast<move_daemon *>(user_data); if (event == EVENT_DEVICE_ADDED) { if (device_type == EVENT_DEVICE_TYPE_USB) { PSMove *move = psmove_connect_internal((wchar_t*)serial, (char*)path, -1); if (psmove_pair(move)) { // Indicate to the user that pairing was successful psmove_set_leds(move, 0, 255, 0); psmove_update_leds(move); } else { printf("Pairing failed for newly-connected USB device.\n"); } psmove_disconnect(move); } moved->handle_connection(path, serial); } else if (event == EVENT_DEVICE_REMOVED) { moved->handle_disconnect(path); } }
psmove_dev::psmove_dev(move_daemon *moved, const char *path, const wchar_t *serial) { if (path != NULL) { move = psmove_connect_internal((wchar_t *)serial, (char *)path, moved->count()); } else { move = psmove_connect_by_id(moved->count()); } assigned_id = moved->get_next_id(); psmove_set_rate_limiting(move, PSMove_False); }
void PSMoveManager::ConnectAll () { struct hid_device_info *devs, *cur; devs = hid_enumerate (PSMOVE_VID, PSMOVE_PID); for (auto w : m_wands) { w.second.flag = false; } uint64_t addr; for (cur = devs; cur != NULL; cur = cur->next) { /* Only consider Bluetooth devices. */ if ((cur->serial_number == NULL) || (wcslen (cur->serial_number) == 0)) { continue; } uint64_t addr = parse_btaddr (cur->serial_number); if (addr == INVALID_BTADDR) { continue; } MoveRecord &record = FindOrCreateRecord (addr); record.flag = true; if (record.controller != NULL) { continue; } record.id = AvailableID (); PSMove *move = psmove_connect_internal (cur->serial_number, cur->path, record.id); if (move == NULL) { abort (); } record.controller = CreateController (move, record.id); record.controller->Bind (this); record.flag = true; SetupController (record.controller); } hid_free_enumeration (devs); auto w = m_wands.begin (); while (w != m_wands.end ()) { auto cur = w++; if (cur->second.flag) { continue; } delete cur->second.controller; m_wands.erase (cur); } }