Как управлять IP-камерой с помощью джойстика без спам-сообщений? - PullRequest
0 голосов
/ 10 января 2020

Мне нужна рекомендация о том, как решить проблему, с которой я сталкиваюсь как разработчик программного обеспечения.

Контекст:

У меня есть IP-камера, которая можно перемещать с помощью команды PTZ (Pan, Tilt, Zoom), которую можно вызывать так:

PTZ(float pan, float tilt, float zoom)

У меня есть джойстик, который обновляет свои входные значения каждые ~ 0,0001 сек c и доступные входные значения:

  • joystickX: от -1 (слева) до 1 (справа) 0 является центром
  • joystickY: от -1 (вниз) до 1 (вверх) 0 - центр
  • joystickMagnitude: от 0 (нетронутый) до 1 (полностью нажат)
  • zoomButton+: нажат (zoomValue = 1 ) или нет
  • zoomButton-: нажата (zoomValue = -1) или нет

Прямо сейчас, каждый раз, когда значения джойстика обновляются, сообщение на камеру отправлено, так что это своего рода спам камеры каждые ~ 0,0001 сек c с PTZ сообщениями.

Пример:

  • Обновление значения ввода джойстика
  • PTZ(joystickX*joystickMagnitude, joystickY*joystickMagnitude, zoomValue) сообщение отправлено
  • Повторить через ~ 0,0001 сек c

Вопрос:

Как лучше всего управлять камерой с помощью джойстика без спама PTZ сообщений?

Вот что у меня есть:

(обратите внимание, что это основано)

Так что да

private void ConnectXboxController()
{
    _xboxController = new XInputController();
    if (_xboxController.Connected)
    {
        //set the update/render loop
        Application.Idle += HandleApplicationIdle;
        MessageBox.Show("The controller has been connected.");
    }
    else
    {
        MessageBox.Show("The controller could not be connected.");
    }
}

private void DisconnectXboxController()
{
    _xboxController = null;
    Application.Idle -= HandleApplicationIdle;
    MessageBox.Show("The controller has been disconnected.");
}

private void Update()
{
    //Update xbox controller properties

    if (!_xboxController.Update())
    {
        //Stop the loop
        DisconnectXboxController();
    }
}

private void Render()
{
    //Render changes made to the xbox controller properties
    try
    {
        if (_xboxController.LeftThumb.Magnitude != 0)
        {
            _moving = true;
            _camera.PostPTZContinuous(
                _xboxController.LeftThumb.Direction.X * _xboxController.LeftThumb.Magnitude * _camera.Speed,
                _xboxController.LeftThumb.Direction.Y * _xboxController.LeftThumb.Magnitude * _camera.Speed,
                0);
        }
        else
        {
            if (_moving == true)
            {
                _camera.PostPTZContinuous(0, 0, 0);
                _moving = false;
                UpdateCurrentStatus();
            }
        }
    }
    catch (Exception) { }
}

private bool IsApplicationIdle()
{
    NativeMessage result;
    return PeekMessage(out result, IntPtr.Zero, (uint)0, (uint)0, (uint)0) == 0;
}

private void HandleApplicationIdle(object sender, EventArgs e)
{
    //Stops when the xbox controller is set to null
    while (IsApplicationIdle() && _xboxController != null)
    {
        Update();
        Render();
    }
}

[StructLayout(LayoutKind.Sequential)]
public struct NativeMessage
{
    public IntPtr Handle;
    public uint Message;
    public IntPtr WParameter;
    public IntPtr LParameter;
    public uint Time;
    public Point Location;
}

[DllImport("user32.dll")]
private static extern int PeekMessage(out NativeMessage message, IntPtr window, uint filterMin, uint filterMax, uint remove);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...