Newer
Older
ISCamRecorder / ISCamRecorder / SensorData.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Ports;
using System.Management;
using System.Diagnostics;

namespace ISCamRecorder {
    internal class SensorData {
        readonly string SERIAL_PORT_NAME = "USB シリアル";

        public Queue<int> Values { get; private set; } = new Queue<int>();
        public Queue<DateTime> Times { get; private set; } = new Queue<DateTime>();
        SerialPort _Serial = null;
        bool _ExitSignal = false;       // 終了シグナル
        int _QueueLength = 100;
        public static object Locker = new object();

        /// <summary>
        /// 接続
        /// </summary>
        /// <returns></returns>
        public bool Connect(int queueLength) {
            _QueueLength = queueLength;

            // シリアルポート接続 
            var portname = GetSerialPort();
            if (portname.Length < 1) {
                //MessageBox.Show("シリアルデバイスに接続できません", "Error",
                //    MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return false;
            }
            _Serial = new SerialPort {
                PortName = portname,
                BaudRate = 9600,
                DataBits = 8,
                Parity = Parity.None,
                StopBits = StopBits.One,
                Handshake = Handshake.None,
                Encoding = Encoding.ASCII,
                WriteTimeout = 1000,
                ReadTimeout = 1000,
                RtsEnable = true,
            };
            try {
                _Serial.Open();
            } catch (Exception ex) {
                Debug.WriteLine(ex.Message);
                return false;
            }
            Debug.WriteLine($"Serial Connect {portname}");
            return true;
        }

        /// <summary>
        /// 受信ループ
        /// </summary>
        public void Loop() {
            while (!_ExitSignal) {
                var str = _Serial.ReadLine();
                var val = int.Parse(str);
                var dt = DateTime.Now;
                lock (Locker) {
                    Values.Enqueue(val);
                    Times.Enqueue(dt);
                    if (Values.Count > _QueueLength) {
                        Values.Dequeue();
                        Times.Dequeue();
                    }
                }
            }

            _Serial?.Close();
            _Serial = null;
        }

        /// <summary>
        /// 停止
        /// </summary>
        public void Stop() {
            _ExitSignal = true;
        }

        /// <summary>
        /// シリアルポート取得
        /// </summary>
        /// <returns></returns>
        private string GetSerialPort() {
            var portname = "";
            var mcW32SerPort = new ManagementClass("Win32_SerialPort");
            foreach (var port in mcW32SerPort.GetInstances()) {
                if (port.GetPropertyValue("Caption").ToString().Contains(SERIAL_PORT_NAME)) {
                    portname = port.GetPropertyValue("DeviceID").ToString();
                }
            }
            return portname;
        }
    }
}