浏览代码

add ahongsheng led support

Robert 8 月之前
父节点
当前提交
0942119688

+ 22 - 0
ApiTest/ApiTest.csproj

@@ -35,11 +35,33 @@
     <WarningLevel>4</WarningLevel>
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="FluentModbus, Version=5.0.0.0, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>..\packages\FluentModbus.5.2.0\lib\netstandard2.0\FluentModbus.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.Extensions.Logging.Abstractions, Version=5.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
+      <HintPath>..\packages\Microsoft.Extensions.Logging.Abstractions.5.0.0\lib\net461\Microsoft.Extensions.Logging.Abstractions.dll</HintPath>
+    </Reference>
     <Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
       <HintPath>..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
     </Reference>
     <Reference Include="System" />
+    <Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
+    </Reference>
     <Reference Include="System.Data" />
+    <Reference Include="System.IO.Ports, Version=5.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.IO.Ports.5.0.0\lib\net461\System.IO.Ports.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Numerics" />
+    <Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.5.3\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
+    </Reference>
     <Reference Include="System.Xml" />
     <Reference Include="Microsoft.CSharp" />
     <Reference Include="System.Core" />

+ 9 - 1
ApiTest/App.config

@@ -1,6 +1,14 @@
-<?xml version="1.0" encoding="utf-8" ?>
+<?xml version="1.0" encoding="utf-8"?>
 <configuration>
     <startup> 
         <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
     </startup>
+  <runtime>
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+      <dependentAssembly>
+        <assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
+      </dependentAssembly>
+    </assemblyBinding>
+  </runtime>
 </configuration>

+ 1 - 1
ApiTest/MainWindow.xaml.cs

@@ -119,7 +119,7 @@ namespace ApiTest
                 //System.IO.Path.GetFullPath("fake.txt"),
                 //System.IO.Path.GetFullPath("fake.txt")
                 System.IO.Path.GetFullPath("CCS_V0.32.S0_CRC=485E654C.gz"),
-                System.IO.Path.GetFullPath("CSU_V3.06_CRC=54D4A562.gz")
+                //System.IO.Path.GetFullPath("CSU_V3.06_CRC=54D4A562.gz")
             });
             //var result = await EvApi.SignalUpdateFirmware(); ;
             uxResult.Text = JsonConvert.SerializeObject(result);

+ 4 - 4
ApiTest/Properties/AssemblyInfo.cs

@@ -50,7 +50,7 @@ using System.Windows;
 //
 // 您可以指定所有的值,也可以使用 '*' 將組建和修訂編號
 // 設為預設,如下所示:
-// [assembly: AssemblyVersion("1.11.5.0")]
-[assembly: AssemblyVersion("1.11.5.0")]
-[assembly: AssemblyFileVersion("1.11.5.0")]
-[assembly: AssemblyInformationalVersion("266a5e2")]
+// [assembly: AssemblyVersion("1.12.1.0")]
+[assembly: AssemblyVersion("1.12.1.0")]
+[assembly: AssemblyFileVersion("1.12.1.0")]
+[assembly: AssemblyInformationalVersion("3be3a19")]

+ 7 - 0
ApiTest/packages.config

@@ -1,4 +1,11 @@
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
+  <package id="FluentModbus" version="5.2.0" targetFramework="net48" />
+  <package id="Microsoft.Extensions.Logging.Abstractions" version="5.0.0" targetFramework="net48" />
   <package id="Newtonsoft.Json" version="13.0.3" targetFramework="net48" />
+  <package id="System.Buffers" version="4.5.1" targetFramework="net48" />
+  <package id="System.IO.Ports" version="5.0.0" targetFramework="net48" />
+  <package id="System.Memory" version="4.5.4" targetFramework="net48" />
+  <package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net48" />
+  <package id="System.Runtime.CompilerServices.Unsafe" version="4.5.3" targetFramework="net48" />
 </packages>

+ 17 - 11
AwInitilizer/App.config

@@ -1,11 +1,17 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-    <configSections>
-    </configSections>
-    <startup> 
-        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/>
-    </startup>
-  <runtime>
-    <gcConcurrent enabled="false"/>
-  </runtime>
-</configuration>
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+    <configSections>
+    </configSections>
+    <startup> 
+        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
+    </startup>
+  <runtime>
+    <gcConcurrent enabled="false" />
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+      <dependentAssembly>
+        <assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
+      </dependentAssembly>
+    </assemblyBinding>
+  </runtime>
+</configuration>

