diff --git a/ISCamRecorder/CvCamera.cs b/ISCamRecorder/CvCamera.cs index 4bec7e0..14fa066 100644 --- a/ISCamRecorder/CvCamera.cs +++ b/ISCamRecorder/CvCamera.cs @@ -32,7 +32,6 @@ /// class CvCamera { VideoCapture camera = null; // カメラオブジェクト - bool _ExitSignal = false; // 終了シグナル Bitmap[] _Buffer = new Bitmap[2]; // ダブルバッファ int _WriteBufferID = 0; // 書き込みバッファ番号 FrameRateCounter _Fps = new FrameRateCounter(10); // フレームレート計測 @@ -73,18 +72,19 @@ /// public void CameraLoop() { // 撮影ループ - while (!_ExitSignal) { + while (_MainForm.State != STATE.Exit) { using (var frame = new Mat()) { // 撮影 camera.Read(frame); _Buffer[_WriteBufferID] = BitmapConverter.ToBitmap(frame); + if (_Recoding) { _RecFrames.Add(new FrameInfo(frame.Clone())); } _WriteBufferID = 1 - _WriteBufferID; // バッファ切り替え // 表示 - if (!_ExitSignal) { + if (_MainForm.State != STATE.Exit) { _MainForm.CvCameraPic.Invoke((MethodInvoker)delegate { _MainForm.CvCameraPic.Image = _Buffer[1 - _WriteBufferID]; }); @@ -155,9 +155,10 @@ /// /// 停止 /// - public void Stop() { - _ExitSignal = true; - } + //public void Stop() { + // _ExitSignal = true; + // Debug.WriteLine("cvcamera stop"); + //} /// /// カメラ情報文字列 diff --git a/ISCamRecorder/MainForm.cs b/ISCamRecorder/MainForm.cs index fdb2723..c839d29 100644 --- a/ISCamRecorder/MainForm.cs +++ b/ISCamRecorder/MainForm.cs @@ -16,21 +16,33 @@ using System.Media; namespace ISCamRecorder { + + /// + /// ソフトウェアの状態 + /// + public enum STATE { + Init, // 初期化中 + Idle, // 待機中 + Recoding, // 録画中 + Exit // 終了 + } + + /// + /// メインフォームクラス + /// public partial class MainForm : Form { readonly int PLOT_LENGTH = 200; // センサー値表示サンプル数 - readonly int PLOT_UPDATE_INTERVAL = 30; // グラフ更新時間 readonly int UI_UPDATE_INTERVAL = 2000; // UI更新時間 readonly int CVCAMERA_ID = 0; // 追加カメラのID readonly int CVCAMERA_WIDTH = 1920; // 追加カメラの画像幅 readonly int CVCAMERA_HEIGHT = 1080; // 追加カメラの画像高さ private System.Threading.Timer _UITimer; // UI更新タイマー - private System.Threading.Timer _GUITimer; // UI更新タイマー List _Cameras = new List (); // ISカメラオブジェクト SensorData _Sensor; // センサーオブジェクト CvCamera _CvCamera; // Cvカメラオブジェクト - bool _ExitSignal = false; // ソフトウェア終了シグナル + //bool _ExitSignal = false; // ソフトウェア終了シグナル Task _TriggerThread; // トリガースレッド Task _SerialThread; // シリアル通信スレッド Task _CvCameraThread; // opencvカメラスレッド @@ -38,8 +50,10 @@ float _TriggerFrameRate = 30.0F; // トリガーフレームレート private ulong _availablePhysicalMemory; //合計物理メモリ DateTime _LastUpdate; // 前回のUI更新時間 - public Chart SensorChart { get { return chart1; } } - public PictureBox CvCameraPic { get { return PicCvCamera; } } + public Chart SensorChart { get { return chart1; } } // 外部からのアクセス用 + public PictureBox CvCameraPic { get { return PicCvCamera; } } // 外部からのアクセス用 + + public STATE State { get; private set; } = STATE.Init; // ソフトウェアの状態 /// /// コンストラクタ @@ -67,12 +81,13 @@ _Cameras.ForEach(c => c.Connect()); // タイマー&スレッド起動 - _UITimer = new System.Threading.Timer(UITimerCB, this, 0, PLOT_UPDATE_INTERVAL); - _GUITimer = new System.Threading.Timer(GUITimerCB, this, 0, PLOT_UPDATE_INTERVAL); + _UITimer = new System.Threading.Timer(UITimerCB, this, 0, UI_UPDATE_INTERVAL); _TriggerThread = Task.Run(TriggerThread); _SerialThread = Task.Run(SerialThread); _CvCameraThread = Task.Run(CvCameraThread); _LastUpdate = DateTime.Now; + + State = STATE.Idle; } /// @@ -82,9 +97,9 @@ var swatch = new Stopwatch(); swatch.Start(); - while (!_ExitSignal) { + while (State != STATE.Exit) { var interval = (long)(1000F / _TriggerFrameRate); - while (!_ExitSignal) { + while (State != STATE.Exit) { if (swatch.ElapsedMilliseconds >= interval) break; } swatch.Restart(); @@ -121,23 +136,20 @@ /// static void UITimerCB(object obj) { //Debug.WriteLine("TUI:" + DateTime.Now.ToString("ss.ff")); - ((MainForm)obj).Invalidate(); - //((MainForm)obj).UpdateForm(); + //((MainForm)obj).Invalidate(); + if (((MainForm)obj).State == STATE.Exit) return; + ((MainForm)obj).UpdateForm(); ((MainForm)obj).EndRecoding(); } - static void GUITimerCB(object obj) { - //Debug.WriteLine("GUI:" + DateTime.Now.ToString("ss.ff")); - } - /// /// UI更新 /// public void UpdateForm() { - //if (this.InvokeRequired) { - // this.Invoke((MethodInvoker)delegate { UpdateForm(); }); - // return; - //} + if (this.InvokeRequired) { + this.Invoke((MethodInvoker)delegate { UpdateForm(); }); + return; + } var now = DateTime.Now; var elapsed = now - _LastUpdate; if (elapsed.TotalMilliseconds > UI_UPDATE_INTERVAL) { @@ -355,15 +367,16 @@ /// /// private void BtnSnapImage_Click(object sender, EventArgs e) { - _Sensor.Stop(); - _SerialThread.Wait(); - + State = STATE.Exit; _UITimer.Dispose(); - _CvCamera.Stop(); - _ExitSignal = true; - _TriggerThread.Wait(); - _CvCameraThread.Wait(); + const int timeout = 2000; + _SerialThread.Wait(timeout); + Debug.WriteLine("_SerialThread stop"); + _CvCameraThread.Wait(timeout); + Debug.WriteLine("_CvCameraThread stop"); + _TriggerThread.Wait(timeout); + Debug.WriteLine("_TriggerThread stop"); //var player = new SoundPlayer(@"D:\prog\ISCamRecorder\ISCamRecorder\media\start.wav"); //player.Play(); diff --git a/ISCamRecorder/SensorData.cs b/ISCamRecorder/SensorData.cs index 2281ae8..ab71d74 100644 --- a/ISCamRecorder/SensorData.cs +++ b/ISCamRecorder/SensorData.cs @@ -19,16 +19,16 @@ readonly string SERIAL_PORT_NAME = "USB シリアル"; // センサー値 - public Queue Values { get; private set; } = new Queue(); + //public Queue Values { get; private set; } = new Queue(); // サンプル時間 - public Queue Times { get; private set; } = new Queue(); + //public Queue Times { get; private set; } = new Queue(); public float FrameRate { get { return _Fps.FrameRate; } } public bool IsStartButtonPressed { get { return _StartButtonState; } } - SerialPort _Serial = null; // シリアル通信オブジェクト - bool _ExitSignal = false; // 終了シグナル - int _QueueLength = 1; // グラフ表示するサンプル数 - public static object Locker = new object(); // 受信データの排他制御 + SerialPort _Serial = null; // シリアル通信オブジェクト + Queue Values = new Queue(); // センサー値 + Queue Times = new Queue(); // サンプル時間 + int _QueueLength = 1; // グラフ表示するサンプル数 bool _RecodingStopSignal = false; // 記録終了シグナル StreamWriter _CsvWriter = null; // ファイル保存オブジェクト DateTime _RecordBeginTime; // 記録開始時間 @@ -84,7 +84,7 @@ /// 受信ループ /// public void Loop() { - while (!_ExitSignal) { + while (_MainForm.State != STATE.Exit) { // データ受信 var str = _Serial.ReadLine(); @@ -118,7 +118,7 @@ } // 表示 - if (!_ExitSignal) { + if (_MainForm.State != STATE.Exit) { _MainForm.SensorChart.Invoke((MethodInvoker)delegate { _MainForm.SensorChart.Series[0].Points.Clear(); _MainForm.SensorChart.Series[0].Points.DataBindXY(Times, Values); @@ -133,13 +133,6 @@ } /// - /// 停止 - /// - public void Stop() { - _ExitSignal = true; - } - - /// /// シリアルポート取得 /// ///