using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Diagnostics;
using TIS.Imaging;
using System.Windows.Forms;
namespace ISCamRecorder {
internal class ISCamera {
readonly string ICCF_FILE = @"dfk33ux290.iccf"; // 設定ファイル
readonly string CAMERA_FORMAT = "RGB32 (1920x1080)";
readonly float FRAME_RATE = 40F;
ICImagingControl _iccs; // カメラオブジェクト
string _SerialNumber; // シリアル番号
VCDButtonProperty _Trigger; // トリガー設定
FPS _fps = new FPS(10); // FPS計測
/// <summary>
/// コンストラクタ
/// </summary>
/// <param name="iccs"></param>
/// <param name="serialNumber"></param>
public ISCamera(ICImagingControl iccs, string serialNumber) {
_iccs = iccs;
_SerialNumber = serialNumber;
}
/// <summary>
/// カメラ接続とプレビュー開始
/// </summary>
/// <returns></returns>
public bool Connect() {
if (_iccs.DeviceValid) return true;
// 接続
_iccs.Device = _iccs.Devices.FirstOrDefault(
c => c.GetSerialNumber().Equals(_SerialNumber));
if (!_iccs.DeviceValid) return false;
// 撮影条件設定
try {
if (File.Exists(ICCF_FILE)){
_iccs.LoadDeviceState(ICCFImport.Import(ICCF_FILE), false);
Debug.WriteLine($"Camera #{_SerialNumber} loaded config {ICCF_FILE}");
} else {
//Debug.WriteLine($"Can't find config {ICCF_FILE}");
_iccs.VideoFormat = _iccs.VideoFormats.FirstOrDefault(
c => c.Name.Equals(CAMERA_FORMAT));
_iccs.DeviceFrameRate = _iccs.DeviceFrameRates.FirstOrDefault(
c => (c > FRAME_RATE - 0.1F && c < FRAME_RATE + 0.1F));
Debug.WriteLine($"Camera #{_SerialNumber} sets {_iccs.VideoFormat}, {_iccs.DeviceFrameRate:0.0}fps");
}
} catch (ICException iex) {
MessageBox.Show(iex.Message, "Camera Error",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
return false;
}
// 表示設定
_iccs.LiveDisplayDefault = false;
_iccs.LiveDisplayHeight = _iccs.Height;
_iccs.LiveDisplayWidth = _iccs.Width;
// ic.ImageRingBufferSize = 2;
_Trigger = _iccs.VCDPropertyItems.Find<VCDButtonProperty>(
VCDGUIDs.VCDID_TriggerMode, VCDGUIDs.VCDElement_SoftwareTrigger);
_iccs.Sink = new FrameQueueSink(CaptureFrame, MediaSubtypes.RGB32, 5);
_iccs.LiveStart();
return true;
}
/// <summary>
/// フレーム取得時
/// </summary>
/// <param name="buffer"></param>
/// <returns></returns>
private FrameQueuedResult CaptureFrame(IFrameQueueBuffer buffer) {
_fps.Shot();
return FrameQueuedResult.ReQueue;
}
/// <summary>
/// トリガーモード変更
/// </summary>
/// <param name="enable"></param>
public void SetTriggerMode(bool enable) {
_iccs.LiveStop();
_iccs.DeviceTrigger = enable;
_iccs.LiveStart();
}
/// <summary>
/// ソフトウェアトリガー発信
/// </summary>
public void SWTrigger() {
if (_iccs.DeviceValid && _Trigger != null) _Trigger.Push();
}
/// <summary>
/// プロパティ設定(ダイアログ)
/// </summary>
/// <returns></returns>
public string SetProperty() {
if (!_iccs.DeviceValid) return "";
_iccs.ShowPropertyDialog();
return _iccs.SaveDeviceState();
}
/// <summary>
/// プロパティ設定(条件指定)
/// </summary>
/// <param name="config"></param>
/// <returns></returns>
public string SetProperty(string config) {
if (!_iccs.DeviceValid) return "";
_iccs.LiveStop();
_iccs.LoadDeviceState(config, false);
_iccs.LiveStart();
return config;
}
/// <summary>
/// FPS取得
/// </summary>
/// <returns></returns>
public float Fps() {
return _fps.fps;
}
public string CameraInfo() {
return $"({_SerialNumber}) {_fps.fps:0.0}fps";
}
}
}