void InputDeviceProvider_Win32Hid::update_values(void *preparse_data, void *report, int report_size) { for (size_t i = 0; i < axis_values.size(); i++) axis_values[i] = 0.0f; for (size_t i = 0; i < hat_values.size(); i++) hat_values[i] = -1; Hid::CAPS caps; hid.GetCaps(preparse_data, &caps); std::vector<Hid::VALUE_CAPS> value_caps(caps.NumberInputValueCaps); if (!value_caps.empty()) { USHORT num_value_caps = value_caps.size(); hid.GetValueCaps(Hid::HidP_Input, &value_caps[0], &num_value_caps, preparse_data); for (size_t collection = 0; collection < value_caps.size(); collection++) { ULONG value = 0; for (Hid::USAGE usage = value_caps[collection].Range.UsageMin; usage <= value_caps[collection].Range.UsageMax; usage++) { hid.GetUsageValue(Hid::HidP_Input, value_caps[collection].UsagePage, 0, usage, &value, preparse_data, report, report_size); if (value_caps[collection].LogicalMin == 0 && value_caps[collection].LogicalMax == 3 && value_caps[collection].HasNull) // Four direction hat { std::map<Hid::USAGE, int>::iterator it = usage_to_hat_index.find(usage); if (it != usage_to_hat_index.end()) hat_values[it->second] = (value == 8) ? -1 : (value * 360 / 4); } else if (value_caps[collection].LogicalMin == 0 && value_caps[collection].LogicalMax == 7 && value_caps[collection].HasNull) // Eight direction hat { std::map<Hid::USAGE, int>::iterator it = usage_to_hat_index.find(usage); if (it != usage_to_hat_index.end()) hat_values[it->second] = (value == 8) ? -1 : (value * 360 / 8); } else { std::map<Hid::USAGE, int>::iterator it = usage_to_axis_index.find(usage); if (it != usage_to_axis_index.end()) axis_values[it->second] = clamp((value - value_caps[collection].LogicalMin) / (float)(value_caps[collection].LogicalMax - value_caps[collection].LogicalMin) * 2.0f - 1.0f, -1.0f, 1.0f); } } } } }
void InputDeviceProvider_Win32Hid::find_value_names(HANDLE device, void *preparse_data) { // Place all standard axis and hats at the beginning of the list axis_values.resize(9); axis_names.push_back("X"); axis_names.push_back("Y"); axis_names.push_back("Z"); axis_names.push_back("Rx"); axis_names.push_back("Ry"); axis_names.push_back("Rz"); axis_names.push_back("Slider"); axis_names.push_back("Dial"); axis_names.push_back("Wheel"); for (int i = 0; i < 9; i++) usage_to_axis_index[0x30 + i] = i; int next_axis_index = 9; hat_values.push_back(-1); hat_names.push_back("Hat"); usage_to_hat_index[0x39] = 0; int next_hat_index = 2; Hid::CAPS caps; hid.GetCaps(preparse_data, &caps); std::vector<Hid::VALUE_CAPS> value_caps(caps.NumberInputValueCaps); if (!value_caps.empty()) { USHORT num_value_caps = value_caps.size(); hid.GetValueCaps(Hid::HidP_Input, &value_caps[0], &num_value_caps, preparse_data); for (size_t collection = 0; collection < value_caps.size(); collection++) { for (Hid::USAGE usage = value_caps[collection].Range.UsageMin; usage <= value_caps[collection].Range.UsageMax; usage++) { if (usage < 0x30 || usage > 0x39) { if (value_caps[collection].LogicalMin == 0 && value_caps[collection].LogicalMax == 3 && value_caps[collection].HasNull) // Four direction hat { hat_names.push_back(string_format("Hat%1", next_hat_index++)); usage_to_hat_index[usage] = hat_values.size(); //hat_ids.push_back(hat_values.size()); hat_values.push_back(-1); } else if (value_caps[collection].LogicalMin == 0 && value_caps[collection].LogicalMax == 7 && value_caps[collection].HasNull) // Eight direction hat { hat_names.push_back(string_format("Hat%1", next_hat_index++)); usage_to_hat_index[usage] = hat_values.size(); //hat_ids.push_back(hat_values.size()); hat_values.push_back(-1); } else { axis_names.push_back(string_format("Axis%1", next_axis_index++)); usage_to_axis_index[usage] = axis_values.size(); axis_ids.push_back(axis_values.size()); axis_values.push_back(0.0f); } } else { switch (usage) { case 0x30: axis_ids.push_back(joystick_x); break; case 0x31: axis_ids.push_back(joystick_y); break; case 0x32: axis_ids.push_back(joystick_z); break; case 0x33: axis_ids.push_back(joystick_rx); break; case 0x34: axis_ids.push_back(joystick_ry); break; case 0x35: axis_ids.push_back(joystick_rz); break; case 0x36: axis_ids.push_back(joystick_slider); break; case 0x37: axis_ids.push_back(joystick_dial); break; case 0x38: axis_ids.push_back(joystick_wheel); break; //case 0x39: hat_ids.push_back(joystick_hat); break; } } } } } }