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;
- }
-
- ///
/// シリアルポート取得
///
///