+ 23 - 0
AwInitilizer/Initializer.csproj

@@ -59,6 +59,12 @@
     <Reference Include="FluentFTP, Version=37.0.2.0, Culture=neutral, PublicKeyToken=f4af092b1d8df44f, processorArchitecture=MSIL">
       <HintPath>..\packages\FluentFTP.37.0.2\lib\net45\FluentFTP.dll</HintPath>
     </Reference>
+    <Reference Include="FluentModbus, Version=5.0.0.0, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>..\packages\FluentModbus.5.2.0\lib\netstandard2.0\FluentModbus.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.Extensions.Logging.Abstractions, Version=5.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
+      <HintPath>..\packages\Microsoft.Extensions.Logging.Abstractions.5.0.0\lib\net461\Microsoft.Extensions.Logging.Abstractions.dll</HintPath>
+    </Reference>
     <Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
       <HintPath>..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
     </Reference>
@@ -69,7 +75,23 @@
       <HintPath>..\packages\RestSharp.106.15.0\lib\net452\RestSharp.dll</HintPath>
     </Reference>
     <Reference Include="System" />
+    <Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
+    </Reference>
     <Reference Include="System.Data" />
+    <Reference Include="System.IO.Ports, Version=5.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.IO.Ports.5.0.0\lib\net461\System.IO.Ports.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Numerics" />
+    <Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.5.3\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
+    </Reference>
     <Reference Include="System.Web" />
     <Reference Include="System.Xml" />
     <Reference Include="Microsoft.CSharp" />
@@ -119,6 +141,7 @@
     <Compile Include="SigninDialog.xaml.cs">
       <DependentUpon>SigninDialog.xaml</DependentUpon>
     </Compile>
+    <Compile Include="ZhongShengLedControl.cs" />
     <Page Include="HintDialog.xaml">
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>

+ 133 - 133
AwInitilizer/MainViewModel.cs

