WindowsMouse::WindowsMouse(DeviceAPI api, int hWheel, wchar_t *displayName, wchar_t *instanceID, wchar_t *deviceID) : Device(api, MOUSE, displayName, instanceID, deviceID) { int i; for (i = 0; i < 5; i++) { AddPhysicalControl(PSHBTN, i, i); } for (i = 0; i < 3 + hWheel; i++) { AddPhysicalControl(RELAXIS, i + 5, i + 5); } }
WindowsKeyboard::WindowsKeyboard(DeviceAPI api, wchar_t *displayName, wchar_t *instanceID, wchar_t *deviceID) : Device(api, KEYBOARD, displayName, instanceID, deviceID) { for (int i=0; i<256; i++) { AddPhysicalControl(PSHBTN, i, i); } }
JoyEvdev::JoyEvdev(int fd, bool ds3, const wchar_t *id) : Device(LNX_JOY, OTHER, id, id) , m_fd(fd) { // XXX LNX_JOY => DS3 or ??? m_abs.clear(); m_btn.clear(); m_rel.clear(); int last = 0; uint8_t abs_bitmap[nUcharsForNBits(ABS_CNT)] = {0}; uint8_t btn_bitmap[nUcharsForNBits(KEY_CNT)] = {0}; uint8_t rel_bitmap[nUcharsForNBits(REL_CNT)] = {0}; // Add buttons if (ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(btn_bitmap)), btn_bitmap) >= 0) { for (int bit = BTN_MISC; bit < KEY_CNT; bit++) { if (testBit(bit, btn_bitmap)) { AddPhysicalControl(PSHBTN, last, 0); m_btn.push_back(bit); last++; } } } // Add Absolute axis if (ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(abs_bitmap)), abs_bitmap) >= 0) { for (int bit = 0; bit < ABS_CNT; bit++) { ControlType type = ABSAXIS; // FIXME DS3 if (testBit(bit, abs_bitmap)) { input_absinfo info; if (ioctl(m_fd, EVIOCGABS(bit), &info) < 0) { fprintf(stderr, "Invalid IOCTL EVIOCGID\n"); continue; } AddPhysicalControl(ABSAXIS, last, 0); last++; if (std::abs(info.value - 127) < 2) { fprintf(stderr, "HALF Axis info %d=>%d, current %d, flat %d, resolution %d\n", info.minimum, info.maximum, info.value, info.flat, info.resolution); // Half axis must be split into 2 parts... AddPhysicalControl(ABSAXIS, last, 0); last++; m_abs.push_back(abs_info(bit, info.minimum, info.value, type)); m_abs.push_back(abs_info(bit, info.value, info.maximum, type)); } else { fprintf(stderr, "FULL Axis info %d=>%d, current %d, flat %d, resolution %d\n", info.minimum, info.maximum, info.value, info.flat, info.resolution); m_abs.push_back(abs_info(bit, info.minimum, info.maximum, type)); } } } } // Add relative axis if (ioctl(fd, EVIOCGBIT(EV_REL, sizeof(rel_bitmap)), rel_bitmap) >= 0) { for (int bit = 0; bit < REL_CNT; bit++) { if (testBit(bit, rel_bitmap)) { AddPhysicalControl(RELAXIS, last, last); m_rel.push_back(bit); last++; fprintf(stderr, "Add relative nb %d\n", bit); } } } fprintf(stderr, "New device created. Found axe:%zu, buttons:%zu, m_rel:%zu\n\n", m_abs.size(), m_btn.size(), m_rel.size()); }