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"> + + + + + + + + + + + +