InputDeviceProvider_Win32Hid::InputDeviceProvider_Win32Hid(HANDLE rawinput_device) : rawinput_device(rawinput_device) { DataBuffer preparse_data = get_preparse_data(); HANDLE device = open_device(); try { find_names(device); find_button_names(device, preparse_data.get_data()); find_value_names(device, preparse_data.get_data()); CloseHandle(device); } catch (...) { CloseHandle(device); throw; } }
void InputDeviceProvider_Win32Hid::update(RAWINPUT *raw_input) { if (raw_input->header.hDevice == rawinput_device) { DataBuffer preparse_data = get_preparse_data(); for (DWORD i = 0; i < raw_input->data.hid.dwCount; i++) { BYTE *raw_data = const_cast<BYTE *>(raw_input->data.hid.bRawData); DWORD offset = i * raw_input->data.hid.dwSizeHid; void *report = raw_data + offset; int report_size = raw_input->data.hid.dwSizeHid; update(preparse_data.get_data(), report, report_size); } } }
void InputDeviceProvider_Win32Hid::update(InputDevice &joystick, RAWINPUT *raw_input) { auto previous_buttons = buttons; auto previous_axis = axis_values; //auto previous_hat = hat_values; // TODO: What about this if (raw_input->header.hDevice == rawinput_device) { DataBuffer preparse_data = get_preparse_data(); for (DWORD i = 0; i < raw_input->data.hid.dwCount; i++) { BYTE *raw_data = const_cast<BYTE *>(raw_input->data.hid.bRawData); DWORD offset = i * raw_input->data.hid.dwSizeHid; void *report = raw_data + offset; int report_size = raw_input->data.hid.dwSizeHid; update(preparse_data.get_data(), report, report_size); } } for (unsigned int cnt = 0; cnt < previous_buttons.size(); cnt++) { if (previous_buttons[cnt] != buttons[cnt]) { InputEvent input_event; input_event.type = buttons[cnt] ? InputEvent::pressed : InputEvent::released; input_event.id = (InputCode) cnt; buttons[cnt] ? joystick.sig_key_down()(input_event) : joystick.sig_key_up()(input_event); } } for (unsigned int cnt = 0; cnt < previous_axis.size(); cnt++) { if (previous_axis[cnt] != axis_values[cnt]) { InputEvent input_event; input_event.type = InputEvent::axis_moved; input_event.id = (InputCode) cnt; input_event.axis_pos = axis_values[cnt]; joystick.sig_axis_move()(input_event); } } }