//--------------------------------------------------------------
//	シリアルポートと関連して使うクラス
//
//		作成者：三上直樹，2022/04/29 作成，©三上直樹 2022
//--------------------------------------------------------------

using System;
using System.IO.Ports;
using System.Threading;

namespace Mikami.Application
{
	// シリアルポートに関連するクラス
	public class MySerialPort
	{
		// シリアルポート
		private SerialPort SrPort { get; set; }
		// シリアルポートがオープンの場合に true
		public bool IsOpen { get => SrPort.IsOpen; }
		// シリアルポートの名前
		public string PortName { get => GetPortName(); }
		// シリアルポートのボー・レート設定
		public int BaudRate { set => SetBoudRate(value); }

		// コンストラクタ
		public MySerialPort(SerialPort port) { SrPort = port; }

		// シリアルポートのオープン処理
		public bool Open(string name)
		{
			SrPort.PortName = ComPort.GetNumber(name);
			try {
				SrPort.Open();
				return true;
			}
			catch {
				Thread.Sleep(50);	// 50 ms 待つ
				return false;
			}
		}

		// シリアルポートのクローズ処理
		public void Close()
		{
			try { SrPort.Close(); }
			catch (Exception ex) { ExceptionCatch(ex); }
		}

		// １行全体の読み込み
		public string ReadLine()
		{
			string buf = "";
			try { buf = SrPort.ReadLine(); }
			catch (Exception ex) { ExceptionCatch(ex); }
			return buf;
		}

		// シリアルポートに文字列を送る
		public void SendTo(string str)
		{
			try { SrPort.Write(str + "\r"); }
			catch (Exception ex) { ExceptionCatch(ex); }
		}

		// シリアルポートのブレーク信号生成
		public void Break()
		{
			try {
				SrPort.BreakState = true;
				Thread.Sleep(10);				// 10 ms 待つ
				SrPort.BreakState = false;
			}
			catch (Exception ex) { ExceptionCatch(ex); }
		}

		// ポート名の取得
		private string GetPortName()
		{
			string name = "";
			try { name = SrPort.PortName; }
			catch (Exception ex) { ExceptionCatch(ex); }
			return name;
		}

		// ボー・レートの設定
		private void SetBoudRate(int rate)
		{
			try { SrPort.BaudRate = rate; }
			catch (Exception ex) { ExceptionCatch(ex); }
		}

		// Debug 時のみ例外のメッセージを出すようにするために使用
		private void ExceptionCatch(Exception ex)
		{
			#if DEBUG
			System.Windows.Forms.MessageBox.Show(ex.ToString());
			#endif
		}
	}
}
