tbf/TBF/Rig/Network/Camera/CJMS11/GrabImagesOp.cs

269 lines
6.0 KiB
C#

///
/// Copyright (c) 2017 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using log4net;
using Common;
using Config.Entities;
using TBF.Rig.Network.Telnet;
using System.IO;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace TBF.Rig.Network.Camera.CJMS11
{
public class GrabImagesOp : IOperation
{
/// TODO: Implement support for grabbing multiple images, now imgFileNames.Lenght should be 1
private static readonly ILog log = LogManager.GetLogger(typeof(GrabImagesOp));
public override string ToString() { return string.Format("GrabImageOp()"); }
readonly Camera camera;
readonly string[] imgFileNames;
readonly bool blackAndWhite;
readonly bool lowResolution;
readonly ImageRotation imageRotation;
string command;
bool grabImageCommandSent;
string response;
bool transferringGrabbedImage;
Image grabedImage;
Dictionary<int, Image> grabedImages = new Dictionary<int, Image>();
private Task<Image> grabImageTask;
private Task saveImageTask;
/// <summary>
/// Events: Event.None or Event.Error
/// </summary>
/// <param name="camera">CLP1611.Camera reference</param>
public GrabImagesOp(Camera camera, string[] imgFileNames, bool blackAndWhite, bool lowResolution, ImageRotation imageRotation)
{
/// TODO: Implement support for grabbing multiple images, now imgFileNames.Lenght should be 1
this.camera = camera;
//this.telnet = camera.Telnet;
this.imgFileNames = imgFileNames;
this.blackAndWhite = blackAndWhite;
this.lowResolution = lowResolution;
this.imageRotation = imageRotation;
grabImageCommandSent = false;
transferringGrabbedImage = false;
// /// image incomming event
// if (camera.DebugLevel == DebugMode.Normal || camera.DebugLevel == DebugMode.DetectedOn)
// {
// Camera.ImageCameraHandler -= ImageReceived;
// Camera.ImageCameraHandler += ImageReceived;
// }
//TODO BUMI improve by simulate image
Camera.ImageCameraHandler -= ImageReceived;
Camera.ImageCameraHandler += ImageReceived;
Camera.ImagesCameraHandler -= ImagesReceived;
Camera.ImagesCameraHandler += ImagesReceived;
}
void PromptReceived(object sndr, PromptReceivedJMSEventArgs a)
{
response = a.Response;
}
private readonly object imageSync = new object();
void ImageReceived(object sndr, PromptReceivedImageEventArgs a)
{
if (a == null || a.idxCamera != camera.CameraIdx)
return;
lock (imageSync)
{
grabedImage = a.image;
}
}
void ImagesReceived(object sndr, PromptReceivedImagesEventArgs a)
{
if(a.idxCamera != camera.CameraIdx) return;
grabedImage = a.image; //upgraded image common
grabedImages[a.idxImage] = a.image; // stored image from sent to list of images
}
public void Start()
{
grabImageCommandSent = false;
transferringGrabbedImage = false;
grabedImage = null;
grabImageTask = null;
saveImageTask = null;
grabedImages.Clear();
if (imgFileNames != null &&
imgFileNames.Length > 0 &&
!string.IsNullOrEmpty(imgFileNames[0]) &&
File.Exists(imgFileNames[0]))
{
File.Delete(imgFileNames[0]);
}
}
public Event Run()
{
if (imgFileNames == null ||
imgFileNames.Length < 1 ||
string.IsNullOrEmpty(imgFileNames[0]))
{
UnsubscribeEvents();
return Event.GrabPassed;
}
if (!grabImageCommandSent)
{
log.Debug( $"Starting asynchronous grab: cameraIdx={camera.CameraIdx}");
grabImageCommandSent = true;
grabImageTask = camera.StartGrabImageListenerAsync();
return Event.CameraBusy;
}
if (grabImageTask == null)
{
log.Error(
$"Grab task was not created: cameraIdx={camera.CameraIdx}");
UnsubscribeEvents();
return Event.GrabFailed;
}
if (!grabImageTask.IsCompleted)
{
return Event.CameraBusy;
}
if (grabImageTask.IsCanceled)
{
log.Warn(
$"Grab task cancelled: cameraIdx={camera.CameraIdx}");
UnsubscribeEvents();
return Event.GrabFailed;
}
if (grabImageTask.IsFaulted)
{
log.Error(
$"Grab task failed: cameraIdx={camera.CameraIdx}",
grabImageTask.Exception);
UnsubscribeEvents();
return Event.GrabFailed;
}
if (grabedImage == null)
{
grabedImage = grabImageTask.GetAwaiter().GetResult();
}
if (grabedImage == null)
{
log.Error(
$"Grab completed without valid image: cameraIdx={camera.CameraIdx}");
UnsubscribeEvents();
return Event.GrabFailed;
}
if (!transferringGrabbedImage)
{
saveImageTask =
camera.StartSaveImageToFileAsync(
grabedImage,
imgFileNames[0]);
transferringGrabbedImage = true;
return Event.CameraBusy;
}
if (saveImageTask == null)
{
log.Error(
$"Save image task was not created: " +
$"cameraIdx={camera.CameraIdx}");
UnsubscribeEvents();
return Event.GrabFailed;
}
if (!saveImageTask.IsCompleted)
{
return Event.CameraBusy;
}
if (saveImageTask.IsCanceled)
{
log.Warn(
$"Save image task cancelled: " +
$"cameraIdx={camera.CameraIdx}");
UnsubscribeEvents();
return Event.GrabFailed;
}
if (saveImageTask.IsFaulted)
{
log.Error(
$"Save image task failed: " +
$"cameraIdx={camera.CameraIdx}",
saveImageTask.Exception);
UnsubscribeEvents();
return Event.GrabFailed;
}
bool fileSaved = File.Exists(imgFileNames[0]);
UnsubscribeEvents();
return fileSaved
? Event.GrabPassed
: Event.GrabFailed;
}
public void Stop()
{
//if (camera.CameraCfg.DebugLevel == DebugMode.Simulate) return;
// if (camera.IsGrabImageListenerThreadAlive)
// {
// camera.SetStopGrabImageListenerFlag();
// }
camera.CancelGrabImage();
UnsubscribeEvents();
}
private void UnsubscribeEvents()
{
Camera.ImageCameraHandler -= ImageReceived;
Camera.ImagesCameraHandler -= ImagesReceived;
}
}
}