From a921e2676216bd5f5cde489fb5bbeea84e8f4d24 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Tue, 24 Dec 2024 00:53:11 +0900
Subject: [PATCH 01/97] add serial.cs
---
CommEx/Serial/Serial.cs | 333 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 333 insertions(+)
create mode 100644 CommEx/Serial/Serial.cs
diff --git a/CommEx/Serial/Serial.cs b/CommEx/Serial/Serial.cs
new file mode 100644
index 0000000..b1c67d8
--- /dev/null
+++ b/CommEx/Serial/Serial.cs
@@ -0,0 +1,333 @@
+using BveEx.PluginHost;
+using BveEx.Diagnostics;
+using BveEx.Extensions.Native;
+using System;
+using System.Collections.Generic;
+using System.Data.SqlTypes;
+using System.Diagnostics;
+using System.IO.Ports;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Reflection;
+using System.Windows.Input;
+using BveEx.PluginHost.Input;
+using BveEx.Extensions.Native.Input;
+using System.Windows.Media.Animation;
+
+namespace CommEx.Serial
+{
+ internal class SerialControl
+ {
+ private enum Errors
+ {
+ ///
+ /// 原因不明エラー
+ ///
+ Unknown,
+ ///
+ /// コンバータとBIDSpp.dllとの間の接続が確立されていない
+ ///
+ NotConnected,
+ ///
+ /// 要求情報コードの数値部が不正
+ ///
+ ErrorInCodeNumber,
+ ///
+ /// 要求情報コードの記号部が不正
+ ///
+ ErrorInCodeSymbol,
+ ///
+ /// 識別子が不正
+ ///
+ ErrorInIdentifier,
+ ///
+ /// 数値変換がオーバーフローした
+ ///
+ Overflow,
+ ///
+ /// 要求情報コードの数値部に数値以外が混入している
+ ///
+ BadFormatInCode,
+ ///
+ /// 要求情報コードの数値部もしくは記号部が不正
+ ///
+ BadFormatCode,
+ ///
+ /// BVEのウィンドウハンドルを取得できない(キーイベント送信時)
+ ///
+ CantGetWindowHandle,
+ ///
+ /// (情報なし)
+ ///
+ NoInfo1,
+ ///
+ /// (情報なし)
+ ///
+ NoInfo2,
+ ///
+ /// (情報なし)
+ ///
+ NoInfo3,
+ ///
+ /// 配列の範囲外アクセス
+ ///
+ OutOfRange,
+ }
+
+ const int version = 300;
+
+ private SerialPort port;
+
+ private INative native;
+ private IBveHacker bveHacker;
+
+ ///
+ /// 改行コード
+ ///
+ private string lineBreak = "\r\n";
+
+ //IBveHacker bveHacker;
+ //INative native;
+
+ struct AutoSend
+ {
+
+ }
+
+
+ internal void PortOpen()
+ {
+ port = new SerialPort();
+ port.PortName = "COM0"; //SetPortName(_serialPort.PortName);
+ port.BaudRate = 115200;//SetPortBaudRate(_serialPort.BaudRate);
+ port.Parity = Parity.None;//SetPortParity(_serialPort.Parity);
+ port.DataBits = 8;//SetPortDataBits(_serialPort.DataBits);
+ port.StopBits = StopBits.One;//SetPortStopBits(_serialPort.StopBits);
+ port.Handshake = Handshake.None;//SetPortHandshake(_serialPort.Handshake);
+ port.Open();
+ }
+ internal void PortOpen(SerialPort serialPort)
+ {
+ port = serialPort;
+ port.Open();
+ port.DataReceived += DataReceived;
+ }
+
+ internal void Open()
+ {
+ port.NewLine = "\r\n";
+ port.DataReceived += DataReceived;
+ try
+ {
+ port.Open();
+ }
+ catch (Exception e)
+ {
+ //MessageBox.Show(e.Message, "ポートオープンエラー", MessageBoxButton.OK, MessageBoxImage.Error);
+ ErrorDialogInfo info = new ErrorDialogInfo(
+ "ポートオープンエラー",
+ e.Source,
+ e.Message
+ );
+ ErrorDialog.Show(info);
+ //throw;
+ }
+ }
+
+ internal void PortClose()
+ {
+ port.Close();
+ port.DataReceived -= DataReceived;
+ }
+
+ private void DataReceived(object sender, SerialDataReceivedEventArgs e)
+ {
+ string str = port.ReadLine();
+ str = str.Trim();
+ }
+
+ ///
+ /// コマンドに応じた返答を生成
+ ///
+ /// コマンド
+ /// 返答
+ string CreateResponse(string str)
+ {
+ string header = str.Substring(0, 2).Trim();
+ string body = str.Substring(2).Trim();
+ string response = str.Trim() + "X";
+ //int num = 0;
+
+ if (header == "TR" || header == "EX")
+ {
+ switch (body.ElementAt(0))
+ {
+ case 'A': // 状態監視
+ return CreateError(Errors.ErrorInCodeSymbol);
+ case 'I': // 運転情報
+ {
+ int num = 0;
+ if (!Convert.ToBoolean(int.TryParse(body.Substring(2), out num)))
+ {
+ CreateError(Errors.BadFormatInCode);
+ }
+
+ switch (body.ElementAt(1))
+ {
+ case 'C': // Spec
+ switch (num)
+ {
+ case 0: // Bノッチ数
+ return response + native.VehicleSpec.BrakeNotches.ToString();
+ case 1: // Pノッチ数
+ return response + native.VehicleSpec.PowerNotches.ToString();
+ case 2: // ATS確認段
+ return response + native.VehicleSpec.AtsNotch.ToString();
+ case 3: // B67相当段
+ return response + native.VehicleSpec.B67Notch.ToString();
+ case 4: // 車両編成数
+ return response + native.VehicleSpec.Cars.ToString();
+ default:
+ CreateError(Errors.ErrorInCodeNumber);
+ break;
+ }
+ break;
+ case 'E': // Status
+ switch (num)
+ {
+ case 0: // 列車位置[m]
+ return response + native.VehicleState.Location.ToString();
+ case 1: // 列車速度[km/h]
+ return response + native.VehicleState.Speed.ToString();
+ case 2: // 現在時刻[ms]
+ return response + native.VehicleState.Time.TotalMilliseconds.ToString();
+ case 3: // BC Pres[kPa]
+ return response + native.VehicleState.BcPressure.ToString();
+ case 4: // MR Pres [kPa]
+ return response + native.VehicleState.MrPressure.ToString();
+ case 5: // ER Pres [kPa]
+ return response + native.VehicleState.ErPressure.ToString();
+ case 6: // BP Pres [kPa]
+ return response + native.VehicleState.BpPressure.ToString();
+ case 7: // SAP Pres [kPa]
+ return response + native.VehicleState.SapPressure.ToString();
+ case 8: // 電流 [A]
+ return response + native.VehicleState.Current.ToString();
+ //case 9: // 電圧 [V](準備工事)
+ // return response + bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.PowerNotch.ToString();
+ // return response + bveHacker.Scenario.Vehicle.Instruments.Electricity.
+ case 10: // 現在時刻(HH)[時]
+ return response + native.VehicleState.Time.Hours.ToString();
+ case 11: // 現在時刻(MM)[分]
+ return response + native.VehicleState.Time.Minutes.ToString();
+ case 12: // 現在時刻(SS)[秒]
+ return response + native.VehicleState.Time.Seconds.ToString();
+ case 13: // 現在時刻(ms)[ミリ秒]
+ return response + native.VehicleState.Time.Milliseconds.ToString();
+ default:
+ CreateError(Errors.ErrorInCodeNumber);
+ break;
+ }
+ break;
+ case 'H': // Handle
+ switch (num)
+ {
+ case 0: // Bノッチ位置
+ return response + bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.BrakeNotch.ToString();
+ case 1: // Pノッチ位置
+ return response + bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.PowerNotch.ToString();
+ case 2: // レバーサー位置
+ return response + bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.ReverserPosition.ToString();
+ case 3: // 定速状態(準備工事)
+ return response + bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.ConstantSpeedMode.ToString();
+ default:
+ return CreateError(Errors.ErrorInCodeNumber);
+ }
+ case 'P': // Panel
+ for (int i = 0; i < body.Length; i++)
+ {
+ try
+ {
+ return response + native.AtsPanelArray[num].ToString();
+ //int val = bveHacker.Scenario.Vehicle.Instruments.AtsPlugin.PanelArray[num];
+ //return response + val.ToString();
+ }
+ catch (Exception e)
+ {
+#if DEBUG
+ ErrorDialogInfo errorDialogInfo = new ErrorDialogInfo("エラー:配列の範囲外アクセス", e.Source, e.Message);
+ ErrorDialog.Show(errorDialogInfo);
+#endif
+ return CreateError(Errors.OutOfRange);
+ }
+ }
+ return CreateError(Errors.ErrorInCodeNumber);
+ case 'S': // Sound
+ for (int i = 0; i < body.Length; i++)
+ {
+ try
+ {
+ return response + native.AtsSoundArray[num].ToString();
+ //int val = bveHacker.Scenario.Vehicle.Instruments.AtsPlugin.SoundArray[num];
+ //return response + val.ToString();
+ }
+ catch (Exception e)
+ {
+#if DEBUG
+ ErrorDialogInfo errorDialogInfo = new ErrorDialogInfo("エラー:配列の範囲外アクセス", e.Source, e.Message);
+ ErrorDialog.Show(errorDialogInfo);
+#endif
+ return CreateError(Errors.OutOfRange);
+ }
+ }
+ return CreateError(Errors.ErrorInCodeNumber);
+ case 'D': // ドア状態
+ switch (num)
+ {
+ case 0: // 全体
+ return response + bveHacker.Scenario.Vehicle.Conductor.Doors.AreAllClosed;
+ case -1: // 左(準備工事)
+ case 1: // 右(準備工事)
+ default:
+ return CreateError(Errors.ErrorInCodeNumber);
+ }
+ default:
+ return CreateError(Errors.ErrorInCodeSymbol);
+ }
+ break;
+ }
+ case 'R': // レバーサー操作要求
+ return CreateError(Errors.ErrorInCodeSymbol);
+ case 'S': // ワンハンドル操作要求
+ return CreateError(Errors.ErrorInCodeSymbol);
+ case 'P': // 力行操作要求
+ return CreateError(Errors.ErrorInCodeSymbol);
+ case 'B': // 制動操作要求
+ return CreateError(Errors.ErrorInCodeSymbol);
+ case 'K': // キー操作要求
+ return CreateError(Errors.ErrorInCodeSymbol);
+ case 'V': // バージョン情報
+ return header + version.ToString();
+ case 'E': // エラー情報
+ return CreateError(Errors.ErrorInCodeSymbol);
+ case 'H': // 保安装置情報
+ return CreateError(Errors.ErrorInCodeSymbol);
+ default:
+ return CreateError(Errors.ErrorInCodeSymbol);
+ }
+ }
+ return null;
+ }
+
+ string CreateError(Errors err, string header = "EX")
+ {
+#if DEBUG
+ Debug.WriteLine(err.ToString());
+#endif
+ return header + "E" + err.ToString();
+ }
+
+ }
+}
From c7deeac16bb4250f939ede9179425a879b7e9130 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Tue, 24 Dec 2024 23:41:45 +0900
Subject: [PATCH 02/97] update serial
---
CommEx/Serial/Serial.cs | 24 ++++++++++++++++++------
1 file changed, 18 insertions(+), 6 deletions(-)
diff --git a/CommEx/Serial/Serial.cs b/CommEx/Serial/Serial.cs
index b1c67d8..ecf7f22 100644
--- a/CommEx/Serial/Serial.cs
+++ b/CommEx/Serial/Serial.cs
@@ -158,7 +158,15 @@ string CreateResponse(string str)
string header = str.Substring(0, 2).Trim();
string body = str.Substring(2).Trim();
string response = str.Trim() + "X";
- //int num = 0;
+
+ int num = 0;
+ if (!Convert.ToBoolean(int.TryParse(body.Substring(1), out num)))
+ {
+ if (body.ElementAt(0) != 'I')
+ {
+ CreateError(Errors.BadFormatInCode);
+ }
+ }
if (header == "TR" || header == "EX")
{
@@ -167,8 +175,6 @@ string CreateResponse(string str)
case 'A': // 状態監視
return CreateError(Errors.ErrorInCodeSymbol);
case 'I': // 運転情報
- {
- int num = 0;
if (!Convert.ToBoolean(int.TryParse(body.Substring(2), out num)))
{
CreateError(Errors.BadFormatInCode);
@@ -297,15 +303,21 @@ string CreateResponse(string str)
return CreateError(Errors.ErrorInCodeSymbol);
}
break;
- }
case 'R': // レバーサー操作要求
+ if (-1 <= num && num <= 1)
+ {
+ bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.BrakeNotch = num;
+ return response + 0.ToString();
+ }
return CreateError(Errors.ErrorInCodeSymbol);
case 'S': // ワンハンドル操作要求
return CreateError(Errors.ErrorInCodeSymbol);
case 'P': // 力行操作要求
- return CreateError(Errors.ErrorInCodeSymbol);
+ bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.PowerNotch += num;
+ return response + 0.ToString();
case 'B': // 制動操作要求
- return CreateError(Errors.ErrorInCodeSymbol);
+ bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.BrakeNotch += num;
+ return response + 0.ToString();
case 'K': // キー操作要求
return CreateError(Errors.ErrorInCodeSymbol);
case 'V': // バージョン情報
From 5b6872ccb5b0f83baaf855f463f824780489de08 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Wed, 25 Dec 2024 00:24:40 +0900
Subject: [PATCH 03/97] update serial
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
キー操作の実装教えてもらった、trさんありがとう
---
CommEx/Serial/Serial.cs | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/CommEx/Serial/Serial.cs b/CommEx/Serial/Serial.cs
index ecf7f22..97796d5 100644
--- a/CommEx/Serial/Serial.cs
+++ b/CommEx/Serial/Serial.cs
@@ -319,6 +319,30 @@ string CreateResponse(string str)
bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.BrakeNotch += num;
return response + 0.ToString();
case 'K': // キー操作要求
+ if (!Convert.ToBoolean(int.TryParse(body.Substring(1), out num)))
+ {
+ CreateError(Errors.BadFormatInCode);
+ }
+
+ switch (body.ElementAt(1))
+ {
+ case 'P': // Pless
+ if (num <= (int)AtsKeyName.L)
+ {
+ bveHacker.InputManager.KeyDown_Invoke(InputEventArgsFactory.AtsKey((AtsKeyName)num));
+ return response + 0.ToString();
+ }
+ return CreateError(Errors.ErrorInCodeNumber);
+ case 'R': // Release
+ if (num <= (int)AtsKeyName.L)
+ {
+ bveHacker.InputManager.KeyUp_Invoke(InputEventArgsFactory.AtsKey((AtsKeyName)num));
+ return response + 0.ToString();
+ }
+ return CreateError(Errors.ErrorInCodeNumber);
+ default:
+ return CreateError(Errors.ErrorInCodeSymbol);
+ }
return CreateError(Errors.ErrorInCodeSymbol);
case 'V': // バージョン情報
return header + version.ToString();
From 865f3339e4340bd3fbac6fd88ed1bf3ea76f477f Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Wed, 25 Dec 2024 01:03:53 +0900
Subject: [PATCH 04/97] update serial
---
CommEx/Serial/Serial.cs | 62 +++++++++++++++++++++++++----------------
1 file changed, 38 insertions(+), 24 deletions(-)
diff --git a/CommEx/Serial/Serial.cs b/CommEx/Serial/Serial.cs
index 97796d5..86d9916 100644
--- a/CommEx/Serial/Serial.cs
+++ b/CommEx/Serial/Serial.cs
@@ -159,8 +159,8 @@ string CreateResponse(string str)
string body = str.Substring(2).Trim();
string response = str.Trim() + "X";
- int num = 0;
- if (!Convert.ToBoolean(int.TryParse(body.Substring(1), out num)))
+ int num1 = 0;
+ if (!Convert.ToBoolean(int.TryParse(body.Substring(1), out num1)))
{
if (body.ElementAt(0) != 'I')
{
@@ -175,7 +175,8 @@ string CreateResponse(string str)
case 'A': // 状態監視
return CreateError(Errors.ErrorInCodeSymbol);
case 'I': // 運転情報
- if (!Convert.ToBoolean(int.TryParse(body.Substring(2), out num)))
+ int num2 = 0;
+ if (!Convert.ToBoolean(int.TryParse(body.Substring(2), out num2)))
{
CreateError(Errors.BadFormatInCode);
}
@@ -183,7 +184,7 @@ string CreateResponse(string str)
switch (body.ElementAt(1))
{
case 'C': // Spec
- switch (num)
+ switch (num2)
{
case 0: // Bノッチ数
return response + native.VehicleSpec.BrakeNotches.ToString();
@@ -201,7 +202,7 @@ string CreateResponse(string str)
}
break;
case 'E': // Status
- switch (num)
+ switch (num2)
{
case 0: // 列車位置[m]
return response + native.VehicleState.Location.ToString();
@@ -238,7 +239,7 @@ string CreateResponse(string str)
}
break;
case 'H': // Handle
- switch (num)
+ switch (num2)
{
case 0: // Bノッチ位置
return response + bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.BrakeNotch.ToString();
@@ -256,8 +257,8 @@ string CreateResponse(string str)
{
try
{
- return response + native.AtsPanelArray[num].ToString();
- //int val = bveHacker.Scenario.Vehicle.Instruments.AtsPlugin.PanelArray[num];
+ return response + native.AtsPanelArray[num2].ToString();
+ //int val = bveHacker.Scenario.Vehicle.Instruments.AtsPlugin.PanelArray[num2];
//return response + val.ToString();
}
catch (Exception e)
@@ -275,8 +276,8 @@ string CreateResponse(string str)
{
try
{
- return response + native.AtsSoundArray[num].ToString();
- //int val = bveHacker.Scenario.Vehicle.Instruments.AtsPlugin.SoundArray[num];
+ return response + native.AtsSoundArray[num2].ToString();
+ //int val = bveHacker.Scenario.Vehicle.Instruments.AtsPlugin.SoundArray[num2];
//return response + val.ToString();
}
catch (Exception e)
@@ -290,7 +291,7 @@ string CreateResponse(string str)
}
return CreateError(Errors.ErrorInCodeNumber);
case 'D': // ドア状態
- switch (num)
+ switch (num2)
{
case 0: // 全体
return response + bveHacker.Scenario.Vehicle.Conductor.Doors.AreAllClosed;
@@ -304,39 +305,52 @@ string CreateResponse(string str)
}
break;
case 'R': // レバーサー操作要求
- if (-1 <= num && num <= 1)
+ if (-1 <= num1 && num1 <= 1)
{
- bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.BrakeNotch = num;
+ bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.BrakeNotch = num1;
return response + 0.ToString();
}
return CreateError(Errors.ErrorInCodeSymbol);
case 'S': // ワンハンドル操作要求
+ //if (num1 > 0)
+ //{
+ // bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.PowerNotch += num1;
+ // bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.BrakeNotch += num1;
+ // return response + 0.ToString();
+ //}
+ //else if (num1 < 0)
+ //{
+ // bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.PowerNotch += num1;
+ // bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.BrakeNotch += num1;
+ // return response + 0.ToString();
+ //}
+ //else if (num1 == 0)
+ //{
+ // bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.PowerNotch = 0;
+ // bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.BrakeNotch = 0;
+ // return response + 0.ToString();
+ //}
return CreateError(Errors.ErrorInCodeSymbol);
case 'P': // 力行操作要求
- bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.PowerNotch += num;
+ bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.PowerNotch += num1;
return response + 0.ToString();
case 'B': // 制動操作要求
- bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.BrakeNotch += num;
+ bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.BrakeNotch += num1;
return response + 0.ToString();
case 'K': // キー操作要求
- if (!Convert.ToBoolean(int.TryParse(body.Substring(1), out num)))
- {
- CreateError(Errors.BadFormatInCode);
- }
-
switch (body.ElementAt(1))
{
case 'P': // Pless
- if (num <= (int)AtsKeyName.L)
+ if (num1 <= (int)AtsKeyName.L)
{
- bveHacker.InputManager.KeyDown_Invoke(InputEventArgsFactory.AtsKey((AtsKeyName)num));
+ bveHacker.InputManager.KeyDown_Invoke(InputEventArgsFactory.AtsKey((AtsKeyName)num1));
return response + 0.ToString();
}
return CreateError(Errors.ErrorInCodeNumber);
case 'R': // Release
- if (num <= (int)AtsKeyName.L)
+ if (num1 <= (int)AtsKeyName.L)
{
- bveHacker.InputManager.KeyUp_Invoke(InputEventArgsFactory.AtsKey((AtsKeyName)num));
+ bveHacker.InputManager.KeyUp_Invoke(InputEventArgsFactory.AtsKey((AtsKeyName)num1));
return response + 0.ToString();
}
return CreateError(Errors.ErrorInCodeNumber);
From d67a7dc2a33d24cb0bf08a7c8ec9000647366667 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Thu, 26 Dec 2024 07:40:02 +0900
Subject: [PATCH 05/97] add setting window
---
CommEx/Serial/SettingWindow.xaml | 12 ++++++++++++
CommEx/Serial/SettingWindow.xaml.cs | 27 +++++++++++++++++++++++++++
2 files changed, 39 insertions(+)
create mode 100644 CommEx/Serial/SettingWindow.xaml
create mode 100644 CommEx/Serial/SettingWindow.xaml.cs
diff --git a/CommEx/Serial/SettingWindow.xaml b/CommEx/Serial/SettingWindow.xaml
new file mode 100644
index 0000000..06c0d57
--- /dev/null
+++ b/CommEx/Serial/SettingWindow.xaml
@@ -0,0 +1,12 @@
+
+
+
+
+
diff --git a/CommEx/Serial/SettingWindow.xaml.cs b/CommEx/Serial/SettingWindow.xaml.cs
new file mode 100644
index 0000000..bcf96c1
--- /dev/null
+++ b/CommEx/Serial/SettingWindow.xaml.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Shapes;
+
+namespace CommEx.Serial
+{
+ ///
+ /// SettingWindow.xaml の相互作用ロジック
+ ///
+ public partial class SettingWindow : Window
+ {
+ public SettingWindow()
+ {
+ InitializeComponent();
+ }
+ }
+}
From e23bd096ec119d5ebc798b0be17fa3e0e7573ea6 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Thu, 26 Dec 2024 17:26:50 +0900
Subject: [PATCH 06/97] =?UTF-8?q?add=20chatgpt=E3=81=AB=E6=9B=B8=E3=81=8B?=
=?UTF-8?q?=E3=81=9B=E3=81=9F=E3=82=84=E3=81=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
CommEx/Serial/SettingWindow.xaml | 59 ++++++++++++++++++++++++++++-
CommEx/Serial/SettingWindow.xaml.cs | 56 +++++++++++++++++++++++++++
2 files changed, 114 insertions(+), 1 deletion(-)
diff --git a/CommEx/Serial/SettingWindow.xaml b/CommEx/Serial/SettingWindow.xaml
index 06c0d57..28ea3a6 100644
--- a/CommEx/Serial/SettingWindow.xaml
+++ b/CommEx/Serial/SettingWindow.xaml
@@ -5,8 +5,65 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:CommEx.Serial"
mc:Ignorable="d"
- Title="SettingWindow" Height="450" Width="800">
+ Title="Serial Port Settings" Height="300" Width="400">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/CommEx/Serial/SettingWindow.xaml.cs b/CommEx/Serial/SettingWindow.xaml.cs
index bcf96c1..f4b0e29 100644
--- a/CommEx/Serial/SettingWindow.xaml.cs
+++ b/CommEx/Serial/SettingWindow.xaml.cs
@@ -11,6 +11,7 @@
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
+using System.IO.Ports;
namespace CommEx.Serial
{
@@ -19,9 +20,64 @@ namespace CommEx.Serial
///
public partial class SettingWindow : Window
{
+ private SerialPort _serialPort;
public SettingWindow()
{
InitializeComponent();
+
+ // 使用可能なポート名をコンボボックスにセット
+ foreach (string portName in SerialPort.GetPortNames())
+ {
+ PortNameComboBox.Items.Add(portName);
+ }
+
+ // 初期選択を設定(最初のポートを選択)
+ if (PortNameComboBox.Items.Count > 0)
+ PortNameComboBox.SelectedIndex = 0;
+
+ // 初期設定としてデフォルト値を設定
+ BaudRateComboBox.SelectedIndex = 4; // 115200
+ DataBitsComboBox.SelectedIndex = 1; // 8
+ StopBitsComboBox.SelectedIndex = 0; // 1
+ ParityComboBox.SelectedIndex = 0; // None
+ FlowControlComboBox.SelectedIndex = 0; // None
+ }
+
+ private void OpenButton_Click(object sender, RoutedEventArgs e)
+ {
+ // シリアルポートが既に開かれているか確認
+ if (_serialPort != null && _serialPort.IsOpen)
+ {
+ // ポートを閉じる
+ _serialPort.Close();
+ OpenButton.Content = "Open Port";
+ MessageBox.Show("Serial port closed.");
+ }
+ else
+ {
+ // シリアルポートの設定
+ try
+ {
+ _serialPort = new SerialPort
+ {
+ PortName = PortNameComboBox.SelectedItem.ToString(),
+ BaudRate = int.Parse(BaudRateComboBox.SelectedItem.ToString()),
+ DataBits = int.Parse(DataBitsComboBox.SelectedItem.ToString()),
+ StopBits = (StopBits)Enum.Parse(typeof(StopBits), StopBitsComboBox.SelectedItem.ToString()),
+ Parity = (Parity)Enum.Parse(typeof(Parity), ParityComboBox.SelectedItem.ToString()),
+ Handshake = (Handshake)Enum.Parse(typeof(Handshake), FlowControlComboBox.SelectedItem.ToString())
+ };
+
+ // ポートを開く
+ _serialPort.Open();
+ OpenButton.Content = "Close Port";
+ MessageBox.Show("Serial port opened.");
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show($"Error opening serial port: {ex.Message}");
+ }
+ }
}
}
}
From 453696e008a38541e6ecee08c9cde4449a9648fb Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Fri, 27 Dec 2024 16:39:33 +0900
Subject: [PATCH 07/97] update window
---
CommEx/Serial/SettingWindow.xaml | 128 ++++++++++++++++++-------------
1 file changed, 74 insertions(+), 54 deletions(-)
diff --git a/CommEx/Serial/SettingWindow.xaml b/CommEx/Serial/SettingWindow.xaml
index 28ea3a6..642f060 100644
--- a/CommEx/Serial/SettingWindow.xaml
+++ b/CommEx/Serial/SettingWindow.xaml
@@ -6,64 +6,84 @@
xmlns:local="clr-namespace:CommEx.Serial"
mc:Ignorable="d"
Title="Serial Port Settings" Height="300" Width="400">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
From 2c7f30d5c6106e5c6d7b9e5cd4ebbcd244e4dd1d Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Fri, 27 Dec 2024 18:02:25 +0900
Subject: [PATCH 08/97] update port control
---
CommEx/Serial/Serial.cs | 28 ++++++++++++++++++++++++----
1 file changed, 24 insertions(+), 4 deletions(-)
diff --git a/CommEx/Serial/Serial.cs b/CommEx/Serial/Serial.cs
index 86d9916..44426a3 100644
--- a/CommEx/Serial/Serial.cs
+++ b/CommEx/Serial/Serial.cs
@@ -18,7 +18,27 @@
namespace CommEx.Serial
{
- internal class SerialControl
+ interface ISerialControl
+ {
+ ///
+ /// ポートを開ける前に呼ばれる
+ ///
+ void PortOpen();
+
+ ///
+ /// ポートを閉じた後に呼ばれる
+ ///
+ void PortClose();
+
+ ///
+ /// シリアルポートの受信時に呼ばれる
+ ///
+ ///
+ ///
+ void DataReceived(object sender, SerialDataReceivedEventArgs e);
+ }
+
+ internal class SerialControl : ISerialControl
{
private enum Errors
{
@@ -97,7 +117,7 @@ struct AutoSend
}
- internal void PortOpen()
+ public void PortOpen()
{
port = new SerialPort();
port.PortName = "COM0"; //SetPortName(_serialPort.PortName);
@@ -136,13 +156,13 @@ internal void Open()
}
}
- internal void PortClose()
+ public void PortClose()
{
port.Close();
port.DataReceived -= DataReceived;
}
- private void DataReceived(object sender, SerialDataReceivedEventArgs e)
+ public void DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string str = port.ReadLine();
str = str.Trim();
From 0bebb85d404be5ca7ed8123610993e60d9c37e58 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Sat, 28 Dec 2024 15:31:05 +0900
Subject: [PATCH 09/97] fix forget return
---
CommEx/Serial/Serial.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/CommEx/Serial/Serial.cs b/CommEx/Serial/Serial.cs
index 44426a3..48b6756 100644
--- a/CommEx/Serial/Serial.cs
+++ b/CommEx/Serial/Serial.cs
@@ -184,7 +184,7 @@ string CreateResponse(string str)
{
if (body.ElementAt(0) != 'I')
{
- CreateError(Errors.BadFormatInCode);
+ return CreateError(Errors.BadFormatInCode);
}
}
From 72ba8d732b4d8e0c1fe3affe7ede99cbde76db05 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Wed, 1 Jan 2025 19:34:48 +0900
Subject: [PATCH 10/97] update ISerialControl
---
CommEx/Serial/Serial.cs | 18 ++++++++----------
1 file changed, 8 insertions(+), 10 deletions(-)
diff --git a/CommEx/Serial/Serial.cs b/CommEx/Serial/Serial.cs
index 48b6756..bec13f9 100644
--- a/CommEx/Serial/Serial.cs
+++ b/CommEx/Serial/Serial.cs
@@ -23,19 +23,21 @@ interface ISerialControl
///
/// ポートを開ける前に呼ばれる
///
- void PortOpen();
+ ///
+ void PortOpen(SerialPort serialPort);
///
/// ポートを閉じた後に呼ばれる
///
- void PortClose();
+ ///
+ void PortClose(SerialPort serialPort);
///
/// シリアルポートの受信時に呼ばれる
///
///
///
- void DataReceived(object sender, SerialDataReceivedEventArgs e);
+ //void DataReceived(object sender, SerialDataReceivedEventArgs e);
}
internal class SerialControl : ISerialControl
@@ -98,19 +100,15 @@ private enum Errors
const int version = 300;
- private SerialPort port;
-
- private INative native;
- private IBveHacker bveHacker;
+ private static bool isAvailable = false;
+ private static INative native;
+ private static IBveHacker bveHacker;
///
/// 改行コード
///
private string lineBreak = "\r\n";
- //IBveHacker bveHacker;
- //INative native;
-
struct AutoSend
{
From b504762760b26f0223f3776c266a27a5f82ea34e Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Wed, 1 Jan 2025 19:39:53 +0900
Subject: [PATCH 11/97] update port conotrol
---
CommEx/Serial/Serial.cs | 72 +++++++++++++++++++----------------------
1 file changed, 34 insertions(+), 38 deletions(-)
diff --git a/CommEx/Serial/Serial.cs b/CommEx/Serial/Serial.cs
index bec13f9..a0248c8 100644
--- a/CommEx/Serial/Serial.cs
+++ b/CommEx/Serial/Serial.cs
@@ -114,56 +114,55 @@ struct AutoSend
}
-
- public void PortOpen()
+ ///
+ public void PortOpen(SerialPort serialPort)
{
- port = new SerialPort();
- port.PortName = "COM0"; //SetPortName(_serialPort.PortName);
- port.BaudRate = 115200;//SetPortBaudRate(_serialPort.BaudRate);
- port.Parity = Parity.None;//SetPortParity(_serialPort.Parity);
- port.DataBits = 8;//SetPortDataBits(_serialPort.DataBits);
- port.StopBits = StopBits.One;//SetPortStopBits(_serialPort.StopBits);
- port.Handshake = Handshake.None;//SetPortHandshake(_serialPort.Handshake);
- port.Open();
+ serialPort.NewLine = lineBreak;
+ serialPort.DataReceived += DataReceived;
}
- internal void PortOpen(SerialPort serialPort)
+
+ ///
+ public void PortClose(SerialPort serialPort)
{
- port = serialPort;
- port.Open();
- port.DataReceived += DataReceived;
+ serialPort.DataReceived -= DataReceived;
}
- internal void Open()
+ ///
+ /// シリアルポートの受信時に呼ばれる
+ ///
+ ///
+ /// event args
+ private void DataReceived(object sender, SerialDataReceivedEventArgs e)
{
- port.NewLine = "\r\n";
- port.DataReceived += DataReceived;
+ SerialPort port = (SerialPort)sender;
+ string str = "";
try
{
- port.Open();
+ str = port.ReadLine();
}
- catch (Exception e)
+ catch (Exception ex)
{
- //MessageBox.Show(e.Message, "ポートオープンエラー", MessageBoxButton.OK, MessageBoxImage.Error);
- ErrorDialogInfo info = new ErrorDialogInfo(
- "ポートオープンエラー",
- e.Source,
- e.Message
- );
- ErrorDialog.Show(info);
- //throw;
- }
+#if DEBUG
+ ErrorDialog.Show(new ErrorDialogInfo("エラー:シリアル読み込み失敗", ex.Source, ex.Message));
+#endif
+ return;
}
+ str = str.Trim();
+ Debug.Print("Serial Receive Data" + str);
- public void PortClose()
+ if (str.Length < 5 || !isAvailable)
{
- port.Close();
- port.DataReceived -= DataReceived;
+ return;
}
-
- public void DataReceived(object sender, SerialDataReceivedEventArgs e)
+ if (str.StartsWith("EX") || str.StartsWith("TR"))
+ {
+ string response = CreateResponse(str);
+ if (response != null)
{
- string str = port.ReadLine();
- str = str.Trim();
+ Debug.Print("Serial Send Data" + response);
+ port.WriteLine(response);
+ }
+ }
}
///
@@ -186,8 +185,6 @@ string CreateResponse(string str)
}
}
- if (header == "TR" || header == "EX")
- {
switch (body.ElementAt(0))
{
case 'A': // 状態監視
@@ -385,7 +382,6 @@ string CreateResponse(string str)
default:
return CreateError(Errors.ErrorInCodeSymbol);
}
- }
return null;
}
From 2367324ba67737c076e5f7918df62187510e0035 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Wed, 1 Jan 2025 19:46:31 +0900
Subject: [PATCH 12/97] split interface
---
CommEx/Serial/ISerialControl.cs | 60 +++++++++++++++++++++++++++++++++
CommEx/Serial/Serial.cs | 28 ++-------------
2 files changed, 63 insertions(+), 25 deletions(-)
create mode 100644 CommEx/Serial/ISerialControl.cs
diff --git a/CommEx/Serial/ISerialControl.cs b/CommEx/Serial/ISerialControl.cs
new file mode 100644
index 0000000..5c5b754
--- /dev/null
+++ b/CommEx/Serial/ISerialControl.cs
@@ -0,0 +1,60 @@
+using BveEx.PluginHost;
+using System;
+using System.Collections.Generic;
+using System.IO.Ports;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CommEx.Serial
+{
+ internal interface ISerialControl
+ {
+ ///
+ /// ポートを開ける前に呼ばれる
+ ///
+ ///
+ void PortOpen(SerialPort serialPort);
+
+ ///
+ /// ポートを閉じた後に呼ばれる
+ ///
+ ///
+ void PortClose(SerialPort serialPort);
+
+ ///
+ /// シリアルポートの受信時に呼ばれる
+ ///
+ ///
+ ///
+ //void DataReceived(object sender, SerialDataReceivedEventArgs e);
+ }
+
+ interface IBveEx
+ {
+ ///
+ /// 全ての BveEx 拡張機能が読み込まれ、BveEx.PluginHost.Plugins.Extensions プロパティが取得可能になると発生
+ ///
+ ///
+ ///
+ void AllExtensionsLoaded(object sender, EventArgs e);
+
+ ///
+ /// シナリオ読み込み
+ ///
+ ///
+ void OnScenarioCreated(ScenarioCreatedEventArgs e);
+
+ ///
+ /// シナリオ読み込み中に毎フレーム呼び出される
+ ///
+ ///
+ void Tick(TimeSpan elapsed);
+
+ ///
+ /// シナリオ終了
+ ///
+ ///
+ void ScenarioClosed(EventArgs e);
+ }
+}
diff --git a/CommEx/Serial/Serial.cs b/CommEx/Serial/Serial.cs
index a0248c8..6f60823 100644
--- a/CommEx/Serial/Serial.cs
+++ b/CommEx/Serial/Serial.cs
@@ -18,33 +18,9 @@
namespace CommEx.Serial
{
- interface ISerialControl
+ internal enum Errors
{
///
- /// ポートを開ける前に呼ばれる
- ///
- ///
- void PortOpen(SerialPort serialPort);
-
- ///
- /// ポートを閉じた後に呼ばれる
- ///
- ///
- void PortClose(SerialPort serialPort);
-
- ///
- /// シリアルポートの受信時に呼ばれる
- ///
- ///
- ///
- //void DataReceived(object sender, SerialDataReceivedEventArgs e);
- }
-
- internal class SerialControl : ISerialControl
- {
- private enum Errors
- {
- ///
/// 原因不明エラー
///
Unknown,
@@ -98,6 +74,8 @@ private enum Errors
OutOfRange,
}
+ internal class SerialControl : ISerialControl
+ {
const int version = 300;
private static bool isAvailable = false;
From 159a7d01c9a50410902a7a645d4deae09a324ce9 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Wed, 1 Jan 2025 20:02:35 +0900
Subject: [PATCH 13/97] =?UTF-8?q?update=20=E8=AC=8E=E3=81=AE=E5=A4=89?=
=?UTF-8?q?=E6=9B=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
CommEx/Serial/Serial.cs | 484 ++++++++++++++++++++--------------------
1 file changed, 242 insertions(+), 242 deletions(-)
diff --git a/CommEx/Serial/Serial.cs b/CommEx/Serial/Serial.cs
index 6f60823..e80349c 100644
--- a/CommEx/Serial/Serial.cs
+++ b/CommEx/Serial/Serial.cs
@@ -21,58 +21,58 @@ namespace CommEx.Serial
internal enum Errors
{
///
- /// 原因不明エラー
- ///
- Unknown,
- ///
- /// コンバータとBIDSpp.dllとの間の接続が確立されていない
- ///
- NotConnected,
- ///
- /// 要求情報コードの数値部が不正
- ///
- ErrorInCodeNumber,
- ///
- /// 要求情報コードの記号部が不正
- ///
- ErrorInCodeSymbol,
- ///
- /// 識別子が不正
- ///
- ErrorInIdentifier,
- ///
- /// 数値変換がオーバーフローした
- ///
- Overflow,
- ///
- /// 要求情報コードの数値部に数値以外が混入している
- ///
- BadFormatInCode,
- ///
- /// 要求情報コードの数値部もしくは記号部が不正
- ///
- BadFormatCode,
- ///
- /// BVEのウィンドウハンドルを取得できない(キーイベント送信時)
- ///
- CantGetWindowHandle,
- ///
- /// (情報なし)
- ///
- NoInfo1,
- ///
- /// (情報なし)
- ///
- NoInfo2,
- ///
- /// (情報なし)
- ///
- NoInfo3,
- ///
- /// 配列の範囲外アクセス
- ///
- OutOfRange,
- }
+ /// 原因不明エラー
+ ///
+ Unknown,
+ ///
+ /// コンバータとBIDSpp.dllとの間の接続が確立されていない
+ ///
+ NotConnected,
+ ///
+ /// 要求情報コードの数値部が不正
+ ///
+ ErrorInCodeNumber,
+ ///
+ /// 要求情報コードの記号部が不正
+ ///
+ ErrorInCodeSymbol,
+ ///
+ /// 識別子が不正
+ ///
+ ErrorInIdentifier,
+ ///
+ /// 数値変換がオーバーフローした
+ ///
+ Overflow,
+ ///
+ /// 要求情報コードの数値部に数値以外が混入している
+ ///
+ BadFormatInCode,
+ ///
+ /// 要求情報コードの数値部もしくは記号部が不正
+ ///
+ BadFormatCode,
+ ///
+ /// BVEのウィンドウハンドルを取得できない(キーイベント送信時)
+ ///
+ CantGetWindowHandle,
+ ///
+ /// (情報なし)
+ ///
+ NoInfo1,
+ ///
+ /// (情報なし)
+ ///
+ NoInfo2,
+ ///
+ /// (情報なし)
+ ///
+ NoInfo3,
+ ///
+ /// 配列の範囲外アクセス
+ ///
+ OutOfRange,
+ }
internal class SerialControl : ISerialControl
{
@@ -89,7 +89,7 @@ internal class SerialControl : ISerialControl
struct AutoSend
{
-
+
}
///
@@ -124,19 +124,19 @@ private void DataReceived(object sender, SerialDataReceivedEventArgs e)
ErrorDialog.Show(new ErrorDialogInfo("エラー:シリアル読み込み失敗", ex.Source, ex.Message));
#endif
return;
- }
+ }
str = str.Trim();
Debug.Print("Serial Receive Data" + str);
if (str.Length < 5 || !isAvailable)
- {
+ {
return;
- }
+ }
if (str.StartsWith("EX") || str.StartsWith("TR"))
{
string response = CreateResponse(str);
if (response != null)
- {
+ {
Debug.Print("Serial Send Data" + response);
port.WriteLine(response);
}
@@ -163,203 +163,203 @@ string CreateResponse(string str)
}
}
- switch (body.ElementAt(0))
- {
- case 'A': // 状態監視
- return CreateError(Errors.ErrorInCodeSymbol);
- case 'I': // 運転情報
- int num2 = 0;
- if (!Convert.ToBoolean(int.TryParse(body.Substring(2), out num2)))
- {
- CreateError(Errors.BadFormatInCode);
- }
+ switch (body.ElementAt(0))
+ {
+ case 'A': // 状態監視
+ return CreateError(Errors.ErrorInCodeSymbol);
+ case 'I': // 運転情報
+ int num2 = 0;
+ if (!Convert.ToBoolean(int.TryParse(body.Substring(2), out num2)))
+ {
+ CreateError(Errors.BadFormatInCode);
+ }
- switch (body.ElementAt(1))
+ switch (body.ElementAt(1))
+ {
+ case 'C': // Spec
+ switch (num2)
{
- case 'C': // Spec
- switch (num2)
- {
- case 0: // Bノッチ数
- return response + native.VehicleSpec.BrakeNotches.ToString();
- case 1: // Pノッチ数
- return response + native.VehicleSpec.PowerNotches.ToString();
- case 2: // ATS確認段
- return response + native.VehicleSpec.AtsNotch.ToString();
- case 3: // B67相当段
- return response + native.VehicleSpec.B67Notch.ToString();
- case 4: // 車両編成数
- return response + native.VehicleSpec.Cars.ToString();
- default:
- CreateError(Errors.ErrorInCodeNumber);
- break;
- }
+ case 0: // Bノッチ数
+ return response + native.VehicleSpec.BrakeNotches.ToString();
+ case 1: // Pノッチ数
+ return response + native.VehicleSpec.PowerNotches.ToString();
+ case 2: // ATS確認段
+ return response + native.VehicleSpec.AtsNotch.ToString();
+ case 3: // B67相当段
+ return response + native.VehicleSpec.B67Notch.ToString();
+ case 4: // 車両編成数
+ return response + native.VehicleSpec.Cars.ToString();
+ default:
+ CreateError(Errors.ErrorInCodeNumber);
break;
- case 'E': // Status
- switch (num2)
- {
- case 0: // 列車位置[m]
- return response + native.VehicleState.Location.ToString();
- case 1: // 列車速度[km/h]
- return response + native.VehicleState.Speed.ToString();
- case 2: // 現在時刻[ms]
- return response + native.VehicleState.Time.TotalMilliseconds.ToString();
- case 3: // BC Pres[kPa]
- return response + native.VehicleState.BcPressure.ToString();
- case 4: // MR Pres [kPa]
- return response + native.VehicleState.MrPressure.ToString();
- case 5: // ER Pres [kPa]
- return response + native.VehicleState.ErPressure.ToString();
- case 6: // BP Pres [kPa]
- return response + native.VehicleState.BpPressure.ToString();
- case 7: // SAP Pres [kPa]
- return response + native.VehicleState.SapPressure.ToString();
- case 8: // 電流 [A]
- return response + native.VehicleState.Current.ToString();
- //case 9: // 電圧 [V](準備工事)
- // return response + bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.PowerNotch.ToString();
- // return response + bveHacker.Scenario.Vehicle.Instruments.Electricity.
- case 10: // 現在時刻(HH)[時]
- return response + native.VehicleState.Time.Hours.ToString();
- case 11: // 現在時刻(MM)[分]
- return response + native.VehicleState.Time.Minutes.ToString();
- case 12: // 現在時刻(SS)[秒]
- return response + native.VehicleState.Time.Seconds.ToString();
- case 13: // 現在時刻(ms)[ミリ秒]
- return response + native.VehicleState.Time.Milliseconds.ToString();
- default:
- CreateError(Errors.ErrorInCodeNumber);
- break;
- }
+ }
+ break;
+ case 'E': // Status
+ switch (num2)
+ {
+ case 0: // 列車位置[m]
+ return response + native.VehicleState.Location.ToString();
+ case 1: // 列車速度[km/h]
+ return response + native.VehicleState.Speed.ToString();
+ case 2: // 現在時刻[ms]
+ return response + native.VehicleState.Time.TotalMilliseconds.ToString();
+ case 3: // BC Pres[kPa]
+ return response + native.VehicleState.BcPressure.ToString();
+ case 4: // MR Pres [kPa]
+ return response + native.VehicleState.MrPressure.ToString();
+ case 5: // ER Pres [kPa]
+ return response + native.VehicleState.ErPressure.ToString();
+ case 6: // BP Pres [kPa]
+ return response + native.VehicleState.BpPressure.ToString();
+ case 7: // SAP Pres [kPa]
+ return response + native.VehicleState.SapPressure.ToString();
+ case 8: // 電流 [A]
+ return response + native.VehicleState.Current.ToString();
+ //case 9: // 電圧 [V](準備工事)
+ // return response + bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.PowerNotch.ToString();
+ // return response + bveHacker.Scenario.Vehicle.Instruments.Electricity.
+ case 10: // 現在時刻(HH)[時]
+ return response + native.VehicleState.Time.Hours.ToString();
+ case 11: // 現在時刻(MM)[分]
+ return response + native.VehicleState.Time.Minutes.ToString();
+ case 12: // 現在時刻(SS)[秒]
+ return response + native.VehicleState.Time.Seconds.ToString();
+ case 13: // 現在時刻(ms)[ミリ秒]
+ return response + native.VehicleState.Time.Milliseconds.ToString();
+ default:
+ CreateError(Errors.ErrorInCodeNumber);
break;
- case 'H': // Handle
- switch (num2)
- {
- case 0: // Bノッチ位置
- return response + bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.BrakeNotch.ToString();
- case 1: // Pノッチ位置
- return response + bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.PowerNotch.ToString();
- case 2: // レバーサー位置
- return response + bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.ReverserPosition.ToString();
- case 3: // 定速状態(準備工事)
- return response + bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.ConstantSpeedMode.ToString();
- default:
- return CreateError(Errors.ErrorInCodeNumber);
- }
- case 'P': // Panel
- for (int i = 0; i < body.Length; i++)
- {
- try
- {
- return response + native.AtsPanelArray[num2].ToString();
- //int val = bveHacker.Scenario.Vehicle.Instruments.AtsPlugin.PanelArray[num2];
- //return response + val.ToString();
- }
- catch (Exception e)
- {
-#if DEBUG
- ErrorDialogInfo errorDialogInfo = new ErrorDialogInfo("エラー:配列の範囲外アクセス", e.Source, e.Message);
- ErrorDialog.Show(errorDialogInfo);
-#endif
- return CreateError(Errors.OutOfRange);
- }
- }
+ }
+ break;
+ case 'H': // Handle
+ switch (num2)
+ {
+ case 0: // Bノッチ位置
+ return response + bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.BrakeNotch.ToString();
+ case 1: // Pノッチ位置
+ return response + bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.PowerNotch.ToString();
+ case 2: // レバーサー位置
+ return response + bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.ReverserPosition.ToString();
+ case 3: // 定速状態(準備工事)
+ return response + bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.ConstantSpeedMode.ToString();
+ default:
return CreateError(Errors.ErrorInCodeNumber);
- case 'S': // Sound
- for (int i = 0; i < body.Length; i++)
- {
- try
- {
- return response + native.AtsSoundArray[num2].ToString();
- //int val = bveHacker.Scenario.Vehicle.Instruments.AtsPlugin.SoundArray[num2];
- //return response + val.ToString();
- }
- catch (Exception e)
- {
+ }
+ case 'P': // Panel
+ for (int i = 0; i < body.Length; i++)
+ {
+ try
+ {
+ return response + native.AtsPanelArray[num2].ToString();
+ //int val = bveHacker.Scenario.Vehicle.Instruments.AtsPlugin.PanelArray[num2];
+ //return response + val.ToString();
+ }
+ catch (Exception e)
+ {
#if DEBUG
- ErrorDialogInfo errorDialogInfo = new ErrorDialogInfo("エラー:配列の範囲外アクセス", e.Source, e.Message);
- ErrorDialog.Show(errorDialogInfo);
+ ErrorDialogInfo errorDialogInfo = new ErrorDialogInfo("エラー:配列の範囲外アクセス", e.Source, e.Message);
+ ErrorDialog.Show(errorDialogInfo);
#endif
- return CreateError(Errors.OutOfRange);
- }
- }
- return CreateError(Errors.ErrorInCodeNumber);
- case 'D': // ドア状態
- switch (num2)
- {
- case 0: // 全体
- return response + bveHacker.Scenario.Vehicle.Conductor.Doors.AreAllClosed;
- case -1: // 左(準備工事)
- case 1: // 右(準備工事)
- default:
- return CreateError(Errors.ErrorInCodeNumber);
- }
- default:
- return CreateError(Errors.ErrorInCodeSymbol);
+ return CreateError(Errors.OutOfRange);
+ }
}
- break;
- case 'R': // レバーサー操作要求
- if (-1 <= num1 && num1 <= 1)
- {
- bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.BrakeNotch = num1;
- return response + 0.ToString();
- }
- return CreateError(Errors.ErrorInCodeSymbol);
- case 'S': // ワンハンドル操作要求
- //if (num1 > 0)
- //{
- // bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.PowerNotch += num1;
- // bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.BrakeNotch += num1;
- // return response + 0.ToString();
- //}
- //else if (num1 < 0)
- //{
- // bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.PowerNotch += num1;
- // bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.BrakeNotch += num1;
- // return response + 0.ToString();
- //}
- //else if (num1 == 0)
- //{
- // bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.PowerNotch = 0;
- // bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.BrakeNotch = 0;
- // return response + 0.ToString();
- //}
- return CreateError(Errors.ErrorInCodeSymbol);
- case 'P': // 力行操作要求
- bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.PowerNotch += num1;
- return response + 0.ToString();
- case 'B': // 制動操作要求
- bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.BrakeNotch += num1;
- return response + 0.ToString();
- case 'K': // キー操作要求
- switch (body.ElementAt(1))
- {
- case 'P': // Pless
- if (num1 <= (int)AtsKeyName.L)
+ return CreateError(Errors.ErrorInCodeNumber);
+ case 'S': // Sound
+ for (int i = 0; i < body.Length; i++)
+ {
+ try
{
- bveHacker.InputManager.KeyDown_Invoke(InputEventArgsFactory.AtsKey((AtsKeyName)num1));
- return response + 0.ToString();
+ return response + native.AtsSoundArray[num2].ToString();
+ //int val = bveHacker.Scenario.Vehicle.Instruments.AtsPlugin.SoundArray[num2];
+ //return response + val.ToString();
}
- return CreateError(Errors.ErrorInCodeNumber);
- case 'R': // Release
- if (num1 <= (int)AtsKeyName.L)
+ catch (Exception e)
{
- bveHacker.InputManager.KeyUp_Invoke(InputEventArgsFactory.AtsKey((AtsKeyName)num1));
- return response + 0.ToString();
+#if DEBUG
+ ErrorDialogInfo errorDialogInfo = new ErrorDialogInfo("エラー:配列の範囲外アクセス", e.Source, e.Message);
+ ErrorDialog.Show(errorDialogInfo);
+#endif
+ return CreateError(Errors.OutOfRange);
}
- return CreateError(Errors.ErrorInCodeNumber);
- default:
- return CreateError(Errors.ErrorInCodeSymbol);
- }
- return CreateError(Errors.ErrorInCodeSymbol);
- case 'V': // バージョン情報
- return header + version.ToString();
- case 'E': // エラー情報
- return CreateError(Errors.ErrorInCodeSymbol);
- case 'H': // 保安装置情報
- return CreateError(Errors.ErrorInCodeSymbol);
- default:
- return CreateError(Errors.ErrorInCodeSymbol);
- }
+ }
+ return CreateError(Errors.ErrorInCodeNumber);
+ case 'D': // ドア状態
+ switch (num2)
+ {
+ case 0: // 全体
+ return response + bveHacker.Scenario.Vehicle.Conductor.Doors.AreAllClosed;
+ case -1: // 左(準備工事)
+ case 1: // 右(準備工事)
+ default:
+ return CreateError(Errors.ErrorInCodeNumber);
+ }
+ default:
+ return CreateError(Errors.ErrorInCodeSymbol);
+ }
+ break;
+ case 'R': // レバーサー操作要求
+ if (-1 <= num1 && num1 <= 1)
+ {
+ bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.BrakeNotch = num1;
+ return response + 0.ToString();
+ }
+ return CreateError(Errors.ErrorInCodeSymbol);
+ case 'S': // ワンハンドル操作要求
+ //if (num1 > 0)
+ //{
+ // bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.PowerNotch += num1;
+ // bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.BrakeNotch += num1;
+ // return response + 0.ToString();
+ //}
+ //else if (num1 < 0)
+ //{
+ // bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.PowerNotch += num1;
+ // bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.BrakeNotch += num1;
+ // return response + 0.ToString();
+ //}
+ //else if (num1 == 0)
+ //{
+ // bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.PowerNotch = 0;
+ // bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.BrakeNotch = 0;
+ // return response + 0.ToString();
+ //}
+ return CreateError(Errors.ErrorInCodeSymbol);
+ case 'P': // 力行操作要求
+ bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.PowerNotch += num1;
+ return response + 0.ToString();
+ case 'B': // 制動操作要求
+ bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.BrakeNotch += num1;
+ return response + 0.ToString();
+ case 'K': // キー操作要求
+ switch (body.ElementAt(1))
+ {
+ case 'P': // Pless
+ if (num1 <= (int)AtsKeyName.L)
+ {
+ bveHacker.InputManager.KeyDown_Invoke(InputEventArgsFactory.AtsKey((AtsKeyName)num1));
+ return response + 0.ToString();
+ }
+ return CreateError(Errors.ErrorInCodeNumber);
+ case 'R': // Release
+ if (num1 <= (int)AtsKeyName.L)
+ {
+ bveHacker.InputManager.KeyUp_Invoke(InputEventArgsFactory.AtsKey((AtsKeyName)num1));
+ return response + 0.ToString();
+ }
+ return CreateError(Errors.ErrorInCodeNumber);
+ default:
+ return CreateError(Errors.ErrorInCodeSymbol);
+ }
+ return CreateError(Errors.ErrorInCodeSymbol);
+ case 'V': // バージョン情報
+ return header + version.ToString();
+ case 'E': // エラー情報
+ return CreateError(Errors.ErrorInCodeSymbol);
+ case 'H': // 保安装置情報
+ return CreateError(Errors.ErrorInCodeSymbol);
+ default:
+ return CreateError(Errors.ErrorInCodeSymbol);
+ }
return null;
}
From 793d0cda1fbe805391408c557daa32af6a6d2ce8 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Wed, 1 Jan 2025 20:03:44 +0900
Subject: [PATCH 14/97] move serial.cs
---
CommEx/Serial/{ => Bids}/Serial.cs | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename CommEx/Serial/{ => Bids}/Serial.cs (100%)
diff --git a/CommEx/Serial/Serial.cs b/CommEx/Serial/Bids/Serial.cs
similarity index 100%
rename from CommEx/Serial/Serial.cs
rename to CommEx/Serial/Bids/Serial.cs
From 10540ba755aeaa416d0226de906c47dee70b07af Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Wed, 1 Jan 2025 20:06:25 +0900
Subject: [PATCH 15/97] change namespace
---
CommEx/Serial/Bids/Serial.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/CommEx/Serial/Bids/Serial.cs b/CommEx/Serial/Bids/Serial.cs
index e80349c..7376b29 100644
--- a/CommEx/Serial/Bids/Serial.cs
+++ b/CommEx/Serial/Bids/Serial.cs
@@ -16,7 +16,7 @@
using BveEx.Extensions.Native.Input;
using System.Windows.Media.Animation;
-namespace CommEx.Serial
+namespace CommEx.Serial.Bids
{
internal enum Errors
{
@@ -74,7 +74,7 @@ internal enum Errors
OutOfRange,
}
- internal class SerialControl : ISerialControl
+ internal class Bids : ISerialControl
{
const int version = 300;
From 8f1fbd36d88595fb04e7a3f5989a3bd0cdd77278 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Wed, 1 Jan 2025 20:13:14 +0900
Subject: [PATCH 16/97] update project
---
CommEx/CommEx.csproj | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/CommEx/CommEx.csproj b/CommEx/CommEx.csproj
index b0ebe19..05b93e3 100644
--- a/CommEx/CommEx.csproj
+++ b/CommEx/CommEx.csproj
@@ -7,6 +7,7 @@
false
false
true
+ true
@@ -18,4 +19,18 @@
+
+
+
+
+
+
+
+
+
+
+ MSBuild:Compile
+
+
+
\ No newline at end of file
From d1e6cef31322f4e505bd035e967436bebe7a045f Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Wed, 1 Jan 2025 20:18:07 +0900
Subject: [PATCH 17/97] update using
---
CommEx/Serial/Main.cs | 20 ++++++++++++++++----
1 file changed, 16 insertions(+), 4 deletions(-)
diff --git a/CommEx/Serial/Main.cs b/CommEx/Serial/Main.cs
index 18d3516..aff87f4 100644
--- a/CommEx/Serial/Main.cs
+++ b/CommEx/Serial/Main.cs
@@ -1,18 +1,25 @@
using System;
using System.Collections.Generic;
+using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-
-using AtsEx.PluginHost.Plugins;
-using AtsEx.PluginHost.Plugins.Extensions;
+using System.Windows.Forms;
+using System.Xml.Linq;
+using BveEx.Extensions.ContextMenuHacker;
+using BveEx.PluginHost;
+//using BveEx.PluginHost.Scripting;
+using BveEx.PluginHost.Plugins;
+using BveEx.PluginHost.Plugins.Extensions;
+using BveTypes.ClassWrappers;
+using BveEx.Extensions.Native;
namespace CommEx.Serial
{
///
/// プラグインの本体
/// Plugin() の第一引数でこのプラグインの仕様を指定
- /// Plugin() の第二引数でこのプラグインが必要とするAtsEX本体の最低バージョンを指定(オプション)
+ /// Plugin() の第二引数でこのプラグインが必要とするBveEx本体の最低バージョンを指定(オプション)
///
[Plugin(PluginType.Extension)]
[Togglable]
@@ -35,6 +42,11 @@ public bool IsEnabled
set { status = value; }
}
+ ///
+ /// 設定ウィンドウ
+ ///
+ private SettingWindow window = new SettingWindow();
+
///
/// プラグインが読み込まれた時に呼ばれる
/// 初期化を実装する
From 8174432868e2fd1faff5bca4289c2deff86a22ba Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Wed, 1 Jan 2025 20:20:30 +0900
Subject: [PATCH 18/97] update main
---
CommEx/Serial/Main.cs | 121 +++++++++++++++++++++++++++++++++++++++---
1 file changed, 115 insertions(+), 6 deletions(-)
diff --git a/CommEx/Serial/Main.cs b/CommEx/Serial/Main.cs
index aff87f4..4b2c3de 100644
--- a/CommEx/Serial/Main.cs
+++ b/CommEx/Serial/Main.cs
@@ -30,6 +30,28 @@ internal class Serial : AssemblyPluginBase, ITogglableExtension, IExtension
///
public override string Description { get; } = "シリアル通信";
+ ///
+ /// シナリオ
+ ///
+ private Scenario scenario;
+
+ ///
+ /// BveHacker
+ ///
+ private IBveHacker bveHacker;
+
+ INative native;
+
+ ///
+ /// ContextMenuHacker
+ ///
+ private IContextMenuHacker cmx;
+
+ ///
+ /// 設定ボタン
+ ///
+ private ToolStripMenuItem setting;
+
///
/// プラグインの有効・無効状態
///
@@ -54,16 +76,46 @@ public bool IsEnabled
///
public Serial(PluginBuilder builder) : base(builder)
{
- Extensions.AllExtensionsLoaded += Extensions_AllExtensionsLoaded;
+ Debug.Listeners.Add(new TextWriterTraceListener(Console.Out));
+ Debug.AutoFlush = true;
+ Extensions.AllExtensionsLoaded += AllExtensionsLoaded;
+ BveHacker.ScenarioCreated += OnScenarioCreated;
+ BveHacker.ScenarioClosed += ScenarioClosed;
+ window = new SettingWindow();
+ window.Hide();
+ }
+
+ ///
+ /// 全ての BveEx 拡張機能が読み込まれ、BveEx.PluginHost.Plugins.Extensions プロパティが取得可能になると発生
+ ///
+ ///
+ ///
+ private void AllExtensionsLoaded(object sender, EventArgs e)
+ {
+ cmx = Extensions.GetExtension();
+ setting = cmx.AddCheckableMenuItem("シリアル通信設定", MenuItemCheckedChanged, ContextMenuItemType.CoreAndExtensions);
}
///
- /// 全ての AtsEX 拡張機能が読み込まれ、AtsEx.PluginHost.Plugins.Extensions プロパティが取得可能になると発生
+ /// 右クリックメニューのボタンイベント
///
///
///
- private void Extensions_AllExtensionsLoaded(object sender, EventArgs e)
+ ///
+ private void MenuItemCheckedChanged(object sender, EventArgs e)
{
+ if (setting == null)
+ {
+ window = new SettingWindow();
+ }
+ if (setting.Checked)
+ {
+ window.Show();
+ }
+ else
+ {
+ window.Hide();
+ }
}
///
@@ -72,16 +124,73 @@ private void Extensions_AllExtensionsLoaded(object sender, EventArgs e)
///
public override void Dispose()
{
- Extensions.AllExtensionsLoaded -= Extensions_AllExtensionsLoaded;
+ Extensions.AllExtensionsLoaded -= AllExtensionsLoaded;
+ BveHacker.ScenarioCreated -= OnScenarioCreated;
+ BveHacker.ScenarioClosed -= ScenarioClosed;
}
///
/// シナリオ読み込み中に毎フレーム呼び出される
///
/// 前回フレームからの経過時間
- public override TickResult Tick(TimeSpan elapsed)
+ public override void Tick(TimeSpan elapsed)
+ {
+
+ }
+
+ ///
+ /// シナリオ読み込み
+ ///
+ ///
+ private void OnScenarioCreated(ScenarioCreatedEventArgs e)
+ {
+ scenario = e.Scenario;
+ bveHacker = BveHacker;
+
+ Bids.Load(bveHacker);
+
+ //try
+ //{
+ // _ExtendedBeacons = ExtendedBeaconSet.Load(Native, BveHacker, e.Scenario);
+ //}
+ //catch (Exception ex)
+ //{
+ // switch (ex)
+ // {
+ // case BveFileLoadException exception:
+ // BveHacker.LoadErrorManager.Throw(exception.Message, exception.SenderFileName, exception.LineIndex, exception.CharIndex);
+ // break;
+
+ // case CompilationException exception:
+ // foreach (Diagnostic diagnostic in exception.CompilationErrors)
+ // {
+ // string message = diagnostic.GetMessage();
+ // string fileName = Path.GetFileName(diagnostic.Location.SourceTree.FilePath);
+
+ // LinePosition position = diagnostic.Location.GetLineSpan().StartLinePosition;
+ // int lineIndex = position.Line;
+ // int charIndex = position.Character;
+
+ // BveHacker.LoadErrorManager.Throw(message, fileName, lineIndex, charIndex);
+ // }
+ // break;
+
+ // default:
+ // BveHacker.LoadErrorManager.Throw(ex.Message);
+ // _ = MessageBox.Show(ex.ToString(), App.Instance.ProductName);
+ // break;
+ // }
+ //}
+ }
+
+ ///
+ /// シナリオ終了
+ ///
+ ///
+ ///
+ private void ScenarioClosed(EventArgs e)
{
- return new ExtensionTickResult();
+ //throw new NotImplementedException();
}
}
}
From bd8dcffe41fe8562655d038f122df9a6ce2d858e Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Thu, 2 Jan 2025 01:02:21 +0900
Subject: [PATCH 19/97] update window behavior
---
CommEx/Serial/Main.cs | 26 +++++++++++++++++++++-----
1 file changed, 21 insertions(+), 5 deletions(-)
diff --git a/CommEx/Serial/Main.cs b/CommEx/Serial/Main.cs
index 4b2c3de..10368c6 100644
--- a/CommEx/Serial/Main.cs
+++ b/CommEx/Serial/Main.cs
@@ -43,12 +43,13 @@ internal class Serial : AssemblyPluginBase, ITogglableExtension, IExtension
INative native;
///
+ /// 右クリックメニュー操作用
/// ContextMenuHacker
///
private IContextMenuHacker cmx;
///
- /// 設定ボタン
+ /// 右クリックメニューの設定ボタン
///
private ToolStripMenuItem setting;
@@ -67,7 +68,7 @@ public bool IsEnabled
///
/// 設定ウィンドウ
///
- private SettingWindow window = new SettingWindow();
+ private readonly SettingWindow window;
///
/// プラグインが読み込まれた時に呼ばれる
@@ -82,9 +83,23 @@ public Serial(PluginBuilder builder) : base(builder)
BveHacker.ScenarioCreated += OnScenarioCreated;
BveHacker.ScenarioClosed += ScenarioClosed;
window = new SettingWindow();
+ window.Closing += WindowClosing;
window.Hide();
}
+ ///
+ /// 閉じるボタンのコールバック
+ ///
+ /// SettingWindow
+ /// キャンセルできるイベントのデータ
+ private void WindowClosing(object sender, System.ComponentModel.CancelEventArgs e)
+ {
+ e.Cancel = true;
+ SettingWindow window = (SettingWindow)sender;
+ window.Hide();
+ setting.Checked = false;
+ }
+
///
/// 全ての BveEx 拡張機能が読み込まれ、BveEx.PluginHost.Plugins.Extensions プロパティが取得可能になると発生
///
@@ -104,10 +119,8 @@ private void AllExtensionsLoaded(object sender, EventArgs e)
///
private void MenuItemCheckedChanged(object sender, EventArgs e)
{
- if (setting == null)
+ if (setting != null)
{
- window = new SettingWindow();
- }
if (setting.Checked)
{
window.Show();
@@ -117,6 +130,7 @@ private void MenuItemCheckedChanged(object sender, EventArgs e)
window.Hide();
}
}
+ }
///
/// プラグインが解放されたときに呼ばれる
@@ -127,6 +141,8 @@ public override void Dispose()
Extensions.AllExtensionsLoaded -= AllExtensionsLoaded;
BveHacker.ScenarioCreated -= OnScenarioCreated;
BveHacker.ScenarioClosed -= ScenarioClosed;
+ window.Closing -= WindowClosing;
+ window.Close();
}
///
From bb7d5169ef02ca73e92781a90aca613c03fb9a24 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Thu, 2 Jan 2025 01:03:08 +0900
Subject: [PATCH 20/97] add comment
---
CommEx/Serial/Main.cs | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/CommEx/Serial/Main.cs b/CommEx/Serial/Main.cs
index 10368c6..f9065ae 100644
--- a/CommEx/Serial/Main.cs
+++ b/CommEx/Serial/Main.cs
@@ -40,6 +40,9 @@ internal class Serial : AssemblyPluginBase, ITogglableExtension, IExtension
///
private IBveHacker bveHacker;
+ ///
+ /// Native
+ ///
INative native;
///
@@ -163,7 +166,7 @@ private void OnScenarioCreated(ScenarioCreatedEventArgs e)
scenario = e.Scenario;
bveHacker = BveHacker;
- Bids.Load(bveHacker);
+ //Bids.Load(bveHacker);
//try
//{
From 92f6e50f025d77de341fb53083f52dd675e1a193 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Thu, 2 Jan 2025 01:03:56 +0900
Subject: [PATCH 21/97] update main
---
CommEx/Serial/Main.cs | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/CommEx/Serial/Main.cs b/CommEx/Serial/Main.cs
index f9065ae..6e022d9 100644
--- a/CommEx/Serial/Main.cs
+++ b/CommEx/Serial/Main.cs
@@ -124,16 +124,16 @@ private void MenuItemCheckedChanged(object sender, EventArgs e)
{
if (setting != null)
{
- if (setting.Checked)
- {
- window.Show();
- }
- else
- {
- window.Hide();
+ if (setting.Checked)
+ {
+ window.Show();
+ }
+ else
+ {
+ window.Hide();
+ }
}
}
- }
///
/// プラグインが解放されたときに呼ばれる
From 13de502eca59e4418ef79440bf2377c5761e78b6 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Thu, 2 Jan 2025 01:56:46 +0900
Subject: [PATCH 22/97] clean main
add region
add comment
---
CommEx/Serial/Main.cs | 136 ++++++++++++++++++++++++------------------
CommEx/Udp/Main.cs | 43 ++++++++-----
2 files changed, 107 insertions(+), 72 deletions(-)
diff --git a/CommEx/Serial/Main.cs b/CommEx/Serial/Main.cs
index 6e022d9..c90bf6b 100644
--- a/CommEx/Serial/Main.cs
+++ b/CommEx/Serial/Main.cs
@@ -25,11 +25,22 @@ namespace CommEx.Serial
[Togglable]
internal class Serial : AssemblyPluginBase, ITogglableExtension, IExtension
{
+ #region Plugin Settings
+
///
public override string Title { get; } = nameof(Serial);
///
public override string Description { get; } = "シリアル通信";
+ #endregion
+
+ #region Variables
+
+ ///
+ /// プラグインの有効・無効状態
+ ///
+ private bool status = true;
+
///
/// シナリオ
///
@@ -57,9 +68,13 @@ internal class Serial : AssemblyPluginBase, ITogglableExtension, IExtension
private ToolStripMenuItem setting;
///
- /// プラグインの有効・無効状態
+ /// 設定ウィンドウ
///
- private bool status = true;
+ private readonly SettingWindow window;
+
+ #endregion
+
+ #region Properties
///
public bool IsEnabled
@@ -68,10 +83,9 @@ public bool IsEnabled
set { status = value; }
}
- ///
- /// 設定ウィンドウ
- ///
- private readonly SettingWindow window;
+ #endregion
+
+ #region Class Functions
///
/// プラグインが読み込まれた時に呼ばれる
@@ -90,55 +104,11 @@ public Serial(PluginBuilder builder) : base(builder)
window.Hide();
}
- ///
- /// 閉じるボタンのコールバック
- ///
- /// SettingWindow
- /// キャンセルできるイベントのデータ
- private void WindowClosing(object sender, System.ComponentModel.CancelEventArgs e)
- {
- e.Cancel = true;
- SettingWindow window = (SettingWindow)sender;
- window.Hide();
- setting.Checked = false;
- }
-
- ///
- /// 全ての BveEx 拡張機能が読み込まれ、BveEx.PluginHost.Plugins.Extensions プロパティが取得可能になると発生
- ///
- ///
- ///
- private void AllExtensionsLoaded(object sender, EventArgs e)
- {
- cmx = Extensions.GetExtension();
- setting = cmx.AddCheckableMenuItem("シリアル通信設定", MenuItemCheckedChanged, ContextMenuItemType.CoreAndExtensions);
- }
+ #endregion
- ///
- /// 右クリックメニューのボタンイベント
- ///
- ///
- ///
- ///
- private void MenuItemCheckedChanged(object sender, EventArgs e)
- {
- if (setting != null)
- {
- if (setting.Checked)
- {
- window.Show();
- }
- else
- {
- window.Hide();
- }
- }
- }
+ #region BveEx Functions
- ///
- /// プラグインが解放されたときに呼ばれる
- /// 後処理を実装する
- ///
+ ///
public override void Dispose()
{
Extensions.AllExtensionsLoaded -= AllExtensionsLoaded;
@@ -148,15 +118,27 @@ public override void Dispose()
window.Close();
}
- ///
- /// シナリオ読み込み中に毎フレーム呼び出される
- ///
- /// 前回フレームからの経過時間
+ ///
public override void Tick(TimeSpan elapsed)
{
}
+ #endregion
+
+ #region BveEx Event Handlers
+
+ ///
+ /// 全ての BveEx 拡張機能が読み込まれ、BveEx.PluginHost.Plugins.Extensions プロパティが取得可能になると発生
+ ///
+ ///
+ ///
+ private void AllExtensionsLoaded(object sender, EventArgs e)
+ {
+ cmx = Extensions.GetExtension();
+ setting = cmx.AddCheckableMenuItem("シリアル通信設定", MenuItemCheckedChanged, ContextMenuItemType.CoreAndExtensions);
+ }
+
///
/// シナリオ読み込み
///
@@ -211,5 +193,45 @@ private void ScenarioClosed(EventArgs e)
{
//throw new NotImplementedException();
}
+
+ #endregion
+
+
+ #region Event Handlers
+
+ ///
+ /// 右クリックメニューのクリックイベントハンドラ
+ ///
+ ///
+ ///
+ private void MenuItemCheckedChanged(object sender, EventArgs e)
+ {
+ if (setting != null)
+ {
+ if (setting.Checked)
+ {
+ window.Show();
+ }
+ else
+ {
+ window.Hide();
+ }
+ }
+ }
+
+ ///
+ /// 設定ウィンドウの閉じるボタンのクリックイベントハンドラ
+ ///
+ /// SettingWindow
+ /// キャンセルできるイベントのデータ
+ private void WindowClosing(object sender, System.ComponentModel.CancelEventArgs e)
+ {
+ e.Cancel = true;
+ SettingWindow window = (SettingWindow)sender;
+ window.Hide();
+ setting.Checked = false;
+ }
+
+ #endregion
}
}
diff --git a/CommEx/Udp/Main.cs b/CommEx/Udp/Main.cs
index ce54c5f..e859b33 100644
--- a/CommEx/Udp/Main.cs
+++ b/CommEx/Udp/Main.cs
@@ -4,30 +4,40 @@
using System.Text;
using System.Threading.Tasks;
-using AtsEx.PluginHost.Plugins;
-using AtsEx.PluginHost.Plugins.Extensions;
+using BveEx.PluginHost.Plugins;
+using BveEx.PluginHost.Plugins.Extensions;
namespace CommEx.Udp
{
///
/// プラグインの本体
/// Plugin() の第一引数でこのプラグインの仕様を指定
- /// Plugin() の第二引数でこのプラグインが必要とするAtsEX本体の最低バージョンを指定(オプション)
+ /// Plugin() の第二引数でこのプラグインが必要とするBveEx本体の最低バージョンを指定(オプション)
///
[Plugin(PluginType.Extension)]
[Togglable]
internal class Udp : AssemblyPluginBase, ITogglableExtension, IExtension
{
+ #region Plugin Settings
+
///
public override string Title { get; } = nameof(Udp);
///
public override string Description { get; } = "UDP";
+ #endregion
+
+ #region Variables
+
///
/// プラグインの有効・無効状態
///
private bool status = false;
-
+
+ #endregion
+
+ #region Properties
+
///
public bool IsEnabled
{
@@ -35,6 +45,10 @@ public bool IsEnabled
set { status = value; }
}
+ #endregion
+
+ #region Class Functions
+
///
/// プラグインが読み込まれた時に呼ばれる
/// 初期化を実装する
@@ -44,21 +58,20 @@ public Udp(PluginBuilder builder) : base(builder)
{
}
- ///
- /// プラグインが解放されたときに呼ばれる
- /// 後処理を実装する
- ///
- public override void Dispose()
+ #endregion
+
+ #region BveEx Functions
+
+ ///
+ public override void Tick(TimeSpan elapsed)
{
}
- ///
- /// シナリオ読み込み中に毎フレーム呼び出される
- ///
- /// 前回フレームからの経過時間
- public override TickResult Tick(TimeSpan elapsed)
+ ///
+ public override void Dispose()
{
- return new ExtensionTickResult();
}
+
+ #endregion
}
}
From db9d8919fa8dfcd8d72187b8477706bff84a1a3a Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Thu, 2 Jan 2025 02:07:08 +0900
Subject: [PATCH 23/97] update component name
---
CommEx/Serial/SettingWindow.xaml | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/CommEx/Serial/SettingWindow.xaml b/CommEx/Serial/SettingWindow.xaml
index 642f060..d33cc47 100644
--- a/CommEx/Serial/SettingWindow.xaml
+++ b/CommEx/Serial/SettingWindow.xaml
@@ -37,11 +37,11 @@
-
+
-
+
@@ -51,14 +51,14 @@
-
+
-
+
@@ -66,7 +66,7 @@
-
+
@@ -74,7 +74,7 @@
-
+
@@ -82,7 +82,7 @@
-
+
From ce72ff21d704677f258360cc6055fd1cf538d4da Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Thu, 2 Jan 2025 02:14:13 +0900
Subject: [PATCH 24/97] update xaml xaml.cs
add status circle
clean code
update port control
---
CommEx/Serial/SettingWindow.xaml | 3 +
CommEx/Serial/SettingWindow.xaml.cs | 116 +++++++++++++++++++++-------
2 files changed, 92 insertions(+), 27 deletions(-)
diff --git a/CommEx/Serial/SettingWindow.xaml b/CommEx/Serial/SettingWindow.xaml
index d33cc47..03a58b8 100644
--- a/CommEx/Serial/SettingWindow.xaml
+++ b/CommEx/Serial/SettingWindow.xaml
@@ -80,6 +80,9 @@
+
+
+
diff --git a/CommEx/Serial/SettingWindow.xaml.cs b/CommEx/Serial/SettingWindow.xaml.cs
index f4b0e29..47fff9e 100644
--- a/CommEx/Serial/SettingWindow.xaml.cs
+++ b/CommEx/Serial/SettingWindow.xaml.cs
@@ -12,6 +12,7 @@
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.IO.Ports;
+using BveEx.Diagnostics;
namespace CommEx.Serial
{
@@ -20,7 +21,16 @@ namespace CommEx.Serial
///
public partial class SettingWindow : Window
{
- private SerialPort _serialPort;
+ ///
+ /// シリアルポート
+ ///
+ private SerialPort _serialPort = new SerialPort();
+
+ ///
+ /// シリアルの制御
+ ///
+ private ISerialControl bids = new Bids.Bids();
+
public SettingWindow()
{
InitializeComponent();
@@ -43,40 +53,92 @@ public SettingWindow()
FlowControlComboBox.SelectedIndex = 0; // None
}
+ ///
+ /// ポートを閉じる
+ ///
+ private void PortClose()
+ {
+ bids.PortClose(_serialPort);
+ _serialPort.Close();
+ OpenButton.Content = "Open Port";
+ //MessageBox.Show("Serial port closed.");
+
+ // UIを有効化
+ PortNameComboBox.IsEnabled = true;
+ BaudRateComboBox.IsEnabled = true;
+ DataBitsComboBox.IsEnabled = true;
+ StopBitsComboBox.IsEnabled = true;
+ ParityComboBox.IsEnabled = true;
+ FlowControlComboBox.IsEnabled = true;
+ PortStaus.Fill = new SolidColorBrush(Colors.Red);
+ }
+
+ ///
+ /// ポートを開く
+ ///
+ private void PortOpen()
+ {
+ // ポート設定
+ try
+ {
+ _serialPort.PortName = PortNameComboBox.Text;
+ _serialPort.BaudRate = int.Parse(BaudRateComboBox.Text);
+ _serialPort.DataBits = int.Parse(DataBitsComboBox.Text);
+ _serialPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits), StopBitsComboBox.Text);
+ _serialPort.Parity = (Parity)Enum.Parse(typeof(Parity), ParityComboBox.Text);
+ _serialPort.Handshake = (Handshake)Enum.Parse(typeof(Handshake), FlowControlComboBox.Text);
+
+ _serialPort = new SerialPort
+ {
+ PortName = PortNameComboBox.Text,
+ BaudRate = int.Parse(BaudRateComboBox.Text),
+ DataBits = int.Parse(DataBitsComboBox.Text),
+ StopBits = (StopBits)Enum.Parse(typeof(StopBits), StopBitsComboBox.Text),
+ Parity = (Parity)Enum.Parse(typeof(Parity), ParityComboBox.Text),
+ Handshake = (Handshake)Enum.Parse(typeof(Handshake), FlowControlComboBox.Text)
+ };
+ }
+ catch (Exception e)
+ {
+ ErrorDialog.Show(new ErrorDialogInfo("Serial setting error", e.Source, e.Message));
+ return;
+ }
+
+ // ポートを開く
+ try
+ {
+ // ポートを開く
+ bids.PortOpen(_serialPort);
+ _serialPort.Open();
+ OpenButton.Content = "Close Port";
+ //MessageBox.Show("Serial port opened.");
+ }
+ catch (Exception e)
+ {
+ ErrorDialog.Show(new ErrorDialogInfo("Serial opening error", e.Source, e.Message));
+ //MessageBox.Show($"Error opening serial port: {ex.Message}");
+ }
+
+ // UIを無効化
+ PortNameComboBox.IsEnabled = false;
+ BaudRateComboBox.IsEnabled = false;
+ DataBitsComboBox.IsEnabled = false;
+ StopBitsComboBox.IsEnabled = false;
+ ParityComboBox.IsEnabled = false;
+ FlowControlComboBox.IsEnabled = false;
+ PortStaus.Fill = new SolidColorBrush(Colors.Green);
+ }
+
private void OpenButton_Click(object sender, RoutedEventArgs e)
{
// シリアルポートが既に開かれているか確認
if (_serialPort != null && _serialPort.IsOpen)
{
- // ポートを閉じる
- _serialPort.Close();
- OpenButton.Content = "Open Port";
- MessageBox.Show("Serial port closed.");
+ PortClose();
}
else
{
- // シリアルポートの設定
- try
- {
- _serialPort = new SerialPort
- {
- PortName = PortNameComboBox.SelectedItem.ToString(),
- BaudRate = int.Parse(BaudRateComboBox.SelectedItem.ToString()),
- DataBits = int.Parse(DataBitsComboBox.SelectedItem.ToString()),
- StopBits = (StopBits)Enum.Parse(typeof(StopBits), StopBitsComboBox.SelectedItem.ToString()),
- Parity = (Parity)Enum.Parse(typeof(Parity), ParityComboBox.SelectedItem.ToString()),
- Handshake = (Handshake)Enum.Parse(typeof(Handshake), FlowControlComboBox.SelectedItem.ToString())
- };
-
- // ポートを開く
- _serialPort.Open();
- OpenButton.Content = "Close Port";
- MessageBox.Show("Serial port opened.");
- }
- catch (Exception ex)
- {
- MessageBox.Show($"Error opening serial port: {ex.Message}");
- }
+ PortOpen();
}
}
}
From caf7a31f7ba7541b4dec277d1901b910ce1d3f86 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Thu, 2 Jan 2025 02:17:16 +0900
Subject: [PATCH 25/97] update var name
---
CommEx/Serial/SettingWindow.xaml.cs | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/CommEx/Serial/SettingWindow.xaml.cs b/CommEx/Serial/SettingWindow.xaml.cs
index 47fff9e..ba18585 100644
--- a/CommEx/Serial/SettingWindow.xaml.cs
+++ b/CommEx/Serial/SettingWindow.xaml.cs
@@ -29,7 +29,7 @@ public partial class SettingWindow : Window
///
/// シリアルの制御
///
- private ISerialControl bids = new Bids.Bids();
+ private ISerialControl control = new Bids.Bids();
public SettingWindow()
{
@@ -58,7 +58,7 @@ public SettingWindow()
///
private void PortClose()
{
- bids.PortClose(_serialPort);
+ control.PortClose(_serialPort);
_serialPort.Close();
OpenButton.Content = "Open Port";
//MessageBox.Show("Serial port closed.");
@@ -108,7 +108,7 @@ private void PortOpen()
try
{
// ポートを開く
- bids.PortOpen(_serialPort);
+ control.PortOpen(_serialPort);
_serialPort.Open();
OpenButton.Content = "Close Port";
//MessageBox.Show("Serial port opened.");
From e480d414a2d7b948f882a8a9178d83e21415ceb4 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Thu, 2 Jan 2025 02:44:44 +0900
Subject: [PATCH 26/97] update serial control
bids to loopback
---
CommEx/Serial/SettingWindow.xaml.cs | 37 ++++++++++++++++++++++++++++-
1 file changed, 36 insertions(+), 1 deletion(-)
diff --git a/CommEx/Serial/SettingWindow.xaml.cs b/CommEx/Serial/SettingWindow.xaml.cs
index ba18585..3d8a4fd 100644
--- a/CommEx/Serial/SettingWindow.xaml.cs
+++ b/CommEx/Serial/SettingWindow.xaml.cs
@@ -16,6 +16,41 @@
namespace CommEx.Serial
{
+ ///
+ /// シリアルループバック
+ ///
+ internal class Default : ISerialControl
+ {
+ ///
+ public void PortOpen(SerialPort serialPort)
+ {
+ serialPort.DataReceived += DataReceived;
+ }
+
+ // 送られてきた情報をそっくりそのまま返す
+ private void DataReceived(object sender, SerialDataReceivedEventArgs e)
+ {
+ try
+ {
+ SerialPort serialPort = (SerialPort)sender;
+ string str = serialPort.ReadLine();
+ serialPort.WriteLine(str);
+ }
+ catch (Exception ex)
+ {
+#if DEBUG
+ ErrorDialog.Show(new ErrorDialogInfo("通信エラー", ex.Source, ex.Message));
+#endif
+ }
+ }
+
+ ///
+ public void PortClose(SerialPort serialPort)
+ {
+ serialPort.DataReceived -= DataReceived;
+ }
+ }
+
///
/// SettingWindow.xaml の相互作用ロジック
///
@@ -29,7 +64,7 @@ public partial class SettingWindow : Window
///
/// シリアルの制御
///
- private ISerialControl control = new Bids.Bids();
+ private ISerialControl control = new Default();
public SettingWindow()
{
From 8536d40042389c2d9952ad54b5aff8c10d68f0d1 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Fri, 3 Jan 2025 16:58:38 +0900
Subject: [PATCH 27/97] move code
---
CommEx/Serial/Loopback.cs | 50 +++++++++++++++++++++++++++++
CommEx/Serial/SettingWindow.xaml.cs | 37 +--------------------
2 files changed, 51 insertions(+), 36 deletions(-)
create mode 100644 CommEx/Serial/Loopback.cs
diff --git a/CommEx/Serial/Loopback.cs b/CommEx/Serial/Loopback.cs
new file mode 100644
index 0000000..d371c01
--- /dev/null
+++ b/CommEx/Serial/Loopback.cs
@@ -0,0 +1,50 @@
+using BveEx.Diagnostics;
+using System;
+using System.Collections.Generic;
+using System.IO.Ports;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CommEx.Serial
+{
+ ///
+ /// シリアルループバック
+ ///
+ internal class Loopback : ISerialControl
+ {
+ ///
+ public void PortOpen(SerialPort serialPort)
+ {
+ serialPort.DataReceived += DataReceived;
+ }
+
+ ///
+ /// シリアル受信時のイベントハンドラ
+ /// 送られてきた情報をそっくりそのまま返す
+ ///
+ /// 受信したポートの
+ /// イベントデータ
+ private void DataReceived(object sender, SerialDataReceivedEventArgs e)
+ {
+ try
+ {
+ SerialPort serialPort = (SerialPort)sender;
+ string str = serialPort.ReadLine();
+ serialPort.WriteLine(str);
+ }
+ catch (Exception ex)
+ {
+#if DEBUG
+ ErrorDialog.Show(new ErrorDialogInfo("通信エラー", ex.Source, ex.Message));
+#endif
+ }
+ }
+
+ ///
+ public void PortClose(SerialPort serialPort)
+ {
+ serialPort.DataReceived -= DataReceived;
+ }
+ }
+}
diff --git a/CommEx/Serial/SettingWindow.xaml.cs b/CommEx/Serial/SettingWindow.xaml.cs
index 3d8a4fd..d45241b 100644
--- a/CommEx/Serial/SettingWindow.xaml.cs
+++ b/CommEx/Serial/SettingWindow.xaml.cs
@@ -16,41 +16,6 @@
namespace CommEx.Serial
{
- ///
- /// シリアルループバック
- ///
- internal class Default : ISerialControl
- {
- ///
- public void PortOpen(SerialPort serialPort)
- {
- serialPort.DataReceived += DataReceived;
- }
-
- // 送られてきた情報をそっくりそのまま返す
- private void DataReceived(object sender, SerialDataReceivedEventArgs e)
- {
- try
- {
- SerialPort serialPort = (SerialPort)sender;
- string str = serialPort.ReadLine();
- serialPort.WriteLine(str);
- }
- catch (Exception ex)
- {
-#if DEBUG
- ErrorDialog.Show(new ErrorDialogInfo("通信エラー", ex.Source, ex.Message));
-#endif
- }
- }
-
- ///
- public void PortClose(SerialPort serialPort)
- {
- serialPort.DataReceived -= DataReceived;
- }
- }
-
///
/// SettingWindow.xaml の相互作用ロジック
///
@@ -64,7 +29,7 @@ public partial class SettingWindow : Window
///
/// シリアルの制御
///
- private ISerialControl control = new Default();
+ private ISerialControl control = new Loopback();
public SettingWindow()
{
From 9575afcf1c7d8f24ae1bace07252494df398958a Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Fri, 3 Jan 2025 18:15:27 +0900
Subject: [PATCH 28/97] add native
---
CommEx/Serial/Main.cs | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/CommEx/Serial/Main.cs b/CommEx/Serial/Main.cs
index c90bf6b..cd94d44 100644
--- a/CommEx/Serial/Main.cs
+++ b/CommEx/Serial/Main.cs
@@ -54,7 +54,7 @@ internal class Serial : AssemblyPluginBase, ITogglableExtension, IExtension
///
/// Native
///
- INative native;
+ private readonly INative native;
///
/// 右クリックメニュー操作用
@@ -96,9 +96,15 @@ public Serial(PluginBuilder builder) : base(builder)
{
Debug.Listeners.Add(new TextWriterTraceListener(Console.Out));
Debug.AutoFlush = true;
+
Extensions.AllExtensionsLoaded += AllExtensionsLoaded;
+
+ cmx = Extensions.GetExtension();
+ native = Extensions.GetExtension();
+
BveHacker.ScenarioCreated += OnScenarioCreated;
BveHacker.ScenarioClosed += ScenarioClosed;
+
window = new SettingWindow();
window.Closing += WindowClosing;
window.Hide();
From bcf073ea9a5e7ff795bc1ad51b4c7e5881150780 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Fri, 3 Jan 2025 20:10:17 +0900
Subject: [PATCH 29/97] update native
---
CommEx/Serial/Main.cs | 26 +++++++++++++++++++++-----
1 file changed, 21 insertions(+), 5 deletions(-)
diff --git a/CommEx/Serial/Main.cs b/CommEx/Serial/Main.cs
index cd94d44..b11e2e1 100644
--- a/CommEx/Serial/Main.cs
+++ b/CommEx/Serial/Main.cs
@@ -13,6 +13,7 @@
using BveEx.PluginHost.Plugins.Extensions;
using BveTypes.ClassWrappers;
using BveEx.Extensions.Native;
+using BveEx.Diagnostics;
namespace CommEx.Serial
{
@@ -54,7 +55,7 @@ internal class Serial : AssemblyPluginBase, ITogglableExtension, IExtension
///
/// Native
///
- private readonly INative native;
+ private INative native;
///
/// 右クリックメニュー操作用
@@ -99,9 +100,6 @@ public Serial(PluginBuilder builder) : base(builder)
Extensions.AllExtensionsLoaded += AllExtensionsLoaded;
- cmx = Extensions.GetExtension();
- native = Extensions.GetExtension();
-
BveHacker.ScenarioCreated += OnScenarioCreated;
BveHacker.ScenarioClosed += ScenarioClosed;
@@ -141,8 +139,12 @@ public override void Tick(TimeSpan elapsed)
///
private void AllExtensionsLoaded(object sender, EventArgs e)
{
+ bveHacker = BveHacker;
cmx = Extensions.GetExtension();
+ native = Extensions.GetExtension();
+
setting = cmx.AddCheckableMenuItem("シリアル通信設定", MenuItemCheckedChanged, ContextMenuItemType.CoreAndExtensions);
+ native.Started += NativeStarted; ;
}
///
@@ -152,7 +154,6 @@ private void AllExtensionsLoaded(object sender, EventArgs e)
private void OnScenarioCreated(ScenarioCreatedEventArgs e)
{
scenario = e.Scenario;
- bveHacker = BveHacker;
//Bids.Load(bveHacker);
@@ -205,6 +206,21 @@ private void ScenarioClosed(EventArgs e)
#region Event Handlers
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ private void NativeStarted(object sender, StartedEventArgs e)
+ {
+#if DEBUG
+ ErrorDialog.Show(new ErrorDialogInfo("started", "sender", "message"));
+#else
+ throw new NotImplementedException();
+#endif
+ }
+
///
/// 右クリックメニューのクリックイベントハンドラ
///
From 87e1d345526010e88d280e170f46772c04d13cee Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Sun, 5 Jan 2025 00:40:22 +0900
Subject: [PATCH 30/97] add view model
---
CommEx/Serial/PortViewModel.cs | 260 +++++++++++++++++++++++++++++++++
1 file changed, 260 insertions(+)
create mode 100644 CommEx/Serial/PortViewModel.cs
diff --git a/CommEx/Serial/PortViewModel.cs b/CommEx/Serial/PortViewModel.cs
new file mode 100644
index 0000000..04dc672
--- /dev/null
+++ b/CommEx/Serial/PortViewModel.cs
@@ -0,0 +1,260 @@
+using System;
+using System.CodeDom.Compiler;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Drawing.Imaging;
+using System.IO.Ports;
+using System.Linq;
+using System.Runtime.CompilerServices;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CommEx.Serial
+{
+ internal class PortViewModel : INotifyPropertyChanged
+ {
+ #region Fields
+
+ private SerialPort port;
+
+ #endregion
+
+ #region Properties
+
+ ///
+ /// ボーレート[Baud]
+ ///
+ [Browsable(true)]
+ [DefaultValue(9600)]
+ [MonitoringDescription("BaudRate")]
+ public int BaudRate
+ {
+ get
+ {
+ return port.BaudRate;
+ }
+ set
+ {
+ port.BaudRate = value;
+ RaisePropertyChanged();
+ }
+ }
+
+ ///
+ /// データビット[bit]
+ ///
+ [Browsable(true)]
+ [DefaultValue(8)]
+ [MonitoringDescription("DataBits")]
+ public int DataBits
+ {
+ get
+ {
+ return port.DataBits;
+ }
+ set
+ {
+ port.DataBits = value;
+ RaisePropertyChanged();
+ }
+ }
+
+ ///
+ /// DTR 有効/無効
+ ///
+ [Browsable(true)]
+ [DefaultValue(false)]
+ [MonitoringDescription("DtrEnable")]
+ public bool DtrEnable
+ {
+ get
+ {
+ return port.DtrEnable;
+ }
+ set
+ {
+ port.DtrEnable = value;
+ RaisePropertyChanged();
+ }
+ }
+
+ ///
+ /// テキストのエンコーディング
+ ///
+ [Browsable(false)]
+ [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+ [MonitoringDescription("Encoding")]
+ public Encoding Encoding
+ {
+ get
+ {
+ return port.Encoding;
+ }
+ set
+ {
+ port.Encoding = value;
+ RaisePropertyChanged();;
+ }
+ }
+
+ ///
+ /// フロー制御
+ ///
+ [Browsable(true)]
+ [DefaultValue(Handshake.None)]
+ [MonitoringDescription("Handshake")]
+ public Handshake Handshake
+ {
+ get
+ {
+ return port.Handshake;
+ }
+ set
+ {
+ port.Handshake = value;
+ RaisePropertyChanged();
+ }
+ }
+
+ ///
+ /// ポートの状態
+ ///
+ [Browsable(false)]
+ public bool IsOpen
+ {
+ get
+ {
+ return port.IsOpen;
+ }
+ }
+
+ ///
+ /// 改行文字
+ ///
+ [Browsable(false)]
+ [DefaultValue("\n")]
+ [MonitoringDescription("NewLine")]
+ public string NewLine
+ {
+ get
+ {
+ return port.NewLine;
+ }
+ set
+ {
+ port.NewLine = value;
+ RaisePropertyChanged();
+ }
+ }
+
+ ///
+ /// パリティ
+ ///
+ [Browsable(true)]
+ [DefaultValue(Parity.None)]
+ [MonitoringDescription("Parity")]
+ public Parity Parity
+ {
+ get
+ {
+ return port.Parity;
+ }
+ set
+ {
+ port.Parity = value;
+ RaisePropertyChanged();
+ }
+ }
+
+ ///
+ /// ポート名
+ ///
+ [Browsable(true)]
+ [DefaultValue("COM1")]
+ [MonitoringDescription("PortName")]
+ public string PortName
+ {
+ get
+ {
+ return port.PortName;
+ }
+ set
+ {
+ port.PortName = value;
+ RaisePropertyChanged();
+ }
+ }
+
+ ///
+ /// ストップビット[bit]
+ ///
+ [Browsable(true)]
+ [DefaultValue(StopBits.One)]
+ [MonitoringDescription("StopBits")]
+ public StopBits StopBits
+ {
+ get
+ {
+ return port.StopBits;
+ }
+ set
+ {
+ port.StopBits = value;
+ RaisePropertyChanged();
+ }
+ }
+
+ #endregion
+
+ #region Methods
+
+ ///
+ /// ViewModel をデフォルト値で初期化
+ ///
+ public PortViewModel()
+ {
+ port = new SerialPort();
+ }
+
+ ///
+ /// ViewModel を値を指定して初期化
+ ///
+ /// ポート名
+ /// ボーレート
+ /// パリティ
+ /// データビット
+ /// ストップビット
+ public PortViewModel(string portName = "COM0", int baudRate = 115200, Parity parity = Parity.None, int dataBits = 8, StopBits stopBits = StopBits.One)
+ {
+ port = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
+ }
+
+ ///
+ /// ViewModel を で初期化
+ ///
+ /// 初期化に使用する
+ public PortViewModel(SerialPort serialPort)
+ {
+ port = serialPort;
+ }
+
+ #endregion
+
+ #region Interface Implementation
+
+ ///
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ ///
+ /// View に値の変更を通知
+ ///
+ /// 呼び出し元のプロパティ名(自動取得)
+ protected void RaisePropertyChanged([CallerMemberName] string propertyName = "")
+ {
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
+ }
+
+ #endregion
+ }
+}
From 58948906ae621852b355ce2c187e1972139e832a Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Sun, 5 Jan 2025 01:12:41 +0900
Subject: [PATCH 31/97] add DTR checkbox
---
CommEx/Serial/SettingWindow.xaml | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/CommEx/Serial/SettingWindow.xaml b/CommEx/Serial/SettingWindow.xaml
index 03a58b8..dfdd80a 100644
--- a/CommEx/Serial/SettingWindow.xaml
+++ b/CommEx/Serial/SettingWindow.xaml
@@ -5,11 +5,11 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:CommEx.Serial"
mc:Ignorable="d"
- Title="Serial Port Settings" Height="300" Width="400">
+ Title="Serial Port Settings" Height="400" Width="400">
-
+
@@ -31,6 +31,8 @@
+
+
@@ -78,14 +80,18 @@
-
+
+
+
+
+
-
+
-
+
From a383aae45e133ad9d420c37e99c0a006b1230648 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Sun, 5 Jan 2025 01:13:52 +0900
Subject: [PATCH 32/97] move control
---
CommEx/Serial/PortViewModel.cs | 84 +++++++++++++++++++++
CommEx/Serial/SettingWindow.xaml | 3 +
CommEx/Serial/SettingWindow.xaml.cs | 109 +++-------------------------
3 files changed, 99 insertions(+), 97 deletions(-)
diff --git a/CommEx/Serial/PortViewModel.cs b/CommEx/Serial/PortViewModel.cs
index 04dc672..24051ff 100644
--- a/CommEx/Serial/PortViewModel.cs
+++ b/CommEx/Serial/PortViewModel.cs
@@ -16,8 +16,16 @@ internal class PortViewModel : INotifyPropertyChanged
{
#region Fields
+ ///
+ /// シリアルポート
+ ///
private SerialPort port;
+ ///
+ /// シリアルの制御
+ ///
+ private ISerialControl control = new Loopback();
+
#endregion
#region Properties
@@ -239,6 +247,82 @@ public PortViewModel(SerialPort serialPort)
port = serialPort;
}
+ /////
+ ///// ポートを開く
+ /////
+ //private void PortOpen()
+ //{
+ // // ポート設定
+ // try
+ // {
+ // port.PortName = PortNameComboBox.Text;
+ // port.BaudRate = int.Parse(BaudRateComboBox.Text);
+ // port.DataBits = int.Parse(DataBitsComboBox.Text);
+ // port.StopBits = (StopBits)Enum.Parse(typeof(StopBits), StopBitsComboBox.Text);
+ // port.Parity = (Parity)Enum.Parse(typeof(Parity), ParityComboBox.Text);
+ // port.Handshake = (Handshake)Enum.Parse(typeof(Handshake), FlowControlComboBox.Text);
+
+ // port = new SerialPort
+ // {
+ // PortName = PortNameComboBox.Text,
+ // BaudRate = int.Parse(BaudRateComboBox.Text),
+ // DataBits = int.Parse(DataBitsComboBox.Text),
+ // StopBits = (StopBits)Enum.Parse(typeof(StopBits), StopBitsComboBox.Text),
+ // Parity = (Parity)Enum.Parse(typeof(Parity), ParityComboBox.Text),
+ // Handshake = (Handshake)Enum.Parse(typeof(Handshake), FlowControlComboBox.Text)
+ // };
+ // }
+ // catch (Exception e)
+ // {
+ // ErrorDialog.Show(new ErrorDialogInfo("Serial setting error", e.Source, e.Message));
+ // return;
+ // }
+
+ // // ポートを開く
+ // try
+ // {
+ // // ポートを開く
+ // control.PortOpen(port);
+ // port.Open();
+ // OpenButton.Content = "Close Port";
+ // //MessageBox.Show("Serial port opened.");
+ // }
+ // catch (Exception e)
+ // {
+ // ErrorDialog.Show(new ErrorDialogInfo("Serial opening error", e.Source, e.Message));
+ // //MessageBox.Show($"Error opening serial port: {ex.Message}");
+ // }
+
+ // // UIを無効化
+ // PortNameComboBox.IsEnabled = false;
+ // BaudRateComboBox.IsEnabled = false;
+ // DataBitsComboBox.IsEnabled = false;
+ // StopBitsComboBox.IsEnabled = false;
+ // ParityComboBox.IsEnabled = false;
+ // FlowControlComboBox.IsEnabled = false;
+ // PortStaus.Fill = new SolidColorBrush(Colors.Green);
+ //}
+
+ /////
+ ///// ポートを閉じる
+ /////
+ //private void PortClose()
+ //{
+ // control.PortClose(port);
+ // port.Close();
+ // OpenButton.Content = "Open Port";
+ // //MessageBox.Show("Serial port closed.");
+
+ // // UIを有効化
+ // PortNameComboBox.IsEnabled = true;
+ // BaudRateComboBox.IsEnabled = true;
+ // DataBitsComboBox.IsEnabled = true;
+ // StopBitsComboBox.IsEnabled = true;
+ // ParityComboBox.IsEnabled = true;
+ // FlowControlComboBox.IsEnabled = true;
+ // PortStaus.Fill = new SolidColorBrush(Colors.Red);
+ //}
+
#endregion
#region Interface Implementation
diff --git a/CommEx/Serial/SettingWindow.xaml b/CommEx/Serial/SettingWindow.xaml
index dfdd80a..eba56e6 100644
--- a/CommEx/Serial/SettingWindow.xaml
+++ b/CommEx/Serial/SettingWindow.xaml
@@ -6,6 +6,9 @@
xmlns:local="clr-namespace:CommEx.Serial"
mc:Ignorable="d"
Title="Serial Port Settings" Height="400" Width="400">
+
+
+
diff --git a/CommEx/Serial/SettingWindow.xaml.cs b/CommEx/Serial/SettingWindow.xaml.cs
index d45241b..a15712d 100644
--- a/CommEx/Serial/SettingWindow.xaml.cs
+++ b/CommEx/Serial/SettingWindow.xaml.cs
@@ -21,16 +21,6 @@ namespace CommEx.Serial
///
public partial class SettingWindow : Window
{
- ///
- /// シリアルポート
- ///
- private SerialPort _serialPort = new SerialPort();
-
- ///
- /// シリアルの制御
- ///
- private ISerialControl control = new Loopback();
-
public SettingWindow()
{
InitializeComponent();
@@ -53,93 +43,18 @@ public SettingWindow()
FlowControlComboBox.SelectedIndex = 0; // None
}
- ///
- /// ポートを閉じる
- ///
- private void PortClose()
- {
- control.PortClose(_serialPort);
- _serialPort.Close();
- OpenButton.Content = "Open Port";
- //MessageBox.Show("Serial port closed.");
-
- // UIを有効化
- PortNameComboBox.IsEnabled = true;
- BaudRateComboBox.IsEnabled = true;
- DataBitsComboBox.IsEnabled = true;
- StopBitsComboBox.IsEnabled = true;
- ParityComboBox.IsEnabled = true;
- FlowControlComboBox.IsEnabled = true;
- PortStaus.Fill = new SolidColorBrush(Colors.Red);
- }
-
- ///
- /// ポートを開く
- ///
- private void PortOpen()
- {
- // ポート設定
- try
- {
- _serialPort.PortName = PortNameComboBox.Text;
- _serialPort.BaudRate = int.Parse(BaudRateComboBox.Text);
- _serialPort.DataBits = int.Parse(DataBitsComboBox.Text);
- _serialPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits), StopBitsComboBox.Text);
- _serialPort.Parity = (Parity)Enum.Parse(typeof(Parity), ParityComboBox.Text);
- _serialPort.Handshake = (Handshake)Enum.Parse(typeof(Handshake), FlowControlComboBox.Text);
-
- _serialPort = new SerialPort
- {
- PortName = PortNameComboBox.Text,
- BaudRate = int.Parse(BaudRateComboBox.Text),
- DataBits = int.Parse(DataBitsComboBox.Text),
- StopBits = (StopBits)Enum.Parse(typeof(StopBits), StopBitsComboBox.Text),
- Parity = (Parity)Enum.Parse(typeof(Parity), ParityComboBox.Text),
- Handshake = (Handshake)Enum.Parse(typeof(Handshake), FlowControlComboBox.Text)
- };
- }
- catch (Exception e)
- {
- ErrorDialog.Show(new ErrorDialogInfo("Serial setting error", e.Source, e.Message));
- return;
- }
-
- // ポートを開く
- try
- {
- // ポートを開く
- control.PortOpen(_serialPort);
- _serialPort.Open();
- OpenButton.Content = "Close Port";
- //MessageBox.Show("Serial port opened.");
- }
- catch (Exception e)
- {
- ErrorDialog.Show(new ErrorDialogInfo("Serial opening error", e.Source, e.Message));
- //MessageBox.Show($"Error opening serial port: {ex.Message}");
- }
-
- // UIを無効化
- PortNameComboBox.IsEnabled = false;
- BaudRateComboBox.IsEnabled = false;
- DataBitsComboBox.IsEnabled = false;
- StopBitsComboBox.IsEnabled = false;
- ParityComboBox.IsEnabled = false;
- FlowControlComboBox.IsEnabled = false;
- PortStaus.Fill = new SolidColorBrush(Colors.Green);
- }
- private void OpenButton_Click(object sender, RoutedEventArgs e)
- {
- // シリアルポートが既に開かれているか確認
- if (_serialPort != null && _serialPort.IsOpen)
- {
- PortClose();
- }
- else
- {
- PortOpen();
- }
- }
+ //private void OpenButton_Click(object sender, RoutedEventArgs e)
+ //{
+ // // シリアルポートが既に開かれているか確認
+ // if (_serialPort != null && _serialPort.IsOpen)
+ // {
+ // PortClose();
+ // }
+ // else
+ // {
+ // PortOpen();
+ // }
+ //}
}
}
From 559578d127e67f31dbdf42d7de9a2c9c8668b8b4 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Tue, 7 Jan 2025 20:36:10 +0900
Subject: [PATCH 33/97] add binding
---
CommEx/Serial/Dictionary.xaml | 26 ++++++++++++++++++++++++++
CommEx/Serial/PortViewModel.cs | 4 ++--
CommEx/Serial/SettingWindow.xaml | 23 +++++++++++++++--------
3 files changed, 43 insertions(+), 10 deletions(-)
create mode 100644 CommEx/Serial/Dictionary.xaml
diff --git a/CommEx/Serial/Dictionary.xaml b/CommEx/Serial/Dictionary.xaml
new file mode 100644
index 0000000..98f8b4a
--- /dev/null
+++ b/CommEx/Serial/Dictionary.xaml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/CommEx/Serial/PortViewModel.cs b/CommEx/Serial/PortViewModel.cs
index 24051ff..868ffaf 100644
--- a/CommEx/Serial/PortViewModel.cs
+++ b/CommEx/Serial/PortViewModel.cs
@@ -129,11 +129,11 @@ public Handshake Handshake
/// ポートの状態
///
[Browsable(false)]
- public bool IsOpen
+ public bool IsClosed
{
get
{
- return port.IsOpen;
+ return !port.IsOpen;
}
}
diff --git a/CommEx/Serial/SettingWindow.xaml b/CommEx/Serial/SettingWindow.xaml
index eba56e6..67abba7 100644
--- a/CommEx/Serial/SettingWindow.xaml
+++ b/CommEx/Serial/SettingWindow.xaml
@@ -6,6 +6,13 @@
xmlns:local="clr-namespace:CommEx.Serial"
mc:Ignorable="d"
Title="Serial Port Settings" Height="400" Width="400">
+
+
+
+
+
+
+
@@ -42,11 +49,11 @@
-
+
-
+
@@ -56,14 +63,14 @@
-
+
-
+
@@ -71,7 +78,7 @@
-
+
@@ -79,16 +86,16 @@
-
+
-
+
-
+
From 92fa2252e068b75e20ce69b60f6db4d698eeaa0d Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Tue, 7 Jan 2025 22:21:51 +0900
Subject: [PATCH 34/97] update viewmodel
---
CommEx/Serial/Main.cs | 9 +-
CommEx/Serial/PortViewModel.cs | 244 +++++++++++++++++++---------
CommEx/Serial/SettingWindow.xaml | 38 +----
CommEx/Serial/SettingWindow.xaml.cs | 40 ++---
4 files changed, 191 insertions(+), 140 deletions(-)
diff --git a/CommEx/Serial/Main.cs b/CommEx/Serial/Main.cs
index b11e2e1..73ad948 100644
--- a/CommEx/Serial/Main.cs
+++ b/CommEx/Serial/Main.cs
@@ -73,6 +73,11 @@ internal class Serial : AssemblyPluginBase, ITogglableExtension, IExtension
///
private readonly SettingWindow window;
+ ///
+ /// ビューモデル
+ ///
+ protected PortViewModel portViewModel;
+
#endregion
#region Properties
@@ -103,7 +108,9 @@ public Serial(PluginBuilder builder) : base(builder)
BveHacker.ScenarioCreated += OnScenarioCreated;
BveHacker.ScenarioClosed += ScenarioClosed;
- window = new SettingWindow();
+ portViewModel = new PortViewModel();
+
+ window = new SettingWindow(portViewModel);
window.Closing += WindowClosing;
window.Hide();
}
diff --git a/CommEx/Serial/PortViewModel.cs b/CommEx/Serial/PortViewModel.cs
index 868ffaf..26e8b4f 100644
--- a/CommEx/Serial/PortViewModel.cs
+++ b/CommEx/Serial/PortViewModel.cs
@@ -9,10 +9,14 @@
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
+using System.Collections.ObjectModel;
+using System.IO;
+using System.Windows.Input;
+using BveEx.Diagnostics;
namespace CommEx.Serial
{
- internal class PortViewModel : INotifyPropertyChanged
+ public class PortViewModel : INotifyPropertyChanged
{
#region Fields
@@ -102,7 +106,7 @@ public Encoding Encoding
set
{
port.Encoding = value;
- RaisePropertyChanged();;
+ RaisePropertyChanged();
}
}
@@ -128,15 +132,23 @@ public Handshake Handshake
///
/// ポートの状態
///
- [Browsable(false)]
- public bool IsClosed
+ [Browsable(true)]
+ [DefaultValue(Handshake.None)]
+ [MonitoringDescription("IsOpen")]
+ public bool IsOpen
{
get
{
- return !port.IsOpen;
+ return port.IsOpen;
}
}
+ ///
+ /// ポートの状態
+ ///
+ [Browsable(false)]
+ public bool IsClosed => !IsOpen;
+
///
/// 改行文字
///
@@ -213,9 +225,49 @@ public StopBits StopBits
}
}
+ ///
+ /// 使用可能なポートの選択肢リスト
+ ///
+ public ObservableCollection AvailablePorts { get; } = new ObservableCollection();
+
+ ///
+ /// ボーレートの選択肢リスト
+ ///
+ public ObservableCollection BaudRates { get; } = new ObservableCollection { 9600, 19200, 38400, 57600, 115200 };
+
+ ///
+ /// データビットの選択肢リスト
+ ///
+ public ObservableCollection DataBitsOptions { get; } = new ObservableCollection { 5, 6, 7, 8 };
+
+ ///
+ /// ストップビットの選択肢リスト
+ ///
+ public ObservableCollection StopBitsOptions { get; } = new ObservableCollection { StopBits.One, StopBits.OnePointFive, StopBits.Two };
+
+ ///
+ /// パリティの選択肢リスト
+ ///
+ public ObservableCollection ParityOptions { get; } = new ObservableCollection(Enum.GetValues(typeof(Parity)) as Parity[]);
+
+ ///
+ /// フロー制御の選択肢リスト
+ ///
+ public ObservableCollection HandshakeOptions { get; } = new ObservableCollection(Enum.GetValues(typeof(Handshake)) as Handshake[]);
+
+ ///
+ /// ポートリストのアップデートコマンド
+ ///
+ public ICommand UpdatePortsCommand { get; }
+
+ ///
+ /// ポートの開閉コマンド
+ ///
+ public ICommand OpenClosePortCommand { get; }
+
#endregion
- #region Methods
+ #region Methods
///
/// ViewModel をデフォルト値で初期化
@@ -223,6 +275,11 @@ public StopBits StopBits
public PortViewModel()
{
port = new SerialPort();
+
+ UpdatePortsCommand = new RelayCommand(UpdatePorts);
+ OpenClosePortCommand = new RelayCommand(OpenClosePort, CanOpenClosePort);
+
+ //UpdatePorts();
}
///
@@ -236,6 +293,11 @@ public PortViewModel()
public PortViewModel(string portName = "COM0", int baudRate = 115200, Parity parity = Parity.None, int dataBits = 8, StopBits stopBits = StopBits.One)
{
port = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
+
+ UpdatePortsCommand = new RelayCommand(UpdatePorts);
+ OpenClosePortCommand = new RelayCommand(OpenClosePort, CanOpenClosePort);
+
+ //UpdatePorts();
}
///
@@ -245,83 +307,83 @@ public PortViewModel(string portName = "COM0", int baudRate = 115200, Parity par
public PortViewModel(SerialPort serialPort)
{
port = serialPort;
+
+ UpdatePortsCommand = new RelayCommand(UpdatePorts);
+ OpenClosePortCommand = new RelayCommand(OpenClosePort, CanOpenClosePort);
+
+ //UpdatePorts();
}
- /////
- ///// ポートを開く
- /////
- //private void PortOpen()
- //{
- // // ポート設定
- // try
- // {
- // port.PortName = PortNameComboBox.Text;
- // port.BaudRate = int.Parse(BaudRateComboBox.Text);
- // port.DataBits = int.Parse(DataBitsComboBox.Text);
- // port.StopBits = (StopBits)Enum.Parse(typeof(StopBits), StopBitsComboBox.Text);
- // port.Parity = (Parity)Enum.Parse(typeof(Parity), ParityComboBox.Text);
- // port.Handshake = (Handshake)Enum.Parse(typeof(Handshake), FlowControlComboBox.Text);
-
- // port = new SerialPort
- // {
- // PortName = PortNameComboBox.Text,
- // BaudRate = int.Parse(BaudRateComboBox.Text),
- // DataBits = int.Parse(DataBitsComboBox.Text),
- // StopBits = (StopBits)Enum.Parse(typeof(StopBits), StopBitsComboBox.Text),
- // Parity = (Parity)Enum.Parse(typeof(Parity), ParityComboBox.Text),
- // Handshake = (Handshake)Enum.Parse(typeof(Handshake), FlowControlComboBox.Text)
- // };
- // }
- // catch (Exception e)
- // {
- // ErrorDialog.Show(new ErrorDialogInfo("Serial setting error", e.Source, e.Message));
- // return;
- // }
-
- // // ポートを開く
- // try
- // {
- // // ポートを開く
- // control.PortOpen(port);
- // port.Open();
- // OpenButton.Content = "Close Port";
- // //MessageBox.Show("Serial port opened.");
- // }
- // catch (Exception e)
- // {
- // ErrorDialog.Show(new ErrorDialogInfo("Serial opening error", e.Source, e.Message));
- // //MessageBox.Show($"Error opening serial port: {ex.Message}");
- // }
-
- // // UIを無効化
- // PortNameComboBox.IsEnabled = false;
- // BaudRateComboBox.IsEnabled = false;
- // DataBitsComboBox.IsEnabled = false;
- // StopBitsComboBox.IsEnabled = false;
- // ParityComboBox.IsEnabled = false;
- // FlowControlComboBox.IsEnabled = false;
- // PortStaus.Fill = new SolidColorBrush(Colors.Green);
- //}
-
- /////
- ///// ポートを閉じる
- /////
- //private void PortClose()
- //{
- // control.PortClose(port);
- // port.Close();
- // OpenButton.Content = "Open Port";
- // //MessageBox.Show("Serial port closed.");
-
- // // UIを有効化
- // PortNameComboBox.IsEnabled = true;
- // BaudRateComboBox.IsEnabled = true;
- // DataBitsComboBox.IsEnabled = true;
- // StopBitsComboBox.IsEnabled = true;
- // ParityComboBox.IsEnabled = true;
- // FlowControlComboBox.IsEnabled = true;
- // PortStaus.Fill = new SolidColorBrush(Colors.Red);
- //}
+ ///
+ /// ポートの開閉が可能か否か判定
+ ///
+ /// ポート操作可否
+ private bool CanOpenClosePort() => port != null && !string.IsNullOrEmpty(PortName);
+
+ ///
+ /// ポートリストのアップデート
+ ///
+ private void UpdatePorts()
+ {
+ AvailablePorts.Clear();
+ foreach (var port in SerialPort.GetPortNames())
+ {
+ AvailablePorts.Add(port);
+ }
+ }
+
+ ///
+ /// ポートの開閉
+ ///
+ private void OpenClosePort()
+ {
+ if (!IsOpen)
+ {
+ // ポートを開ける
+ try
+ {
+ // control.PortOpen(port);
+ port.Open();
+ }
+ catch (UnauthorizedAccessException ex)
+ {
+ ErrorDialog.Show(new ErrorDialogInfo("ポートが既に使われています。", ex.Source, ex.Message));
+ }
+ catch (ArgumentOutOfRangeException ex)
+ {
+ ErrorDialog.Show(new ErrorDialogInfo("ポートの設定が無効です。", ex.Source, ex.Message));
+ }
+ catch (ArgumentException ex)
+ {
+ ErrorDialog.Show(new ErrorDialogInfo("このポートはサポートされていません。", ex.Source, ex.Message));
+ }
+ catch (IOException ex)
+ {
+ ErrorDialog.Show(new ErrorDialogInfo("ポートが無効状態です。", ex.Source, ex.Message));
+ }
+ catch (Exception ex)
+ {
+ ErrorDialog.Show(new ErrorDialogInfo("ポートのオープンに失敗しました。", ex.Source, ex.Message));
+ }
+ }
+ else
+ {
+ // ポートを閉じる
+ try
+ {
+ port.Close();
+ // control.PortClose(port);
+ }
+ catch (IOException ex)
+ {
+ ErrorDialog.Show(new ErrorDialogInfo("ポートが無効状態です。", ex.Source, ex.Message));
+ }
+ catch (Exception ex)
+ {
+ ErrorDialog.Show(new ErrorDialogInfo("ポートを閉じたときにエラーが発生しました。", ex.Source, ex.Message));
+ }
+ }
+ }
#endregion
@@ -341,4 +403,24 @@ protected void RaisePropertyChanged([CallerMemberName] string propertyName = "")
#endregion
}
+
+ public class RelayCommand : ICommand
+ {
+ private readonly Action _execute;
+ private readonly Func _canExecute;
+
+ public RelayCommand(Action execute, Func canExecute = null)
+ {
+ _execute = execute;
+ _canExecute = canExecute;
+ }
+
+ public event EventHandler CanExecuteChanged;
+
+ public bool CanExecute(object parameter) => _canExecute == null || _canExecute();
+
+ public void Execute(object parameter) => _execute();
+
+ public void RaiseCanExecuteChanged() => CanExecuteChanged?.Invoke(this, EventArgs.Empty);
+ }
}
diff --git a/CommEx/Serial/SettingWindow.xaml b/CommEx/Serial/SettingWindow.xaml
index 67abba7..673bf2c 100644
--- a/CommEx/Serial/SettingWindow.xaml
+++ b/CommEx/Serial/SettingWindow.xaml
@@ -49,59 +49,37 @@
-
+
-
-
-
-
-
-
-
+
-
-
-
-
+
-
-
-
-
-
+
-
-
-
-
-
+
-
-
-
-
-
-
+
-
+
-
+
diff --git a/CommEx/Serial/SettingWindow.xaml.cs b/CommEx/Serial/SettingWindow.xaml.cs
index a15712d..9c32222 100644
--- a/CommEx/Serial/SettingWindow.xaml.cs
+++ b/CommEx/Serial/SettingWindow.xaml.cs
@@ -24,37 +24,21 @@ public partial class SettingWindow : Window
public SettingWindow()
{
InitializeComponent();
+ DataContext = new PortViewModel();
+ }
+
+ public SettingWindow(PortViewModel viewModel)
+ {
+ InitializeComponent();
+ DataContext = viewModel;
+ }
- // 使用可能なポート名をコンボボックスにセット
- foreach (string portName in SerialPort.GetPortNames())
+ private void DropDownOpened(object sender, EventArgs e)
+ {
+ if (DataContext is PortViewModel viewModel)
{
- PortNameComboBox.Items.Add(portName);
+ viewModel.UpdatePortsCommand.Execute(null);
}
-
- // 初期選択を設定(最初のポートを選択)
- if (PortNameComboBox.Items.Count > 0)
- PortNameComboBox.SelectedIndex = 0;
-
- // 初期設定としてデフォルト値を設定
- BaudRateComboBox.SelectedIndex = 4; // 115200
- DataBitsComboBox.SelectedIndex = 1; // 8
- StopBitsComboBox.SelectedIndex = 0; // 1
- ParityComboBox.SelectedIndex = 0; // None
- FlowControlComboBox.SelectedIndex = 0; // None
}
-
-
- //private void OpenButton_Click(object sender, RoutedEventArgs e)
- //{
- // // シリアルポートが既に開かれているか確認
- // if (_serialPort != null && _serialPort.IsOpen)
- // {
- // PortClose();
- // }
- // else
- // {
- // PortOpen();
- // }
- //}
}
}
From ad55e05c22b3af21db4c7f10dd5b82064a21de4b Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Thu, 9 Jan 2025 01:26:41 +0900
Subject: [PATCH 35/97] update serial control
---
CommEx/Serial/PortViewModel.cs | 82 ++++++++++++++++++++++++++++++--
CommEx/Serial/SettingWindow.xaml | 13 ++---
2 files changed, 81 insertions(+), 14 deletions(-)
diff --git a/CommEx/Serial/PortViewModel.cs b/CommEx/Serial/PortViewModel.cs
index 26e8b4f..49da429 100644
--- a/CommEx/Serial/PortViewModel.cs
+++ b/CommEx/Serial/PortViewModel.cs
@@ -13,6 +13,9 @@
using System.IO;
using System.Windows.Input;
using BveEx.Diagnostics;
+using System.Globalization;
+using System.Windows.Data;
+using System.Windows.Media;
namespace CommEx.Serial
{
@@ -28,7 +31,7 @@ public class PortViewModel : INotifyPropertyChanged
///
/// シリアルの制御
///
- private ISerialControl control = new Loopback();
+ private ISerialControl control;
#endregion
@@ -275,6 +278,7 @@ public StopBits StopBits
public PortViewModel()
{
port = new SerialPort();
+ control = new Loopback();
UpdatePortsCommand = new RelayCommand(UpdatePorts);
OpenClosePortCommand = new RelayCommand(OpenClosePort, CanOpenClosePort);
@@ -293,6 +297,7 @@ public PortViewModel()
public PortViewModel(string portName = "COM0", int baudRate = 115200, Parity parity = Parity.None, int dataBits = 8, StopBits stopBits = StopBits.One)
{
port = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
+ control = new Loopback();
UpdatePortsCommand = new RelayCommand(UpdatePorts);
OpenClosePortCommand = new RelayCommand(OpenClosePort, CanOpenClosePort);
@@ -307,6 +312,41 @@ public PortViewModel(string portName = "COM0", int baudRate = 115200, Parity par
public PortViewModel(SerialPort serialPort)
{
port = serialPort;
+ control = new Loopback();
+
+ UpdatePortsCommand = new RelayCommand(UpdatePorts);
+ OpenClosePortCommand = new RelayCommand(OpenClosePort, CanOpenClosePort);
+
+ //UpdatePorts();
+ }
+
+ ///
+ /// ISerialControl を指定して初期化
+ ///
+ /// シリアル制御
+ /// ポート名
+ /// ボーレート
+ /// パリティ
+ /// データビット
+ /// ストップビット
+ public PortViewModel(ISerialControl serialControls, string portName = "COM0", int baudRate = 115200, Parity parity = Parity.None, int dataBits = 8, StopBits stopBits = StopBits.One)
+ {
+ port = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
+ control = serialControls;
+
+ UpdatePortsCommand = new RelayCommand(UpdatePorts);
+ OpenClosePortCommand = new RelayCommand(OpenClosePort, CanOpenClosePort);
+
+ //UpdatePorts();
+ }
+
+ ///
+ /// ViewModel をデフォルト値で ISerialControl を指定して初期化
+ ///
+ public PortViewModel(ISerialControl serialControls)
+ {
+ port = new SerialPort();
+ control = serialControls;
UpdatePortsCommand = new RelayCommand(UpdatePorts);
OpenClosePortCommand = new RelayCommand(OpenClosePort, CanOpenClosePort);
@@ -337,12 +377,12 @@ private void UpdatePorts()
///
private void OpenClosePort()
{
- if (!IsOpen)
+ if (IsClosed)
{
// ポートを開ける
try
{
- // control.PortOpen(port);
+ control.PortOpen(port);
port.Open();
}
catch (UnauthorizedAccessException ex)
@@ -372,7 +412,7 @@ private void OpenClosePort()
try
{
port.Close();
- // control.PortClose(port);
+ control.PortClose(port);
}
catch (IOException ex)
{
@@ -423,4 +463,38 @@ public RelayCommand(Action execute, Func canExecute = null)
public void RaiseCanExecuteChanged() => CanExecuteChanged?.Invoke(this, EventArgs.Empty);
}
+
+ public class BoolToColorConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ if (value is bool isOpen)
+ {
+ return isOpen ? Brushes.Green : Brushes.Red;
+ }
+
+ return Brushes.Gray; // デフォルト色
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ if (value is Brush brush)
+ {
+ if (brush == Brushes.Green)
+ {
+ return true;
+ }
+ else if (brush == Brushes.Red)
+ {
+ return false;
+ }
+ else if (brush == Brushes.Gray)
+ {
+ return false;
+ }
+ }
+
+ throw new InvalidOperationException("Unsupported conversion");
+ }
+ }
}
diff --git a/CommEx/Serial/SettingWindow.xaml b/CommEx/Serial/SettingWindow.xaml
index 673bf2c..5d41b8b 100644
--- a/CommEx/Serial/SettingWindow.xaml
+++ b/CommEx/Serial/SettingWindow.xaml
@@ -7,15 +7,8 @@
mc:Ignorable="d"
Title="Serial Port Settings" Height="400" Width="400">
-
-
-
-
-
+
-
-
-
@@ -49,7 +42,7 @@
-
+
@@ -76,7 +69,7 @@
-
+
From 6a0f878637ec92b4b7585dd36405d252f9ecc403 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Sat, 11 Jan 2025 10:43:00 +0900
Subject: [PATCH 36/97] fix fogotten change
---
CommEx/Serial/PortViewModel.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/CommEx/Serial/PortViewModel.cs b/CommEx/Serial/PortViewModel.cs
index 49da429..c775cfa 100644
--- a/CommEx/Serial/PortViewModel.cs
+++ b/CommEx/Serial/PortViewModel.cs
@@ -136,7 +136,7 @@ public Handshake Handshake
/// ポートの状態
///
[Browsable(true)]
- [DefaultValue(Handshake.None)]
+ [DefaultValue(false)]
[MonitoringDescription("IsOpen")]
public bool IsOpen
{
From 750e51678f9a9958eea90bde57f994a0f32ab7fb Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Sat, 11 Jan 2025 11:16:59 +0900
Subject: [PATCH 37/97] add prop change notify
---
CommEx/Serial/PortViewModel.cs | 2 ++
1 file changed, 2 insertions(+)
diff --git a/CommEx/Serial/PortViewModel.cs b/CommEx/Serial/PortViewModel.cs
index c775cfa..d885866 100644
--- a/CommEx/Serial/PortViewModel.cs
+++ b/CommEx/Serial/PortViewModel.cs
@@ -423,6 +423,8 @@ private void OpenClosePort()
ErrorDialog.Show(new ErrorDialogInfo("ポートを閉じたときにエラーが発生しました。", ex.Source, ex.Message));
}
}
+ RaisePropertyChanged("IsOpen");
+ RaisePropertyChanged("IsClosed");
}
#endregion
From 045cd876fd77900a7ee07852238e4754f092402a Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Sun, 12 Jan 2025 00:23:41 +0900
Subject: [PATCH 38/97] change dir
---
CommEx/CommEx.csproj | 5 ++++
CommEx/Serial/{ => Common}/ISerialControl.cs | 28 ++++++++++++++++++-
CommEx/Serial/{ => Common}/Loopback.cs | 0
CommEx/Serial/{ => Common}/Main.cs | 0
.../Serial/{ => ViewModels}/PortViewModel.cs | 0
CommEx/Serial/{ => Views}/SettingWindow.xaml | 0
.../Serial/{ => Views}/SettingWindow.xaml.cs | 0
7 files changed, 32 insertions(+), 1 deletion(-)
rename CommEx/Serial/{ => Common}/ISerialControl.cs (63%)
rename CommEx/Serial/{ => Common}/Loopback.cs (100%)
rename CommEx/Serial/{ => Common}/Main.cs (100%)
rename CommEx/Serial/{ => ViewModels}/PortViewModel.cs (100%)
rename CommEx/Serial/{ => Views}/SettingWindow.xaml (100%)
rename CommEx/Serial/{ => Views}/SettingWindow.xaml.cs (100%)
diff --git a/CommEx/CommEx.csproj b/CommEx/CommEx.csproj
index 05b93e3..45dae81 100644
--- a/CommEx/CommEx.csproj
+++ b/CommEx/CommEx.csproj
@@ -33,4 +33,9 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/CommEx/Serial/ISerialControl.cs b/CommEx/Serial/Common/ISerialControl.cs
similarity index 63%
rename from CommEx/Serial/ISerialControl.cs
rename to CommEx/Serial/Common/ISerialControl.cs
index 5c5b754..c95bccc 100644
--- a/CommEx/Serial/ISerialControl.cs
+++ b/CommEx/Serial/Common/ISerialControl.cs
@@ -8,7 +8,7 @@
namespace CommEx.Serial
{
- internal interface ISerialControl
+ public interface ISerialControl
{
///
/// ポートを開ける前に呼ばれる
@@ -57,4 +57,30 @@ interface IBveEx
///
void ScenarioClosed(EventArgs e);
}
+
+ ///
+ /// 入力されたキーを送信する
+ ///
+ ///
+ ///
+ ///
+ //[DllImport("user32.dll", SetLastError = true)]
+ //public extern static void SendInput(int nInputs, Input[] pInputs, int cbsize);
+
+ ///
+ /// BveHacker と Native の初期化
+ ///
+ ///
+ ///
+ /// 引数がnullの時に投げる例外
+ //public static void Load(IBveHacker bveHacker, INative native)
+ //{
+ // native = native ?? throw new ArgumentNullException(nameof(native));
+ // bveHacker = bveHacker ?? throw new ArgumentNullException(nameof(bveHacker));
+ //}
+ //public static void Load(IBveHacker bveHacker)
+ //{
+ // bveHacker = bveHacker ?? throw new ArgumentNullException(nameof(bveHacker));
+ //}
+
}
diff --git a/CommEx/Serial/Loopback.cs b/CommEx/Serial/Common/Loopback.cs
similarity index 100%
rename from CommEx/Serial/Loopback.cs
rename to CommEx/Serial/Common/Loopback.cs
diff --git a/CommEx/Serial/Main.cs b/CommEx/Serial/Common/Main.cs
similarity index 100%
rename from CommEx/Serial/Main.cs
rename to CommEx/Serial/Common/Main.cs
diff --git a/CommEx/Serial/PortViewModel.cs b/CommEx/Serial/ViewModels/PortViewModel.cs
similarity index 100%
rename from CommEx/Serial/PortViewModel.cs
rename to CommEx/Serial/ViewModels/PortViewModel.cs
diff --git a/CommEx/Serial/SettingWindow.xaml b/CommEx/Serial/Views/SettingWindow.xaml
similarity index 100%
rename from CommEx/Serial/SettingWindow.xaml
rename to CommEx/Serial/Views/SettingWindow.xaml
diff --git a/CommEx/Serial/SettingWindow.xaml.cs b/CommEx/Serial/Views/SettingWindow.xaml.cs
similarity index 100%
rename from CommEx/Serial/SettingWindow.xaml.cs
rename to CommEx/Serial/Views/SettingWindow.xaml.cs
From 63f17a5b37aa3c8392ca67392c1b3209599dbc15 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Sun, 12 Jan 2025 22:17:18 +0900
Subject: [PATCH 39/97] change namespace
---
CommEx/Serial/Bids/Serial.cs | 1 +
CommEx/Serial/Common/ISerialControl.cs | 2 +-
CommEx/Serial/Common/Loopback.cs | 2 +-
CommEx/Serial/ViewModels/PortViewModel.cs | 3 ++-
CommEx/Serial/Views/SettingWindow.xaml | 6 +++---
CommEx/Serial/Views/SettingWindow.xaml.cs | 3 ++-
6 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/CommEx/Serial/Bids/Serial.cs b/CommEx/Serial/Bids/Serial.cs
index 7376b29..b0db8ac 100644
--- a/CommEx/Serial/Bids/Serial.cs
+++ b/CommEx/Serial/Bids/Serial.cs
@@ -15,6 +15,7 @@
using BveEx.PluginHost.Input;
using BveEx.Extensions.Native.Input;
using System.Windows.Media.Animation;
+using CommEx.Serial.Common;
namespace CommEx.Serial.Bids
{
diff --git a/CommEx/Serial/Common/ISerialControl.cs b/CommEx/Serial/Common/ISerialControl.cs
index c95bccc..91eb16f 100644
--- a/CommEx/Serial/Common/ISerialControl.cs
+++ b/CommEx/Serial/Common/ISerialControl.cs
@@ -6,7 +6,7 @@
using System.Text;
using System.Threading.Tasks;
-namespace CommEx.Serial
+namespace CommEx.Serial.Common
{
public interface ISerialControl
{
diff --git a/CommEx/Serial/Common/Loopback.cs b/CommEx/Serial/Common/Loopback.cs
index d371c01..6979f51 100644
--- a/CommEx/Serial/Common/Loopback.cs
+++ b/CommEx/Serial/Common/Loopback.cs
@@ -6,7 +6,7 @@
using System.Text;
using System.Threading.Tasks;
-namespace CommEx.Serial
+namespace CommEx.Serial.Common
{
///
/// シリアルループバック
diff --git a/CommEx/Serial/ViewModels/PortViewModel.cs b/CommEx/Serial/ViewModels/PortViewModel.cs
index d885866..a4e2f6c 100644
--- a/CommEx/Serial/ViewModels/PortViewModel.cs
+++ b/CommEx/Serial/ViewModels/PortViewModel.cs
@@ -16,8 +16,9 @@
using System.Globalization;
using System.Windows.Data;
using System.Windows.Media;
+using CommEx.Serial.Common;
-namespace CommEx.Serial
+namespace CommEx.Serial.ViewModel
{
public class PortViewModel : INotifyPropertyChanged
{
diff --git a/CommEx/Serial/Views/SettingWindow.xaml b/CommEx/Serial/Views/SettingWindow.xaml
index 5d41b8b..1dbc2ab 100644
--- a/CommEx/Serial/Views/SettingWindow.xaml
+++ b/CommEx/Serial/Views/SettingWindow.xaml
@@ -1,13 +1,13 @@
-
-
+
diff --git a/CommEx/Serial/Views/SettingWindow.xaml.cs b/CommEx/Serial/Views/SettingWindow.xaml.cs
index 9c32222..3dbc234 100644
--- a/CommEx/Serial/Views/SettingWindow.xaml.cs
+++ b/CommEx/Serial/Views/SettingWindow.xaml.cs
@@ -13,8 +13,9 @@
using System.Windows.Shapes;
using System.IO.Ports;
using BveEx.Diagnostics;
+using CommEx.Serial.ViewModel;
-namespace CommEx.Serial
+namespace CommEx.Serial.Views
{
///
/// SettingWindow.xaml の相互作用ロジック
From eaef85cf2d1f4aaaeff3ee0e2a23f566b5f225d1 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Sun, 12 Jan 2025 22:17:34 +0900
Subject: [PATCH 40/97] move main
---
CommEx/Serial/{Common => }/Main.cs | 2 ++
1 file changed, 2 insertions(+)
rename CommEx/Serial/{Common => }/Main.cs (99%)
diff --git a/CommEx/Serial/Common/Main.cs b/CommEx/Serial/Main.cs
similarity index 99%
rename from CommEx/Serial/Common/Main.cs
rename to CommEx/Serial/Main.cs
index 73ad948..718982b 100644
--- a/CommEx/Serial/Common/Main.cs
+++ b/CommEx/Serial/Main.cs
@@ -14,6 +14,8 @@
using BveTypes.ClassWrappers;
using BveEx.Extensions.Native;
using BveEx.Diagnostics;
+using CommEx.Serial.ViewModel;
+using CommEx.Serial.Views;
namespace CommEx.Serial
{
From 64a9832e80f1b33b58ffa4167af6fc0ae72c17a4 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Sun, 12 Jan 2025 22:21:56 +0900
Subject: [PATCH 41/97] add autoconnect
---
CommEx/Serial/ViewModels/PortViewModel.cs | 24 +++++++++++++++++++++++
CommEx/Serial/Views/SettingWindow.xaml | 10 ++++++++--
2 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/CommEx/Serial/ViewModels/PortViewModel.cs b/CommEx/Serial/ViewModels/PortViewModel.cs
index a4e2f6c..f485fc8 100644
--- a/CommEx/Serial/ViewModels/PortViewModel.cs
+++ b/CommEx/Serial/ViewModels/PortViewModel.cs
@@ -34,6 +34,11 @@ public class PortViewModel : INotifyPropertyChanged
///
private ISerialControl control;
+ ///
+ /// 自動接続の設定
+ ///
+ private bool isAutoConnent;
+
#endregion
#region Properties
@@ -229,6 +234,25 @@ public StopBits StopBits
}
}
+ ///
+ /// 自動接続設定
+ ///
+ [Browsable(true)]
+ [DefaultValue(false)]
+ [MonitoringDescription("IsAutoConnent")]
+ public bool IsAutoConnent
+ {
+ get
+ {
+ return isAutoConnent;
+ }
+ set
+ {
+ isAutoConnent = value;
+ RaisePropertyChanged();
+ }
+ }
+
///
/// 使用可能なポートの選択肢リスト
///
diff --git a/CommEx/Serial/Views/SettingWindow.xaml b/CommEx/Serial/Views/SettingWindow.xaml
index 1dbc2ab..f6544eb 100644
--- a/CommEx/Serial/Views/SettingWindow.xaml
+++ b/CommEx/Serial/Views/SettingWindow.xaml
@@ -36,6 +36,8 @@
+
+
@@ -68,11 +70,15 @@
+
+
+
+
-
+
-
+
From 992037fbfe4c021c31b61cf7c05afab483805406 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Sun, 12 Jan 2025 22:25:27 +0900
Subject: [PATCH 42/97] delete resource dict
---
CommEx/Serial/Dictionary.xaml | 26 --------------------------
1 file changed, 26 deletions(-)
delete mode 100644 CommEx/Serial/Dictionary.xaml
diff --git a/CommEx/Serial/Dictionary.xaml b/CommEx/Serial/Dictionary.xaml
deleted file mode 100644
index 98f8b4a..0000000
--- a/CommEx/Serial/Dictionary.xaml
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
From dcc8eaf56c2da5279500b68dcf725ab54f455c76 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Sun, 12 Jan 2025 22:41:13 +0900
Subject: [PATCH 43/97] add save settings
---
CommEx/Serial/Common/SaveSettings.cs | 12 ++++++++++++
1 file changed, 12 insertions(+)
create mode 100644 CommEx/Serial/Common/SaveSettings.cs
diff --git a/CommEx/Serial/Common/SaveSettings.cs b/CommEx/Serial/Common/SaveSettings.cs
new file mode 100644
index 0000000..1e67d39
--- /dev/null
+++ b/CommEx/Serial/Common/SaveSettings.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CommEx.Serial.Common
+{
+ class SaveSettings
+ {
+ }
+}
From 07a11e3aa8a91054948d36d0f7d8a8fef3af608c Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Sun, 12 Jan 2025 23:43:55 +0900
Subject: [PATCH 44/97] update save settings
---
CommEx/Serial/Common/SaveSettings.cs | 102 +++++++++++++++++++++++++++
1 file changed, 102 insertions(+)
diff --git a/CommEx/Serial/Common/SaveSettings.cs b/CommEx/Serial/Common/SaveSettings.cs
index 1e67d39..c0f663e 100644
--- a/CommEx/Serial/Common/SaveSettings.cs
+++ b/CommEx/Serial/Common/SaveSettings.cs
@@ -1,12 +1,114 @@
using System;
using System.Collections.Generic;
+using System.IO.Ports;
+using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
+using System.Xml.Serialization;
+using CommEx.Serial.ViewModel;
namespace CommEx.Serial.Common
{
class SaveSettings
{
+ private const string FilePath = "PortViewModelSettings.xml";
+
+ ///
+ /// PortViewModelのプロパティをXMLファイルに保存します。
+ ///
+ /// 保存するPortViewModelインスタンス
+ public static void Save(PortViewModel viewModel)
+ {
+ try
+ {
+ var serializableObject = new SerializablePortViewModel(viewModel);
+ using (var stream = new FileStream(FilePath, FileMode.Create))
+ {
+ var serializer = new XmlSerializer(typeof(SerializablePortViewModel));
+ serializer.Serialize(stream, serializableObject);
+ }
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($"Error saving settings: {ex.Message}");
+ }
+ }
+
+ ///
+ /// XMLファイルからPortViewModelのプロパティを読み込みます。
+ ///
+ /// 読み込まれたPortViewModelインスタンス
+ public static PortViewModel Load()
+ {
+ try
+ {
+ if (!File.Exists(FilePath)) return new PortViewModel();
+
+ using (var stream = new FileStream(FilePath, FileMode.Open))
+ {
+ var serializer = new XmlSerializer(typeof(SerializablePortViewModel));
+ var serializableObject = (SerializablePortViewModel)serializer.Deserialize(stream);
+ return serializableObject.ToPortViewModel();
+ }
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($"Error loading settings: {ex.Message}");
+ return new PortViewModel();
+ }
+ }
+ }
+
+ ///
+ /// を保存するためのラップクラス
+ ///
+ [Serializable]
+ public class SerializablePortViewModel
+ {
+ public int BaudRate { get; set; }
+ public int DataBits { get; set; }
+ public bool DtrEnable { get; set; }
+ public string EncodingName { get; set; }
+ public Handshake Handshake { get; set; }
+ public string NewLine { get; set; }
+ public Parity Parity { get; set; }
+ public string PortName { get; set; }
+ public StopBits StopBits { get; set; }
+ public bool IsAutoConnent { get; set; }
+
+ // Parameterless constructor for XmlSerializer
+ public SerializablePortViewModel() { }
+
+ public SerializablePortViewModel(PortViewModel viewModel)
+ {
+ BaudRate = viewModel.BaudRate;
+ DataBits = viewModel.DataBits;
+ DtrEnable = viewModel.DtrEnable;
+ EncodingName = viewModel.Encoding.WebName;
+ Handshake = viewModel.Handshake;
+ NewLine = viewModel.NewLine;
+ Parity = viewModel.Parity;
+ PortName = viewModel.PortName;
+ StopBits = viewModel.StopBits;
+ IsAutoConnent = viewModel.IsAutoConnent;
+ }
+
+ public PortViewModel ToPortViewModel()
+ {
+ return new PortViewModel
+ {
+ BaudRate = BaudRate,
+ DataBits = DataBits,
+ DtrEnable = DtrEnable,
+ Encoding = Encoding.GetEncoding(EncodingName),
+ Handshake = Handshake,
+ NewLine = NewLine,
+ Parity = Parity,
+ PortName = PortName,
+ StopBits = StopBits,
+ IsAutoConnent = IsAutoConnent
+ };
+ }
}
}
From 3e51479a709fe1aaa3818d5a7c433aad606dc95e Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Mon, 13 Jan 2025 02:45:29 +0900
Subject: [PATCH 45/97] update save settings
---
CommEx/Serial/Common/SaveSettings.cs | 100 +++++++---------------
CommEx/Serial/ViewModels/PortViewModel.cs | 23 +++++
2 files changed, 55 insertions(+), 68 deletions(-)
diff --git a/CommEx/Serial/Common/SaveSettings.cs b/CommEx/Serial/Common/SaveSettings.cs
index c0f663e..cd607ef 100644
--- a/CommEx/Serial/Common/SaveSettings.cs
+++ b/CommEx/Serial/Common/SaveSettings.cs
@@ -7,108 +7,72 @@
using System.Threading.Tasks;
using System.Xml.Serialization;
using CommEx.Serial.ViewModel;
+using System.Diagnostics;
namespace CommEx.Serial.Common
{
class SaveSettings
{
- private const string FilePath = "PortViewModelSettings.xml";
+ ///
+ /// 保存先のファイルパスを動的に取得
+ /// このdllのファイルパス - ".dll" + ".Settings.xml"
+ ///
+ /// 保存先のファイルパス
+ ///
+ private static string GetSettingsFilePath()
+ {
+ string assemblyLocation = System.Reflection.Assembly.GetExecutingAssembly().Location;
+ string directory = Path.GetDirectoryName(assemblyLocation) ?? throw new InvalidOperationException("アセンブリのディレクトリを取得できません。");
+ string fileName = Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetExecutingAssembly().Location);
+ return Path.Combine(directory, $"{fileName}.Settings.xml");
+ }
///
- /// PortViewModelのプロパティをXMLファイルに保存します。
+ /// のプロパティをXMLファイルに保存
///
- /// 保存するPortViewModelインスタンス
+ /// 保存する インスタンス
public static void Save(PortViewModel viewModel)
{
try
{
- var serializableObject = new SerializablePortViewModel(viewModel);
- using (var stream = new FileStream(FilePath, FileMode.Create))
+ string filePath = GetSettingsFilePath();
+
+ using (var writer = new StreamWriter(filePath))
{
- var serializer = new XmlSerializer(typeof(SerializablePortViewModel));
- serializer.Serialize(stream, serializableObject);
+ var serializer = new XmlSerializer(typeof(PortViewModel));
+ serializer.Serialize(writer, viewModel);
}
}
catch (Exception ex)
{
- Console.WriteLine($"Error saving settings: {ex.Message}");
+ Debug.Print($"Error saving settings: {ex.Message}");
}
}
///
- /// XMLファイルからPortViewModelのプロパティを読み込みます。
+ /// XMLファイルから のプロパティを読み込み
///
- /// 読み込まれたPortViewModelインスタンス
+ /// 読み込まれた インスタンス
public static PortViewModel Load()
{
try
{
- if (!File.Exists(FilePath)) return new PortViewModel();
+ string filePath = GetSettingsFilePath();
- using (var stream = new FileStream(FilePath, FileMode.Open))
+ if (!File.Exists(filePath)) return new PortViewModel();
+
+ using (var stream = new FileStream(filePath, FileMode.Open))
{
- var serializer = new XmlSerializer(typeof(SerializablePortViewModel));
- var serializableObject = (SerializablePortViewModel)serializer.Deserialize(stream);
- return serializableObject.ToPortViewModel();
+ var serializer = new XmlSerializer(typeof(PortViewModel));
+ var serializableObject = (PortViewModel)serializer.Deserialize(stream);
+ return serializableObject;
}
}
catch (Exception ex)
{
- Console.WriteLine($"Error loading settings: {ex.Message}");
+ Debug.Print($"Error loading settings: {ex.Message}");
return new PortViewModel();
}
}
}
-
- ///
- /// を保存するためのラップクラス
- ///
- [Serializable]
- public class SerializablePortViewModel
- {
- public int BaudRate { get; set; }
- public int DataBits { get; set; }
- public bool DtrEnable { get; set; }
- public string EncodingName { get; set; }
- public Handshake Handshake { get; set; }
- public string NewLine { get; set; }
- public Parity Parity { get; set; }
- public string PortName { get; set; }
- public StopBits StopBits { get; set; }
- public bool IsAutoConnent { get; set; }
-
- // Parameterless constructor for XmlSerializer
- public SerializablePortViewModel() { }
-
- public SerializablePortViewModel(PortViewModel viewModel)
- {
- BaudRate = viewModel.BaudRate;
- DataBits = viewModel.DataBits;
- DtrEnable = viewModel.DtrEnable;
- EncodingName = viewModel.Encoding.WebName;
- Handshake = viewModel.Handshake;
- NewLine = viewModel.NewLine;
- Parity = viewModel.Parity;
- PortName = viewModel.PortName;
- StopBits = viewModel.StopBits;
- IsAutoConnent = viewModel.IsAutoConnent;
- }
-
- public PortViewModel ToPortViewModel()
- {
- return new PortViewModel
- {
- BaudRate = BaudRate,
- DataBits = DataBits,
- DtrEnable = DtrEnable,
- Encoding = Encoding.GetEncoding(EncodingName),
- Handshake = Handshake,
- NewLine = NewLine,
- Parity = Parity,
- PortName = PortName,
- StopBits = StopBits,
- IsAutoConnent = IsAutoConnent
- };
- }
- }
}
diff --git a/CommEx/Serial/ViewModels/PortViewModel.cs b/CommEx/Serial/ViewModels/PortViewModel.cs
index f485fc8..a373625 100644
--- a/CommEx/Serial/ViewModels/PortViewModel.cs
+++ b/CommEx/Serial/ViewModels/PortViewModel.cs
@@ -17,9 +17,12 @@
using System.Windows.Data;
using System.Windows.Media;
using CommEx.Serial.Common;
+using System.Xml.Serialization;
namespace CommEx.Serial.ViewModel
{
+ [Serializable]
+ [XmlRoot("Port")]
public class PortViewModel : INotifyPropertyChanged
{
#region Fields
@@ -49,6 +52,7 @@ public class PortViewModel : INotifyPropertyChanged
[Browsable(true)]
[DefaultValue(9600)]
[MonitoringDescription("BaudRate")]
+ [XmlElement("BaudRate")]
public int BaudRate
{
get
@@ -68,6 +72,7 @@ public int BaudRate
[Browsable(true)]
[DefaultValue(8)]
[MonitoringDescription("DataBits")]
+ [XmlElement("DataBits")]
public int DataBits
{
get
@@ -87,6 +92,7 @@ public int DataBits
[Browsable(true)]
[DefaultValue(false)]
[MonitoringDescription("DtrEnable")]
+ [XmlElement("DtrEnable")]
public bool DtrEnable
{
get
@@ -106,6 +112,7 @@ public bool DtrEnable
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
[MonitoringDescription("Encoding")]
+ [XmlIgnore]
public Encoding Encoding
{
get
@@ -125,6 +132,7 @@ public Encoding Encoding
[Browsable(true)]
[DefaultValue(Handshake.None)]
[MonitoringDescription("Handshake")]
+ [XmlElement("Handshake")]
public Handshake Handshake
{
get
@@ -144,6 +152,7 @@ public Handshake Handshake
[Browsable(true)]
[DefaultValue(false)]
[MonitoringDescription("IsOpen")]
+ [XmlIgnore]
public bool IsOpen
{
get
@@ -156,6 +165,7 @@ public bool IsOpen
/// ポートの状態
///
[Browsable(false)]
+ [XmlIgnore]
public bool IsClosed => !IsOpen;
///
@@ -164,6 +174,7 @@ public bool IsOpen
[Browsable(false)]
[DefaultValue("\n")]
[MonitoringDescription("NewLine")]
+ [XmlElement("NewLine")]
public string NewLine
{
get
@@ -183,6 +194,7 @@ public string NewLine
[Browsable(true)]
[DefaultValue(Parity.None)]
[MonitoringDescription("Parity")]
+ [XmlElement("Parity")]
public Parity Parity
{
get
@@ -202,6 +214,7 @@ public Parity Parity
[Browsable(true)]
[DefaultValue("COM1")]
[MonitoringDescription("PortName")]
+ [XmlAttribute("PortName")]
public string PortName
{
get
@@ -221,6 +234,7 @@ public string PortName
[Browsable(true)]
[DefaultValue(StopBits.One)]
[MonitoringDescription("StopBits")]
+ [XmlElement("StopBits")]
public StopBits StopBits
{
get
@@ -240,6 +254,7 @@ public StopBits StopBits
[Browsable(true)]
[DefaultValue(false)]
[MonitoringDescription("IsAutoConnent")]
+ [XmlElement("IsAutoConnent")]
public bool IsAutoConnent
{
get
@@ -256,41 +271,49 @@ public bool IsAutoConnent
///
/// 使用可能なポートの選択肢リスト
///
+ [XmlIgnore]
public ObservableCollection AvailablePorts { get; } = new ObservableCollection();
///
/// ボーレートの選択肢リスト
///
+ [XmlIgnore]
public ObservableCollection BaudRates { get; } = new ObservableCollection { 9600, 19200, 38400, 57600, 115200 };
///
/// データビットの選択肢リスト
///
+ [XmlIgnore]
public ObservableCollection DataBitsOptions { get; } = new ObservableCollection { 5, 6, 7, 8 };
///
/// ストップビットの選択肢リスト
///
+ [XmlIgnore]
public ObservableCollection StopBitsOptions { get; } = new ObservableCollection { StopBits.One, StopBits.OnePointFive, StopBits.Two };
///
/// パリティの選択肢リスト
///
+ [XmlIgnore]
public ObservableCollection ParityOptions { get; } = new ObservableCollection(Enum.GetValues(typeof(Parity)) as Parity[]);
///
/// フロー制御の選択肢リスト
///
+ [XmlIgnore]
public ObservableCollection HandshakeOptions { get; } = new ObservableCollection(Enum.GetValues(typeof(Handshake)) as Handshake[]);
///
/// ポートリストのアップデートコマンド
///
+ [XmlIgnore]
public ICommand UpdatePortsCommand { get; }
///
/// ポートの開閉コマンド
///
+ [XmlIgnore]
public ICommand OpenClosePortCommand { get; }
#endregion
From d8c6f838aa24c4e5a1c683d6a90c70680607ca07 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Mon, 13 Jan 2025 02:50:43 +0900
Subject: [PATCH 46/97] add sample settings
---
CommEx/Serial/Common/Sample.Setting.xml | 10 ++++++++++
1 file changed, 10 insertions(+)
create mode 100644 CommEx/Serial/Common/Sample.Setting.xml
diff --git a/CommEx/Serial/Common/Sample.Setting.xml b/CommEx/Serial/Common/Sample.Setting.xml
new file mode 100644
index 0000000..0e243ae
--- /dev/null
+++ b/CommEx/Serial/Common/Sample.Setting.xml
@@ -0,0 +1,10 @@
+
+
+ 115200
+ 8
+ false
+ None
+ None
+ One
+ true
+
\ No newline at end of file
From 51cd93e72635ba90ba584dc0c1c4c5587eb7db71 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Mon, 13 Jan 2025 02:51:32 +0900
Subject: [PATCH 47/97] update main
---
CommEx/Serial/Main.cs | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/CommEx/Serial/Main.cs b/CommEx/Serial/Main.cs
index 718982b..1f3e758 100644
--- a/CommEx/Serial/Main.cs
+++ b/CommEx/Serial/Main.cs
@@ -16,6 +16,7 @@
using BveEx.Diagnostics;
using CommEx.Serial.ViewModel;
using CommEx.Serial.Views;
+using CommEx.Serial.Common;
namespace CommEx.Serial
{
@@ -110,7 +111,7 @@ public Serial(PluginBuilder builder) : base(builder)
BveHacker.ScenarioCreated += OnScenarioCreated;
BveHacker.ScenarioClosed += ScenarioClosed;
- portViewModel = new PortViewModel();
+ portViewModel = SaveSettings.Load();
window = new SettingWindow(portViewModel);
window.Closing += WindowClosing;
@@ -124,6 +125,8 @@ public Serial(PluginBuilder builder) : base(builder)
///
public override void Dispose()
{
+ SaveSettings.Save(portViewModel);
+
Extensions.AllExtensionsLoaded -= AllExtensionsLoaded;
BveHacker.ScenarioCreated -= OnScenarioCreated;
BveHacker.ScenarioClosed -= ScenarioClosed;
From 9674b16af8aae94e201b885731f6a9111fbac8cf Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Mon, 13 Jan 2025 02:53:28 +0900
Subject: [PATCH 48/97] add debug
---
CommEx/Serial/Main.cs | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/CommEx/Serial/Main.cs b/CommEx/Serial/Main.cs
index 1f3e758..bcea92a 100644
--- a/CommEx/Serial/Main.cs
+++ b/CommEx/Serial/Main.cs
@@ -115,7 +115,11 @@ public Serial(PluginBuilder builder) : base(builder)
window = new SettingWindow(portViewModel);
window.Closing += WindowClosing;
+#if DEBUG
+ window.Show();
+#else
window.Hide();
+#endif
}
#endregion
@@ -157,6 +161,10 @@ private void AllExtensionsLoaded(object sender, EventArgs e)
setting = cmx.AddCheckableMenuItem("シリアル通信設定", MenuItemCheckedChanged, ContextMenuItemType.CoreAndExtensions);
native.Started += NativeStarted; ;
+
+#if DEBUG
+ setting.Checked = true;
+#endif
}
///
From 84097ddc8e28b388f62e0a2be99cabd1757f3eb3 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Mon, 13 Jan 2025 03:13:48 +0900
Subject: [PATCH 49/97] add lib
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
さすがに本物は追加できないので存在を示す意味で空のファイルだけ入れておいた
実際はbve本体付属のものを参照
---
CommEx/CommEx.csproj | 3 +++
ref/.gitignore | 1 +
ref/Mackoy.IInputDevice.DLL | 0
3 files changed, 4 insertions(+)
create mode 100644 ref/.gitignore
create mode 100644 ref/Mackoy.IInputDevice.DLL
diff --git a/CommEx/CommEx.csproj b/CommEx/CommEx.csproj
index 45dae81..e57ebce 100644
--- a/CommEx/CommEx.csproj
+++ b/CommEx/CommEx.csproj
@@ -20,6 +20,9 @@
+
+ ..\ref\Mackoy.IInputDevice.DLL
+
diff --git a/ref/.gitignore b/ref/.gitignore
new file mode 100644
index 0000000..7dfd6f3
--- /dev/null
+++ b/ref/.gitignore
@@ -0,0 +1 @@
+Mackoy.IInputDevice.DLL
\ No newline at end of file
diff --git a/ref/Mackoy.IInputDevice.DLL b/ref/Mackoy.IInputDevice.DLL
new file mode 100644
index 0000000..e69de29
From d61f7ae92737cef080ee1511dcd982a5a3610bb0 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Mon, 13 Jan 2025 03:45:28 +0900
Subject: [PATCH 50/97] clean bids serial
---
CommEx/Serial/Bids/Serial.cs | 116 ++++++++++++++++++++---------------
1 file changed, 68 insertions(+), 48 deletions(-)
diff --git a/CommEx/Serial/Bids/Serial.cs b/CommEx/Serial/Bids/Serial.cs
index b0db8ac..c0f68aa 100644
--- a/CommEx/Serial/Bids/Serial.cs
+++ b/CommEx/Serial/Bids/Serial.cs
@@ -77,6 +77,8 @@ internal enum Errors
internal class Bids : ISerialControl
{
+ #region Fields
+
const int version = 300;
private static bool isAvailable = false;
@@ -88,61 +90,18 @@ internal class Bids : ISerialControl
///
private string lineBreak = "\r\n";
- struct AutoSend
- {
+ #endregion
- }
+ #region Structs
- ///
- public void PortOpen(SerialPort serialPort)
+ struct AutoSend
{
- serialPort.NewLine = lineBreak;
- serialPort.DataReceived += DataReceived;
- }
- ///
- public void PortClose(SerialPort serialPort)
- {
- serialPort.DataReceived -= DataReceived;
}
- ///
- /// シリアルポートの受信時に呼ばれる
- ///
- ///
- /// event args
- private void DataReceived(object sender, SerialDataReceivedEventArgs e)
- {
- SerialPort port = (SerialPort)sender;
- string str = "";
- try
- {
- str = port.ReadLine();
- }
- catch (Exception ex)
- {
-#if DEBUG
- ErrorDialog.Show(new ErrorDialogInfo("エラー:シリアル読み込み失敗", ex.Source, ex.Message));
-#endif
- return;
- }
- str = str.Trim();
- Debug.Print("Serial Receive Data" + str);
+ #endregion
- if (str.Length < 5 || !isAvailable)
- {
- return;
- }
- if (str.StartsWith("EX") || str.StartsWith("TR"))
- {
- string response = CreateResponse(str);
- if (response != null)
- {
- Debug.Print("Serial Send Data" + response);
- port.WriteLine(response);
- }
- }
- }
+ #region Methods
///
/// コマンドに応じた返答を生成
@@ -372,5 +331,66 @@ string CreateError(Errors err, string header = "EX")
return header + "E" + err.ToString();
}
+ #endregion
+
+ #region Interface Implementation
+
+ ///
+ public void PortOpen(SerialPort serialPort)
+ {
+ serialPort.NewLine = lineBreak;
+ serialPort.DataReceived += DataReceived;
+ }
+
+ ///
+ public void PortClose(SerialPort serialPort)
+ {
+ serialPort.DataReceived -= DataReceived;
+ }
+
+ #endregion
+
+ #region Event Handlers
+
+ ///
+ /// シリアルポートの受信時に呼ばれる
+ ///
+ ///
+ /// event args
+ private void DataReceived(object sender, SerialDataReceivedEventArgs e)
+ {
+ SerialPort port = (SerialPort)sender;
+ string str = "";
+ try
+ {
+ str = port.ReadLine();
+ }
+ catch (Exception ex)
+ {
+
+#if DEBUG
+ ErrorDialog.Show(new ErrorDialogInfo("エラー:シリアル読み込み失敗", ex.Source, ex.Message));
+#endif
+ return;
+ }
+ str = str.Trim();
+ Debug.Print("Serial Receive Data" + str);
+
+ if (str.Length < 5 || !isAvailable)
+ {
+ return;
+ }
+ if (str.StartsWith("EX") || str.StartsWith("TR"))
+ {
+ string response = CreateResponse(str);
+ if (response != null)
+ {
+ Debug.Print("Serial Send Data" + response);
+ port.WriteLine(response);
+ }
+ }
+ }
+
+ #endregion
}
}
From 1a46a64414d87556faa8076319ee8e1485a3ad40 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Mon, 13 Jan 2025 04:03:03 +0900
Subject: [PATCH 51/97] add status check
---
CommEx/Serial/Bids/Serial.cs | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
diff --git a/CommEx/Serial/Bids/Serial.cs b/CommEx/Serial/Bids/Serial.cs
index c0f68aa..898ed9a 100644
--- a/CommEx/Serial/Bids/Serial.cs
+++ b/CommEx/Serial/Bids/Serial.cs
@@ -73,6 +73,10 @@ internal enum Errors
/// 配列の範囲外アクセス
///
OutOfRange,
+ ///
+ /// シナリオが開始されていない
+ ///
+ NotStarted,
}
internal class Bids : ISerialControl
@@ -367,7 +371,6 @@ private void DataReceived(object sender, SerialDataReceivedEventArgs e)
}
catch (Exception ex)
{
-
#if DEBUG
ErrorDialog.Show(new ErrorDialogInfo("エラー:シリアル読み込み失敗", ex.Source, ex.Message));
#endif
@@ -382,7 +385,16 @@ private void DataReceived(object sender, SerialDataReceivedEventArgs e)
}
if (str.StartsWith("EX") || str.StartsWith("TR"))
{
- string response = CreateResponse(str);
+ string response;
+ if (!isAvailable)
+ {
+ response = CreateError(Errors.NotStarted);
+ }
+ else
+ {
+ response = CreateResponse(str);
+ }
+
if (response != null)
{
Debug.Print("Serial Send Data" + response);
From 3b71b491c3f82216825539423fcf073f278dff2e Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Mon, 13 Jan 2025 04:16:02 +0900
Subject: [PATCH 52/97] update bids
---
CommEx/Serial/Bids/Serial.cs | 50 ++++++++++++++++++------------------
1 file changed, 25 insertions(+), 25 deletions(-)
diff --git a/CommEx/Serial/Bids/Serial.cs b/CommEx/Serial/Bids/Serial.cs
index 898ed9a..a46dc12 100644
--- a/CommEx/Serial/Bids/Serial.cs
+++ b/CommEx/Serial/Bids/Serial.cs
@@ -79,15 +79,15 @@ internal enum Errors
NotStarted,
}
- internal class Bids : ISerialControl
+ public class Bids : ISerialControl
{
#region Fields
- const int version = 300;
+ private const int version = 300;
private static bool isAvailable = false;
private static INative native;
- private static IBveHacker bveHacker;
+ private static IBveHacker hacker;
///
/// 改行コード
@@ -112,7 +112,7 @@ struct AutoSend
///
/// コマンド
/// 返答
- string CreateResponse(string str)
+ private string CreateResponse(string str)
{
string header = str.Substring(0, 2).Trim();
string body = str.Substring(2).Trim();
@@ -180,8 +180,8 @@ string CreateResponse(string str)
case 8: // 電流 [A]
return response + native.VehicleState.Current.ToString();
//case 9: // 電圧 [V](準備工事)
- // return response + bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.PowerNotch.ToString();
- // return response + bveHacker.Scenario.Vehicle.Instruments.Electricity.
+ // return response + hacker.Scenario.Vehicle.Instruments.Cab.Handles.PowerNotch.ToString();
+ // return response + hacker.Scenario.Vehicle.Instruments.Electricity.
case 10: // 現在時刻(HH)[時]
return response + native.VehicleState.Time.Hours.ToString();
case 11: // 現在時刻(MM)[分]
@@ -199,13 +199,13 @@ string CreateResponse(string str)
switch (num2)
{
case 0: // Bノッチ位置
- return response + bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.BrakeNotch.ToString();
+ return response + hacker.Scenario.Vehicle.Instruments.Cab.Handles.BrakeNotch.ToString();
case 1: // Pノッチ位置
- return response + bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.PowerNotch.ToString();
+ return response + hacker.Scenario.Vehicle.Instruments.Cab.Handles.PowerNotch.ToString();
case 2: // レバーサー位置
- return response + bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.ReverserPosition.ToString();
+ return response + hacker.Scenario.Vehicle.Instruments.Cab.Handles.ReverserPosition.ToString();
case 3: // 定速状態(準備工事)
- return response + bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.ConstantSpeedMode.ToString();
+ return response + hacker.Scenario.Vehicle.Instruments.Cab.Handles.ConstantSpeedMode.ToString();
default:
return CreateError(Errors.ErrorInCodeNumber);
}
@@ -215,7 +215,7 @@ string CreateResponse(string str)
try
{
return response + native.AtsPanelArray[num2].ToString();
- //int val = bveHacker.Scenario.Vehicle.Instruments.AtsPlugin.PanelArray[num2];
+ //int val = hacker.Scenario.Vehicle.Instruments.AtsPlugin.PanelArray[num2];
//return response + val.ToString();
}
catch (Exception e)
@@ -234,7 +234,7 @@ string CreateResponse(string str)
try
{
return response + native.AtsSoundArray[num2].ToString();
- //int val = bveHacker.Scenario.Vehicle.Instruments.AtsPlugin.SoundArray[num2];
+ //int val = hacker.Scenario.Vehicle.Instruments.AtsPlugin.SoundArray[num2];
//return response + val.ToString();
}
catch (Exception e)
@@ -251,7 +251,7 @@ string CreateResponse(string str)
switch (num2)
{
case 0: // 全体
- return response + bveHacker.Scenario.Vehicle.Conductor.Doors.AreAllClosed;
+ return response + hacker.Scenario.Vehicle.Conductor.Doors.AreAllClosed;
case -1: // 左(準備工事)
case 1: // 右(準備工事)
default:
@@ -264,35 +264,35 @@ string CreateResponse(string str)
case 'R': // レバーサー操作要求
if (-1 <= num1 && num1 <= 1)
{
- bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.BrakeNotch = num1;
+ hacker.Scenario.Vehicle.Instruments.Cab.Handles.BrakeNotch = num1;
return response + 0.ToString();
}
return CreateError(Errors.ErrorInCodeSymbol);
case 'S': // ワンハンドル操作要求
//if (num1 > 0)
//{
- // bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.PowerNotch += num1;
- // bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.BrakeNotch += num1;
+ // hacker.Scenario.Vehicle.Instruments.Cab.Handles.PowerNotch += num1;
+ // hacker.Scenario.Vehicle.Instruments.Cab.Handles.BrakeNotch += num1;
// return response + 0.ToString();
//}
//else if (num1 < 0)
//{
- // bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.PowerNotch += num1;
- // bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.BrakeNotch += num1;
+ // hacker.Scenario.Vehicle.Instruments.Cab.Handles.PowerNotch += num1;
+ // hacker.Scenario.Vehicle.Instruments.Cab.Handles.BrakeNotch += num1;
// return response + 0.ToString();
//}
//else if (num1 == 0)
//{
- // bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.PowerNotch = 0;
- // bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.BrakeNotch = 0;
+ // hacker.Scenario.Vehicle.Instruments.Cab.Handles.PowerNotch = 0;
+ // hacker.Scenario.Vehicle.Instruments.Cab.Handles.BrakeNotch = 0;
// return response + 0.ToString();
//}
return CreateError(Errors.ErrorInCodeSymbol);
case 'P': // 力行操作要求
- bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.PowerNotch += num1;
+ hacker.Scenario.Vehicle.Instruments.Cab.Handles.PowerNotch += num1;
return response + 0.ToString();
case 'B': // 制動操作要求
- bveHacker.Scenario.Vehicle.Instruments.Cab.Handles.BrakeNotch += num1;
+ hacker.Scenario.Vehicle.Instruments.Cab.Handles.BrakeNotch += num1;
return response + 0.ToString();
case 'K': // キー操作要求
switch (body.ElementAt(1))
@@ -300,14 +300,14 @@ string CreateResponse(string str)
case 'P': // Pless
if (num1 <= (int)AtsKeyName.L)
{
- bveHacker.InputManager.KeyDown_Invoke(InputEventArgsFactory.AtsKey((AtsKeyName)num1));
+ hacker.InputManager.KeyDown_Invoke(InputEventArgsFactory.AtsKey((AtsKeyName)num1));
return response + 0.ToString();
}
return CreateError(Errors.ErrorInCodeNumber);
case 'R': // Release
if (num1 <= (int)AtsKeyName.L)
{
- bveHacker.InputManager.KeyUp_Invoke(InputEventArgsFactory.AtsKey((AtsKeyName)num1));
+ hacker.InputManager.KeyUp_Invoke(InputEventArgsFactory.AtsKey((AtsKeyName)num1));
return response + 0.ToString();
}
return CreateError(Errors.ErrorInCodeNumber);
@@ -327,7 +327,7 @@ string CreateResponse(string str)
return null;
}
- string CreateError(Errors err, string header = "EX")
+ private string CreateError(Errors err, string header = "EX")
{
#if DEBUG
Debug.WriteLine(err.ToString());
From f74f8fd50ec044c6c5a93a8a4dd52e45bfd1c013 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Mon, 13 Jan 2025 04:44:02 +0900
Subject: [PATCH 53/97] update start check
---
CommEx/Serial/Bids/Serial.cs | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/CommEx/Serial/Bids/Serial.cs b/CommEx/Serial/Bids/Serial.cs
index a46dc12..d52c4e2 100644
--- a/CommEx/Serial/Bids/Serial.cs
+++ b/CommEx/Serial/Bids/Serial.cs
@@ -379,14 +379,19 @@ private void DataReceived(object sender, SerialDataReceivedEventArgs e)
str = str.Trim();
Debug.Print("Serial Receive Data" + str);
- if (str.Length < 5 || !isAvailable)
+ if (str.Length < 5)
{
return;
}
+
if (str.StartsWith("EX") || str.StartsWith("TR"))
{
string response;
- if (!isAvailable)
+ if (native == null)
+ {
+ response = CreateError(Errors.NotStarted);
+ }
+ else if (!native.IsAvailable)
{
response = CreateError(Errors.NotStarted);
}
From cb5764ab1fc21c9a97d373293fbdc05294a5972c Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Mon, 13 Jan 2025 04:45:30 +0900
Subject: [PATCH 54/97] update get instance
---
CommEx/Serial/Bids/Serial.cs | 12 +++++++++++-
CommEx/Serial/Main.cs | 3 +++
2 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/CommEx/Serial/Bids/Serial.cs b/CommEx/Serial/Bids/Serial.cs
index d52c4e2..d3b8152 100644
--- a/CommEx/Serial/Bids/Serial.cs
+++ b/CommEx/Serial/Bids/Serial.cs
@@ -86,8 +86,9 @@ public class Bids : ISerialControl
private const int version = 300;
private static bool isAvailable = false;
- private static INative native;
+
private static IBveHacker hacker;
+ private static INative native;
///
/// 改行コード
@@ -107,6 +108,15 @@ struct AutoSend
#region Methods
+ ///
+ /// インスタンスの取り込み
+ ///
+ public static void UpdateInfos(IBveHacker bveHacker, INative bveNative)
+ {
+ hacker = bveHacker;
+ native = bveNative;
+ }
+
///
/// コマンドに応じた返答を生成
///
diff --git a/CommEx/Serial/Main.cs b/CommEx/Serial/Main.cs
index bcea92a..808347a 100644
--- a/CommEx/Serial/Main.cs
+++ b/CommEx/Serial/Main.cs
@@ -17,6 +17,7 @@
using CommEx.Serial.ViewModel;
using CommEx.Serial.Views;
using CommEx.Serial.Common;
+using CommEx.Serial.Bids;
namespace CommEx.Serial
{
@@ -165,6 +166,8 @@ private void AllExtensionsLoaded(object sender, EventArgs e)
#if DEBUG
setting.Checked = true;
#endif
+
+ Bids.Bids.UpdateInfos(bveHacker, native);
}
///
From 1e194ecc57c07d7a497ed3007b231a898c22448f Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Mon, 13 Jan 2025 04:45:44 +0900
Subject: [PATCH 55/97] clean main code
---
CommEx/Serial/Main.cs | 35 -----------------------------------
1 file changed, 35 deletions(-)
diff --git a/CommEx/Serial/Main.cs b/CommEx/Serial/Main.cs
index 808347a..17ce2f1 100644
--- a/CommEx/Serial/Main.cs
+++ b/CommEx/Serial/Main.cs
@@ -177,41 +177,6 @@ private void AllExtensionsLoaded(object sender, EventArgs e)
private void OnScenarioCreated(ScenarioCreatedEventArgs e)
{
scenario = e.Scenario;
-
- //Bids.Load(bveHacker);
-
- //try
- //{
- // _ExtendedBeacons = ExtendedBeaconSet.Load(Native, BveHacker, e.Scenario);
- //}
- //catch (Exception ex)
- //{
- // switch (ex)
- // {
- // case BveFileLoadException exception:
- // BveHacker.LoadErrorManager.Throw(exception.Message, exception.SenderFileName, exception.LineIndex, exception.CharIndex);
- // break;
-
- // case CompilationException exception:
- // foreach (Diagnostic diagnostic in exception.CompilationErrors)
- // {
- // string message = diagnostic.GetMessage();
- // string fileName = Path.GetFileName(diagnostic.Location.SourceTree.FilePath);
-
- // LinePosition position = diagnostic.Location.GetLineSpan().StartLinePosition;
- // int lineIndex = position.Line;
- // int charIndex = position.Character;
-
- // BveHacker.LoadErrorManager.Throw(message, fileName, lineIndex, charIndex);
- // }
- // break;
-
- // default:
- // BveHacker.LoadErrorManager.Throw(ex.Message);
- // _ = MessageBox.Show(ex.ToString(), App.Instance.ProductName);
- // break;
- // }
- //}
}
///
From 09ce0f512f66383fcd81a0e28a00519d5e35c464 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Mon, 13 Jan 2025 04:49:09 +0900
Subject: [PATCH 56/97] change class name
---
CommEx/Serial/Bids/Serial.cs | 2 +-
CommEx/Serial/Main.cs | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/CommEx/Serial/Bids/Serial.cs b/CommEx/Serial/Bids/Serial.cs
index d3b8152..e615088 100644
--- a/CommEx/Serial/Bids/Serial.cs
+++ b/CommEx/Serial/Bids/Serial.cs
@@ -79,7 +79,7 @@ internal enum Errors
NotStarted,
}
- public class Bids : ISerialControl
+ public class BidsSerial : ISerialControl
{
#region Fields
diff --git a/CommEx/Serial/Main.cs b/CommEx/Serial/Main.cs
index 17ce2f1..b0fea83 100644
--- a/CommEx/Serial/Main.cs
+++ b/CommEx/Serial/Main.cs
@@ -167,7 +167,7 @@ private void AllExtensionsLoaded(object sender, EventArgs e)
setting.Checked = true;
#endif
- Bids.Bids.UpdateInfos(bveHacker, native);
+ BidsSerial.UpdateInfos(bveHacker, native);
}
///
From a3eb8c06813f223c3743e8e8bc76bf5dcae89610 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Mon, 13 Jan 2025 04:49:40 +0900
Subject: [PATCH 57/97] change serial control
---
CommEx/Serial/ViewModels/PortViewModel.cs | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/CommEx/Serial/ViewModels/PortViewModel.cs b/CommEx/Serial/ViewModels/PortViewModel.cs
index a373625..f426db3 100644
--- a/CommEx/Serial/ViewModels/PortViewModel.cs
+++ b/CommEx/Serial/ViewModels/PortViewModel.cs
@@ -18,6 +18,7 @@
using System.Windows.Media;
using CommEx.Serial.Common;
using System.Xml.Serialization;
+using CommEx.Serial.Bids;
namespace CommEx.Serial.ViewModel
{
@@ -326,7 +327,7 @@ public bool IsAutoConnent
public PortViewModel()
{
port = new SerialPort();
- control = new Loopback();
+ control = new BidsSerial();
UpdatePortsCommand = new RelayCommand(UpdatePorts);
OpenClosePortCommand = new RelayCommand(OpenClosePort, CanOpenClosePort);
@@ -345,7 +346,7 @@ public PortViewModel()
public PortViewModel(string portName = "COM0", int baudRate = 115200, Parity parity = Parity.None, int dataBits = 8, StopBits stopBits = StopBits.One)
{
port = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
- control = new Loopback();
+ control = new BidsSerial();
UpdatePortsCommand = new RelayCommand(UpdatePorts);
OpenClosePortCommand = new RelayCommand(OpenClosePort, CanOpenClosePort);
@@ -360,7 +361,7 @@ public PortViewModel(string portName = "COM0", int baudRate = 115200, Parity par
public PortViewModel(SerialPort serialPort)
{
port = serialPort;
- control = new Loopback();
+ control = new BidsSerial();
UpdatePortsCommand = new RelayCommand(UpdatePorts);
OpenClosePortCommand = new RelayCommand(OpenClosePort, CanOpenClosePort);
From 3477b5caff0a90b26a2e0386c793fbe8c4b211c7 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Mon, 13 Jan 2025 05:12:46 +0900
Subject: [PATCH 58/97] add init method
---
CommEx/Serial/ViewModels/PortViewModel.cs | 40 ++++++++++++++++-------
1 file changed, 28 insertions(+), 12 deletions(-)
diff --git a/CommEx/Serial/ViewModels/PortViewModel.cs b/CommEx/Serial/ViewModels/PortViewModel.cs
index f426db3..204050d 100644
--- a/CommEx/Serial/ViewModels/PortViewModel.cs
+++ b/CommEx/Serial/ViewModels/PortViewModel.cs
@@ -321,18 +321,40 @@ public bool IsAutoConnent
#region Methods
+ ///
+ /// 初期化処理
+ ///
+ private void Initialize(SerialPort serialPort = null, ISerialControl serialControl = null)
+ {
+ if (serialPort == null)
+ {
+ port = new SerialPort();
+ }
+ else
+ {
+ port = serialPort;
+ }
+ if (serialControl == null)
+ {
+ control = new BidsSerial();
+ }
+ else
+ {
+ control = serialControl;
+ }
+
+ //UpdatePorts();
+ }
+
///
/// ViewModel をデフォルト値で初期化
///
public PortViewModel()
{
- port = new SerialPort();
- control = new BidsSerial();
-
UpdatePortsCommand = new RelayCommand(UpdatePorts);
OpenClosePortCommand = new RelayCommand(OpenClosePort, CanOpenClosePort);
- //UpdatePorts();
+ Initialize();
}
///
@@ -345,13 +367,10 @@ public PortViewModel()
/// ストップビット
public PortViewModel(string portName = "COM0", int baudRate = 115200, Parity parity = Parity.None, int dataBits = 8, StopBits stopBits = StopBits.One)
{
- port = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
- control = new BidsSerial();
-
UpdatePortsCommand = new RelayCommand(UpdatePorts);
OpenClosePortCommand = new RelayCommand(OpenClosePort, CanOpenClosePort);
- //UpdatePorts();
+ Initialize(new SerialPort(portName, baudRate, parity, dataBits, stopBits));
}
///
@@ -360,13 +379,10 @@ public PortViewModel(string portName = "COM0", int baudRate = 115200, Parity par
/// 初期化に使用する
public PortViewModel(SerialPort serialPort)
{
- port = serialPort;
- control = new BidsSerial();
-
UpdatePortsCommand = new RelayCommand(UpdatePorts);
OpenClosePortCommand = new RelayCommand(OpenClosePort, CanOpenClosePort);
- //UpdatePorts();
+ Initialize(serialPort);
}
///
From 6d5bd69343e123bff9a7f6e25c5ff61019a2e1e7 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Mon, 13 Jan 2025 05:14:47 +0900
Subject: [PATCH 59/97] add error catch
---
CommEx/Serial/Bids/Serial.cs | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/CommEx/Serial/Bids/Serial.cs b/CommEx/Serial/Bids/Serial.cs
index e615088..75efa90 100644
--- a/CommEx/Serial/Bids/Serial.cs
+++ b/CommEx/Serial/Bids/Serial.cs
@@ -413,7 +413,14 @@ private void DataReceived(object sender, SerialDataReceivedEventArgs e)
if (response != null)
{
Debug.Print("Serial Send Data" + response);
- port.WriteLine(response);
+ try
+ {
+ port.WriteLine(response);
+ }
+ catch (Exception ex)
+ {
+ ErrorDialog.Show(new ErrorDialogInfo("ポートが無効状態です。", ex.Source, ex.Message));
+ }
}
}
}
From 4cb56f8bd9d3540fec6e25eede6c6c92b4984c42 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Mon, 13 Jan 2025 06:24:47 +0900
Subject: [PATCH 60/97] update status management
---
CommEx/Serial/Bids/Serial.cs | 11 ++++++++++-
CommEx/Serial/Main.cs | 4 ++--
2 files changed, 12 insertions(+), 3 deletions(-)
diff --git a/CommEx/Serial/Bids/Serial.cs b/CommEx/Serial/Bids/Serial.cs
index 75efa90..b3e8cdb 100644
--- a/CommEx/Serial/Bids/Serial.cs
+++ b/CommEx/Serial/Bids/Serial.cs
@@ -117,6 +117,15 @@ public static void UpdateInfos(IBveHacker bveHacker, INative bveNative)
native = bveNative;
}
+ ///
+ /// 使用可否を設定
+ ///
+ /// 使用可否
+ public static void SetStatus(bool status)
+ {
+ isAvailable = status;
+ }
+
///
/// コマンドに応じた返答を生成
///
@@ -401,7 +410,7 @@ private void DataReceived(object sender, SerialDataReceivedEventArgs e)
{
response = CreateError(Errors.NotStarted);
}
- else if (!native.IsAvailable)
+ else if (!isAvailable)
{
response = CreateError(Errors.NotStarted);
}
diff --git a/CommEx/Serial/Main.cs b/CommEx/Serial/Main.cs
index b0fea83..14386d0 100644
--- a/CommEx/Serial/Main.cs
+++ b/CommEx/Serial/Main.cs
@@ -142,7 +142,7 @@ public override void Dispose()
///
public override void Tick(TimeSpan elapsed)
{
-
+ BidsSerial.SetStatus(true);
}
#endregion
@@ -186,7 +186,7 @@ private void OnScenarioCreated(ScenarioCreatedEventArgs e)
///
private void ScenarioClosed(EventArgs e)
{
- //throw new NotImplementedException();
+ BidsSerial.SetStatus(false);
}
#endregion
From cb293489e821fe0f9bb2faa7cd2e84f26f772d72 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Mon, 13 Jan 2025 06:43:30 +0900
Subject: [PATCH 61/97] add auto connect
---
CommEx/Serial/ViewModels/PortViewModel.cs | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/CommEx/Serial/ViewModels/PortViewModel.cs b/CommEx/Serial/ViewModels/PortViewModel.cs
index 204050d..d068e79 100644
--- a/CommEx/Serial/ViewModels/PortViewModel.cs
+++ b/CommEx/Serial/ViewModels/PortViewModel.cs
@@ -343,7 +343,16 @@ private void Initialize(SerialPort serialPort = null, ISerialControl serialContr
control = serialControl;
}
- //UpdatePorts();
+ UpdatePorts();
+
+ if (isAutoConnent || IsClosed)
+ {
+ if (AvailablePorts.Contains(PortName))
+ {
+ // 自動接続:ポート名の読み取りでコケる
+ OpenClosePort();
+ }
+ }
}
///
From 8d5ec9ce263ee9eb8b93e17be8346c0fba1bb106 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Mon, 13 Jan 2025 06:44:36 +0900
Subject: [PATCH 62/97] clean code
---
CommEx/Serial/Main.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/CommEx/Serial/Main.cs b/CommEx/Serial/Main.cs
index 14386d0..a675405 100644
--- a/CommEx/Serial/Main.cs
+++ b/CommEx/Serial/Main.cs
@@ -161,7 +161,7 @@ private void AllExtensionsLoaded(object sender, EventArgs e)
native = Extensions.GetExtension();
setting = cmx.AddCheckableMenuItem("シリアル通信設定", MenuItemCheckedChanged, ContextMenuItemType.CoreAndExtensions);
- native.Started += NativeStarted; ;
+ native.Started += NativeStarted;
#if DEBUG
setting.Checked = true;
From ec149a4150fd2af470cada79be399d2c54d26185 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Tue, 14 Jan 2025 00:49:18 +0900
Subject: [PATCH 63/97] fix autoconnect
---
CommEx/Serial/Main.cs | 2 ++
CommEx/Serial/ViewModels/PortViewModel.cs | 7 ++++++-
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/CommEx/Serial/Main.cs b/CommEx/Serial/Main.cs
index a675405..998111b 100644
--- a/CommEx/Serial/Main.cs
+++ b/CommEx/Serial/Main.cs
@@ -121,6 +121,8 @@ public Serial(PluginBuilder builder) : base(builder)
#else
window.Hide();
#endif
+
+ portViewModel.CheckAutoConnect();
}
#endregion
diff --git a/CommEx/Serial/ViewModels/PortViewModel.cs b/CommEx/Serial/ViewModels/PortViewModel.cs
index d068e79..30908e7 100644
--- a/CommEx/Serial/ViewModels/PortViewModel.cs
+++ b/CommEx/Serial/ViewModels/PortViewModel.cs
@@ -344,12 +344,17 @@ private void Initialize(SerialPort serialPort = null, ISerialControl serialContr
}
UpdatePorts();
+ }
+ ///
+ /// 自動接続処理
+ ///
+ public void CheckAutoConnect()
+ {
if (isAutoConnent || IsClosed)
{
if (AvailablePorts.Contains(PortName))
{
- // 自動接続:ポート名の読み取りでコケる
OpenClosePort();
}
}
From 3d702a5a9e455a631a89e07fa8389e4652a25458 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Tue, 14 Jan 2025 22:21:48 +0900
Subject: [PATCH 64/97] update prop load
---
CommEx/Serial/Common/SaveSettings.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/CommEx/Serial/Common/SaveSettings.cs b/CommEx/Serial/Common/SaveSettings.cs
index cd607ef..7ad9f6c 100644
--- a/CommEx/Serial/Common/SaveSettings.cs
+++ b/CommEx/Serial/Common/SaveSettings.cs
@@ -61,10 +61,10 @@ public static PortViewModel Load()
if (!File.Exists(filePath)) return new PortViewModel();
- using (var stream = new FileStream(filePath, FileMode.Open))
+ using (var reader = new StreamReader(filePath))
{
var serializer = new XmlSerializer(typeof(PortViewModel));
- var serializableObject = (PortViewModel)serializer.Deserialize(stream);
+ var serializableObject = (PortViewModel)serializer.Deserialize(reader);
return serializableObject;
}
}
From efb070acc3f617878edf7aa74cd0c541773a5f00 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Tue, 14 Jan 2025 23:26:16 +0900
Subject: [PATCH 65/97] update newline
---
CommEx/Serial/Common/NewLines.cs | 122 ++++++++++++++++++++++
CommEx/Serial/Common/Sample.Setting.xml | 3 +-
CommEx/Serial/ViewModels/PortViewModel.cs | 16 ++-
CommEx/Serial/Views/SettingWindow.xaml | 24 +++--
4 files changed, 150 insertions(+), 15 deletions(-)
create mode 100644 CommEx/Serial/Common/NewLines.cs
diff --git a/CommEx/Serial/Common/NewLines.cs b/CommEx/Serial/Common/NewLines.cs
new file mode 100644
index 0000000..b5293e1
--- /dev/null
+++ b/CommEx/Serial/Common/NewLines.cs
@@ -0,0 +1,122 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using System.Drawing;
+
+namespace CommEx.Serial.Common
+{
+ #region Enum
+
+ ///
+ /// 改行文字
+ ///
+ [TypeConverter(typeof(NewLinesConverter))]
+ public enum NewLines
+ {
+ [Description("\n")]
+ LF,
+ [Description("\r\n")]
+ CRLF,
+ [Description("\r")]
+ CR
+ }
+
+ #endregion
+
+ #region TypeConverter
+
+ // https://qiita.com/mkuwan/items/be6745f2c9e7823f8a66
+ internal static class EnumExtention
+ {
+ ///
+ /// Enum の Value から Description を取得
+ ///
+ /// 任意の
+ /// 型が T の値
+ /// value の Description
+ internal static string GetDescriptionFromValue(this T value) where T : Enum //where T : Enum とすることで Tがenumでない場合はコンパイル時にエラーにしてくれる
+ {
+ //valueはenum型確定なので空文字が返ることはない
+ string strValue = value.ToString();
+
+ var description =
+ typeof(T).GetField(strValue) //FiledInfoを取得
+ .GetCustomAttributes(typeof(DescriptionAttribute), false) //DescriptionAttributeのリストを取得
+ .Cast() //DescriptionAttributeにキャスト
+ .FirstOrDefault() //最初の一つを取得、なければnull
+ ?.Description; //DescriptionAttributeがあればDescriptionを、なければnullを返す
+
+ return description ?? strValue; //descriptionがnullならstrValueを返す
+ }
+
+ ///
+ /// EnumのDescriptionからValueを取得
+ ///
+ /// 任意の
+ /// 型が T の value の Description
+ /// Description を属性に持つ型が T の値
+ internal static T GetEnumValueFromDescription(this string description) where T : Enum
+ {
+ var value =
+ typeof(T).GetFields()
+ .SelectMany(x => x.GetCustomAttributes(typeof(DescriptionAttribute), false),
+ (f, a) => new { field = f, attribute = a })
+ .Where(x => ((DescriptionAttribute)x.attribute).Description == description)
+ .FirstOrDefault()
+ ?.field.GetRawConstantValue();
+
+ // 値が見つからない場合にエラーとする場合はこちら
+ //return (T)(value ?? throw new ArgumentNullException());
+
+ return (T)(value ?? default(T));
+ }
+ }
+
+
+ internal class NewLinesConverter : TypeConverter
+ {
+ public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
+ {
+ if (value is string)
+ {
+ string str = (string)value;
+ switch (str)
+ {
+ case "CRLF":
+ return NewLines.CRLF;
+ case "CR":
+ return NewLines.CR;
+ case "LF":
+ default:
+ return NewLines.LF;
+ }
+ }
+ return base.ConvertFrom(context, culture, value);
+ }
+
+ public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
+ {
+ if (destinationType == typeof(string))
+ {
+ switch ((NewLines)value)
+ {
+ case NewLines.CRLF:
+ return "CRLF";
+ case NewLines.CR:
+ return "CR";
+ case NewLines.LF:
+ default:
+ return "LF";
+ }
+ }
+ return base.ConvertTo(context, culture, value, destinationType);
+ }
+ }
+
+ #endregion
+}
diff --git a/CommEx/Serial/Common/Sample.Setting.xml b/CommEx/Serial/Common/Sample.Setting.xml
index 0e243ae..24ee4d1 100644
--- a/CommEx/Serial/Common/Sample.Setting.xml
+++ b/CommEx/Serial/Common/Sample.Setting.xml
@@ -1,9 +1,10 @@
-
+
115200
8
false
None
+ CRLF
None
One
true
diff --git a/CommEx/Serial/ViewModels/PortViewModel.cs b/CommEx/Serial/ViewModels/PortViewModel.cs
index 30908e7..6230285 100644
--- a/CommEx/Serial/ViewModels/PortViewModel.cs
+++ b/CommEx/Serial/ViewModels/PortViewModel.cs
@@ -172,19 +172,19 @@ public bool IsOpen
///
/// 改行文字
///
- [Browsable(false)]
- [DefaultValue("\n")]
+ [Browsable(true)]
+ [DefaultValue(NewLines.LF)]
[MonitoringDescription("NewLine")]
[XmlElement("NewLine")]
- public string NewLine
+ public NewLines NewLine
{
get
{
- return port.NewLine;
+ return EnumExtention.GetEnumValueFromDescription(port.NewLine);
}
set
{
- port.NewLine = value;
+ port.NewLine = EnumExtention.GetDescriptionFromValue(value);
RaisePropertyChanged();
}
}
@@ -305,6 +305,12 @@ public bool IsAutoConnent
[XmlIgnore]
public ObservableCollection HandshakeOptions { get; } = new ObservableCollection(Enum.GetValues(typeof(Handshake)) as Handshake[]);
+ ///
+ /// 改行文字の選択肢リスト
+ ///
+ [XmlIgnore]
+ public ObservableCollection NewLineOptions { get; } = new ObservableCollection(Enum.GetValues(typeof(NewLines)) as NewLines[]);
+
///
/// ポートリストのアップデートコマンド
///
diff --git a/CommEx/Serial/Views/SettingWindow.xaml b/CommEx/Serial/Views/SettingWindow.xaml
index f6544eb..1527a9b 100644
--- a/CommEx/Serial/Views/SettingWindow.xaml
+++ b/CommEx/Serial/Views/SettingWindow.xaml
@@ -5,17 +5,19 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="clr-namespace:CommEx.Serial.ViewModel"
mc:Ignorable="d"
- Title="Serial Port Settings" Height="400" Width="400">
+ Title="Serial Port Settings" Height="400" Width="500">
-
+
-
+
+
+
@@ -66,19 +68,23 @@
+
+
+
+
-
-
+
+
-
-
+
+
-
+
-
+
From 51daa2926b3d98b6f3f2872c25ce203d242fae36 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Tue, 14 Jan 2025 23:59:53 +0900
Subject: [PATCH 66/97] fix namespace
---
CommEx/Serial/Common/SaveSettings.cs | 2 +-
CommEx/Serial/Main.cs | 2 +-
CommEx/Serial/ViewModels/PortViewModel.cs | 2 +-
CommEx/Serial/Views/SettingWindow.xaml | 2 +-
CommEx/Serial/Views/SettingWindow.xaml.cs | 2 +-
5 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/CommEx/Serial/Common/SaveSettings.cs b/CommEx/Serial/Common/SaveSettings.cs
index 7ad9f6c..1be04a8 100644
--- a/CommEx/Serial/Common/SaveSettings.cs
+++ b/CommEx/Serial/Common/SaveSettings.cs
@@ -6,7 +6,7 @@
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
-using CommEx.Serial.ViewModel;
+using CommEx.Serial.ViewModels;
using System.Diagnostics;
namespace CommEx.Serial.Common
diff --git a/CommEx/Serial/Main.cs b/CommEx/Serial/Main.cs
index 998111b..d5b9890 100644
--- a/CommEx/Serial/Main.cs
+++ b/CommEx/Serial/Main.cs
@@ -14,7 +14,7 @@
using BveTypes.ClassWrappers;
using BveEx.Extensions.Native;
using BveEx.Diagnostics;
-using CommEx.Serial.ViewModel;
+using CommEx.Serial.ViewModels;
using CommEx.Serial.Views;
using CommEx.Serial.Common;
using CommEx.Serial.Bids;
diff --git a/CommEx/Serial/ViewModels/PortViewModel.cs b/CommEx/Serial/ViewModels/PortViewModel.cs
index 6230285..a04228a 100644
--- a/CommEx/Serial/ViewModels/PortViewModel.cs
+++ b/CommEx/Serial/ViewModels/PortViewModel.cs
@@ -20,7 +20,7 @@
using System.Xml.Serialization;
using CommEx.Serial.Bids;
-namespace CommEx.Serial.ViewModel
+namespace CommEx.Serial.ViewModels
{
[Serializable]
[XmlRoot("Port")]
diff --git a/CommEx/Serial/Views/SettingWindow.xaml b/CommEx/Serial/Views/SettingWindow.xaml
index 1527a9b..dbd1d8c 100644
--- a/CommEx/Serial/Views/SettingWindow.xaml
+++ b/CommEx/Serial/Views/SettingWindow.xaml
@@ -3,7 +3,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- xmlns:vm="clr-namespace:CommEx.Serial.ViewModel"
+ xmlns:vm="clr-namespace:CommEx.Serial.ViewModels"
mc:Ignorable="d"
Title="Serial Port Settings" Height="400" Width="500">
diff --git a/CommEx/Serial/Views/SettingWindow.xaml.cs b/CommEx/Serial/Views/SettingWindow.xaml.cs
index 3dbc234..79f73c1 100644
--- a/CommEx/Serial/Views/SettingWindow.xaml.cs
+++ b/CommEx/Serial/Views/SettingWindow.xaml.cs
@@ -13,7 +13,7 @@
using System.Windows.Shapes;
using System.IO.Ports;
using BveEx.Diagnostics;
-using CommEx.Serial.ViewModel;
+using CommEx.Serial.ViewModels;
namespace CommEx.Serial.Views
{
From 09c7f8c997b7c2e16617b95d87311ed5ca90b829 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Wed, 15 Jan 2025 00:24:36 +0900
Subject: [PATCH 67/97] update sindow size
---
CommEx/Serial/Views/SettingWindow.xaml | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/CommEx/Serial/Views/SettingWindow.xaml b/CommEx/Serial/Views/SettingWindow.xaml
index dbd1d8c..7888b62 100644
--- a/CommEx/Serial/Views/SettingWindow.xaml
+++ b/CommEx/Serial/Views/SettingWindow.xaml
@@ -5,18 +5,19 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="clr-namespace:CommEx.Serial.ViewModels"
mc:Ignorable="d"
- Title="Serial Port Settings" Height="400" Width="500">
+ Title="Serial Port Settings">
-
+
+
@@ -77,14 +78,14 @@
-
-
+
+
-
+
-
+
From a0cfbf059fd90d55a1ff97cc98f501233ad7e64f Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Wed, 15 Jan 2025 01:03:32 +0900
Subject: [PATCH 68/97] update window format
---
CommEx/Serial/Views/SettingWindow.xaml | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/CommEx/Serial/Views/SettingWindow.xaml b/CommEx/Serial/Views/SettingWindow.xaml
index 7888b62..2feee11 100644
--- a/CommEx/Serial/Views/SettingWindow.xaml
+++ b/CommEx/Serial/Views/SettingWindow.xaml
@@ -5,14 +5,14 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="clr-namespace:CommEx.Serial.ViewModels"
mc:Ignorable="d"
- Title="Serial Port Settings">
+ Title="Serial Port Settings" Height="400" Width="600">
-
+
@@ -86,6 +86,9 @@
+
+
+
From c4e55e8ceb7fc542a7935a9219d680db83d4f73b Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Mon, 20 Jan 2025 17:09:40 +0900
Subject: [PATCH 69/97] add on-design DataContext setting
---
CommEx/Serial/Views/SettingWindow.xaml | 1 +
1 file changed, 1 insertion(+)
diff --git a/CommEx/Serial/Views/SettingWindow.xaml b/CommEx/Serial/Views/SettingWindow.xaml
index 2feee11..edcdb6e 100644
--- a/CommEx/Serial/Views/SettingWindow.xaml
+++ b/CommEx/Serial/Views/SettingWindow.xaml
@@ -4,6 +4,7 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="clr-namespace:CommEx.Serial.ViewModels"
+ d:DataContext="{d:DesignInstance Type=vm:PortViewModel, IsDesignTimeCreatable=True}"
mc:Ignorable="d"
Title="Serial Port Settings" Height="400" Width="600">
From 54abe0dd2e8c5f068065bec7d6729d5e3478b749 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Mon, 20 Jan 2025 21:04:22 +0900
Subject: [PATCH 70/97] add list view
---
CommEx/Serial/ViewModels/ListViewModel.cs | 240 ++++++++++++++++++++++
CommEx/Serial/ViewModels/PortViewModel.cs | 54 +++++
CommEx/Serial/Views/ListWindow.xaml | 111 ++++++++++
CommEx/Serial/Views/ListWindow.xaml.cs | 35 ++++
4 files changed, 440 insertions(+)
create mode 100644 CommEx/Serial/ViewModels/ListViewModel.cs
create mode 100644 CommEx/Serial/Views/ListWindow.xaml
create mode 100644 CommEx/Serial/Views/ListWindow.xaml.cs
diff --git a/CommEx/Serial/ViewModels/ListViewModel.cs b/CommEx/Serial/ViewModels/ListViewModel.cs
new file mode 100644
index 0000000..6fdea93
--- /dev/null
+++ b/CommEx/Serial/ViewModels/ListViewModel.cs
@@ -0,0 +1,240 @@
+using BveEx.Diagnostics;
+using CommEx.Serial.Bids;
+using CommEx.Serial.Common;
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.IO.Ports;
+using System.IO;
+using System.Linq;
+using System.Runtime.CompilerServices;
+using System.Text;
+using System.Threading.Tasks;
+using System.Xml.Serialization;
+using System.Windows.Input;
+using CommEx.Serial.Views;
+
+namespace CommEx.Serial.ViewModels
+{
+ [XmlRoot("Settings")]
+ public class ListViewModel: INotifyPropertyChanged
+ {
+ #region Fields
+
+ ///
+ /// 子要素の ViewModel
+ ///
+ private ObservableCollection portViewModels;
+
+ ///
+ /// 現在選択中の ViewModel
+ ///
+ private PortViewModel selectedPort;
+
+ #endregion
+
+ #region Properties
+
+ ///
+ /// 子要素の ViewModel
+ ///
+ [XmlArray("Port Settings")]
+ [XmlArrayItem("Port")]
+ public ObservableCollection PortViewModels
+ {
+ get { return portViewModels; }
+ set
+ {
+ portViewModels = value;
+ RaisePropertyChanged();
+ }
+ }
+
+ ///
+ /// 現在選択中の ViewModel
+ ///
+ [XmlIgnore]
+ public PortViewModel SelectedPort
+ {
+ get { return selectedPort; }
+ set
+ {
+ selectedPort = value;
+ RaisePropertyChanged();
+ }
+ }
+
+ ///
+ /// 追加コマンド
+ ///
+ [XmlIgnore]
+ public ICommand AddItemCommand { get; }
+
+ ///
+ /// 設定コマンド
+ ///
+ [XmlIgnore]
+ public ICommand SettingCommand { get; }
+
+ ///
+ /// 削除コマンド
+ ///
+ [XmlIgnore]
+ public ICommand DeleteItemCommand { get; }
+
+ #endregion
+
+ #region Methods
+
+ ///
+ /// ListViewModel をデフォルト値で初期化
+ ///
+ public ListViewModel()
+ {
+ portViewModels = new ObservableCollection
+ {
+ new PortViewModel()
+ };
+
+ AddItemCommand = new RelayCommand(AddItem);
+ SettingCommand = new RelayCommand(ShowSettingWindow, IsSelectedItemNotNull);
+ DeleteItemCommand = new RelayCommand(ClearSelectedItem, IsSelectedItemNotNull);
+ }
+
+ ///
+ /// ListViewModel を で初期化
+ ///
+ public ListViewModel(PortViewModel viewModel)
+ {
+ portViewModels = new ObservableCollection
+ {
+ viewModel
+ };
+
+ AddItemCommand = new RelayCommand(AddItem);
+ SettingCommand = new RelayCommand(ShowSettingWindow, IsSelectedItemNotNull);
+ DeleteItemCommand = new RelayCommand(ClearSelectedItem, IsSelectedItemNotNull);
+ }
+
+ ///
+ /// ListViewModel を で初期化
+ ///
+ public ListViewModel(Collection viewModels)
+ {
+ portViewModels = new ObservableCollection(viewModels);
+
+ AddItemCommand = new RelayCommand(AddItem);
+ SettingCommand = new RelayCommand(ShowSettingWindow, IsSelectedItemNotNull);
+ DeleteItemCommand = new RelayCommand(ClearSelectedItem, IsSelectedItemNotNull);
+ }
+
+ ///
+ /// 選択された内容がnullか判定
+ ///
+ /// 選択された内容がnullか否か
+ private bool IsSelectedItemNotNull() => SelectedPort != null;
+
+ ///
+ /// ポート設定を追加
+ ///
+ private void AddItem() => portViewModels.Add(new PortViewModel());
+
+ ///
+ /// 設定ウィンドウを表示
+ ///
+ private void ShowSettingWindow()
+ {
+ // 設定ウィンドウをモーダルで表示する
+ SelectedPort.ShowSettingWindow(true);
+ //SettingWindow settingWindow = new SettingWindow(viewModel);
+ //settingWindow.ShowDialog();
+ }
+
+ ///
+ /// ポート設定を削除
+ ///
+ private void ClearSelectedItem()
+ {
+ if (SelectedPort != null)
+ {
+ SelectedPort.Dispose();
+ PortViewModels.Remove(SelectedPort);
+ SelectedPort = null;
+ RaisePropertyChanged(nameof(SelectedPort));
+ }
+ }
+
+ #endregion
+
+ #region Class
+
+ ///
+ /// 設定ボタンのコマンド
+ ///
+ internal class SettingButtonCommand: ICommand
+ {
+ #region Constructor
+
+ public SettingButtonCommand()
+ {
+ }
+
+ #endregion
+
+ #region Event Handler
+
+ ///
+ public event EventHandler CanExecuteChanged;
+
+ #endregion
+
+ #region Method
+
+ ///
+ public bool CanExecute(object parameter)
+ {
+ // 常に実行可能
+ return true;
+ }
+
+ ///
+ public void Execute(object parameter)
+ {
+ // 設定ウィンドウをモーダルで表示する
+ if (parameter is PortViewModel viewModel)
+ {
+ if (viewModel == null)
+ {
+ viewModel = new PortViewModel();
+ }
+ viewModel.ShowSettingWindow(true);
+ //SettingWindow settingWindow = new SettingWindow(viewModel);
+ //settingWindow.ShowDialog();
+ }
+ }
+
+ #endregion
+ }
+
+ #endregion
+
+ #region Interface Implementation
+
+ ///
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ ///
+ /// View に値の変更を通知
+ ///
+ /// 呼び出し元のプロパティ名(自動取得)
+ protected void RaisePropertyChanged([CallerMemberName] string propertyName = "")
+ {
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
+ }
+
+ #endregion
+ }
+}
diff --git a/CommEx/Serial/ViewModels/PortViewModel.cs b/CommEx/Serial/ViewModels/PortViewModel.cs
index a04228a..0fcbb5e 100644
--- a/CommEx/Serial/ViewModels/PortViewModel.cs
+++ b/CommEx/Serial/ViewModels/PortViewModel.cs
@@ -19,6 +19,7 @@
using CommEx.Serial.Common;
using System.Xml.Serialization;
using CommEx.Serial.Bids;
+using CommEx.Serial.Views;
namespace CommEx.Serial.ViewModels
{
@@ -269,6 +270,25 @@ public bool IsAutoConnent
}
}
+ ///
+ /// ボタン用テキスト
+ ///
+ [XmlIgnore]
+ public string OperationString
+ {
+ get
+ {
+ if (IsOpen)
+ {
+ return "Close";
+ }
+ else
+ {
+ return "Open";
+ }
+ }
+ }
+
///
/// 使用可能なポートの選択肢リスト
///
@@ -439,6 +459,40 @@ public PortViewModel(ISerialControl serialControls)
//UpdatePorts();
}
+ ///
+ /// 設定ウィンドウを表示
+ ///
+ /// モーダルとして表示するかどうか
+ /// モーダルとして開いたウィンドウが閉じられたか否か
+ public bool? ShowSettingWindow(bool isModal = false)
+ {
+ SettingWindow settingWindow = new SettingWindow(this);
+ if (isModal)
+ {
+ return settingWindow.ShowDialog();
+ }
+ else
+ {
+ settingWindow.Show();
+ }
+ return null;
+ }
+
+ ///
+ /// リソースの解放
+ ///
+ public void Dispose()
+ {
+ if (port != null)
+ {
+ if (port.IsOpen)
+ {
+ port.Close();
+ }
+ port.Dispose();
+ }
+ }
+
///
/// ポートの開閉が可能か否か判定
///
diff --git a/CommEx/Serial/Views/ListWindow.xaml b/CommEx/Serial/Views/ListWindow.xaml
new file mode 100644
index 0000000..a134fb0
--- /dev/null
+++ b/CommEx/Serial/Views/ListWindow.xaml
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/CommEx/Serial/Views/ListWindow.xaml.cs b/CommEx/Serial/Views/ListWindow.xaml.cs
new file mode 100644
index 0000000..14dd50c
--- /dev/null
+++ b/CommEx/Serial/Views/ListWindow.xaml.cs
@@ -0,0 +1,35 @@
+using CommEx.Serial.ViewModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Shapes;
+
+namespace CommEx.Serial.Views
+{
+ ///
+ /// ListWindow.xaml の相互作用ロジック
+ ///
+ public partial class ListWindow : Window
+ {
+ public ListWindow()
+ {
+ InitializeComponent();
+ DataContext = new ListViewModel();
+ }
+
+ public ListWindow(ListViewModel viewModel)
+ {
+ InitializeComponent();
+ DataContext = viewModel;
+ }
+ }
+}
From ff0af265a7fc7745a9eb82a5e8efa67b5a0f159a Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Mon, 20 Jan 2025 21:05:38 +0900
Subject: [PATCH 71/97] update setting window
---
CommEx/Serial/Views/SettingWindow.xaml | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/CommEx/Serial/Views/SettingWindow.xaml b/CommEx/Serial/Views/SettingWindow.xaml
index edcdb6e..ff62333 100644
--- a/CommEx/Serial/Views/SettingWindow.xaml
+++ b/CommEx/Serial/Views/SettingWindow.xaml
@@ -48,6 +48,7 @@
+
@@ -78,6 +79,16 @@
+
+
+
+
+
+
+
+
From 9a0e6c6e5d3cf45b1443b37cfff9f5a33240b0de Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Mon, 20 Jan 2025 21:20:25 +0900
Subject: [PATCH 72/97] change main window
---
CommEx/Serial/Main.cs | 33 +++++++++++++++++++--------------
1 file changed, 19 insertions(+), 14 deletions(-)
diff --git a/CommEx/Serial/Main.cs b/CommEx/Serial/Main.cs
index d5b9890..00be42b 100644
--- a/CommEx/Serial/Main.cs
+++ b/CommEx/Serial/Main.cs
@@ -73,14 +73,14 @@ internal class Serial : AssemblyPluginBase, ITogglableExtension, IExtension
private ToolStripMenuItem setting;
///
- /// 設定ウィンドウ
+ /// ウィンドウ
///
- private readonly SettingWindow window;
+ private readonly ListWindow window;
///
/// ビューモデル
///
- protected PortViewModel portViewModel;
+ protected ListViewModel viewModel;
#endregion
@@ -112,9 +112,10 @@ public Serial(PluginBuilder builder) : base(builder)
BveHacker.ScenarioCreated += OnScenarioCreated;
BveHacker.ScenarioClosed += ScenarioClosed;
- portViewModel = SaveSettings.Load();
+ //viewModel = SaveSettings.Load();
+ viewModel = new ListViewModel();
- window = new SettingWindow(portViewModel);
+ window = new ListWindow(viewModel);
window.Closing += WindowClosing;
#if DEBUG
window.Show();
@@ -122,7 +123,10 @@ public Serial(PluginBuilder builder) : base(builder)
window.Hide();
#endif
- portViewModel.CheckAutoConnect();
+ foreach (var item in viewModel.PortViewModels)
+ {
+ item.CheckAutoConnect();
+ }
}
#endregion
@@ -132,7 +136,7 @@ public Serial(PluginBuilder builder) : base(builder)
///
public override void Dispose()
{
- SaveSettings.Save(portViewModel);
+ //SaveSettings.Save(portViewModel);
Extensions.AllExtensionsLoaded -= AllExtensionsLoaded;
BveHacker.ScenarioCreated -= OnScenarioCreated;
@@ -193,7 +197,6 @@ private void ScenarioClosed(EventArgs e)
#endregion
-
#region Event Handlers
///
@@ -232,16 +235,18 @@ private void MenuItemCheckedChanged(object sender, EventArgs e)
}
///
- /// 設定ウィンドウの閉じるボタンのクリックイベントハンドラ
+ /// リストウィンドウの閉じるボタンのクリックイベントハンドラ
///
- /// SettingWindow
+ /// ListWindow
/// キャンセルできるイベントのデータ
private void WindowClosing(object sender, System.ComponentModel.CancelEventArgs e)
{
- e.Cancel = true;
- SettingWindow window = (SettingWindow)sender;
- window.Hide();
- setting.Checked = false;
+ if (sender is ListWindow window)
+ {
+ e.Cancel = true;
+ window.Hide();
+ setting.Checked = false;
+ }
}
#endregion
From ed02a34613aa0efbc90b961f768081901b9600f7 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Wed, 22 Jan 2025 02:20:11 +0900
Subject: [PATCH 73/97] update button status
---
CommEx/Serial/ViewModels/ListViewModel.cs | 17 +++++++++++++++++
CommEx/Serial/Views/ListWindow.xaml | 2 ++
2 files changed, 19 insertions(+)
diff --git a/CommEx/Serial/ViewModels/ListViewModel.cs b/CommEx/Serial/ViewModels/ListViewModel.cs
index 6fdea93..814d605 100644
--- a/CommEx/Serial/ViewModels/ListViewModel.cs
+++ b/CommEx/Serial/ViewModels/ListViewModel.cs
@@ -64,9 +64,17 @@ public PortViewModel SelectedPort
{
selectedPort = value;
RaisePropertyChanged();
+ RaisePropertyChanged("IsButtonAvailable");
+ UpdateCommands();
}
}
+ ///
+ /// ボタンが利用可能か
+ ///
+ [XmlIgnore]
+ public bool IsButtonAvailable => SelectedPort != null;
+
///
/// 追加コマンド
///
@@ -131,6 +139,15 @@ public ListViewModel(Collection viewModels)
DeleteItemCommand = new RelayCommand(ClearSelectedItem, IsSelectedItemNotNull);
}
+ ///
+ /// コマンドの実行可否を更新
+ ///
+ private void UpdateCommands()
+ {
+ (SettingCommand as RelayCommand).RaiseCanExecuteChanged();
+ (DeleteItemCommand as RelayCommand).RaiseCanExecuteChanged();
+ }
+
///
/// 選択された内容がnullか判定
///
diff --git a/CommEx/Serial/Views/ListWindow.xaml b/CommEx/Serial/Views/ListWindow.xaml
index a134fb0..03ee56d 100644
--- a/CommEx/Serial/Views/ListWindow.xaml
+++ b/CommEx/Serial/Views/ListWindow.xaml
@@ -32,6 +32,7 @@
VerticalAlignment="Top"
Command="{Binding SettingCommand}"
CommandParameter="{Binding ElementName=PortDataGrid, Path=SelectedItem}"
+ IsEnabled="{Binding IsButtonAvailable}"
Content="Setting" />
@@ -43,6 +44,7 @@
VerticalAlignment="Top"
Command="{Binding DeleteItemCommand}"
CommandParameter="{Binding ElementName=PortDataGrid, Path=SelectedItem}"
+ IsEnabled="{Binding IsButtonAvailable}"
Content="Delete" />
From f5fe6b2225dd51dfac238ed86616ecd742397d77 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Wed, 22 Jan 2025 02:21:26 +0900
Subject: [PATCH 74/97] clean code
---
CommEx/Serial/ViewModels/ListViewModel.cs | 62 +++--------------------
1 file changed, 7 insertions(+), 55 deletions(-)
diff --git a/CommEx/Serial/ViewModels/ListViewModel.cs b/CommEx/Serial/ViewModels/ListViewModel.cs
index 814d605..c315acb 100644
--- a/CommEx/Serial/ViewModels/ListViewModel.cs
+++ b/CommEx/Serial/ViewModels/ListViewModel.cs
@@ -157,7 +157,13 @@ private void UpdateCommands()
///
/// ポート設定を追加
///
- private void AddItem() => portViewModels.Add(new PortViewModel());
+ private void AddItem()
+ {
+ var index = portViewModels.IndexOf(SelectedPort);
+ portViewModels.Add(new PortViewModel());
+ if (index < 0) index = portViewModels.Count - 1;
+ selectedPort = portViewModels.ElementAt(index);
+ }
///
/// 設定ウィンドウを表示
@@ -166,8 +172,6 @@ private void ShowSettingWindow()
{
// 設定ウィンドウをモーダルで表示する
SelectedPort.ShowSettingWindow(true);
- //SettingWindow settingWindow = new SettingWindow(viewModel);
- //settingWindow.ShowDialog();
}
///
@@ -186,58 +190,6 @@ private void ClearSelectedItem()
#endregion
- #region Class
-
- ///
- /// 設定ボタンのコマンド
- ///
- internal class SettingButtonCommand: ICommand
- {
- #region Constructor
-
- public SettingButtonCommand()
- {
- }
-
- #endregion
-
- #region Event Handler
-
- ///
- public event EventHandler CanExecuteChanged;
-
- #endregion
-
- #region Method
-
- ///
- public bool CanExecute(object parameter)
- {
- // 常に実行可能
- return true;
- }
-
- ///
- public void Execute(object parameter)
- {
- // 設定ウィンドウをモーダルで表示する
- if (parameter is PortViewModel viewModel)
- {
- if (viewModel == null)
- {
- viewModel = new PortViewModel();
- }
- viewModel.ShowSettingWindow(true);
- //SettingWindow settingWindow = new SettingWindow(viewModel);
- //settingWindow.ShowDialog();
- }
- }
-
- #endregion
- }
-
- #endregion
-
#region Interface Implementation
///
From ece5031bb74d8ad2ae3162d0b59fc9563b785a15 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Wed, 22 Jan 2025 02:21:47 +0900
Subject: [PATCH 75/97] fix code
---
CommEx/Serial/ViewModels/PortViewModel.cs | 2 ++
1 file changed, 2 insertions(+)
diff --git a/CommEx/Serial/ViewModels/PortViewModel.cs b/CommEx/Serial/ViewModels/PortViewModel.cs
index 0fcbb5e..59fccdc 100644
--- a/CommEx/Serial/ViewModels/PortViewModel.cs
+++ b/CommEx/Serial/ViewModels/PortViewModel.cs
@@ -273,6 +273,7 @@ public bool IsAutoConnent
///
/// ボタン用テキスト
///
+ [DefaultValue("Open")]
[XmlIgnore]
public string OperationString
{
@@ -564,6 +565,7 @@ private void OpenClosePort()
}
RaisePropertyChanged("IsOpen");
RaisePropertyChanged("IsClosed");
+ RaisePropertyChanged("OperationString");
}
#endregion
From e5040747541d9afbb9bbff8833b2e2bc06c93bc4 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Wed, 22 Jan 2025 02:22:39 +0900
Subject: [PATCH 76/97] fix command binding
---
CommEx/Serial/Views/ListWindow.xaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/CommEx/Serial/Views/ListWindow.xaml b/CommEx/Serial/Views/ListWindow.xaml
index 03ee56d..a180966 100644
--- a/CommEx/Serial/Views/ListWindow.xaml
+++ b/CommEx/Serial/Views/ListWindow.xaml
@@ -61,7 +61,7 @@
-
+
From d17ebcdc11eba30f4c51bd503a3b6a3c21843b92 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Wed, 22 Jan 2025 02:34:32 +0900
Subject: [PATCH 77/97] add message display
---
CommEx/Serial/ViewModels/PortViewModel.cs | 43 +++++++++++++++++++++++
CommEx/Serial/Views/SettingWindow.xaml | 2 +-
2 files changed, 44 insertions(+), 1 deletion(-)
diff --git a/CommEx/Serial/ViewModels/PortViewModel.cs b/CommEx/Serial/ViewModels/PortViewModel.cs
index 59fccdc..be28f52 100644
--- a/CommEx/Serial/ViewModels/PortViewModel.cs
+++ b/CommEx/Serial/ViewModels/PortViewModel.cs
@@ -44,6 +44,11 @@ public class PortViewModel : INotifyPropertyChanged
///
private bool isAutoConnent;
+ ///
+ /// 表示用テキスト
+ ///
+ private string message = "";
+
#endregion
#region Properties
@@ -270,6 +275,17 @@ public bool IsAutoConnent
}
}
+ ///
+ /// 表示用テキスト
+ ///
+ [DefaultValue("")]
+ [XmlIgnore]
+ public string Message
+ {
+ get { return message; }
+ set { message = value; }
+ }
+
///
/// ボタン用テキスト
///
@@ -524,26 +540,40 @@ private void OpenClosePort()
{
control.PortOpen(port);
port.Open();
+
+ if (IsOpen)
+ {
+ message = "Port: Open";
+ }
+ else
+ {
+ message = "Port: Close";
+ }
}
catch (UnauthorizedAccessException ex)
{
ErrorDialog.Show(new ErrorDialogInfo("ポートが既に使われています。", ex.Source, ex.Message));
+ Message = "ポートが既に使われています。";
}
catch (ArgumentOutOfRangeException ex)
{
ErrorDialog.Show(new ErrorDialogInfo("ポートの設定が無効です。", ex.Source, ex.Message));
+ Message = "ポートの設定が無効です。";
}
catch (ArgumentException ex)
{
ErrorDialog.Show(new ErrorDialogInfo("このポートはサポートされていません。", ex.Source, ex.Message));
+ Message = "このポートはサポートされていません。";
}
catch (IOException ex)
{
ErrorDialog.Show(new ErrorDialogInfo("ポートが無効状態です。", ex.Source, ex.Message));
+ Message = "ポートが無効状態です。";
}
catch (Exception ex)
{
ErrorDialog.Show(new ErrorDialogInfo("ポートのオープンに失敗しました。", ex.Source, ex.Message));
+ Message = "ポートのオープンに失敗しました。";
}
}
else
@@ -553,19 +583,32 @@ private void OpenClosePort()
{
port.Close();
control.PortClose(port);
+
+ if (IsOpen)
+ {
+ message = "Port: Open";
+ }
+ else
+ {
+ message = "Port: Close";
+ }
}
catch (IOException ex)
{
ErrorDialog.Show(new ErrorDialogInfo("ポートが無効状態です。", ex.Source, ex.Message));
+ Message = "ポートが無効状態です。";
}
catch (Exception ex)
{
ErrorDialog.Show(new ErrorDialogInfo("ポートを閉じたときにエラーが発生しました。", ex.Source, ex.Message));
+ Message = "ポートを閉じたときにエラーが発生しました。";
}
}
+
RaisePropertyChanged("IsOpen");
RaisePropertyChanged("IsClosed");
RaisePropertyChanged("OperationString");
+ RaisePropertyChanged("Message");
}
#endregion
diff --git a/CommEx/Serial/Views/SettingWindow.xaml b/CommEx/Serial/Views/SettingWindow.xaml
index ff62333..27dfb1f 100644
--- a/CommEx/Serial/Views/SettingWindow.xaml
+++ b/CommEx/Serial/Views/SettingWindow.xaml
@@ -100,7 +100,7 @@
-
+
From 8d91016678c57fb8d7974ea7346cde4bfb5eefdf Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Wed, 22 Jan 2025 03:02:59 +0900
Subject: [PATCH 78/97] clean files
---
CommEx/Serial/Common/BoolToColorConverter.cs | 48 +++++++++++++
CommEx/Serial/ViewModels/BaseViewModel.cs | 56 +++++++++++++++
CommEx/Serial/ViewModels/ListViewModel.cs | 18 +----
CommEx/Serial/ViewModels/PortViewModel.cs | 72 +-------------------
CommEx/Serial/Views/ListWindow.xaml | 3 +-
CommEx/Serial/Views/SettingWindow.xaml | 3 +-
6 files changed, 110 insertions(+), 90 deletions(-)
create mode 100644 CommEx/Serial/Common/BoolToColorConverter.cs
create mode 100644 CommEx/Serial/ViewModels/BaseViewModel.cs
diff --git a/CommEx/Serial/Common/BoolToColorConverter.cs b/CommEx/Serial/Common/BoolToColorConverter.cs
new file mode 100644
index 0000000..202c9d2
--- /dev/null
+++ b/CommEx/Serial/Common/BoolToColorConverter.cs
@@ -0,0 +1,48 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Data;
+using System.Windows.Media;
+
+namespace CommEx.Serial.Common
+{
+ ///
+ /// bool 型を Color に変換するコンバータ
+ ///
+ public class BoolToColorConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ if (value is bool isOpen)
+ {
+ return isOpen ? Brushes.Green : Brushes.Red;
+ }
+
+ return Brushes.Gray; // デフォルト色
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ if (value is Brush brush)
+ {
+ if (brush == Brushes.Green)
+ {
+ return true;
+ }
+ else if (brush == Brushes.Red)
+ {
+ return false;
+ }
+ else if (brush == Brushes.Gray)
+ {
+ return false;
+ }
+ }
+
+ throw new InvalidOperationException("Unsupported conversion");
+ }
+ }
+}
diff --git a/CommEx/Serial/ViewModels/BaseViewModel.cs b/CommEx/Serial/ViewModels/BaseViewModel.cs
new file mode 100644
index 0000000..43b60cb
--- /dev/null
+++ b/CommEx/Serial/ViewModels/BaseViewModel.cs
@@ -0,0 +1,56 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Runtime.CompilerServices;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Input;
+
+namespace CommEx.Serial.ViewModels
+{
+ ///
+ /// ViewModel の基底クラス
+ ///
+ public abstract class BaseViewModel : INotifyPropertyChanged
+ {
+ #region Interface Implementation
+
+ ///
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ ///
+ /// View に値の変更を通知
+ ///
+ /// 呼び出し元のプロパティ名(自動取得)
+ protected void RaisePropertyChanged([CallerMemberName] string propertyName = "")
+ {
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
+ }
+
+ #endregion
+ }
+
+ ///
+ /// コマンドのリレー用クラス
+ ///
+ public class RelayCommand : ICommand
+ {
+ private readonly Action _execute;
+ private readonly Func _canExecute;
+
+ public RelayCommand(Action execute, Func canExecute = null)
+ {
+ _execute = execute;
+ _canExecute = canExecute;
+ }
+
+ public event EventHandler CanExecuteChanged;
+
+ public bool CanExecute(object parameter) => _canExecute == null || _canExecute();
+
+ public void Execute(object parameter) => _execute();
+
+ public void RaiseCanExecuteChanged() => CanExecuteChanged?.Invoke(this, EventArgs.Empty);
+ }
+}
diff --git a/CommEx/Serial/ViewModels/ListViewModel.cs b/CommEx/Serial/ViewModels/ListViewModel.cs
index c315acb..c871f49 100644
--- a/CommEx/Serial/ViewModels/ListViewModel.cs
+++ b/CommEx/Serial/ViewModels/ListViewModel.cs
@@ -20,7 +20,7 @@
namespace CommEx.Serial.ViewModels
{
[XmlRoot("Settings")]
- public class ListViewModel: INotifyPropertyChanged
+ public class ListViewModel: BaseViewModel
{
#region Fields
@@ -189,21 +189,5 @@ private void ClearSelectedItem()
}
#endregion
-
- #region Interface Implementation
-
- ///
- public event PropertyChangedEventHandler PropertyChanged;
-
- ///
- /// View に値の変更を通知
- ///
- /// 呼び出し元のプロパティ名(自動取得)
- protected void RaisePropertyChanged([CallerMemberName] string propertyName = "")
- {
- PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
- }
-
- #endregion
}
}
diff --git a/CommEx/Serial/ViewModels/PortViewModel.cs b/CommEx/Serial/ViewModels/PortViewModel.cs
index be28f52..0e827f1 100644
--- a/CommEx/Serial/ViewModels/PortViewModel.cs
+++ b/CommEx/Serial/ViewModels/PortViewModel.cs
@@ -25,7 +25,7 @@ namespace CommEx.Serial.ViewModels
{
[Serializable]
[XmlRoot("Port")]
- public class PortViewModel : INotifyPropertyChanged
+ public class PortViewModel : BaseViewModel
{
#region Fields
@@ -612,75 +612,5 @@ private void OpenClosePort()
}
#endregion
-
- #region Interface Implementation
-
- ///
- public event PropertyChangedEventHandler PropertyChanged;
-
- ///
- /// View に値の変更を通知
- ///
- /// 呼び出し元のプロパティ名(自動取得)
- protected void RaisePropertyChanged([CallerMemberName] string propertyName = "")
- {
- PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
- }
-
- #endregion
- }
-
- public class RelayCommand : ICommand
- {
- private readonly Action _execute;
- private readonly Func _canExecute;
-
- public RelayCommand(Action execute, Func canExecute = null)
- {
- _execute = execute;
- _canExecute = canExecute;
- }
-
- public event EventHandler CanExecuteChanged;
-
- public bool CanExecute(object parameter) => _canExecute == null || _canExecute();
-
- public void Execute(object parameter) => _execute();
-
- public void RaiseCanExecuteChanged() => CanExecuteChanged?.Invoke(this, EventArgs.Empty);
- }
-
- public class BoolToColorConverter : IValueConverter
- {
- public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
- {
- if (value is bool isOpen)
- {
- return isOpen ? Brushes.Green : Brushes.Red;
- }
-
- return Brushes.Gray; // デフォルト色
- }
-
- public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
- {
- if (value is Brush brush)
- {
- if (brush == Brushes.Green)
- {
- return true;
- }
- else if (brush == Brushes.Red)
- {
- return false;
- }
- else if (brush == Brushes.Gray)
- {
- return false;
- }
- }
-
- throw new InvalidOperationException("Unsupported conversion");
- }
}
}
diff --git a/CommEx/Serial/Views/ListWindow.xaml b/CommEx/Serial/Views/ListWindow.xaml
index a180966..db4a837 100644
--- a/CommEx/Serial/Views/ListWindow.xaml
+++ b/CommEx/Serial/Views/ListWindow.xaml
@@ -4,11 +4,12 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="clr-namespace:CommEx.Serial.ViewModels"
+ xmlns:com="clr-namespace:CommEx.Serial.Common"
d:DataContext="{d:DesignInstance Type=vm:ListViewModel, IsDesignTimeCreatable=True}"
mc:Ignorable="d"
Title="ListWindow" Height="450" Width="800">
-
+
diff --git a/CommEx/Serial/Views/SettingWindow.xaml b/CommEx/Serial/Views/SettingWindow.xaml
index 27dfb1f..a8c63d4 100644
--- a/CommEx/Serial/Views/SettingWindow.xaml
+++ b/CommEx/Serial/Views/SettingWindow.xaml
@@ -4,11 +4,12 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="clr-namespace:CommEx.Serial.ViewModels"
+ xmlns:com="clr-namespace:CommEx.Serial.Common"
d:DataContext="{d:DesignInstance Type=vm:PortViewModel, IsDesignTimeCreatable=True}"
mc:Ignorable="d"
Title="Serial Port Settings" Height="400" Width="600">
-
+
From b17533a7be0bfbffdaa184d7f68aed23906526df Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Wed, 22 Jan 2025 03:03:34 +0900
Subject: [PATCH 79/97] add static / clean
---
CommEx/Serial/ViewModels/PortViewModel.cs | 17 +++++++++--------
1 file changed, 9 insertions(+), 8 deletions(-)
diff --git a/CommEx/Serial/ViewModels/PortViewModel.cs b/CommEx/Serial/ViewModels/PortViewModel.cs
index 0e827f1..260cc46 100644
--- a/CommEx/Serial/ViewModels/PortViewModel.cs
+++ b/CommEx/Serial/ViewModels/PortViewModel.cs
@@ -310,43 +310,43 @@ public string OperationString
/// 使用可能なポートの選択肢リスト
///
[XmlIgnore]
- public ObservableCollection AvailablePorts { get; } = new ObservableCollection();
+ public static ObservableCollection AvailablePorts { get; } = new ObservableCollection();
///
/// ボーレートの選択肢リスト
///
[XmlIgnore]
- public ObservableCollection BaudRates { get; } = new ObservableCollection { 9600, 19200, 38400, 57600, 115200 };
+ public static ObservableCollection BaudRates { get; } = new ObservableCollection { 9600, 19200, 38400, 57600, 115200 };
///
/// データビットの選択肢リスト
///
[XmlIgnore]
- public ObservableCollection DataBitsOptions { get; } = new ObservableCollection { 5, 6, 7, 8 };
+ public static ObservableCollection DataBitsOptions { get; } = new ObservableCollection { 5, 6, 7, 8 };
///
/// ストップビットの選択肢リスト
///
[XmlIgnore]
- public ObservableCollection StopBitsOptions { get; } = new ObservableCollection { StopBits.One, StopBits.OnePointFive, StopBits.Two };
+ public static ObservableCollection StopBitsOptions { get; } = new ObservableCollection { StopBits.One, StopBits.OnePointFive, StopBits.Two };
///
/// パリティの選択肢リスト
///
[XmlIgnore]
- public ObservableCollection ParityOptions { get; } = new ObservableCollection(Enum.GetValues(typeof(Parity)) as Parity[]);
+ public static ObservableCollection ParityOptions { get; } = new ObservableCollection(Enum.GetValues(typeof(Parity)) as Parity[]);
///
/// フロー制御の選択肢リスト
///
[XmlIgnore]
- public ObservableCollection HandshakeOptions { get; } = new ObservableCollection(Enum.GetValues(typeof(Handshake)) as Handshake[]);
+ public static ObservableCollection HandshakeOptions { get; } = new ObservableCollection(Enum.GetValues(typeof(Handshake)) as Handshake[]);
///
/// 改行文字の選択肢リスト
///
[XmlIgnore]
- public ObservableCollection NewLineOptions { get; } = new ObservableCollection(Enum.GetValues(typeof(NewLines)) as NewLines[]);
+ public static ObservableCollection NewLineOptions { get; } = new ObservableCollection(Enum.GetValues(typeof(NewLines)) as NewLines[]);
///
/// ポートリストのアップデートコマンド
@@ -519,7 +519,7 @@ public void Dispose()
///
/// ポートリストのアップデート
///
- private void UpdatePorts()
+ private static void UpdatePorts()
{
AvailablePorts.Clear();
foreach (var port in SerialPort.GetPortNames())
@@ -605,6 +605,7 @@ private void OpenClosePort()
}
}
+ // プロパティの変更通知
RaisePropertyChanged("IsOpen");
RaisePropertyChanged("IsClosed");
RaisePropertyChanged("OperationString");
From 6112f2d404186d460ad1209ee1c4db0ebaa297b3 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Fri, 24 Jan 2025 16:37:35 +0900
Subject: [PATCH 80/97] update view
hoge-panel to grid
---
CommEx/Serial/Views/ListWindow.xaml | 59 ++++++++++++++++-------------
1 file changed, 33 insertions(+), 26 deletions(-)
diff --git a/CommEx/Serial/Views/ListWindow.xaml b/CommEx/Serial/Views/ListWindow.xaml
index db4a837..0dd760b 100644
--- a/CommEx/Serial/Views/ListWindow.xaml
+++ b/CommEx/Serial/Views/ListWindow.xaml
@@ -12,44 +12,51 @@
-
-
-
-
-
-
-
+
From 9037749d07656cc64bc0047d386e5f4a13e25783 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Sat, 25 Jan 2025 14:20:12 +0900
Subject: [PATCH 81/97] update save settings
---
CommEx/Serial/Common/SaveSettings.cs | 26 +++++++++++++++-----------
CommEx/Serial/Main.cs | 12 +++++-------
2 files changed, 20 insertions(+), 18 deletions(-)
diff --git a/CommEx/Serial/Common/SaveSettings.cs b/CommEx/Serial/Common/SaveSettings.cs
index 1be04a8..c941486 100644
--- a/CommEx/Serial/Common/SaveSettings.cs
+++ b/CommEx/Serial/Common/SaveSettings.cs
@@ -13,6 +13,8 @@ namespace CommEx.Serial.Common
{
class SaveSettings
{
+ #region Static Methods
+
///
/// 保存先のファイルパスを動的に取得
/// このdllのファイルパス - ".dll" + ".Settings.xml"
@@ -28,10 +30,10 @@ private static string GetSettingsFilePath()
}
///
- /// のプロパティをXMLファイルに保存
+ /// のプロパティをXMLファイルに保存
///
- /// 保存する インスタンス
- public static void Save(PortViewModel viewModel)
+ /// 保存する インスタンス
+ public static void Save(ListViewModel viewModel)
{
try
{
@@ -39,7 +41,7 @@ public static void Save(PortViewModel viewModel)
using (var writer = new StreamWriter(filePath))
{
- var serializer = new XmlSerializer(typeof(PortViewModel));
+ var serializer = new XmlSerializer(typeof(ListViewModel));
serializer.Serialize(writer, viewModel);
}
}
@@ -50,29 +52,31 @@ public static void Save(PortViewModel viewModel)
}
///
- /// XMLファイルから のプロパティを読み込み
+ /// XMLファイルから のプロパティを読み込み
///
- /// 読み込まれた インスタンス
- public static PortViewModel Load()
+ /// 読み込まれた インスタンス
+ public static ListViewModel Load()
{
try
{
string filePath = GetSettingsFilePath();
- if (!File.Exists(filePath)) return new PortViewModel();
+ if (!File.Exists(filePath)) return new ListViewModel();
using (var reader = new StreamReader(filePath))
{
- var serializer = new XmlSerializer(typeof(PortViewModel));
- var serializableObject = (PortViewModel)serializer.Deserialize(reader);
+ var serializer = new XmlSerializer(typeof(ListViewModel));
+ var serializableObject = (ListViewModel)serializer.Deserialize(reader);
return serializableObject;
}
}
catch (Exception ex)
{
Debug.Print($"Error loading settings: {ex.Message}");
- return new PortViewModel();
+ return new ListViewModel();
}
}
+
+ #endregion
}
}
diff --git a/CommEx/Serial/Main.cs b/CommEx/Serial/Main.cs
index 00be42b..6672f8a 100644
--- a/CommEx/Serial/Main.cs
+++ b/CommEx/Serial/Main.cs
@@ -112,16 +112,12 @@ public Serial(PluginBuilder builder) : base(builder)
BveHacker.ScenarioCreated += OnScenarioCreated;
BveHacker.ScenarioClosed += ScenarioClosed;
- //viewModel = SaveSettings.Load();
- viewModel = new ListViewModel();
+ viewModel = SaveSettings.Load();
+ //viewModel = new ListViewModel();
window = new ListWindow(viewModel);
window.Closing += WindowClosing;
-#if DEBUG
- window.Show();
-#else
window.Hide();
-#endif
foreach (var item in viewModel.PortViewModels)
{
@@ -136,7 +132,7 @@ public Serial(PluginBuilder builder) : base(builder)
///
public override void Dispose()
{
- //SaveSettings.Save(portViewModel);
+ SaveSettings.Save(viewModel);
Extensions.AllExtensionsLoaded -= AllExtensionsLoaded;
BveHacker.ScenarioCreated -= OnScenarioCreated;
@@ -171,6 +167,8 @@ private void AllExtensionsLoaded(object sender, EventArgs e)
#if DEBUG
setting.Checked = true;
+#else
+ setting.Checked = false;
#endif
BidsSerial.UpdateInfos(bveHacker, native);
From a5e71a2333f051aa07190d636e750368a419d0b0 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Sat, 25 Jan 2025 14:22:06 +0900
Subject: [PATCH 82/97] update save config
---
CommEx/Serial/ViewModels/ListViewModel.cs | 2 +-
CommEx/Serial/ViewModels/PortViewModel.cs | 20 ++++++++++----------
2 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/CommEx/Serial/ViewModels/ListViewModel.cs b/CommEx/Serial/ViewModels/ListViewModel.cs
index c871f49..e880c39 100644
--- a/CommEx/Serial/ViewModels/ListViewModel.cs
+++ b/CommEx/Serial/ViewModels/ListViewModel.cs
@@ -41,7 +41,7 @@ public class ListViewModel: BaseViewModel
///
/// 子要素の ViewModel
///
- [XmlArray("Port Settings")]
+ [XmlArray("PortSettings")]
[XmlArrayItem("Port")]
public ObservableCollection PortViewModels
{
diff --git a/CommEx/Serial/ViewModels/PortViewModel.cs b/CommEx/Serial/ViewModels/PortViewModel.cs
index 260cc46..f9b0b98 100644
--- a/CommEx/Serial/ViewModels/PortViewModel.cs
+++ b/CommEx/Serial/ViewModels/PortViewModel.cs
@@ -57,7 +57,7 @@ public class PortViewModel : BaseViewModel
/// ボーレート[Baud]
///
[Browsable(true)]
- [DefaultValue(9600)]
+ //[DefaultValue(9600)]
[MonitoringDescription("BaudRate")]
[XmlElement("BaudRate")]
public int BaudRate
@@ -77,7 +77,7 @@ public int BaudRate
/// データビット[bit]
///
[Browsable(true)]
- [DefaultValue(8)]
+ //[DefaultValue(8)]
[MonitoringDescription("DataBits")]
[XmlElement("DataBits")]
public int DataBits
@@ -97,7 +97,7 @@ public int DataBits
/// DTR 有効/無効
///
[Browsable(true)]
- [DefaultValue(false)]
+ //[DefaultValue(false)]
[MonitoringDescription("DtrEnable")]
[XmlElement("DtrEnable")]
public bool DtrEnable
@@ -137,7 +137,7 @@ public Encoding Encoding
/// フロー制御
///
[Browsable(true)]
- [DefaultValue(Handshake.None)]
+ //[DefaultValue(Handshake.None)]
[MonitoringDescription("Handshake")]
[XmlElement("Handshake")]
public Handshake Handshake
@@ -157,7 +157,7 @@ public Handshake Handshake
/// ポートの状態
///
[Browsable(true)]
- [DefaultValue(false)]
+ //[DefaultValue(false)]
[MonitoringDescription("IsOpen")]
[XmlIgnore]
public bool IsOpen
@@ -179,7 +179,7 @@ public bool IsOpen
/// 改行文字
///
[Browsable(true)]
- [DefaultValue(NewLines.LF)]
+ //[DefaultValue(NewLines.LF)]
[MonitoringDescription("NewLine")]
[XmlElement("NewLine")]
public NewLines NewLine
@@ -199,7 +199,7 @@ public NewLines NewLine
/// パリティ
///
[Browsable(true)]
- [DefaultValue(Parity.None)]
+ //[DefaultValue(Parity.None)]
[MonitoringDescription("Parity")]
[XmlElement("Parity")]
public Parity Parity
@@ -219,7 +219,7 @@ public Parity Parity
/// ポート名
///
[Browsable(true)]
- [DefaultValue("COM1")]
+ //[DefaultValue("COM1")]
[MonitoringDescription("PortName")]
[XmlAttribute("PortName")]
public string PortName
@@ -239,7 +239,7 @@ public string PortName
/// ストップビット[bit]
///
[Browsable(true)]
- [DefaultValue(StopBits.One)]
+ //[DefaultValue(StopBits.One)]
[MonitoringDescription("StopBits")]
[XmlElement("StopBits")]
public StopBits StopBits
@@ -259,7 +259,7 @@ public StopBits StopBits
/// 自動接続設定
///
[Browsable(true)]
- [DefaultValue(false)]
+ //[DefaultValue(false)]
[MonitoringDescription("IsAutoConnent")]
[XmlElement("IsAutoConnent")]
public bool IsAutoConnent
From bd05947a654c6a4eafc577e10a9f2c3d1ce0d3f0 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Sat, 25 Jan 2025 14:30:29 +0900
Subject: [PATCH 83/97] fix auto connect
---
CommEx/Serial/ViewModels/PortViewModel.cs | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/CommEx/Serial/ViewModels/PortViewModel.cs b/CommEx/Serial/ViewModels/PortViewModel.cs
index f9b0b98..be6b17e 100644
--- a/CommEx/Serial/ViewModels/PortViewModel.cs
+++ b/CommEx/Serial/ViewModels/PortViewModel.cs
@@ -394,12 +394,17 @@ private void Initialize(SerialPort serialPort = null, ISerialControl serialContr
///
public void CheckAutoConnect()
{
- if (isAutoConnent || IsClosed)
+ if (isAutoConnent && IsClosed)
{
if (AvailablePorts.Contains(PortName))
{
OpenClosePort();
}
+ else
+ {
+ ErrorDialog.Show(new ErrorDialogInfo("自動接続対象のポートが存在しません。", null, $"ポート {PortName} が見つかりません。"));
+ Message = "ポートが見つかりません。";
+ }
}
}
From d4dac7112d43e45ee01b847a8cde77dbabb1d100 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Sat, 25 Jan 2025 17:36:40 +0900
Subject: [PATCH 84/97] fix error message
---
CommEx/Serial/ViewModels/PortViewModel.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/CommEx/Serial/ViewModels/PortViewModel.cs b/CommEx/Serial/ViewModels/PortViewModel.cs
index be6b17e..6c663fb 100644
--- a/CommEx/Serial/ViewModels/PortViewModel.cs
+++ b/CommEx/Serial/ViewModels/PortViewModel.cs
@@ -577,8 +577,8 @@ private void OpenClosePort()
}
catch (Exception ex)
{
- ErrorDialog.Show(new ErrorDialogInfo("ポートのオープンに失敗しました。", ex.Source, ex.Message));
- Message = "ポートのオープンに失敗しました。";
+ ErrorDialog.Show(new ErrorDialogInfo("ポートを開いたときにエラーが発生しました。", ex.Source, ex.Message));
+ Message = "ポートを開いたときにエラーが発生しました。";
}
}
else
From 831818e2d44e32ea6e350f87f0db6008526ae5ed Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Sat, 25 Jan 2025 17:38:14 +0900
Subject: [PATCH 85/97] fix default constructor
---
CommEx/Serial/ViewModels/ListViewModel.cs | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/CommEx/Serial/ViewModels/ListViewModel.cs b/CommEx/Serial/ViewModels/ListViewModel.cs
index e880c39..eb95927 100644
--- a/CommEx/Serial/ViewModels/ListViewModel.cs
+++ b/CommEx/Serial/ViewModels/ListViewModel.cs
@@ -102,10 +102,7 @@ public PortViewModel SelectedPort
///
public ListViewModel()
{
- portViewModels = new ObservableCollection
- {
- new PortViewModel()
- };
+ portViewModels = new ObservableCollection();
AddItemCommand = new RelayCommand(AddItem);
SettingCommand = new RelayCommand(ShowSettingWindow, IsSelectedItemNotNull);
From 13f618c860ba9ca40fe703a147e1fb050de442b0 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Sat, 25 Jan 2025 18:23:00 +0900
Subject: [PATCH 86/97] delete asm ref
---
CommEx/CommEx.csproj | 3 ---
CommEx/Serial/Bids/Serial.cs | 4 ++--
ref/Mackoy.IInputDevice.DLL | 0
3 files changed, 2 insertions(+), 5 deletions(-)
delete mode 100644 ref/Mackoy.IInputDevice.DLL
diff --git a/CommEx/CommEx.csproj b/CommEx/CommEx.csproj
index e57ebce..45dae81 100644
--- a/CommEx/CommEx.csproj
+++ b/CommEx/CommEx.csproj
@@ -20,9 +20,6 @@
-
- ..\ref\Mackoy.IInputDevice.DLL
-
diff --git a/CommEx/Serial/Bids/Serial.cs b/CommEx/Serial/Bids/Serial.cs
index b3e8cdb..222f0d5 100644
--- a/CommEx/Serial/Bids/Serial.cs
+++ b/CommEx/Serial/Bids/Serial.cs
@@ -319,14 +319,14 @@ private string CreateResponse(string str)
case 'P': // Pless
if (num1 <= (int)AtsKeyName.L)
{
- hacker.InputManager.KeyDown_Invoke(InputEventArgsFactory.AtsKey((AtsKeyName)num1));
+ //hacker.InputManager.KeyDown_Invoke(InputEventArgsFactory.AtsKey((AtsKeyName)num1));
return response + 0.ToString();
}
return CreateError(Errors.ErrorInCodeNumber);
case 'R': // Release
if (num1 <= (int)AtsKeyName.L)
{
- hacker.InputManager.KeyUp_Invoke(InputEventArgsFactory.AtsKey((AtsKeyName)num1));
+ //hacker.InputManager.KeyUp_Invoke(InputEventArgsFactory.AtsKey((AtsKeyName)num1));
return response + 0.ToString();
}
return CreateError(Errors.ErrorInCodeNumber);
diff --git a/ref/Mackoy.IInputDevice.DLL b/ref/Mackoy.IInputDevice.DLL
deleted file mode 100644
index e69de29..0000000
From 04da371a52a14f99a08fee4c2b6c520f7646979f Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Sat, 25 Jan 2025 18:25:25 +0900
Subject: [PATCH 87/97] update project
---
CommEx/CommEx.csproj | 12 ------------
1 file changed, 12 deletions(-)
diff --git a/CommEx/CommEx.csproj b/CommEx/CommEx.csproj
index 45dae81..d7e2c69 100644
--- a/CommEx/CommEx.csproj
+++ b/CommEx/CommEx.csproj
@@ -26,16 +26,4 @@
-
-
-
- MSBuild:Compile
-
-
-
-
-
-
-
-
\ No newline at end of file
From 888df6ffb311a2c308e63540b522a49b0c6c4fb5 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Sat, 25 Jan 2025 20:44:25 +0900
Subject: [PATCH 88/97] add controller enum
---
CommEx/Serial/Common/EnumConverters.cs | 98 ++++++++++++++++++++++++
CommEx/Serial/Common/SerialController.cs | 23 ++++++
2 files changed, 121 insertions(+)
create mode 100644 CommEx/Serial/Common/EnumConverters.cs
create mode 100644 CommEx/Serial/Common/SerialController.cs
diff --git a/CommEx/Serial/Common/EnumConverters.cs b/CommEx/Serial/Common/EnumConverters.cs
new file mode 100644
index 0000000..0d40649
--- /dev/null
+++ b/CommEx/Serial/Common/EnumConverters.cs
@@ -0,0 +1,98 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Globalization;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CommEx.Serial.Common
+{
+ #region StringConverter
+
+ ///
+ ///
+ /// Enum の Value と Description を変換するコンバータ
+ ///
+ public class EnumToStringConverter : EnumConverter
+ {
+ public EnumToStringConverter(Type type) : base(type)
+ {
+ if (!type.IsEnum)
+ {
+ throw new ArgumentException("Type must be an Enum.");
+ }
+ }
+
+ public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
+ {
+ if (destinationType == typeof(string) && value != null)
+ {
+ return value.ToString();
+ }
+ return base.ConvertTo(context, culture, value, destinationType);
+ }
+
+ public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
+ {
+ if (value is string stringValue)
+ {
+ return Enum.Parse(EnumType, stringValue);
+ }
+ return base.ConvertFrom(context, culture, value);
+ }
+ }
+
+ #endregion
+
+ #region DescriptionConverter
+
+ ///
+ ///
+ /// Enum の Value と Description を変換するコンバータ
+ ///
+ public class EnumToDescriptionConverter : EnumConverter
+ {
+ public EnumToDescriptionConverter(Type type) : base(type)
+ {
+ if (!type.IsEnum)
+ {
+ throw new ArgumentException("Type must be an Enum.");
+ }
+ }
+
+ public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
+ {
+ if (destinationType == typeof(string) && value != null)
+ {
+ var fieldInfo = value.GetType().GetField(value.ToString());
+ var descriptionAttribute = fieldInfo?.GetCustomAttribute();
+ if (descriptionAttribute != null)
+ {
+ return descriptionAttribute.Description;
+ }
+ }
+ return base.ConvertTo(context, culture, value, destinationType);
+ }
+
+ public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
+ {
+ if (value is string stringValue)
+ {
+ foreach (var field in EnumType.GetFields(BindingFlags.Public | BindingFlags.Static))
+ {
+ var descriptionAttribute = field.GetCustomAttribute();
+ if (descriptionAttribute != null && descriptionAttribute.Description == stringValue)
+ {
+ return Enum.Parse(EnumType, field.Name);
+ }
+ }
+ }
+ return base.ConvertFrom(context, culture, value);
+ }
+ }
+
+ #endregion
+}
diff --git a/CommEx/Serial/Common/SerialController.cs b/CommEx/Serial/Common/SerialController.cs
new file mode 100644
index 0000000..1669c6f
--- /dev/null
+++ b/CommEx/Serial/Common/SerialController.cs
@@ -0,0 +1,23 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Globalization;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CommEx.Serial.Common
+{
+ ///
+ /// シリアル通信の制御方法
+ ///
+ [TypeConverter(typeof(EnumToDescriptionConverter))]
+ enum SerialController
+ {
+ [Description("Loopback")]
+ Loopback,
+ [Description("BIDS")]
+ Bids,
+ }
+}
From 3236c2528b8688fc73f3eb3219fc1b490ce07830 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Sat, 25 Jan 2025 20:58:17 +0900
Subject: [PATCH 89/97] fix converter
---
CommEx/Serial/Common/NewLines.cs | 98 +----------------------
CommEx/Serial/ViewModels/PortViewModel.cs | 6 +-
2 files changed, 5 insertions(+), 99 deletions(-)
diff --git a/CommEx/Serial/Common/NewLines.cs b/CommEx/Serial/Common/NewLines.cs
index b5293e1..0bb6ac4 100644
--- a/CommEx/Serial/Common/NewLines.cs
+++ b/CommEx/Serial/Common/NewLines.cs
@@ -10,12 +10,10 @@
namespace CommEx.Serial.Common
{
- #region Enum
-
///
/// 改行文字
///
- [TypeConverter(typeof(NewLinesConverter))]
+ [TypeConverter(typeof(EnumToStringConverter))]
public enum NewLines
{
[Description("\n")]
@@ -25,98 +23,4 @@ public enum NewLines
[Description("\r")]
CR
}
-
- #endregion
-
- #region TypeConverter
-
- // https://qiita.com/mkuwan/items/be6745f2c9e7823f8a66
- internal static class EnumExtention
- {
- ///
- /// Enum の Value から Description を取得
- ///
- /// 任意の
- /// 型が T の値
- /// value の Description
- internal static string GetDescriptionFromValue(this T value) where T : Enum //where T : Enum とすることで Tがenumでない場合はコンパイル時にエラーにしてくれる
- {
- //valueはenum型確定なので空文字が返ることはない
- string strValue = value.ToString();
-
- var description =
- typeof(T).GetField(strValue) //FiledInfoを取得
- .GetCustomAttributes(typeof(DescriptionAttribute), false) //DescriptionAttributeのリストを取得
- .Cast() //DescriptionAttributeにキャスト
- .FirstOrDefault() //最初の一つを取得、なければnull
- ?.Description; //DescriptionAttributeがあればDescriptionを、なければnullを返す
-
- return description ?? strValue; //descriptionがnullならstrValueを返す
- }
-
- ///
- /// EnumのDescriptionからValueを取得
- ///
- /// 任意の
- /// 型が T の value の Description
- /// Description を属性に持つ型が T の値
- internal static T GetEnumValueFromDescription(this string description) where T : Enum
- {
- var value =
- typeof(T).GetFields()
- .SelectMany(x => x.GetCustomAttributes(typeof(DescriptionAttribute), false),
- (f, a) => new { field = f, attribute = a })
- .Where(x => ((DescriptionAttribute)x.attribute).Description == description)
- .FirstOrDefault()
- ?.field.GetRawConstantValue();
-
- // 値が見つからない場合にエラーとする場合はこちら
- //return (T)(value ?? throw new ArgumentNullException());
-
- return (T)(value ?? default(T));
- }
- }
-
-
- internal class NewLinesConverter : TypeConverter
- {
- public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
- {
- if (value is string)
- {
- string str = (string)value;
- switch (str)
- {
- case "CRLF":
- return NewLines.CRLF;
- case "CR":
- return NewLines.CR;
- case "LF":
- default:
- return NewLines.LF;
- }
- }
- return base.ConvertFrom(context, culture, value);
- }
-
- public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
- {
- if (destinationType == typeof(string))
- {
- switch ((NewLines)value)
- {
- case NewLines.CRLF:
- return "CRLF";
- case NewLines.CR:
- return "CR";
- case NewLines.LF:
- default:
- return "LF";
- }
- }
- return base.ConvertTo(context, culture, value, destinationType);
- }
- }
-
- #endregion
}
diff --git a/CommEx/Serial/ViewModels/PortViewModel.cs b/CommEx/Serial/ViewModels/PortViewModel.cs
index 6c663fb..8b1e4a3 100644
--- a/CommEx/Serial/ViewModels/PortViewModel.cs
+++ b/CommEx/Serial/ViewModels/PortViewModel.cs
@@ -186,11 +186,13 @@ public NewLines NewLine
{
get
{
- return EnumExtention.GetEnumValueFromDescription(port.NewLine);
+ var conv = new EnumToDescriptionConverter(typeof(NewLines));
+ return (NewLines)conv.ConvertFrom(port.NewLine);
}
set
{
- port.NewLine = EnumExtention.GetDescriptionFromValue(value);
+ var conv = new EnumToDescriptionConverter(typeof(NewLines));
+ port.NewLine = (string)conv.ConvertTo(value, typeof(string));
RaisePropertyChanged();
}
}
From 1cdc9ddc30d1778f8bc26c4796379f02deced020 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Sun, 26 Jan 2025 16:23:04 +0900
Subject: [PATCH 90/97] update serial controller
---
CommEx/Serial/Common/SerialControl.cs | 114 ++++++++++++++++++++++
CommEx/Serial/Common/SerialController.cs | 23 -----
CommEx/Serial/ViewModels/PortViewModel.cs | 42 ++++++--
CommEx/Serial/Views/SettingWindow.xaml | 7 +-
4 files changed, 151 insertions(+), 35 deletions(-)
create mode 100644 CommEx/Serial/Common/SerialControl.cs
delete mode 100644 CommEx/Serial/Common/SerialController.cs
diff --git a/CommEx/Serial/Common/SerialControl.cs b/CommEx/Serial/Common/SerialControl.cs
new file mode 100644
index 0000000..fe67bb1
--- /dev/null
+++ b/CommEx/Serial/Common/SerialControl.cs
@@ -0,0 +1,114 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Globalization;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CommEx.Serial.Common
+{
+ ///
+ /// シリアル通信の制御器
+ ///
+ [TypeConverter(typeof(EnumToDescriptionConverter))]
+ public enum Controller
+ {
+ [Description("Loopback")]
+ Loopback,
+ [Description("BIDS互換")]
+ Bids,
+ }
+
+ ///
+ ///
+ /// Controller とその ISerialControl を変換するコンバータ
+ ///
+ public class ControllerToISerialControlConverter : EnumToDescriptionConverter
+ {
+ public ControllerToISerialControlConverter(Type type) : base(type)
+ {
+ if (type != typeof(Controller))
+ {
+ throw new ArgumentException($"Type must be {typeof(Controller)}.");
+ }
+ }
+
+ ///
+ /// の value に応じたクラス
+ ///
+ private static readonly Dictionary ClassDictionary = new Dictionary
+ {
+ // { , typeof(<制御クラス>) },
+ { Controller.Loopback, typeof(Loopback) },
+ { Controller.Bids, typeof(Bids.BidsSerial) }
+ };
+
+ ///
+ /// Enum の Value から ISerialControl のインスタンスを取得
+ /// Enum.Value -> ISerialControl
+ ///
+ /// Enum.value
+ /// ISerialControl
+ /// ISerialControl
+ public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
+ {
+ if (value == null)
+ {
+ Debug.WriteLine("value が null です。");
+ return null;
+ }
+
+ if (destinationType == typeof(ISerialControl))
+ {
+
+ if (ClassDictionary.TryGetValue((Controller)value, out Type type))
+ {
+ return (ISerialControl)Activator.CreateInstance(type);
+ }
+ else
+ {
+ Debug.WriteLine("クラスが登録されていません。");
+ return null;
+ }
+ }
+
+ return base.ConvertTo(context, culture, value, destinationType);
+ }
+
+ ///
+ /// ISerialControl のインスタンスから Enum の Value を取得
+ /// ISerialControl -> Enum.Value
+ ///
+ /// ISerialControl
+ /// Enum.value
+ public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
+ {
+ if (value == null)
+ {
+ Debug.WriteLine("value が null です。");
+ return null;
+ }
+
+ if (value is ISerialControl)
+ {
+ // controllerの型をSerialControl.Controllerに変換
+ // 現在のcontrollerインスタンスがClassDictionaryのどのキーに対応するかを探す
+ foreach (var item in ClassDictionary)
+ {
+ if (item.Value == value.GetType())
+ {
+ return item.Key;
+ }
+ }
+ Debug.WriteLine("クラスが登録されていません。");
+ return null;
+ }
+
+ return base.ConvertFrom(context, culture, value);
+ }
+ }
+
+}
diff --git a/CommEx/Serial/Common/SerialController.cs b/CommEx/Serial/Common/SerialController.cs
deleted file mode 100644
index 1669c6f..0000000
--- a/CommEx/Serial/Common/SerialController.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Globalization;
-using System.Linq;
-using System.Reflection;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace CommEx.Serial.Common
-{
- ///
- /// シリアル通信の制御方法
- ///
- [TypeConverter(typeof(EnumToDescriptionConverter))]
- enum SerialController
- {
- [Description("Loopback")]
- Loopback,
- [Description("BIDS")]
- Bids,
- }
-}
diff --git a/CommEx/Serial/ViewModels/PortViewModel.cs b/CommEx/Serial/ViewModels/PortViewModel.cs
index 8b1e4a3..dbaba51 100644
--- a/CommEx/Serial/ViewModels/PortViewModel.cs
+++ b/CommEx/Serial/ViewModels/PortViewModel.cs
@@ -37,7 +37,7 @@ public class PortViewModel : BaseViewModel
///
/// シリアルの制御
///
- private ISerialControl control;
+ private ISerialControl controller;
///
/// 自動接続の設定
@@ -49,6 +49,11 @@ public class PortViewModel : BaseViewModel
///
private string message = "";
+ ///
+ /// Controller と ISerialControl のコンバータ
+ ///
+ private static readonly ControllerToISerialControlConverter c2iconv = new ControllerToISerialControlConverter(typeof(Controller));
+
#endregion
#region Properties
@@ -308,6 +313,23 @@ public string OperationString
}
}
+ ///
+ /// 現在選択中の Controller
+ ///
+ [XmlIgnore]
+ public Controller? Controller
+ {
+ get
+ {
+ return (Controller)c2iconv.ConvertFrom(controller);
+ }
+ set
+ {
+ controller = (ISerialControl)c2iconv.ConvertTo(value, typeof(ISerialControl));
+ RaisePropertyChanged();
+ }
+ }
+
///
/// 使用可能なポートの選択肢リスト
///
@@ -350,6 +372,12 @@ public string OperationString
[XmlIgnore]
public static ObservableCollection NewLineOptions { get; } = new ObservableCollection(Enum.GetValues(typeof(NewLines)) as NewLines[]);
+ ///
+ /// コントローラーの選択肢リスト
+ ///
+ [XmlIgnore]
+ public static ObservableCollection ControllerOptions { get; } = new ObservableCollection(Enum.GetValues(typeof(Controller)) as Controller[]);
+
///
/// ポートリストのアップデートコマンド
///
@@ -381,11 +409,11 @@ private void Initialize(SerialPort serialPort = null, ISerialControl serialContr
}
if (serialControl == null)
{
- control = new BidsSerial();
+ controller = new BidsSerial();
}
else
{
- control = serialControl;
+ controller = serialControl;
}
UpdatePorts();
@@ -461,7 +489,7 @@ public PortViewModel(SerialPort serialPort)
public PortViewModel(ISerialControl serialControls, string portName = "COM0", int baudRate = 115200, Parity parity = Parity.None, int dataBits = 8, StopBits stopBits = StopBits.One)
{
port = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
- control = serialControls;
+ controller = serialControls;
UpdatePortsCommand = new RelayCommand(UpdatePorts);
OpenClosePortCommand = new RelayCommand(OpenClosePort, CanOpenClosePort);
@@ -475,7 +503,7 @@ public PortViewModel(ISerialControl serialControls, string portName = "COM0", in
public PortViewModel(ISerialControl serialControls)
{
port = new SerialPort();
- control = serialControls;
+ controller = serialControls;
UpdatePortsCommand = new RelayCommand(UpdatePorts);
OpenClosePortCommand = new RelayCommand(OpenClosePort, CanOpenClosePort);
@@ -545,7 +573,7 @@ private void OpenClosePort()
// ポートを開ける
try
{
- control.PortOpen(port);
+ controller.PortOpen(port);
port.Open();
if (IsOpen)
@@ -589,7 +617,7 @@ private void OpenClosePort()
try
{
port.Close();
- control.PortClose(port);
+ controller.PortClose(port);
if (IsOpen)
{
diff --git a/CommEx/Serial/Views/SettingWindow.xaml b/CommEx/Serial/Views/SettingWindow.xaml
index a8c63d4..5658864 100644
--- a/CommEx/Serial/Views/SettingWindow.xaml
+++ b/CommEx/Serial/Views/SettingWindow.xaml
@@ -84,11 +84,8 @@
-
-
-
+
+
From 2cb1b796e96dbdc9ef0b086ca2563fbb0dc75dcd Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Sun, 26 Jan 2025 16:23:37 +0900
Subject: [PATCH 91/97] update enum converter
---
CommEx/Serial/ViewModels/PortViewModel.cs | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/CommEx/Serial/ViewModels/PortViewModel.cs b/CommEx/Serial/ViewModels/PortViewModel.cs
index dbaba51..96b393f 100644
--- a/CommEx/Serial/ViewModels/PortViewModel.cs
+++ b/CommEx/Serial/ViewModels/PortViewModel.cs
@@ -49,6 +49,11 @@ public class PortViewModel : BaseViewModel
///
private string message = "";
+ ///
+ /// Enum と Description のコンバータ
+ ///
+ private static readonly EnumToDescriptionConverter e2dconv = new EnumToDescriptionConverter(typeof(NewLines));
+
///
/// Controller と ISerialControl のコンバータ
///
@@ -191,13 +196,11 @@ public NewLines NewLine
{
get
{
- var conv = new EnumToDescriptionConverter(typeof(NewLines));
- return (NewLines)conv.ConvertFrom(port.NewLine);
+ return (NewLines)e2dconv.ConvertFrom(port.NewLine);
}
set
{
- var conv = new EnumToDescriptionConverter(typeof(NewLines));
- port.NewLine = (string)conv.ConvertTo(value, typeof(string));
+ port.NewLine = (string)e2dconv.ConvertTo(value, typeof(string));
RaisePropertyChanged();
}
}
From 6d3ed7fdbb3882f1b8ede49083fb6b5491369def Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Sun, 26 Jan 2025 16:23:55 +0900
Subject: [PATCH 92/97] fix error code
---
CommEx/Serial/Bids/Serial.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/CommEx/Serial/Bids/Serial.cs b/CommEx/Serial/Bids/Serial.cs
index 222f0d5..d55d3eb 100644
--- a/CommEx/Serial/Bids/Serial.cs
+++ b/CommEx/Serial/Bids/Serial.cs
@@ -351,7 +351,7 @@ private string CreateError(Errors err, string header = "EX")
#if DEBUG
Debug.WriteLine(err.ToString());
#endif
- return header + "E" + err.ToString();
+ return header + "E" + (int)err;
}
#endregion
From 90110d601728be82070a17d05d78932705c12deb Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Sun, 26 Jan 2025 16:24:09 +0900
Subject: [PATCH 93/97] update comment
---
CommEx/Serial/Common/EnumConverters.cs | 32 +++++++++++++++++++++++---
1 file changed, 29 insertions(+), 3 deletions(-)
diff --git a/CommEx/Serial/Common/EnumConverters.cs b/CommEx/Serial/Common/EnumConverters.cs
index 0d40649..e43a863 100644
--- a/CommEx/Serial/Common/EnumConverters.cs
+++ b/CommEx/Serial/Common/EnumConverters.cs
@@ -14,7 +14,8 @@ namespace CommEx.Serial.Common
///
///
- /// Enum の Value と Description を変換するコンバータ
+ /// Enum の Value と String を変換するコンバータ
+ /// String はそのまま Enum の Value として扱われる
///
public class EnumToStringConverter : EnumConverter
{
@@ -25,7 +26,13 @@ public EnumToStringConverter(Type type) : base(type)
throw new ArgumentException("Type must be an Enum.");
}
}
-
+ ///
+ /// Enum の Value から String を取得
+ /// Enum.Value -> string
+ ///
+ /// Enum.value
+ /// string
+ /// string
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
{
if (destinationType == typeof(string) && value != null)
@@ -35,6 +42,12 @@ public override object ConvertTo(ITypeDescriptorContext context, CultureInfo cul
return base.ConvertTo(context, culture, value, destinationType);
}
+ ///
+ /// String から Enum の Value を取得
+ /// string -> Enum.Value
+ ///
+ /// string
+ /// Enum.value
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
if (value is string stringValue)
@@ -51,7 +64,7 @@ public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo c
///
///
- /// Enum の Value と Description を変換するコンバータ
+ /// Enum の Value とその Description を変換するコンバータ
///
public class EnumToDescriptionConverter : EnumConverter
{
@@ -63,6 +76,13 @@ public EnumToDescriptionConverter(Type type) : base(type)
}
}
+ ///
+ /// Enum の Value から DescriptionAttribute を取得
+ /// Enum.Value -> string
+ ///
+ /// Enum.value
+ /// string
+ /// string
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
{
if (destinationType == typeof(string) && value != null)
@@ -77,6 +97,12 @@ public override object ConvertTo(ITypeDescriptorContext context, CultureInfo cul
return base.ConvertTo(context, culture, value, destinationType);
}
+ ///
+ /// Enum の DescriptionAttribute から Value を取得
+ /// string -> Enum.Value
+ ///
+ /// string
+ /// Enum.value
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
if (value is string stringValue)
From 21656dae7ee564c3d9b19741457b994f8f3d9448 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Sun, 26 Jan 2025 16:33:56 +0900
Subject: [PATCH 94/97] update sample setting
---
CommEx/Serial/Common/Sample.Setting.xml | 25 +++++++++++++++----------
1 file changed, 15 insertions(+), 10 deletions(-)
diff --git a/CommEx/Serial/Common/Sample.Setting.xml b/CommEx/Serial/Common/Sample.Setting.xml
index 24ee4d1..ec39dd7 100644
--- a/CommEx/Serial/Common/Sample.Setting.xml
+++ b/CommEx/Serial/Common/Sample.Setting.xml
@@ -1,11 +1,16 @@
-
- 115200
- 8
- false
- None
- CRLF
- None
- One
- true
-
\ No newline at end of file
+
+
+
+ 115200
+ 8
+ false
+ None
+ CRLF
+ None
+ One
+ true
+ Loopback
+
+
+
\ No newline at end of file
From 1d7524abbe946d8ca459f983c2d09cba6f6a956a Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Sun, 26 Jan 2025 16:34:15 +0900
Subject: [PATCH 95/97] add controller
---
CommEx/Serial/Views/ListWindow.xaml | 3 +++
1 file changed, 3 insertions(+)
diff --git a/CommEx/Serial/Views/ListWindow.xaml b/CommEx/Serial/Views/ListWindow.xaml
index 0dd760b..d018932 100644
--- a/CommEx/Serial/Views/ListWindow.xaml
+++ b/CommEx/Serial/Views/ListWindow.xaml
@@ -112,6 +112,9 @@
+
+
+
From d3e5a49931e61fb07dfe1b700603e2bc28e63b50 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Sun, 26 Jan 2025 16:34:38 +0900
Subject: [PATCH 96/97] add setting element
---
CommEx/Serial/ViewModels/PortViewModel.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/CommEx/Serial/ViewModels/PortViewModel.cs b/CommEx/Serial/ViewModels/PortViewModel.cs
index 96b393f..17f94ab 100644
--- a/CommEx/Serial/ViewModels/PortViewModel.cs
+++ b/CommEx/Serial/ViewModels/PortViewModel.cs
@@ -319,7 +319,7 @@ public string OperationString
///
/// 現在選択中の Controller
///
- [XmlIgnore]
+ [XmlElement]
public Controller? Controller
{
get
From 2e9873d6f54a7ada4bbfc0a07ae6a5d39c74e823 Mon Sep 17 00:00:00 2001
From: stop-pattern <40131396+stop-pattern@users.noreply.github.com>
Date: Sun, 26 Jan 2025 16:36:52 +0900
Subject: [PATCH 97/97] update default value
---
CommEx/Serial/ViewModels/PortViewModel.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/CommEx/Serial/ViewModels/PortViewModel.cs b/CommEx/Serial/ViewModels/PortViewModel.cs
index 17f94ab..be99a8e 100644
--- a/CommEx/Serial/ViewModels/PortViewModel.cs
+++ b/CommEx/Serial/ViewModels/PortViewModel.cs
@@ -412,7 +412,7 @@ private void Initialize(SerialPort serialPort = null, ISerialControl serialContr
}
if (serialControl == null)
{
- controller = new BidsSerial();
+ controller = (ISerialControl)c2iconv.ConvertTo(Enum.GetValues(typeof(Controller)).Cast().Min(), typeof(ISerialControl));
}
else
{