#c# #.net-core #joystick
#c# #.net-ядро #джойстик
Вопрос:
У меня есть настольное приложение WPF dotnetCore3.1. Частично он использует джойстик для управления последовательным устройством RS232. Когда джойстик подключен, пользователь может выбрать его из выпадающего списка, затем программное обеспечение начинает опрашивать его, усреднять и отправлять элементы управления на последовательное устройство. Для этого используется Windows.Азартные игры.Ввод.RawGameController
Выбор из выпадающего списка вызывает этот инициализатор
private void UpdateController()
{
if (selectedController != null)
{
buttonStates = new bool[selectedController.ButtonCount];
axisPositions = new double[selectedController.AxisCount];
switchpositions = new GameControllerSwitchPosition[selectedController.SwitchCount];
selectedController.GetCurrentReading(buttonStates, switchpositions, axisPositions);
}
else
{
buttonStates = Array.Empty<bool>();
axisPositions = Array.Empty<double>();
switchpositions = Array.Empty<GameControllerSwitchPosition>();
}
}
Опрос выглядит следующим образом
private async void ControlAsync()
{
// If axiscount < 2 then don't bother
if (selectedController != null amp;amp; selectedController.AxisCount > 1)
{
selectedController.GetCurrentReading(buttonStates, switchpositions, axisPositions);
controlBuffer[0] = axisPositions[0];
controlBuffer[1] = axisPositions[1];
// Debug.WriteLine($"Controller: {axisPositions[0]}, {axisPositions[1]}");
}
// 0.5 is the neutral position
else
{
controlBuffer[0] = 0.5;
controlBuffer[1] = 0.5;
}
if ( controlCounter == controlCount)
{
controlCounter = 0;
PositionerController.PanAxisPositon = controlBuffer[0] / controlCount;
PositionerController.TiltAxisPositon = controlBuffer[1] / controlCount;
controlBuffer[0] = 0;
controlBuffer[1] = 0;
await PositionerController.Control().ConfigureAwait(true);
}
}
Проблема в том, что джойстики часто выдают отчеты (0.0, 0.0) (полностью вниз слева), независимо от того, где они находятся, в то время как нейтральное положение равно (0.5, 0.5). Это не будет корректно обновляться до тех пор, пока не будет перемещен джойстик, что означает, что последовательное устройство, физическое устройство, отключится от пользователя.
Я не смог придумать надежный способ исправить это. У меня были некоторые уловы, которые вроде бы работали, например, блокировка ввода до тех пор, пока не будет видно что-то отличное от 0,0, но, похоже, должен быть более чистый / стандартный способ сделать это.
Похоже, это не относится к Windows.Азартные игры.Imput API, поскольку эта же проблема возникает в другом проекте, где мы считываем джойстик со встроенной прошивкой C.
Комментарии:
1. Тогда это означало бы, что сам джойстик сообщает неверную информацию, с которой никакой API ничего не может поделать.
2. Да, согласен. Но я надеялся, что был запрос или что-то, что я должен был отправить на джойстик, чтобы разбудить его, а не ждать, пока кто-нибудь переместит его, чтобы разбудить его.