Мне нужна рекомендация о том, как решить проблему, с которой я сталкиваюсь как разработчик программного обеспечения.
Контекст:
У меня есть 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);