Newer
Older
ISCamRecorder / ISCamRecorder / ISCamera.cs
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";
        }
    }
}