112 lines
3.8 KiB
C#
112 lines
3.8 KiB
C#
using System;
|
|
using System.Diagnostics;
|
|
using System.Runtime.InteropServices;
|
|
using System.Threading;
|
|
using Inspectron.Devices.Raspberry;
|
|
using Inspectron.HawkEye.Protocol;
|
|
using Inspectron.HawkEye.Protocol.Interfaces;
|
|
|
|
namespace Inspectron.HawkEye.Camera
|
|
{
|
|
public class InspectronCamera:ICameraControl,IImageSource,ILightControl
|
|
{
|
|
|
|
[DllImport("libVCLibProxy.so", CallingConvention = CallingConvention.Cdecl)]
|
|
static extern IntPtr init(Int32 captBuf);
|
|
[DllImport("libVCLibProxy.so", CallingConvention = CallingConvention.Cdecl)]
|
|
static extern int trigger(IntPtr cpt, byte[] addr, int lines, int captBuf,ref int cancelFlag);
|
|
[DllImport("libVCLibProxy.so", CallingConvention = CallingConvention.Cdecl)]
|
|
static extern void set_parameters(IntPtr cpt, ref ImageSettings imageSettings);
|
|
|
|
[DllImport("libVCLibProxy.so", CallingConvention = CallingConvention.Cdecl)]
|
|
public static extern int test();
|
|
byte[] _buffer = new byte[2048 * 250 * 4];
|
|
|
|
public InspectronCamera()
|
|
{
|
|
|
|
_i2c = new I2CLinux(0);
|
|
_i2c.Open();
|
|
|
|
}
|
|
|
|
|
|
|
|
private bool _isRunningContiniuos = false;
|
|
private IntPtr _cp= IntPtr.Zero;
|
|
private ImageSettings _imageSettings=new ImageSettings()
|
|
{
|
|
CaptureBuffer = 25,
|
|
Gain = 200,
|
|
Lines = 1000,
|
|
Shutter = 200,
|
|
SensorWidth = 1440
|
|
};
|
|
|
|
private I2CLinux _i2c;
|
|
|
|
private int _lastBuffer = -1;
|
|
public void SetParameters(CameraSettings cameraSettings)
|
|
|
|
{
|
|
_cameraSettings = cameraSettings;
|
|
ImageSettings imageSettings = cameraSettings.ImageSettings;
|
|
if (_lastBuffer ==-1)
|
|
{
|
|
_lastBuffer = imageSettings.CaptureBuffer;
|
|
_cp = init(_lastBuffer);
|
|
}
|
|
|
|
|
|
_imageSettings = imageSettings;
|
|
_buffer=new byte[imageSettings.SensorWidth*(imageSettings.Lines)];
|
|
var cpImageSettings = imageSettings;
|
|
cpImageSettings.UseExternalTrigger =imageSettings.UseExternalTrigger;
|
|
|
|
if(_lastBuffer==imageSettings.CaptureBuffer)
|
|
set_parameters(_cp, ref cpImageSettings);
|
|
else
|
|
Console.WriteLine("Warning! Buffer size changed. Needs restart");
|
|
_i2c.writeBytes(4, 2, 4, BitConverter.GetBytes(imageSettings.Divider));
|
|
Thread.Sleep(100);
|
|
_i2c.writeBytes(4,3,1, new byte[] { (byte)imageSettings.UseExternalTrigger });
|
|
Thread.Sleep(100);
|
|
}
|
|
|
|
|
|
private int _cancelFlag = 0;
|
|
private CameraSettings _cameraSettings;
|
|
|
|
public byte[] GetImage()
|
|
{
|
|
_cancelFlag = 0;
|
|
var sw = Stopwatch.StartNew();
|
|
|
|
_i2c.writeBytes(4, 4, 1,new byte[]{ (byte)(_cameraSettings.LaserTrigger?1:0)} );
|
|
//Thread.Sleep(20);
|
|
_i2c.writeBytes(4, 5, 4, BitConverter.GetBytes(_cameraSettings.LaserTriggerDelay));
|
|
//Thread.Sleep(20);
|
|
|
|
trigger(_cp, _buffer, _imageSettings.Lines, _imageSettings.CaptureBuffer,ref _cancelFlag);
|
|
sw.Stop();
|
|
Console.WriteLine("Trigger time: "+sw.ElapsedMilliseconds);
|
|
if(_cancelFlag==1)return new byte[0];
|
|
return _buffer;
|
|
}
|
|
|
|
public void CancelTrigger()
|
|
{
|
|
_cancelFlag = 1;
|
|
}
|
|
|
|
public void SetLight(int pwm1, int pwm2)
|
|
{
|
|
Console.WriteLine($"setting lights to {pwm1}/{pwm2}");
|
|
pwm1 = (int)(pwm1 / 100.0 * 255);
|
|
pwm2 = (int)(pwm2 / 100.0 * 255);
|
|
_i2c.writeBytes(4, 1, 2, new byte[] { (byte)pwm1,(byte)pwm2 });
|
|
|
|
Thread.Sleep(10);
|
|
}
|
|
}
|
|
} |