@@ -1,133 +1,133 @@
-using AwInitilizer.Procedure;
-using System;
-using System.Collections.Generic;
-using System.Collections.ObjectModel;
-using System.ComponentModel;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace AwInitilizer
-{
-    public class MainViewModel : Model.UpdateData,INotifyPropertyChanged
-    {
-        private string _UserID;
-        public string UserID
-        {
-            get => _UserID;
-            set
-            {
-                if(_UserID!=value)
-                {
-                    _UserID = value;
-                    RaisePropertyChanged(nameof(UserID));
-                }
-            }
-        }
-
-        private string _WorkOrder;
-        public string WorkOrder
-        {
-            get => _WorkOrder;
-            set
-            {
-                if (_WorkOrder != value)
-                {
-                    _WorkOrder = value;
-                    RaisePropertyChanged(nameof(WorkOrder));
-                }
-            }
-        }
-
-        private bool _IsUdatIng = false;
-        public bool IsUdatIng
-        {
-            get => _IsUdatIng;
-            set
-            {
-                if(_IsUdatIng!=value)
-                {
-                    _IsUdatIng = value;
-                    RaisePropertyChanged("IsUdatIng");
-                    RaisePropertyChanged("IsInputLock");
-                }
-            }
-        }
-
-        private bool _IsInputCheckpassed = false;
-        public bool IsInputCheckpassed
-        {
-            get => _IsInputCheckpassed;
-            set
-            {
-                if(_IsInputCheckpassed != value)
-                {
-                    _IsInputCheckpassed = value;
-                    RaisePropertyChanged(nameof(IsInputCheckpassed));
-                }
-            }
-        }
-
-        public bool IsInputLock => !IsUdatIng;
-
-        private string _SettingFileName;
-        public string SettingFileName
-        {
-            get => _SettingFileName;
-            set
-            {
-                if (_SettingFileName != value)
-                {
-                    _SettingFileName = value;
-                    RaisePropertyChanged("SettingFileName");
-                }
-            }
-        }
-
-        private string _SettingModelName;
-        public string SettingModelName
-        {
-            get => _SettingModelName;
-            set
-            {
-                if (_SettingModelName != value)
-                {
-                    _SettingModelName = value;
-                    RaisePropertyChanged("SettingModelName");
-                }
-            }
-        }
-
-        private ObservableCollection<ProcedureBase> _updateProcedure;
-        public ObservableCollection<ProcedureBase> UpdateProcedure
-        {
-            get => _updateProcedure;
-            set
-            {
-                if (_updateProcedure != value)
-                {
-                    if(_updateProcedure!=null)
-                    {
-                        _updateProcedure.CollectionChanged -= _updateProcedure_CollectionChanged;
-                    }
-
-                    _updateProcedure = value;
-                    RaisePropertyChanged("UpdateProcedure");
-                }
-            }
-        }
-
-        public TimeSpan UpdateElpased { get; set; }
-
-        public MainViewModel()
-        {
-            _updateProcedure = new ObservableCollection<ProcedureBase>();
-            _updateProcedure.CollectionChanged += _updateProcedure_CollectionChanged;
-        }
-
-        private void _updateProcedure_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
-        {
-            RaisePropertyChanged("UpdateProcedure");
-        }
-    }
-}
+using AwInitilizer.Procedure;
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace AwInitilizer
+{
+    public class MainViewModel : Model.UpdateData,INotifyPropertyChanged
+    {
+        private string _UserID;
+        public string UserID
+        {
+            get => _UserID;
+            set
+            {
+                if(_UserID!=value)
+                {
+                    _UserID = value;
+                    RaisePropertyChanged(nameof(UserID));
+                }
+            }
+        }
+
+        private string _WorkOrder;
+        public string WorkOrder
+        {
+            get => _WorkOrder;
+            set
+            {
+                if (_WorkOrder != value)
+                {
+                    _WorkOrder = value;
+                    RaisePropertyChanged(nameof(WorkOrder));
+                }
+            }
+        }
+
+        private bool _IsUdatIng = false;
+        public bool IsUpdating
+        {
+            get => _IsUdatIng;
+            set
+            {
+                if(_IsUdatIng!=value)
+                {
+                    _IsUdatIng = value;
+                    RaisePropertyChanged("IsUdatIng");
+                    RaisePropertyChanged("IsInputLock");
+                }
+            }
+        }
+
+        private bool _IsInputCheckpassed = false;
+        public bool IsInputCheckpassed
+        {
+            get => _IsInputCheckpassed;
+            set
+            {
+                if(_IsInputCheckpassed != value)
+                {
+                    _IsInputCheckpassed = value;
+                    RaisePropertyChanged(nameof(IsInputCheckpassed));
+                }
+            }
+        }
+
+        public bool IsInputLock => !IsUpdating;
+
+        private string _SettingFileName;
+        public string SettingFileName
+        {
+            get => _SettingFileName;
+            set
+            {
+                if (_SettingFileName != value)
+                {
+                    _SettingFileName = value;
+                    RaisePropertyChanged("SettingFileName");
+                }
+            }
+        }
+
+        private string _SettingModelName;
+        public string SettingModelName
+        {
+            get => _SettingModelName;
+            set
+            {
+                if (_SettingModelName != value)
+                {
+                    _SettingModelName = value;
+                    RaisePropertyChanged("SettingModelName");
+                }
+            }
+        }
+
+        private ObservableCollection<ProcedureBase> _updateProcedure;
+        public ObservableCollection<ProcedureBase> UpdateProcedure
+        {
+            get => _updateProcedure;
+            set
+            {
+                if (_updateProcedure != value)
+                {
+                    if(_updateProcedure!=null)
+                    {
+                        _updateProcedure.CollectionChanged -= _updateProcedure_CollectionChanged;
+                    }
+
+                    _updateProcedure = value;
+                    RaisePropertyChanged("UpdateProcedure");
+                }
+            }
+        }
+
+        public TimeSpan UpdateElpased { get; set; }
+
+        public MainViewModel()
+        {
+            _updateProcedure = new ObservableCollection<ProcedureBase>();
+            _updateProcedure.CollectionChanged += _updateProcedure_CollectionChanged;
+        }
+
+        private void _updateProcedure_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
+        {
+            RaisePropertyChanged("UpdateProcedure");
+        }
+    }
+}

+ 44 - 6
AwInitilizer/MainWindow.xaml.cs

