コード例 #1
0
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);
				}
			}
		}
	}
}
コード例 #2
0
	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;
						}
					}
				}
			}
		}
	}