Как я могу проверить наличие ползунков на джойстике с SharpDX DirectInput? - PullRequest
0 голосов
/ 09 мая 2018

Я работаю над настройкой мульти-джойстика, где мне нужно создать пользовательские сопоставления кнопок.И даже наносить на карту через устройства.Например, если есть отдельный джойстик и сектор газа, мне нужно отобразить «Z» или что-то еще на вход газа.Мне также нужно иметь возможность проверять и видеть, есть ли ползун (ы) на каждой флешке, когда я строю профили сопоставления и т. Д. Я не могу понять, как просто сказать что-то вроде: if (joystick.HasSliders)

До сих пор я пробовал разные варианты

PropertyInfo rxprop = typeof(SharpDX.DirectInput.JoystickState).GetProperty("Sliders");

Однако, если джойстик не имеет ползунков, это, конечно, вызовет исключение.Если у него только один слайдер, я всегда получу массив Int Slider [] с двумя значениями, независимо от того, есть ли у флешки только один слайдер или нет.Так что это не гарантированный способ узнать, существуют ли ползунки, или даже сколько существует.Если второго фактического слайдера нет, значение Sliders [1] всегда равно 0, но если есть второй слайдер, он все еще может быть в позиции 0.

В настоящее время это то, с чем я связывался:

usbjoysticks[k].Poll();
JoystickState currentState = null;

try
{
    currentState = usbjoysticks[k].GetCurrentState();

    //joystickmap.axisRangeMax = usbjoysticks[k].GetObjectInfoById(1);
    PropertyInfo rxprop = typeof(SharpDX.DirectInput.JoystickState).GetProperty("Sliders");
    var rzvalue = (int[])rxprop.GetValue(currentState, null);
    var mySlider1 = rzvalue[0];

    var datas = usbjoysticks[k].GetBufferedData();
    foreach (var state in datas)
    {
        Console.WriteLine(state);
        if (state.Offset == JoystickOffset.X)
        {
            Console.WriteLine(state.Value);
        }
    }
    //DeviceObjectInstance my = usbjoysticks[k].GetObjectInfoByName("Sliders1");
    var stuff = usbjoysticks[k].GetObjectPropertiesByName("Sliders0");
    //=================
    joystickmap.jX = "X";
    joystickmap.axisRangeMax = usbjoysticks[k].GetObjectPropertiesByName("Y").Range.Maximum; //65535
    joystickmap.jY = "Y";

    if (currentState.Z != 0)
    {
        joystickmap.jZ = "Z";
        var maxZrange = usbjoysticks[k].GetObjectPropertiesByName("Z").Range.Maximum;
        joystickmap.axisRangeMax = usbjoysticks[k].GetObjectPropertiesByName("Z").Range.Maximum;
    }

    if (currentState.Sliders[0] != 0 || currentState.Sliders[1] != 0) //TODO possible change to Joystick State value in class object instead of text. 
    {
        joystickmap.SLD1 = "Slider1";
        //joystickmap.jZ = "Sliders";
        joystickmap.jsSliders = currentState.Sliders;
        var maxSld1range = usbjoysticks[k].GetObjectPropertiesByName("Sliders0").Range.Maximum; 
        joystickmap.sld1 = joystickmap.jsSliders[0];
        joystickmap.sld2 = joystickmap.jsSliders[1];
    }

    if (currentState.Sliders[1] != 0)
    {
        joystickmap.SLD2 = "Slider2";
    }

    if (currentState.RotationX != 0)
    {
        joystickmap.rX = "RotationX";
    }

    if (currentState.RotationY != 0)
    {
        joystickmap.rY = "RotationY";
    }

    if (currentState.RotationZ != 0)
    {
        joystickmap.rZ = "RotationZ";
        //joystickmap.jZ = "RotationZ";
    }

    joystickmap.axisdivider = 2;

    for (var b = 0; b < 20; b++)
    {
        //joystickmap.joybuttons.Add(currentState.Buttons[b]);
        joystickmap.joybuttons[b] = (b + 1);
    }


    joystickmappings.Add(joystickmap);

    if (!File.Exists(filename))
    {
        File.WriteAllText(filename, JsonConvert.SerializeObject(joystickmap));
        // serialize JSON directly to a file
        using (StreamWriter file = File.CreateText(filename))
        {
            JsonSerializer serializer = new JsonSerializer();
            serializer.Serialize(file, joystickmap);
        }
    }
}
catch (Exception e)
{
    MessageBox.Show("USB joystick map creation failure!\n" + e.Message);
    break;
}
...