diff --git a/ISCamRecorder/MainForm.cs b/ISCamRecorder/MainForm.cs index 67450d6..e92d7ff 100644 --- a/ISCamRecorder/MainForm.cs +++ b/ISCamRecorder/MainForm.cs @@ -26,8 +26,9 @@ readonly int CVCAMERA_HEIGHT = 1080; // 追加カメラの画像高さ private System.Threading.Timer _UITimer; // UI更新タイマー + private System.Threading.Timer _GUITimer; // UI更新タイマー List _Cameras = new List (); // カメラオブジェクト - SensorData _Sensor = new SensorData(); // センサーオブジェクト + SensorData _Sensor; // センサーオブジェクト CvCamera _CvCamera = new CvCamera (); bool _ExitSignal = false; // ソフトウェア終了シグナル Task _TriggerThread; // トリガースレッド @@ -37,6 +38,7 @@ float _TriggerFrameRate = 30.0F; // トリガーフレームレート private ulong _availablePhysicalMemory; //合計物理メモリ DateTime _LastUpdate; // 前回のUI更新時間 + public Chart SensorChart { get { return chart1; } } /// /// コンストラクタ @@ -44,6 +46,7 @@ public MainForm() { MediaFoundationApi.Startup(); InitializeComponent(); + _Sensor = new SensorData(this); } /// @@ -63,6 +66,7 @@ // タイマー&スレッド起動 _UITimer = new System.Threading.Timer(UITimerCB, this, 0, PLOT_UPDATE_INTERVAL); + _GUITimer = new System.Threading.Timer(GUITimerCB, this, 0, PLOT_UPDATE_INTERVAL); _TriggerThread = Task.Run(TriggerThread); _SerialThread = Task.Run(SerialThread); _CvCameraThread = Task.Run(CvCameraThread); @@ -106,13 +110,20 @@ /// グラフをプロット /// private void Plot() { - if (_Sensor.Values.Count < 1) return; - chart1.Series[0].Points.Clear(); - lock (SensorData.Locker) { - chart1.Series[0].Points.DataBindXY(_Sensor.Times, _Sensor.Values); - //var minValue = _Sensor.Values.Min(); - //chart1.ChartAreas[0].AxisY.Minimum = - // minValue < PLOT_YAXIS_MIN ? minValue : PLOT_YAXIS_MIN; + //if (_Sensor.Values.Count < 1) return; + //chart1.Series[0].Points.Clear(); + //lock (SensorData.Locker) { + // chart1.Series[0].Points.DataBindXY(_Sensor.Times, _Sensor.Values); + // //var minValue = _Sensor.Values.Min(); + // //chart1.ChartAreas[0].AxisY.Minimum = + // // minValue < PLOT_YAXIS_MIN ? minValue : PLOT_YAXIS_MIN; + //} + } + + void EndRecoding() { + if (_RecodingThread != null && _RecodingThread.IsCompleted) { + _RecodingThread.Dispose(); + _RecodingThread = null; } } @@ -121,8 +132,14 @@ /// /// static void UITimerCB(object obj) { + //Debug.WriteLine("TUI:" + DateTime.Now.ToString("ss.ff")); ((MainForm)obj).Invalidate(); //((MainForm)obj).UpdateForm(); + ((MainForm)obj).EndRecoding(); + } + + static void GUITimerCB(object obj) { + //Debug.WriteLine("GUI:" + DateTime.Now.ToString("ss.ff")); } /// @@ -147,13 +164,9 @@ MemoryToUse(); _TriggerFrameRate = float.Parse(TxtTriggerFPS.Text); } - Plot(); + //Plot(); PicCvCamera.Image = _CvCamera.GetImage(); // 追加カメラ表示 if (ChkStartSW.Checked && _Sensor.IsStartButtonPressed) StartRecoding(); - if (_RecodingThread != null && _RecodingThread.IsCompleted) { - _RecodingThread.Dispose(); - _RecodingThread = null; - } } /// @@ -185,13 +198,15 @@ /// /// private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { - _UITimer.Dispose(); - _Sensor.Stop(); - _CvCamera.Stop(); - _ExitSignal = true; - _TriggerThread.Wait(); - _SerialThread.Wait(); - _CvCameraThread.Wait(); + //_Sensor.Stop(); + //_SerialThread.Dispose(); + + //_UITimer.Dispose(); + + //_CvCamera.Stop(); + //_ExitSignal = true; + //_TriggerThread.Wait(); + //_CvCameraThread.Wait(); } /// @@ -353,8 +368,19 @@ /// /// private void BtnSnapImage_Click(object sender, EventArgs e) { - var player = new SoundPlayer(@"D:\prog\ISCamRecorder\ISCamRecorder\media\start.wav"); - player.Play(); + _Sensor.Stop(); + _SerialThread.Wait(); + + _UITimer.Dispose(); + + _CvCamera.Stop(); + _ExitSignal = true; + _TriggerThread.Wait(); + _CvCameraThread.Wait(); + + //var player = new SoundPlayer(@"D:\prog\ISCamRecorder\ISCamRecorder\media\start.wav"); + //player.Play(); + this.Close(); } } } diff --git a/ISCamRecorder/SensorData.cs b/ISCamRecorder/SensorData.cs index 43e4b87..5957b73 100644 --- a/ISCamRecorder/SensorData.cs +++ b/ISCamRecorder/SensorData.cs @@ -7,9 +7,15 @@ using System.Management; using System.Diagnostics; using System.IO; +using System.Windows.Forms; namespace ISCamRecorder { + + /// + /// センサーデータクラス + /// internal class SensorData { + readonly string SERIAL_PORT_NAME = "USB シリアル"; // センサー値 @@ -28,6 +34,15 @@ DateTime _RecordBeginTime; // 記録開始時間 FrameRateCounter _Fps = new FrameRateCounter(10); bool _StartButtonState = false; // スタートボタンの状態 + MainForm _MainForm = null; // メインフォームインスタンス + + /// + /// コンストラクタ + /// + /// + public SensorData(MainForm mf) { + _MainForm = mf; + } /// /// 接続 @@ -70,14 +85,20 @@ /// public void Loop() { while (!_ExitSignal) { + + // データ受信 var str = _Serial.ReadLine(); var values = str.Split(','); if (values.Length < 2) continue; + Debug.WriteLine("cp1"); + // 受信データ解析 _StartButtonState = values[0].Equals("0"); var photoSensor = int.Parse(values[1]); var dt = DateTime.Now; var elapsed = (dt - _RecordBeginTime).TotalMilliseconds; + + // CSV保存 if (_CsvWriter != null) { if (_RecodingStopSignal) { _CsvWriter.Close(); @@ -88,17 +109,34 @@ $"{dt.ToString("yyyy/MM/dd,HH:mm:ss.fff")},{elapsed:0.00},{photoSensor}"); } } - lock (Locker) { - Values.Enqueue(photoSensor); - Times.Enqueue(dt); - if (Values.Count > _QueueLength) { - Values.Dequeue(); - Times.Dequeue(); - } + Debug.WriteLine("cp2"); + + // データ追加 + Values.Enqueue(photoSensor); + Times.Enqueue(dt); + if (Values.Count > _QueueLength) { + Values.Dequeue(); + Times.Dequeue(); } + Debug.WriteLine("cp3"); + + // 表示 + if (!_ExitSignal) { + Debug.WriteLine("cp3a"); + _MainForm.SensorChart.Invoke((MethodInvoker)delegate { + Debug.WriteLine("cp3b"); + _MainForm.SensorChart.Series[0].Points.Clear(); + Debug.WriteLine("cp3c"); + _MainForm.SensorChart.Series[0].Points.DataBindXY(Times, Values); + Debug.WriteLine("cp3d"); + }); + } + Debug.WriteLine("cp4"); + _Fps.Shot(); } + Debug.WriteLine("break"); _Serial?.Close(); _Serial = null; } @@ -108,6 +146,7 @@ /// public void Stop() { _ExitSignal = true; + Debug.WriteLine("stop"); } /// @@ -132,7 +171,7 @@ public void StartRecoding(string filename) { _CsvWriter = new StreamWriter(filename); if (_CsvWriter == null) return; - _CsvWriter.WriteLine($"Date,Time,elapsed,sensor"); + _CsvWriter.WriteLine($"Date,Time,elapsed,sensor,switch"); _RecordBeginTime = DateTime.Now; _RecodingStopSignal = false; }