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;
}
}
}