@@ -41,6 +41,9 @@ namespace AwInitilizer
     /// </summary>
     public partial class MainWindow : Window, Interface.IIogger
     {
+        public event EventHandler OnUpdateStarting;
+        public event EventHandler OnUpdateCompleted;
+
         private DispatcherTimer LogoutTimer;
 
         private KeyinListener keyinListener;
@@ -51,6 +54,8 @@ namespace AwInitilizer
         private string csuFilePath;
         private string mcuFilePath;
 
+        private ZhongShengLedControl ledControl;
+
         private MainViewModel ViewModel => DataContext as MainViewModel;
 
         private UpdateStatus _UpdateStatus = UpdateStatus.Idle;
@@ -77,7 +82,13 @@ namespace AwInitilizer
             keyinListener = new KeyinListener(this);
             keyinListener.OnSystemIDReseived += KeyinListener_OnSystemIDReseived;
 
+            if (!string.IsNullOrEmpty(AppSettingConfig.JohnSenLedComPort))
+            {
+                ledControl = new ZhongShengLedControl(AppSettingConfig.JohnSenLedComPort, this);
+            }
+
             Loaded += MainWindow_Loaded;
+            Closing += MainWindow_Closing;
 
             this.DataContext = new MainViewModel();
 
@@ -101,11 +112,24 @@ namespace AwInitilizer
             UpdateProcedure();
 
             LogoutTimer.Start();
-        }
-
+        }
+
         private void KeyinListener_OnSystemIDReseived(object sender, SystemID systemID)
         {
             SystemIDScanReseived(systemID);
+        }
+
+        private async void MainWindow_Closing(object sender, CancelEventArgs e)
+        {
+            //if (ledControl != null)
+            //{
+            //    e.Cancel = true;
+            //    await Task.Factory.StartNew(async () =>
+            //    {
+            //        await ledControl?.DisposeAsync();
+            //        Environment.Exit(0);
+            //    }, TaskCreationOptions.AttachedToParent);
+            //}
         }
 
         protected override void OnClosing(CancelEventArgs e)
@@ -116,6 +140,16 @@ namespace AwInitilizer
             {
                 LogoutTimer.Tick -= LogoutTimer_Tick;
                 LogoutTimer.Stop();
+
+                if (ledControl != null)
+                {
+                    Task.Factory.StartNew(() =>
+                    {
+                        ledControl?.DisposeAsync().Wait();
+                    }, TaskCreationOptions.AttachedToParent).Wait();
+                    //ledControl?.DisposeAsync().Wait();
+                }
+                //ledControl?.Dispose();
             }
             catch
             {
@@ -194,7 +228,7 @@ namespace AwInitilizer
             ViewModel.IsInputCheckpassed = CheckInputData();
             if (ViewModel.IsInputCheckpassed)
             {
-                ViewModel.IsUdatIng = true;
+                ViewModel.IsUpdating = true;
                 UpdateStatus = UpdateStatus.Updating;
                 EvHttpClientLogger.Instance.StartNewLog(serialNumber);
                 _ = UpdateTask();
@@ -350,13 +384,15 @@ namespace AwInitilizer
 
             MesErrorCode mesErrorCode = MesErrorCode.None;
 
+            OnUpdateStarting?.Invoke(this, null);
+
             //Dictionary<string, string> logPairs = new Dictionary<string, string>();
             ValueReportDatas reportDatas = new ValueReportDatas();
             //logPairs.Add("ModelName", ViewModel.SystemID.ModelName.ToString());
             //logPairs.Add("SerialNumber", ViewModel.SystemID.SerialNumber);
             EvHttpClient.ResetServerIpAddress(ViewModel.IpAddress);
 
-            ViewModel.IsUdatIng = true;
+            ViewModel.IsUpdating = true;
             var procedureList = ViewModel.UpdateProcedure.Where(x => x.IsActivated).ToList();
             int procedureIndex;
             for (procedureIndex = 0; procedureIndex < procedureList.Count; procedureIndex++)
@@ -413,8 +449,10 @@ namespace AwInitilizer
 
             CreateLogFile();
             CreateUploadCustomterLogFile();
-            ViewModel.IsUdatIng = false;
+            ViewModel.IsUpdating = false;
             ViewModel.IsInputCheckpassed = false;
+
+            OnUpdateCompleted?.Invoke(this, null);
         }
 
         private void ReportMESLog(ValueReportDatas logPairs)
@@ -918,7 +956,7 @@ namespace AwInitilizer
         {
             LogoutTimer.Stop();
 
-            if (ViewModel.IsUdatIng)
+            if (ViewModel.IsUpdating)
             {
                 logoutCheckCnt = 0;
                 LogoutTimer.Start();

+ 1 - 0
AwInitilizer/Model/AppSettingConfig.cs

@@ -13,5 +13,6 @@ namespace AwInitilizer.Model
         public string MES { get; set; }
         public string MechineCode { get; set; }
         public bool IsDisableAuthRequired { get; set; }
+        public string JohnSenLedComPort { get; set; }
     }
 }

+ 4 - 4
AwInitilizer/Properties/AssemblyInfo.cs

@@ -31,7 +31,7 @@ using System.Runtime.InteropServices;
 //
 // You can specify all the values or you can default the Build and Revision Numbers
 // by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.11.5.0")]
-[assembly: AssemblyVersion("1.11.5.0")]
-[assembly: AssemblyFileVersion("1.11.5.0")]
-[assembly: AssemblyInformationalVersion("266a5e2")]
+// [assembly: AssemblyVersion("1.12.1.0")]
+[assembly: AssemblyVersion("1.12.1.0")]
+[assembly: AssemblyFileVersion("1.12.1.0")]
+[assembly: AssemblyInformationalVersion("3be3a19")]

+ 14 - 1
AwInitilizer/SettingConfig.cs

@@ -69,11 +69,23 @@ namespace AwInitilizer
             }
         }
 
