hawkeye camera support(not tested)
This commit is contained in:
114
framework/Inspectron.HawkEye/Protocol/ImageClient.cs
Normal file
114
framework/Inspectron.HawkEye/Protocol/ImageClient.cs
Normal file
@@ -0,0 +1,114 @@
|
||||
using System;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using Inspectron.HawkEye.UDPB;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Inspectron.HawkEye.Protocol
|
||||
{
|
||||
public class ImageClient : IDisposable
|
||||
{
|
||||
private static readonly object connectionLock = new object();
|
||||
private readonly IPEndPoint _endpoint;
|
||||
private readonly IPAddress _adapter;
|
||||
|
||||
private readonly UDPBSocket _imageSocket = new UDPBSocket();
|
||||
private readonly UDPBSocket _commandSocket = new UDPBSocket();
|
||||
private bool _isConnected = true;
|
||||
|
||||
public ImageClient(IPEndPoint endpoint,IPAddress adapter)
|
||||
{
|
||||
_endpoint = endpoint;
|
||||
_adapter = adapter;
|
||||
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
_isConnected = false;
|
||||
_commandSocket.Dispose();
|
||||
}
|
||||
|
||||
public void Connect()
|
||||
{
|
||||
lock (connectionLock)
|
||||
{
|
||||
_commandSocket.Connect(_endpoint,_adapter);
|
||||
var port = UDPBSocket.FindFreePort(_adapter);
|
||||
var bytesPort = BitConverter.GetBytes(port);
|
||||
_commandSocket.SendData(new[]
|
||||
{(byte) ECommand.Connect, bytesPort[0], bytesPort[1], bytesPort[2], bytesPort[3]});
|
||||
var settingsData0 = _commandSocket.Receive();
|
||||
var b = new byte[settingsData0.Length - 1];
|
||||
Array.Copy(settingsData0, 1, b, 0, b.Length);
|
||||
var settingsString = Encoding.UTF8.GetString(b);
|
||||
SettingsReceived(JsonConvert.DeserializeObject<CameraSettings>(settingsString));
|
||||
_imageSocket.Listen(_adapter,port);
|
||||
var th = new Thread(ReceiveLoop);
|
||||
th.Start();
|
||||
}
|
||||
}
|
||||
|
||||
public event Action<byte[]> ImageReceived = delegate { };
|
||||
public event Action<CameraSettings> SettingsReceived = delegate { };
|
||||
|
||||
|
||||
public void Trigger()
|
||||
{
|
||||
_commandSocket.SendData(new[] {(byte) ECommand.Trigger});
|
||||
}
|
||||
|
||||
public void ApplySettings(CameraSettings cameraSettings)
|
||||
{
|
||||
var data = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(cameraSettings));
|
||||
var databytes = new byte[1000];
|
||||
databytes[0] = (byte) ECommand.Settings;
|
||||
Array.Copy(data, 0, databytes, 1, data.Length);
|
||||
|
||||
_commandSocket.SendData(databytes);
|
||||
}
|
||||
|
||||
public void StartContinuous()
|
||||
{
|
||||
_commandSocket.SendData(new[] {(byte) ECommand.StartContinuous});
|
||||
}
|
||||
|
||||
public void StopContinuous()
|
||||
{
|
||||
_commandSocket.SendData(new[] {(byte) ECommand.StopContinuous});
|
||||
}
|
||||
|
||||
public void SaveSettingsOnCamera()
|
||||
{
|
||||
_commandSocket.SendData(new[] {(byte) ECommand.SaveSettings});
|
||||
}
|
||||
|
||||
|
||||
private void ReceiveLoop()
|
||||
{
|
||||
while (_isConnected)
|
||||
{
|
||||
var data = _imageSocket.Receive();
|
||||
|
||||
Process(data);
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private void Process(byte[] data)
|
||||
{
|
||||
switch ((EData) data[0])
|
||||
{
|
||||
case EData.Image:
|
||||
var b = new byte[data.Length - 1];
|
||||
Array.Copy(data, 1, b, 0, b.Length);
|
||||
ImageReceived(data);
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user