+        public static string JohnSenLedComPort
+        {
+            get
+            {
+                if (Instance == null)
+                {
+                    Instance = new AppSettingConfig();
+                }
+                return Instance._JohnSenLedComPort;
+            }
+        }
+
         private static AppSettingConfig Instance;
 
         private string _FirmwareRoot, _Language, _MES , _MechineCode;
         private bool _IsDisableAuthRequired;
-
+        private string _JohnSenLedComPort;
         private static string settingFileName = "config.ini";
 
         public AppSettingConfig()
@@ -101,6 +113,7 @@ namespace AwInitilizer
                 _MES = config.MES;
                 _MechineCode = config.MechineCode;
                 _IsDisableAuthRequired = config.IsDisableAuthRequired;
+                _JohnSenLedComPort = config.JohnSenLedComPort;
             }
             catch
             {

+ 268 - 0
AwInitilizer/ZhongShengLedControl.cs

@@ -0,0 +1,268 @@
+using FluentModbus;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Markup;
+
+namespace AwInitilizer
+{
+    internal class ZhongShengLedControl : IDisposable
+    {
+        private readonly MainWindow mainWindow;
+        private const int DevAddress = 1;
+        private const int GreenAddress = 0;
+        private const int YelloAddress = 1;
+        private const int EmergencyAddress = 2;
+
+        private ModbusRtuClient modbusRtuClient;
+        private Task poolingMonitorTask;
+        private bool isInEmergency = false;
+        private CancellationTokenSource cancellationSource;
+        private bool IsInitCompleted => modbusRtuClient != null;
+        private SemaphoreSlim semaphore = new SemaphoreSlim(1, 1);
+        private bool isDisposing = false;
+        private bool isPoolingMonitorTaskComplete = false;
+
+        public ZhongShengLedControl(ModbusRtuClient comportClient, MainWindow mainWindow)
+        {
+            if (comportClient is null)
+            {
+                return;
+            }
+
+            cancellationSource = new CancellationTokenSource();
+            this.mainWindow = mainWindow;
+            //mainWindow.OnUpdateStarting += MainWindow_OnUpdateStarting;
+            //mainWindow.OnUpdateCompleted += MainWindow_OnUpdateCompleted;
+
+            InitComport(comportClient);
+            InitMoniter();
+        }
+
+        public ZhongShengLedControl(string comport, MainWindow mainWindow)
+        {
+            if (string.IsNullOrEmpty(comport))
+            {
+                return;
+            }
+
+            cancellationSource = new CancellationTokenSource();
+            this.mainWindow = mainWindow;
+            //mainWindow.OnUpdateStarting += MainWindow_OnUpdateStarting;
+            //mainWindow.OnUpdateCompleted += MainWindow_OnUpdateCompleted;
+
+            InitComport(comport);
+            InitMoniter();
+        }
+
+        private async void MainWindow_OnUpdateCompleted(object sender, EventArgs e)
+        {
+            if (!IsInitCompleted || isInEmergency)
+            {
+                return;
+            }
+            await SetGreenOn(true);
+            await SetYelloOn(false);
+        }
+
+        private async void MainWindow_OnUpdateStarting(object sender, EventArgs e)
+        {
+            if (!IsInitCompleted || isInEmergency)
+            {
+                return;
+            }
+
+            await SetGreenOn(false);
+            await SetYelloOn(true);
+        }
+
+        public void Dispose()
+        {
+            Application.Current.Dispatcher.Invoke(() => {
+                isDisposing = true;
+                //cancellationSource.Cancel();
+
+                Task.Delay(1000).Wait();
+
+                SetGreenOn(true).Wait();
+                SetYelloOn(false).Wait();
+                //mainWindow.OnUpdateStarting -= MainWindow_OnUpdateStarting;
+                //mainWindow.OnUpdateCompleted -= MainWindow_OnUpdateCompleted;
+                modbusRtuClient.Dispose();
+
+            });
+        }
+
+        public async Task DisposeAsync()
+        {
+            isDisposing = true;
+            //cancellationSource.Cancel();
+
+            //var wai = poolingMonitorTask.Result;
+            while(!isPoolingMonitorTaskComplete)
+            {
+                await Task.Delay(1000);
+            }
+
+            var test =  poolingMonitorTask.Status;
+
+            await SetGreenOn(true);
+            await SetYelloOn(false);
+            //mainWindow.OnUpdateStarting -= MainWindow_OnUpdateStarting;
+            //mainWindow.OnUpdateCompleted -= MainWindow_OnUpdateCompleted;
+            modbusRtuClient.Dispose();
+        }
+
+        private void InitComport(ModbusRtuClient comportClient)
+        {
+            modbusRtuClient = comportClient;
+        }
+
+        private void InitComport(string comport)
+        {
+            try
+            {
+                modbusRtuClient = new ModbusRtuClient()
+                {
+                    BaudRate = 38400,
+                    StopBits = System.IO.Ports.StopBits.One,
+                    Parity = System.IO.Ports.Parity.None    //arity奇偶
+                };
+                modbusRtuClient.Connect(comport);
+            }
+            catch (Exception ex)
+            {
+                MessageBox.Show("ZhongShengLed port open failed");
+                throw;
+            }
+        }
+
+        private void InitMoniter()
+        {
+            if (poolingMonitorTask != null)
+            {
+                return;
+            }
+
+            //poolingMonitorTask = MonitorTask(cancellationSource.Token);
+            poolingMonitorTask = Task.Factory.StartNew(() => MonitorTask().Wait(), TaskCreationOptions.AttachedToParent);
+        }
+
+        private async Task MonitorTask(CancellationToken token = default)
+        {
+            try
+            {
+                while (!token.IsCancellationRequested && !isDisposing)
+                {
+                    var emergencyDataRead = await Read(EmergencyAddress, token);
+                    if (isDisposing) return ;
+                    isInEmergency = emergencyDataRead > 0;
+                    if (isInEmergency)
+                    {
+                        //await SetGreenOn(false);
+                        await SetYelloOn(false, token);
+                        if (isDisposing) return ;
+                    }
+                    else
+                    {
+                        await SetGreenOn(false, token);
+                        if (isDisposing) return ;
+                        await SetYelloOn(true, token);
+                        if (isDisposing) return ;
+                    }
+                await Task.Delay(1000);
+                }
+            }
+            catch
+            {
+
+            }
+            finally
+            {
+                isPoolingMonitorTaskComplete = true;
+            }
+            return ;
+        }
+
+        public async Task SetGreenOn(bool isOn, CancellationToken token = default)
+        {
+            try
+            {
+                //var greenValue = await Read(GreenAddress);
+                //var isGreenOn = greenValue == 0;
+                //if (isGreenOn != isOn)
+                //{
+                //    await Write(GreenAddress, 1);
+                //}
+                await Write(GreenAddress, isOn ? (short)0 : (short)256, token);
+            }
+            catch (Exception ex)
+            {
+            }
+        }
+
+        public async Task SetYelloOn(bool isOn, CancellationToken token = default)
+        {
+            try
+            {
+                //var yelloValue = await Read(YelloAddress);
+                //var isYellowOn = yelloValue > 0;
+                //if (isYellowOn != isOn)
+                //{
+                //    await Write(YelloAddress, 1);
+                //}
+
+                await Write(YelloAddress, isOn ? (short)256 : (short)0, token);
+            }
+            catch (Exception ex)
+            {
+            }
+        }
+
+        private async Task Write(int address, short value, CancellationToken token = default)
+        {
+            //await semaphore.WaitAsync();
+            try
+            {
+                await modbusRtuClient.WriteSingleRegisterAsync(DevAddress, address, value, token);
+            }
+            catch (Exception e)
+            {
+            }
+            finally
+            {
+                //semaphore.Release();
+            }
+            return;
+        }
+
+        private async Task<short?> Read(int address, CancellationToken token = default)
+        {
+            //await semaphore.WaitAsync();
+            try
+            {
+                //var result = await modbusRtuClient.ReadInputRegistersAsync<short>(DevAddress, address, 1);
+                var result = await modbusRtuClient.ReadHoldingRegistersAsync<short>(DevAddress, address, 1, token);
+                var resultArray = result.ToArray();
+                if (resultArray.Length == 0)
+                {
+                    return null;
+                }
+                return resultArray[0];
+            }
+            catch (Exception ex)
+            {
+                return null;
+            }
+            finally
+            {
+                //semaphore.Release();
+            }
+        }
+    }
+}

+ 7 - 0
AwInitilizer/packages.config

@@ -1,7 +1,14 @@
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
   <package id="FluentFTP" version="37.0.2" targetFramework="net48" />
+  <package id="FluentModbus" version="5.2.0" targetFramework="net48" />
+  <package id="Microsoft.Extensions.Logging.Abstractions" version="5.0.0" targetFramework="net48" />
   <package id="Newtonsoft.Json" version="13.0.3" targetFramework="net48" />
   <package id="PhihongEv.Lib" version="1.0.16" targetFramework="net48" />
   <package id="RestSharp" version="106.15.0" targetFramework="net48" />
+  <package id="System.Buffers" version="4.5.1" targetFramework="net48" />
+  <package id="System.IO.Ports" version="5.0.0" targetFramework="net48" />
+  <package id="System.Memory" version="4.5.4" targetFramework="net48" />
+  <package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net48" />
+  <package id="System.Runtime.CompilerServices.Unsafe" version="4.5.3" targetFramework="net48" />
 </packages>

+ 1 - 1
GitVersion.yml

@@ -1,6 +1,6 @@
 assembly-versioning-scheme: MajorMinorPatch
 assembly-informational-format: '{ShortSha}'
-next-version: 1.11.5
+next-version: 1.12.1
 branches: {}
 ignore:
   sha: []

+ 3 - 3
Initilizer/AssemblyInfo.cs

@@ -9,7 +9,7 @@
                                               // app, or any theme specific resource dictionaries)
 )]
 
-[assembly: AssemblyVersion("1.11.5.0")]
-[assembly: AssemblyFileVersion("1.11.5.0")]
-[assembly: AssemblyInformationalVersion("266a5e2")]
+[assembly: AssemblyVersion("1.12.1.0")]
+[assembly: AssemblyFileVersion("1.12.1.0")]
+[assembly: AssemblyInformationalVersion("3be3a19")]
 

+ 4 - 4
MesAdaptor/Properties/AssemblyInfo.cs

@@ -31,7 +31,7 @@ using System.Runtime.InteropServices;
 //
 // You can specify all the values or you can default the Build and Revision Numbers
 // by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.11.5.0")]
-[assembly: AssemblyVersion("1.11.5.0")]
-[assembly: AssemblyFileVersion("1.11.5.0")]
-[assembly: AssemblyInformationalVersion("266a5e2")]
+// [assembly: AssemblyVersion("1.12.1.0")]
+[assembly: AssemblyVersion("1.12.1.0")]
+[assembly: AssemblyFileVersion("1.12.1.0")]
+[assembly: AssemblyInformationalVersion("3be3a19")]