Bläddra i källkod

Merge branch 'master' of http://unque781.synology.me:3000/GSI/OHV

# Conflicts:
#	Dev/OHV/OHV.Vehicle/Concept/D_MainWindowViewModel.cs
ys-hwang 6 år sedan
förälder
incheckning
47d97e0fec

+ 17 - 6
Dev/OHV/OHV.Common/Events/MessageEventArgs.cs

@@ -15,23 +15,29 @@ namespace OHV.Common.Events
         /// </summary>
         public enum eGUIMessageKind
         {
+            ModelPropertyChange, //각 Model 마다 사용 할 예정.
+
             RspIOObject,
             RspIOMapList,
             RspCommandList,
+            RspAutoModeChange,
+            RspManualModeChange,
+            RspAlarmReset,
         }
 
         public eGUIMessageKind Kind { get; set; }
-        public int MessageKey { get; set; }
+        public string MessageKey { get; set; }
         public string MessageText { get; set; }
         public Command Command { get; set; }
         public Dictionary<string, object> Dic { get; set; }
         public object Args { get; set; }
+        public FluentResults.Result Result { get; set; }
 
-        public GUIMessageEventArgs(eGUIMessageKind kind, object args)
-        {
-            this.Kind = kind;
-            this.Args = args;
-        }
+        //public GUIMessageEventArgs(eGUIMessageKind kind, object args)
+        //{
+        //    this.Kind = kind;
+        //    this.Args = args;
+        //}
     }
 
     /// <summary>
@@ -41,9 +47,14 @@ namespace OHV.Common.Events
     {
         public enum eVCSMessageKind
         {
+            ModelPropertyChange,
+
             ReqIOObject,
             ReqIOMapList,
             ReqCommandList,
+            ReqAutoModeChange,
+            ReqManualModeChange,
+            ReqAlarmReset,
         }
 
         public eVCSMessageKind Kind { get; set; }

+ 1 - 0
Dev/OHV/OHV.Common/Model/Alarm.cs

@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
 using System.ComponentModel.DataAnnotations.Schema;
 using System.Linq;
 using System.Text;

+ 2 - 2
Dev/OHV/OHV.Common/Model/HisAlarm.cs

@@ -14,9 +14,9 @@ namespace OHV.Common.Model
         public DateTime OccurTime { get; set; }
         public string Solution { get; set; }
 
-        public int? AlarmId { get; set; }
+        public int AlarmId { get; set; }
 
-        public virtual Alarm Alarm { get; set; }
+        //public virtual Alarm Alarm { get; set; }
 
         public HisAlarm()
         {

+ 1 - 1
Dev/OHV/OHV.Common/Model/SubCmd.cs

@@ -16,7 +16,7 @@ namespace OHV.Common.Model
             Move,
             Load,
             Unload,
-            Chaging,
+            Charge,
         }
 
         public enum eCmdType

+ 5 - 0
Dev/OHV/OHV.Common/Shareds/ConstString.cs

@@ -21,4 +21,9 @@ namespace OHV.Common.Shareds
         public const string TEACH_POSITION_LOCK = "Teach_Postion_Lock";
         public const string TEACH_POSITION_UNLOCK = "Teach_Postion_Unlock";
     }
+
+    public class MessageKey
+    {
+        public const string Alarm = "Alarm";
+    }
 }

+ 25 - 2
Dev/OHV/OHV.Common/Shareds/SharedEnumType.cs

@@ -42,10 +42,18 @@
 		Blocked,
 		Decelerate,
 	}
+
+	public enum eObstacleState
+	{
+		Normal,
+        Abnormal,
+        Blocked,
+        Decelerate,
+    }
     #endregion
 
     #region Opertation
-	public enum eOperatationMode
+    public enum eOperatationMode
 	{
 		ManualMode,
 		AutoMode,
@@ -58,6 +66,7 @@
 		StartRun,
 		Run,
 		Stop,
+		WaitStop,
 	}
 
     #endregion
@@ -74,9 +83,9 @@
 	public enum eCommandState
 	{
 		Queued,
-		Assign,
 		Processing,
 		Complete,
+		Paused,
 	}
 
 	public enum eCommandResult
@@ -100,4 +109,18 @@
 		Cylinder,
 		Drive,
 	}
+
+	public enum eBuzzerKind
+	{
+		Alarm,
+		StartWarn,
+		Moving,
+	}
+
+	public enum eLampState
+	{
+		Alarm,
+		Charging,
+		AutoRunNChargingFull, //충전 완료시에도 점등
+	}
 }

+ 1 - 1
Dev/OHV/OHV.Module.ListViews/Views/SubCommandListView.xaml

@@ -46,7 +46,7 @@
                 <ColumnDefinition Width="2*"/>
                 <ColumnDefinition Width="*"/>
             </Grid.ColumnDefinitions>
-            <DataGrid ItemsSource="{Binding CommandList}" CanUserSortColumns="True" CanUserAddRows="False" AutoGenerateColumns="False" materialDesign:DataGridAssist.CellPadding="13 8 8 8" 
+            <DataGrid ItemsSource="{Binding SubCmdList}" CanUserSortColumns="True" CanUserAddRows="False" AutoGenerateColumns="False" materialDesign:DataGridAssist.CellPadding="13 8 8 8" 
                                   materialDesign:DataGridAssist.ColumnHeaderPadding="8" Background="{x:Null}" Foreground="White" IsReadOnly="True" >
 
                 <DataGrid.Resources>

+ 2 - 2
Dev/OHV/OHV.Vehicle/Concept/D_MainWindow.xaml

@@ -229,14 +229,14 @@
                 <DockPanel Grid.Row="4">
                     <Border BorderBrush="#FF00FFD3" BorderThickness="2" Margin="5">
                         <StackPanel Orientation="Vertical" VerticalAlignment="Center" HorizontalAlignment="Center">
-                            <Button Margin="15" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="60" Width="250">
+                            <Button Margin="15" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="60" Width="250" Command="{Binding StartCommand}">
                                 <StackPanel Orientation="Horizontal">
                                     <materialDesign:PackIcon Kind="GooglePlay" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Height="40" Width="auto" Margin="0,0,20,0" Background="DarkGreen"/>
                                     <TextBlock Text="START" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="30"/>
                                 </StackPanel>
                             </Button>
 
-                            <Button Margin="15" HorizontalAlignment="Stretch" Height="60">
+                            <Button Margin="15" HorizontalAlignment="Stretch" Height="60" Command="{Binding StopCommand}">
                                 <StackPanel Orientation="Horizontal">
                                     <materialDesign:PackIcon Kind="Stop" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Height="40" Width="auto" Margin="0,0,32,0" Background="Orange"/>
                                     <TextBlock Text="STOP" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="30"/>

+ 4 - 14
Dev/OHV/OHV.Vehicle/Concept/D_MainWindow.xaml.cs

@@ -1,17 +1,6 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
+using System.ComponentModel;
 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;
 using GSG.NET.WPF.Extensions;
 
 namespace OHV.Vehicle.Concept
@@ -37,8 +26,6 @@ namespace OHV.Vehicle.Concept
                 this.Closing += MainWindow_Closing;
             }
 
-            App.splashScreen.AddMessage( "Done !" );
-            App.splashScreen.LoadComplete();
         }
 
         private void GridMain_MouseLeftButtonDown( object sender , MouseButtonEventArgs e )
@@ -64,6 +51,9 @@ namespace OHV.Vehicle.Concept
         {
             //throw new NotImplementedException();
             WindowExternal.MaximizeToFirstMonitor(this);
+
+            App.splashScreen.AddMessage("Done !");
+            App.splashScreen.LoadComplete();
         }
 
         private void Button_Click(object sender, RoutedEventArgs e)

+ 116 - 38
Dev/OHV/OHV.Vehicle/Concept/D_MainWindowViewModel.cs

@@ -1,5 +1,6 @@
 using CommonServiceLocator;
 using OHV.Common.Events;
+using OHV.Common.Model;
 using OHV.Common.Shareds;
 using OHV.Module.Interactivity;
 using OHV.SqliteDAL;
@@ -29,14 +30,14 @@ namespace OHV.Vehicle.Concept
         public string Title
         {
             get { return _title; }
-            set { SetProperty( ref _title , value ); }
+            set { SetProperty(ref _title, value); }
         }
 
         private double _cpu;
         public double CPU
         {
             get { return this._cpu; }
-            set { this.SetProperty( ref this._cpu , value ); }
+            set { this.SetProperty(ref this._cpu, value); }
         }
         private double _totalCPU;
         public double TotalCPU
@@ -45,7 +46,7 @@ namespace OHV.Vehicle.Concept
             set
             {
                 //this._totalCPU = dti.cpuResult.ToString();
-                this.SetProperty( ref this._totalCPU , value );
+                this.SetProperty(ref this._totalCPU, value);
             }
         }
         public int UsageCPU { get; set; }
@@ -54,14 +55,14 @@ namespace OHV.Vehicle.Concept
         public double RAM
         {
             get { return this._ram; }
-            set { this.SetProperty( ref this._ram , value ); }
+            set { this.SetProperty(ref this._ram, value); }
         }
 
         private double _cDrive;
         public double CDrive
         {
             get { return this._cDrive; }
-            set { this.SetProperty( ref this._cDrive , value ); }
+            set { this.SetProperty(ref this._cDrive, value); }
         }
 
         DateTime _dateTime;
@@ -70,7 +71,7 @@ namespace OHV.Vehicle.Concept
             get { return _dateTime; }
             set
             {
-                this.SetProperty( ref _dateTime , value );
+                this.SetProperty(ref _dateTime, value);
             }
         }
 
@@ -78,7 +79,7 @@ namespace OHV.Vehicle.Concept
         public string VehicleID
         {
             get { return this._vehicleID; }
-            set { this.SetProperty( ref this._vehicleID , value ); }
+            set { this.SetProperty(ref this._vehicleID, value); }
         }
 
         private string _vehicleIP = "127.0.0.1";
@@ -103,7 +104,7 @@ namespace OHV.Vehicle.Concept
             get { return _ocsBrush; }
             set
             {
-                SetProperty( ref _ocsBrush , value );
+                SetProperty(ref _ocsBrush, value);
             }
         }
         public Brush BatteryBrush
@@ -111,7 +112,7 @@ namespace OHV.Vehicle.Concept
             get { return _batteryBrush; }
             set
             {
-                SetProperty( ref _batteryBrush , value );
+                SetProperty(ref _batteryBrush, value);
             }
         }
         public Brush LaserBrush
@@ -119,7 +120,7 @@ namespace OHV.Vehicle.Concept
             get { return this._laserBrush; }
             set
             {
-                SetProperty( ref _laserBrush , value );
+                SetProperty(ref _laserBrush, value);
             }
         }
 
@@ -127,25 +128,32 @@ namespace OHV.Vehicle.Concept
         public string SwVersion
         {
             get { return this._swVersion; }
-            set { this.SetProperty( ref this._swVersion , value ); }
+            set { this.SetProperty(ref this._swVersion, value); }
         }
 
         private DateTime _lastBuildedTime;
         public DateTime LastBuildedTime
         {
             get { return this._lastBuildedTime; }
-            set { this.SetProperty( ref this._lastBuildedTime , value ); }
+            set { this.SetProperty(ref this._lastBuildedTime, value); }
         }
 
         IEventAggregator eventAggregator = null;
         VCSystem VCSystem = null;
         MessageController messageController;
 
+        VCSMessagePubSubEvent vcsMessagePublisher;
+
         public ICommand TestCommand { get; set; }
         public ICommand NavigateCommand { get; set; }
         public ICommand SystemOffCommand { get; set; }
+<<<<<<< HEAD
         public ICommand BuzzerStopCommand { get; set; }
         public ICommand EmergencyStopCommand { get; set; }
+=======
+        public ICommand StartCommand { get; set; }
+        public ICommand StopCommand { get; set; }
+>>>>>>> 52c448e88e2005d6b9bc85ad2c7b734e5cb29907
 
         IRegionManager regionManager;
         public Common.Events.HostConnectedEventArgs.eConnectedState State { get; set; }
@@ -159,6 +167,7 @@ namespace OHV.Vehicle.Concept
             //LanguageHalper.LanguagesSelcter.ChangLanguage(LanguageHalper.eLanguageType.Chinese);
         }
 
+<<<<<<< HEAD
         SqliteManager sql;
 
         public D_MainWindowViewModel( IEventAggregator _ea , VCSystem cSystem , IRegionManager _regionManager , MessageController _msgController, SqliteManager _sql )
@@ -168,6 +177,16 @@ namespace OHV.Vehicle.Concept
             this.eventAggregator = _ea;
             this.eventAggregator.GetEvent<GUIMessagePubSubEvent>().Subscribe( UICallbackCommunication , ThreadOption.UIThread );
             this.eventAggregator.GetEvent<HostConnectedPubSubEvent>().Subscribe( OcsConnectCallBack , ThreadOption.UIThread , false );
+=======
+        public D_MainWindowViewModel(IEventAggregator ea, VCSystem cSystem, IRegionManager _regionManager, MessageController messageController)
+        {
+            this.regionManager = _regionManager;
+
+            this.eventAggregator = ea;
+            this.eventAggregator.GetEvent<GUIMessagePubSubEvent>().Subscribe(UICallbackCommunication, ThreadOption.UIThread);
+            this.eventAggregator.GetEvent<HostConnectedPubSubEvent>().Subscribe(OcsConnectCallBack, ThreadOption.UIThread, false);
+            vcsMessagePublisher = this.eventAggregator.GetEvent<VCSMessagePubSubEvent>();
+>>>>>>> 52c448e88e2005d6b9bc85ad2c7b734e5cb29907
 
             this.VCSystem = cSystem;
             this.messageController = _msgController;
@@ -178,27 +197,29 @@ namespace OHV.Vehicle.Concept
             this.OcsIP = sql.ConfigDal.GetK( ConstString.Addr ).Value;
 
             //this.TestCommand = new DelegateCommand( ExecuteTextCommand );
-            this.NavigateCommand = new DelegateCommand<object>( this.Navigate );
-            this.SystemOffCommand = new DelegateCommand( ExecuteSystemOffCommand );
+            this.NavigateCommand = new DelegateCommand<object>(this.Navigate);
+            this.SystemOffCommand = new DelegateCommand(ExecuteSystemOffCommand);
             this.ChangeLanguage = new DelegateCommand(Execte_ChangeLanguage);
+            this.StartCommand = new DelegateCommand(ExecuteStartCommand);
+            this.StopCommand = new DelegateCommand(ExecuteStopCommand);
 
             DispatcherTimer dateTimer = new DispatcherTimer();
-            dateTimer.Tick += ( object sender , EventArgs e ) =>
+            dateTimer.Tick += (object sender, EventArgs e) =>
             {
                 this.DateTime = DateTime.Now;
-                
+
             };
-            dateTimer.Interval = TimeSpan.FromMilliseconds( 500 );
+            dateTimer.Interval = TimeSpan.FromMilliseconds(500);
             dateTimer.Start();
 
             DispatcherTimer deskTopTimer = new DispatcherTimer();
-            deskTopTimer.Tick += ( object sender , EventArgs e ) =>
+            deskTopTimer.Tick += (object sender, EventArgs e) =>
             {
                 this.CPU = dti.GetCpuUsage();
-                this.UsageCPU = ( int )dti.GetCpuUsage();
+                this.UsageCPU = (int)dti.GetCpuUsage();
                 this.RAM = dti.GetRamUsage();
             };
-            deskTopTimer.Interval = TimeSpan.FromMilliseconds( 1000 );
+            deskTopTimer.Interval = TimeSpan.FromMilliseconds(1000);
             deskTopTimer.Start();
 
             this._totalCPU = dti.cpuResult;
@@ -208,11 +229,41 @@ namespace OHV.Vehicle.Concept
             this.LastBuildedTime = new Helpler.AssemblyInfo().Get_BuildDateTime();
         }
 
-        private void OcsConnectCallBack( HostConnectedEventArgs obj )
+        private void ExecuteStopCommand()
+        {
+            this.messageController.ShowConfirmationPopupView("Request Vehicle Auto Mode ?", r =>
+            {
+                if (r.Result == ButtonResult.OK)
+                {
+                    var msg = new VCSMessageEventArgs
+                    {
+                        Kind = VCSMessageEventArgs.eVCSMessageKind.ReqManualModeChange,
+                    };
+                    vcsMessagePublisher.Publish(msg);
+                }
+            });
+        }
+
+        private void ExecuteStartCommand()
+        {
+            this.messageController.ShowConfirmationPopupView("Request Vehicle Auto Mode ?", r =>
+            {
+                if (r.Result == ButtonResult.OK)
+                {
+                    var msg = new VCSMessageEventArgs
+                    {
+                        Kind = VCSMessageEventArgs.eVCSMessageKind.ReqAutoModeChange,
+                    };
+                    vcsMessagePublisher.Publish(msg);
+                }
+            });
+        }
+
+        private void OcsConnectCallBack(HostConnectedEventArgs obj)
         {
             this.State = obj.State;
 
-            switch ( this.State )
+            switch (this.State)
             {
                 case HostConnectedEventArgs.eConnectedState.Disconnected:
                     this.OcsBrush = Brushes.Yellow;
@@ -223,38 +274,65 @@ namespace OHV.Vehicle.Concept
             }
         }
 
-        private void ExecuteSystemOffCommand( )
+        private void ExecuteSystemOffCommand()
         {
-            this.messageController.ShowConfirmationPopupView( "System ShutDown ?" , r =>
-            {
-                if ( r.Result == ButtonResult.OK )
-                    App.Current.Shutdown();
-            } );
+            this.messageController.ShowConfirmationPopupView("System ShutDown ?", r =>
+          {
+              if (r.Result == ButtonResult.OK)
+                  App.Current.Shutdown();
+          });
         }
 
-        private void Navigate( object obj )
+        private void Navigate(object obj)
         {
             var selectItem = obj.ToString();
-            if ( !string.IsNullOrEmpty(selectItem ))
-                regionManager.RequestNavigate( "MainView" , selectItem );
+            if (!string.IsNullOrEmpty(selectItem))
+                regionManager.RequestNavigate("MainView", selectItem);
         }
 
-        private void UICallbackCommunication( GUIMessageEventArgs obj )
+        private void UICallbackCommunication(GUIMessageEventArgs obj)
         {
+            switch (obj.Kind)
+            {
+                case GUIMessageEventArgs.eGUIMessageKind.ModelPropertyChange:
+                    this.UICallBackModelPropertyChange(obj);
+                    break;
+                case GUIMessageEventArgs.eGUIMessageKind.RspIOObject:
+                    break;
+                case GUIMessageEventArgs.eGUIMessageKind.RspIOMapList:
+                    break;
+                case GUIMessageEventArgs.eGUIMessageKind.RspCommandList:
+                    break;
+                case GUIMessageEventArgs.eGUIMessageKind.RspAutoModeChange:
+                    break;
+                case GUIMessageEventArgs.eGUIMessageKind.RspManualModeChange:
+                    break;
+                default:
+                    break;
+            }
+        }
+
+        void UICallBackModelPropertyChange(GUIMessageEventArgs args)
+        {
+            if (args.MessageKey.Equals(MessageKey.Alarm))
+            {
+                var hisAlarm = args.Args as HisAlarm;
+                this.messageController.ShowNotificationView(args.MessageText);
+            }
         }
 
-        private void ExecuteTextCommand( )
+        private void ExecuteTextCommand()
         {
             var m = new VCSMessageEventArgs();
             m.MessageKey = 1234;
             m.MessageText = "Test Message";
-            m.Command = new Common.Model.Command() { CommandID = "TestCommand123" , Type = Common.Shareds.eCommandType.Move };
+            m.Command = new Common.Model.Command() { CommandID = "TestCommand123", Type = Common.Shareds.eCommandType.Move };
 
-            this.eventAggregator.GetEvent<VCSMessagePubSubEvent>().Publish( m );
+            this.eventAggregator.GetEvent<VCSMessagePubSubEvent>().Publish(m);
         }
 
 
-        public void InitViewModel( )
+        public void InitViewModel()
         {
             //VCSystem.Instance.Init();
             //var containerRegistry = ServiceLocator.Current.GetInstance<VCSystem>();
@@ -264,10 +342,10 @@ namespace OHV.Vehicle.Concept
             //}
             //var vsys = containerRegistry.GetContainer().Resolve<IContainerProvider>();
 
-            regionManager.RequestNavigate( RegionNames.MainView , "AutoView" );
+            regionManager.RequestNavigate(RegionNames.MainView, "AutoView");
         }
 
-        public void Dispose( )
+        public void Dispose()
         {
             //VCSystem.Instance.Dispose();
         }

+ 3 - 1
Dev/OHV/OHV.Vehicle/Config/AlarmDefind..csv

@@ -16,4 +16,6 @@
 16,Conveyor,Inverter Error,,,1,0
 17,PIO,Port PIO Ready Off,,,1,0
 18,PIO,Port PIO Time Out,,,1,0
-19,,,,,,
+19,PIO,Port PIO InterLock On,,,1,0
+20,Conveyor,Loading Position Wrong,,,1,0
+21,Conveyor,Loading Position Wrong,,,1,0

+ 1 - 1
Dev/OHV/OHV.Vehicle/OHV.Vehicle.csproj

@@ -38,7 +38,7 @@
     <DebugType>full</DebugType>
     <Optimize>false</Optimize>
     <OutputPath>..\OutRelese\</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DefineConstants>TRACE;DEBUG;SIMULATION</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
     <Prefer32Bit>true</Prefer32Bit>

+ 11 - 13
Dev/OHV/VehicleControlSystem/ControlLayer/Clamp.cs

@@ -14,7 +14,7 @@ using VehicleControlSystem.ControlLayer.Lib.EziPlusE;
 
 namespace VehicleControlSystem.ControlLayer
 {
-    public class Clamp
+    public class Clamp : ControlObjectBase
     {
         SqliteManager sql = null;
         List<EzAxis> axes = new List<EzAxis>();
@@ -79,7 +79,6 @@ namespace VehicleControlSystem.ControlLayer
             }
         }
 
-
         void PublishEvent(AxisControlEventArgs args)
         {
             this.eventAggregator.GetEvent<AxisControlPubSubEvent>().Publish(args);
@@ -324,7 +323,7 @@ namespace VehicleControlSystem.ControlLayer
         {
             int result = 0;
 
-            result = this.AllOriginReturn();
+            result = this.IsAllAxisOriginReturn();
             if (result != 0)
                 return result;
 
@@ -338,20 +337,19 @@ namespace VehicleControlSystem.ControlLayer
 
             result = left.StartMove(leftData.Value, 0);
             if (result != EziMOTIONPlusELib.FMM_OK)
-                return result;
+                return 1;
 
             result = right.StartMove(rightData.Value, 0);
             if (result != EziMOTIONPlusELib.FMM_OK)
-                return result;
+                return 3;
 
             result = left.Wait4Done();
             if (result != EziMOTIONPlusELib.FMM_OK)
-                return result;
+                return 1;
 
             result = right.Wait4Done();
             if (result != EziMOTIONPlusELib.FMM_OK)
-                return result;
-
+                return 1;
 
             return EziMOTIONPlusELib.FMM_OK;
         }
@@ -364,7 +362,7 @@ namespace VehicleControlSystem.ControlLayer
         {
             int result = 0;
 
-            result = this.AllOriginReturn();
+            result = this.IsAllAxisOriginReturn();
             if (result != 0)
                 return result;
 
@@ -378,19 +376,19 @@ namespace VehicleControlSystem.ControlLayer
 
             result = left.StartMove(leftData.Value, 0);
             if (result != EziMOTIONPlusELib.FMM_OK)
-                return result;
+                return 2;
 
             result = right.StartMove(rightData.Value, 0);
             if (result != EziMOTIONPlusELib.FMM_OK)
-                return result;
+                return 4;
 
             result = left.Wait4Done();
             if (result != EziMOTIONPlusELib.FMM_OK)
-                return result;
+                return 2;
 
             result = right.Wait4Done();
             if (result != EziMOTIONPlusELib.FMM_OK)
-                return result;
+                return 4;
 
 
             return EziMOTIONPlusELib.FMM_OK;

+ 51 - 0
Dev/OHV/VehicleControlSystem/ControlLayer/ControlObjectBase.cs

@@ -0,0 +1,51 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Runtime.CompilerServices;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace VehicleControlSystem.ControlLayer
+{
+    public abstract class ControlObjectBase : INotifyPropertyChanged
+    {
+        public event PropertyChangedEventHandler PropertyChanged;
+
+        protected void OnPropertyChanged(string name)
+        {
+            PropertyChangedEventHandler handler = PropertyChanged;
+            if (handler != null)
+            {
+                handler?.Invoke(this, new PropertyChangedEventArgs(name));
+            }
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="field">필드 변수</param>
+        /// <param name="newValue"></param>
+        /// <param name="isComparer">이전 값과 비교를 할지 Default = true</param>
+        /// <param name="propertyName"></param>
+        /// <returns></returns>
+        protected bool SetField<T>(ref T field, T newValue = default(T), bool isComparer = true, [CallerMemberName] string propertyName = null)
+        {
+            if (isComparer)
+                if (EqualityComparer<T>.Default.Equals(field, newValue)) return false;
+
+            field = newValue;
+
+            if (propertyName != null)
+            {
+                OnPropertyChanged(propertyName);
+
+                return true;
+            }
+
+            return false;
+        }
+
+    }
+}

+ 12 - 2
Dev/OHV/VehicleControlSystem/ControlLayer/Conveyor.cs

@@ -10,7 +10,7 @@ using VehicleControlSystem.ControlLayer.IO;
 
 namespace VehicleControlSystem.ControlLayer
 {
-    public class Conveyor
+    public class Conveyor :ControlObjectBase
     {
         static Logger loggerPIO = Logger.GetLogger("PIO");
         IIO iO = null;
@@ -56,11 +56,13 @@ namespace VehicleControlSystem.ControlLayer
         /// 실물 감지
         /// </summary>
         /// <returns></returns>
-        bool IsDetectedCenter() => this.iO.IsOn("IN_CV_DETECT_01"); 
+        public bool IsDetectedCenter() => this.iO.IsOn("IN_CV_DETECT_01");
+        
         bool IsDetectedLoadStop() => this.iO.IsOn("IN_CV_DETECT_02");
         bool IsInverterError() => this.iO.IsOn("IN_CV_ERROR");
         bool IsLifterPositinCheck() => this.iO.IsOn("IN_LIFTER_POSITION_DETECT");
         bool IsLifterDuplication() => this.iO.IsOn("IN_LIFTER_DUPLICATION_DETECT");
+        bool IsPIOInterLockOn() => this.iO.IsOn("OUT_PIO_INTERLOCK");
 
         int Load_Carrier()
         {
@@ -165,6 +167,14 @@ namespace VehicleControlSystem.ControlLayer
                     this.SetConveyorSpeed(false);
 
                 if (this.IsDetectedLoadStop()) break;
+
+                if (this.IsPIOInterLockOn())
+                {
+                    PIOClear();
+                    this.OnOffConveyor(false); //Stop
+                    loggerPIO.E("[Port] PIO InterLock On ");
+                    return 19; //Conveyor Moving Timeout
+                }
             }
 
             this.OnOffConveyor(false); //Stop

+ 1 - 5
Dev/OHV/VehicleControlSystem/ControlLayer/Steering.cs

@@ -1,18 +1,14 @@
 using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
 using System.Threading.Tasks;
 using GSG.NET.Logging;
 using GSG.NET.Utils;
 using OHV.SqliteDAL;
 using Prism.Events;
 using VehicleControlSystem.ControlLayer.IO;
-using VehicleControlSystem.Managers;
 
 namespace VehicleControlSystem.ControlLayer
 {
-    public class Steering
+    public class Steering : ControlObjectBase
     {
         static Logger logger = Logger.GetLogger();
 

+ 127 - 61
Dev/OHV/VehicleControlSystem/ControlLayer/Vehicle.cs

@@ -2,11 +2,10 @@
 using System.Collections;
 using System.Collections.Generic;
 using System.Linq;
-using System.Text;
 using System.Threading;
-using System.Threading.Tasks;
 using GSG.NET.Concurrent;
 using GSG.NET.Logging;
+using GSG.NET.Quartz;
 using GSG.NET.Utils;
 using OHV.Common.Events;
 using OHV.Common.Model;
@@ -14,7 +13,6 @@ using OHV.Common.Shareds;
 using OHV.SqliteDAL;
 using Prism.Events;
 using VehicleControlSystem.ControlLayer.Actuator.Cylinder;
-using VehicleControlSystem.ControlLayer.Axis;
 using VehicleControlSystem.ControlLayer.IO;
 using VehicleControlSystem.ControlLayer.Motion;
 using VehicleControlSystem.Managers;
@@ -24,7 +22,7 @@ namespace VehicleControlSystem.ControlLayer
     /// <summary>
     /// Control Layer 의 자원을 여기서 사용하자.
     /// </summary>
-    public class Vehicle : IDisposable
+    public class Vehicle : ControlObjectBase, IDisposable
     {
         static Logger logger = Logger.GetLogger();
 
@@ -50,11 +48,36 @@ namespace VehicleControlSystem.ControlLayer
         public bool IsMoving { get; set; }
         public double BatteryVolt { get; set; }
         public bool IsError { get; set; }
-        public bool IsContain { get { return this.iO.IsOn("IN_Carrier_Detect"); } }
+        public bool IsContain { get { return this.conveyor.IsDetectedCenter(); } }
 
         public SubCmd CurrentSubCommand { get; private set; }
         #endregion
 
+        #region Event
+        public event Action OnMoveReady;
+        public event Action OnMoving;
+        public event Action OnMoveFinish;
+
+        public event Action OnChargingStart;
+        public event Action OnCharging;
+        public event Action OnChargingFull;
+        public event Action<double> OnBatteryVelueChanged;
+
+        public event Action<bool> OnPIOStart;
+        public event Action<bool> OnConveyorStart;
+        public event Action<bool> OnConveyorStop;
+        public event Action<bool> OnCarrierDetected;
+        public event Action OnLoadComplete;
+        public event Action OnUnloadComplete;
+
+        public event Action<int> OnCurrentPotisionChanged;
+
+        public event Action OnManualMove;
+        public event Action OnManualLoad;
+        public event Action OnManualUnload;
+        public event Action OnManualCharging;
+        #endregion
+
         IIO iO = null;
         GSIMotion motion = null;
         SqliteManager sql = null;
@@ -71,15 +94,23 @@ namespace VehicleControlSystem.ControlLayer
 
         ThreadCancel cancel = new ThreadCancel();
 
-        private eVehicleState vehicleState = eVehicleState.Idle;
+        private eObstacleState obstacleState = eObstacleState.Normal;
+        public eObstacleState ObstacleStateProperty
+        {
+            get { return obstacleState; }
+            set { SetField(ref this.obstacleState, value); }
+        }
+
+        private eVehicleState vehicleState;
 
         public eVehicleState VehicleStateProperty
         {
             get { return vehicleState; }
-            set { vehicleState = value; }
+            set { SetField(ref this.vehicleState, value); }
         }
 
         IEventAggregator eventAggregator;
+
         public Vehicle(IIO io, SqliteManager sqliteManager, IEventAggregator ea, AutoManager auto)
         {
             this.iO = io;
@@ -175,7 +206,8 @@ namespace VehicleControlSystem.ControlLayer
             {
                 try
                 {
-                    this.CheckObstacle();
+                    if (this.autoManager.OperationModeProperty == eOperatationMode.AutoMode)
+                        this.CheckObstacle();
                 }
                 catch (ThreadInterruptedException threadInterruptedException)
                 {
@@ -201,7 +233,10 @@ namespace VehicleControlSystem.ControlLayer
             {
                 try
                 {
-                    if (this.VehicleStateProperty != eVehicleState.Idle) //상태가 Idle 가 아니면 subcmd 를 가져 오지 않는다.
+                    if (this.ObstacleStateProperty != eObstacleState.Normal) //장애물 감지 상태 시 조그 동작만 가능하게.
+                        continue;
+
+                    if (this.autoManager.AutoModeStateProperty != eAutoModeState.Run) // 
                         continue;
 
                     var subCmd = sql.SubCmdDAL.GetSubCmd();
@@ -225,12 +260,17 @@ namespace VehicleControlSystem.ControlLayer
 
                         case SubCmd.eType.Load:
                             this.CurrentSubCommand = subCmd;
-                            this.Load(subCmd);
+                            this.LoadCarrier(subCmd);
                             break;
 
                         case SubCmd.eType.Unload:
+                            this.CurrentSubCommand = subCmd;
+                            this.UnloadCarrier(subCmd);
                             break;
-                        case SubCmd.eType.Chaging:
+
+                        case SubCmd.eType.Charge:
+                            this.CurrentSubCommand = subCmd;
+                            this.BatteryCharge(subCmd);
                             break;
                         default:
                             break;
@@ -250,9 +290,7 @@ namespace VehicleControlSystem.ControlLayer
             }
             logger.D("Vehicle - _ThSubCmdWorker Dispose");
         }
-
-
-        #endregion        
+        #endregion
 
         #region Control Action Method
 
@@ -269,115 +307,144 @@ namespace VehicleControlSystem.ControlLayer
 
         bool MoveTo(string pointID)
         {
+            ////ToDo: 부저를 울리는 시간을 설정에 넣자.
+            //this.BuzzerOnOff(true, eBuzzerKind.StartWarn);
+            ////TimerUtils.Once(3000, BuzzerOnOff, false, eBuzzerKind.StartWarn );
+            //Thread.Sleep(3000);
+            //this.BuzzerOnOff(false);
+            this.OnMoveReady?.Invoke();
+            Thread.Sleep(3000);
+            this.OnMoving?.Invoke();
+            this.IsMoving = true;
+
+            //this.BuzzerOnOff(true, eBuzzerKind.Moving);
             this.motion.MoveToPoint(pointID, 100);
 
-            return Wait4MoveDone();
+            Wait4MoveDone();
+            this.IsMoving = false;
+            //this.BuzzerOnOff(false);
+            this.OnMoveFinish?.Invoke();
+
+            return true;
         }
 
         bool Wait4MoveDone()
         {
-            int waitTime = 60000;
+            int waitTime = 6000; //설정 할 수있게.
             long st = SwUtils.CurrentTimeMillis;
 
             //Todo: 이동시 확인 사항들.
             while (true)
             {
+                Thread.Sleep(5);
+
                 if (SwUtils.Gt(st, waitTime))
                 {
                     //Todo: 이동시간 초과 시 동작들.
                     break;
                 }
 
-                if (this.VehicleStateProperty == eVehicleState.Blocked)
+                if (this.ObstacleStateProperty == eObstacleState.Blocked)
                     return false;
             }
             return true;
         }
 
-        //Load
-        void Load(SubCmd sub)
-        {
-            if (this.LoadCarrier(sub))
-                sql.SubCmdDAL.Delete(sub);
-        }
-
         public bool LoadCarrier(SubCmd sub)
         {
             var route = sql.RouteDal.GetRoute(sub.TargetID);
 
             if (!CorrectPosition(route, this.CurrentPosition))
+            {
+                this.autoManager.ProcessAlarm(20);
                 return false; //Alarm
+            }
 
+            int result = this.clamp.Unlock_Sync();
+            if (result != 0)
+            {
+                this.autoManager.ProcessAlarm(result);
+                return false;
+            }
 
+            result = this.conveyor.PIOAndLoad(sub.TargetID);
+            if (result != 0)
+            {
+                this.autoManager.ProcessAlarm(result);
+                return false;
+            }
 
+            result = this.clamp.Lock_Sync();
+            if (result != 0)
+            {
+                this.autoManager.ProcessAlarm(result);
+                return false;
+            }
 
-            return Wait4LoadCarreir();
+            return true;
         }
 
-        bool Wait4LoadCarreir()
+        public bool UnloadCarrier(SubCmd sub)
         {
-            int waitTime = 60000;
-            long st = SwUtils.CurrentTimeMillis;
+            var route = sql.RouteDal.GetRoute(sub.TargetID);
 
-            //Todo: 이동시 확인 사항들.
-            while (true)
+            if (!CorrectPosition(route, this.CurrentPosition))
             {
-                if (SwUtils.Gt(st, waitTime))
-                {
-                    //Todo: 이동시간 초과 시 동작들.
-                    break;
-                }
+                this.autoManager.ProcessAlarm(21);
+                return false; //Alarm
             }
-            return true;
-        }
 
-        public bool UnloadCarrier()
-        {
-            return Wait4UnloadCarreir();
+            int result = this.clamp.Unlock_Sync();
+            if (result != 0)
+            {
+                this.autoManager.ProcessAlarm(result);
+                return false;
+            }
+
+            result = this.conveyor.PIOAndUnload(sub.TargetID);
+            if (result != 0)
+            {
+                this.autoManager.ProcessAlarm(result);
+                return false;
+            }
+
+            return true;
         }
 
-        bool Wait4UnloadCarreir()
+        public bool BatteryCharge(SubCmd sub)
         {
-            int waitTime = 60000;
-            long st = SwUtils.CurrentTimeMillis;
 
-            //Todo: 이동시 확인 사항들.
-            while (true)
-            {
-                if (SwUtils.Gt(st, waitTime))
-                {
-                    //Todo: 이동시간 초과 시 동작들.
-                    break;
-                }
-            }
             return true;
         }
+
         #endregion
 
         #region Check Method
         bool CheckObstacle()
         {
-            if (this.iO.IsOn("IN_OBSTRUCTION_DETECT_SLOW"))
+            if (this.iO.IsOn("IN_OBSTRUCTION_DETECT_SAFETY") || this.iO.IsOn("IN_OBSTRUCTION_DETECT_ERROR"))
             {
-                this.motion.SlowStop();
-                this.VehicleStateProperty = eVehicleState.Decelerate;
+                this.motion.Stop();
+                this.ObstacleStateProperty = eObstacleState.Abnormal;
                 return true;
             }
 
             if (this.iO.IsOn("IN_OBSTRUCTION_DETECT_STOP"))
             {
                 this.motion.Stop();
-                this.VehicleStateProperty = eVehicleState.Blocked;
+                this.ObstacleStateProperty = eObstacleState.Blocked;
                 return true;
             }
 
-            if (this.iO.IsOn("IN_OBSTRUCTION_DETECT_SAFETY") || this.iO.IsOn("IN_OBSTRUCTION_DETECT_ERROR"))
+            if (this.iO.IsOn("IN_OBSTRUCTION_DETECT_SLOW"))
             {
-                this.motion.Stop();
-                this.VehicleStateProperty = eVehicleState.Abnormal;
+                this.motion.SlowStop();
+                this.ObstacleStateProperty = eObstacleState.Decelerate;
                 return true;
             }
 
+            this.ObstacleStateProperty = eObstacleState.Normal;
+
             return false;
         }
 
@@ -386,14 +453,13 @@ namespace VehicleControlSystem.ControlLayer
         #region Machanical Method
         #endregion
 
-        #region Hardware Method
+        #region Hardware Create Method
         void CreateSteering()
         {
             this.steering = new Steering(this.iO, this.sql, this.eventAggregator);
             this.steering.OnSteeringError += Steering_OnSteeringError;
         }
 
-
         void CreateClamp()
         {
             this.clamp = new Clamp(this.sql, this.eventAggregator);

+ 171 - 10
Dev/OHV/VehicleControlSystem/Managers/AutoManager.cs

@@ -1,13 +1,14 @@
 using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Linq;
 using System.Threading;
-using System.Threading.Tasks;
 using GSG.NET.Concurrent;
 using GSG.NET.Logging;
 using OHV.Common.Shareds;
 using VehicleControlSystem.ControlLayer.IO;
+using Prism.Events;
+using OHV.SqliteDAL;
+using OHV.Common.Model;
+using OHV.Common.Events;
+using VehicleControlSystem.ControlLayer;
 
 namespace VehicleControlSystem.Managers
 {
@@ -22,37 +23,157 @@ namespace VehicleControlSystem.Managers
         bool isThreadAlive = false;
 
         IIO iO = null;
+        bool IsErrorProcessing = false;
+        IEventAggregator eventAggregator = null;
+        SqliteManager sql = null;
 
         private eOperatationMode operationMode;
-
         public eOperatationMode OperationModeProperty
         {
             get { return operationMode; }
-            set { operationMode = value; }
+            set
+            {
+                if (operationMode == value) return;
+
+                operationMode = value;
+                logger.D($"[AutoManager] OperationMode - {value}");
+            }
         }
 
         private eAutoModeState autoModeState;
-
         public eAutoModeState AutoModeStateProperty
         {
             get { return autoModeState; }
-            set { autoModeState = value; }
+            set
+            {
+                if (autoModeState == value) return;
+
+                autoModeState = value;
+                logger.D($"[AutoManager] AutoModeState - {value}");
+            }
+        }
+
+        private eLampState lampState;
+        public eLampState LampStateProperty
+        {
+            get { return lampState; }
+            set
+            {
+                if (lampState == value) return;
+
+                lampState = value;
+                this.LampStateChange(value);
+            }
         }
 
-        public AutoManager( IIO io )
+        private eBuzzerKind buzzerState;
+        public eBuzzerKind BuzzerStateProperty
+        {
+            get { return buzzerState; }
+            set { buzzerState = value; }
+        }
+
+        public AutoManager(IIO io, IEventAggregator ea, SqliteManager sql)
         {
             this.iO = io;
+            this.eventAggregator = ea;
+            this.sql = sql;
         }
 
-        public void Init()
+        #region Vehicle Events
+        private void Vehicle_OnChargingFull()
+        {
+            LampStateChange(eLampState.AutoRunNChargingFull);
+        }
+
+        private void Vehicle_OnCharging()
+        {
+            LampStateChange(eLampState.Charging);
+        }
+
+        private void Vehicle_OnMoveFinish()
+        {
+            BuzzerOnOff(false);
+            logger.D("Vehicle Move Finish");
+        }
+
+        private void Vehicle_OnMoving()
+        {
+            BuzzerOnOff(true, eBuzzerKind.Moving);
+            logger.D("Vehicle Moving");
+        }
+
+        private void Vehicle_OnMoveReady()
+        {
+            BuzzerOnOff(true, eBuzzerKind.StartWarn);
+            logger.D("Vehicle Move Ready");
+        }
+        #endregion
+
+        public void Init(Vehicle vehicle)
         {
             this.OperationModeProperty = eOperatationMode.ManualMode;
             this.AutoModeStateProperty = eAutoModeState.Stop;
 
             this.isThreadAlive = true;
             this.threadWorker = ThreadUtils.Invoke(this.ThreadWork);
+
+            vehicle.OnMoveReady += Vehicle_OnMoveReady;
+            vehicle.OnMoving += Vehicle_OnMoving;
+            vehicle.OnMoveFinish += Vehicle_OnMoveFinish;
+            vehicle.OnCharging += Vehicle_OnCharging;
+            vehicle.OnChargingFull += Vehicle_OnChargingFull;
         }
 
+        #region Lamp & Buzzer
+        void LampStateChange(eLampState state)
+        {
+            this.iO.OutputOff("OUT_TOWER_LAMP_RED");
+            this.iO.OutputOff("OUT_TOWER_LAMP_GREEN");
+            this.iO.OutputOff("OUT_TOWER_LAMP_BLUE");
+
+            switch (state)
+            {
+                case eLampState.Alarm:
+                    this.iO.OutputOff("OUT_TOWER_LAMP_RED");
+                    break;
+                case eLampState.Charging:
+                    this.iO.OutputOff("OUT_TOWER_LAMP_GREEN");
+                    break;
+                case eLampState.AutoRunNChargingFull:
+                    this.iO.OutputOff("OUT_TOWER_LAMP_BLUE");
+                    break;
+                default:
+                    break;
+            }
+        }
+
+        void BuzzerOnOff(bool isOn, eBuzzerKind kind = eBuzzerKind.Alarm)
+        {
+            this.iO.OutputOff("OUT_BUZZER_00");
+            this.iO.OutputOff("OUT_BUZZER_01");
+            this.iO.OutputOff("OUT_BUZZER_02");
+
+            if (!isOn)
+                return;
+
+            switch (kind)
+            {
+                case eBuzzerKind.Alarm:
+                    this.iO.OutputOn("OUT_BUZZER_00");
+                    break;
+                case eBuzzerKind.StartWarn:
+                    this.iO.OutputOn("OUT_BUZZER_01");
+                    break;
+                case eBuzzerKind.Moving:
+                    this.iO.OutputOn("OUT_BUZZER_02");
+                    break;
+                default:
+                    break;
+            }
+        }
+        #endregion
+
         void ThreadWork()
         {
             while (this.isThreadAlive)
@@ -81,8 +202,19 @@ namespace VehicleControlSystem.Managers
                     switch (this.AutoModeStateProperty)
                     {
                         case eAutoModeState.ErrorStop:
+                            if ( !IsErrorProcessing )
+                                this.AutoModeStateProperty = eAutoModeState.WaitStop;
+
+                            break;
+                        case eAutoModeState.WaitStop:
+                            this.AutoModeStateProperty = eAutoModeState.Stop;
+                            break;
+                        case eAutoModeState.Stop:
+                            this.OperationModeProperty = eOperatationMode.ManualMode;
                             break;
                         case eAutoModeState.StartRun:
+                            this.AutoModeStateProperty = eAutoModeState.Run;
+                            this.LampStateProperty = eLampState.AutoRunNChargingFull;
                             break;
                         case eAutoModeState.Run:
                             break;
@@ -100,6 +232,35 @@ namespace VehicleControlSystem.Managers
         public void ProcessAlarm(int alarmID)
         {
             this.AutoModeStateProperty = eAutoModeState.ErrorStop;
+            this.LampStateProperty = eLampState.Alarm;
+
+            HisAlarm hisAlarm = new HisAlarm();
+            var alarm = sql.AlarmDAL.GetK(alarmID);
+            if (alarm == null)
+            {
+                hisAlarm.AlarmId = alarmID;
+                hisAlarm.Text = "Not Define Alarm";
+            }
+            else
+            {
+                hisAlarm.AlarmId = alarmID;
+                hisAlarm.Text = alarm.Text;
+                hisAlarm.Solution = alarm.Solution;
+                //hisAlarm.Alarm = alarm;
+            }
+            sql.HisAlarmDAL.Add(hisAlarm);
+
+            if (IsErrorProcessing)
+                return;
+
+            var msg = new GUIMessageEventArgs
+            {
+                Kind = GUIMessageEventArgs.eGUIMessageKind.ModelPropertyChange,
+                MessageKey = MessageKey.Alarm,
+                MessageText = hisAlarm.Text,
+                Args = hisAlarm,
+            };
+            this.eventAggregator.GetEvent<GUIMessagePubSubEvent>().Publish(msg);
         }
 
         #region IDisposable Support

+ 245 - 5
Dev/OHV/VehicleControlSystem/Managers/HostManager.cs

@@ -51,8 +51,185 @@ namespace VehicleControlSystem.Managers
 
             //Vehicle Server.
             this.manager.Connect(false);
+
+            //Vehicle Event
+            vehicle.OnBatteryVelueChanged += Vehicle_OnBatteryVelueChanged;
+            vehicle.OnChargingStart += Vehicle_OnChargingStart;
+            vehicle.OnCharging += Vehicle_OnCharging;
+            vehicle.OnChargingFull += Vehicle_OnChargingFull;
+
+            vehicle.OnCurrentPotisionChanged += Vehicle_OnCurrentPotisionChanged;
+
+            vehicle.OnManualLoad += Vehicle_OnManualLoad;
+            vehicle.OnManualMove += Vehicle_OnManualMove;
+            vehicle.OnManualUnload += Vehicle_OnManualUnload;
+            vehicle.OnManualCharging += Vehicle_OnManualCharging;
+
+            vehicle.OnPIOStart += Vehicle_OnPIOStart;
+            vehicle.OnConveyorStart += Vehicle_OnConveyorStart;
+            vehicle.OnConveyorStop += Vehicle_OnConveyorStop;
+            vehicle.OnLoadComplete += Vehicle_OnLoadComplete;
+            vehicle.OnUnloadComplete += Vehicle_OnUnloadComplete;
+            vehicle.OnCarrierDetected += Vehicle_OnCarrierDetected;
+        }
+
+        private void Vehicle_OnChargingFull()
+        {
+            var msg = new OCSMessage();
+            msg.Kind = eKind.H;
+            msg.Tag = this.vehicle.CurrentPosition.ToString();
+            msg.IsSubCode1 = false;
+            msg.IsSubCode2 = false;
+            msg.IsSubCode3 = false;
+
+            this.manager.Send(msg);
+        }
+
+        private void Vehicle_OnCharging()
+        {
+            var msg = new OCSMessage();
+            msg.Kind = eKind.H;
+            msg.Tag = this.vehicle.CurrentPosition.ToString();
+            msg.IsSubCode1 = false;
+            msg.IsSubCode2 = true;
+            msg.IsSubCode3 = false;
+
+            this.manager.Send(msg);
+        }
+
+        private void Vehicle_OnChargingStart()
+        {
+            var msg = new OCSMessage();
+            msg.Kind = eKind.H;
+            msg.Tag = this.vehicle.CurrentPosition.ToString();
+            msg.IsSubCode1 = true;
+            msg.IsSubCode2 = false;
+            msg.IsSubCode3 = false;
+
+            this.manager.Send(msg);
+        }
+
+        private void Vehicle_OnCarrierDetected(bool isLoad)
+        {
+            var msg = new OCSMessage();
+
+            if (isLoad)
+                msg.Kind = eKind.L;
+            else
+                msg.Kind = eKind.U;
+
+            msg.Tag = this.vehicle.CurrentPosition.ToString();
+            msg.IsSubCode1 = true;
+            msg.IsSubCode2 = true;
+            msg.IsSubCode3 = false;
+
+            this.manager.Send(msg);
+        }
+
+        private void Vehicle_OnUnloadComplete()
+        {
+            var msg = new OCSMessage();
+            msg.Kind = eKind.U;
+            msg.Tag = this.vehicle.CurrentPosition.ToString();
+            msg.IsSubCode1 = true;
+            msg.IsSubCode2 = true;
+            msg.IsSubCode3 = true;
+
+            this.manager.Send(msg);
+        }
+
+        private void Vehicle_OnLoadComplete()
+        {
+            var msg = new OCSMessage();
+            msg.Kind = eKind.L;
+            msg.Tag = this.vehicle.CurrentPosition.ToString();
+            msg.IsSubCode1 = true;
+            msg.IsSubCode2 = true;
+            msg.IsSubCode3 = true;
+
+            this.manager.Send(msg);
+        }
+
+        private void Vehicle_OnConveyorStop(bool isLoad)
+        {
+            var msg = new OCSMessage();
+
+            if (isLoad)
+                msg.Kind = eKind.L;
+            else
+                msg.Kind = eKind.U;
+
+            msg.Tag = this.vehicle.CurrentPosition.ToString();
+            msg.IsSubCode1 = true;
+            msg.IsSubCode2 = false;
+            msg.IsSubCode3 = true;
+
+            this.manager.Send(msg);
+        }
+
+        private void Vehicle_OnConveyorStart(bool isLoad)
+        {
+            var msg = new OCSMessage();
+
+            if (isLoad)
+                msg.Kind = eKind.L;
+            else
+                msg.Kind = eKind.U;
+
+            msg.Tag = this.vehicle.CurrentPosition.ToString();
+            msg.IsSubCode1 = true;
+            msg.IsSubCode2 = false;
+            msg.IsSubCode3 = false;
+
+            this.manager.Send(msg);
         }
 
+        private void Vehicle_OnPIOStart(bool isLoad)
+        {
+            var msg = new OCSMessage();
+
+            if (isLoad)
+                msg.Kind = eKind.L;
+            else
+                msg.Kind = eKind.U;
+
+            msg.Tag = this.vehicle.CurrentPosition.ToString();
+            msg.IsSubCode1 = false;
+            msg.IsSubCode2 = false;
+            msg.IsSubCode3 = false;
+
+            this.manager.Send(msg);
+        }
+
+        private void Vehicle_OnManualCharging()
+        {
+            this.Send_ManualCharging();
+        }
+
+        private void Vehicle_OnManualUnload()
+        {
+            this.Send_ManualUnlaod();
+        }
+
+        private void Vehicle_OnManualMove()
+        {
+            this.Send_ManualMove();
+        }
+
+        private void Vehicle_OnManualLoad()
+        {
+            this.Send_ManualLoad();
+        }
+
+        private void Vehicle_OnCurrentPotisionChanged(int point)
+        {
+            this.Send_Tcmd(point);
+        }
+
+        private void Vehicle_OnBatteryVelueChanged(double obj)
+        {
+            this.Send_Bcmd(obj);
+        }
 
         #region Event Method
         private void Manager_OnSent(OHVConnector.OCSMessage msg)
@@ -134,14 +311,23 @@ namespace VehicleControlSystem.Managers
         /// <summary>
         /// 현재 위치 보고 
         /// </summary>
-        public void Send_Scmd()
+        public void Send_Scmd(int point)
         {
+            var msg = new OCSMessage();
+            msg.Kind = eKind.S;
+            msg.Tag = point.ToString("0000");
+            msg.IsSubCode1 = this.vehicle.IsContain;
+            msg.IsSubCode2 = vehicle.IsMoving;
+            msg.IsSubCode3 = vehicle.IsError;
+
+            this.manager.Send(msg);
         }
 
-        public void Send_Bcmd()
+        public void Send_Bcmd(double volt)
         {
             var msg = new OCSMessage();
-            var bData = this.vehicle.BatteryVolt;
+            msg.Kind = eKind.B;
+            var bData = volt;
             msg.Tag = bData.ToString("00.00").Replace(".", "");
             msg.IsSubCode1 = this.vehicle.IsContain;
             msg.IsSubCode2 = vehicle.IsMoving;
@@ -161,10 +347,11 @@ namespace VehicleControlSystem.Managers
             this.manager.Send(msg);
         }
 
-        public void Send_Tcmd()
+        public void Send_Tcmd(int point)
         {
             var msg = new OCSMessage();
-            msg.Tag = vehicle.CurrentPosition.ToString();
+            msg.Kind = eKind.T;
+            msg.Tag = point.ToString();
             msg.IsSubCode1 = this.vehicle.IsContain;
             msg.IsSubCode2 = vehicle.IsMoving;
             msg.IsSubCode3 = vehicle.IsError;
@@ -172,9 +359,11 @@ namespace VehicleControlSystem.Managers
             this.manager.Send(msg);
         }
 
+
         public void Send_Ccmd()
         {
             var msg = new OCSMessage();
+            msg.Kind = eKind.C;
             msg.Tag = vehicle.CurrentPosition.ToString();
             msg.IsSubCode1 = this.vehicle.IsContain;
             msg.IsSubCode2 = vehicle.IsMoving;
@@ -182,6 +371,57 @@ namespace VehicleControlSystem.Managers
 
             this.manager.Send(msg);
         }
+
+        public void Send_ManualMove()
+        {
+            var msg = new OCSMessage()
+            {
+                Kind = eKind.P,
+                Tag = this.vehicle.CurrentPosition.ToString(),
+                IsSubCode1 = false,
+                IsSubCode2 = false,
+                IsSubCode3 = true,
+            };
+            this.manager.Send(msg);
+        }
+        public void Send_ManualLoad()
+        {
+            var msg = new OCSMessage()
+            {
+                Kind = eKind.P,
+                Tag = this.vehicle.CurrentPosition.ToString(),
+                IsSubCode1 = false,
+                IsSubCode2 = true,
+                IsSubCode3 = false,
+            };
+            this.manager.Send(msg);
+        }
+
+        public void Send_ManualUnlaod()
+        {
+            var msg = new OCSMessage()
+            {
+                Kind = eKind.P,
+                Tag = this.vehicle.CurrentPosition.ToString(),
+                IsSubCode1 = true,
+                IsSubCode2 = false,
+                IsSubCode3 = false,
+            };
+            this.manager.Send(msg);
+
+        }
+        public void Send_ManualCharging()
+        {
+            var msg = new OCSMessage()
+            {
+                Kind = eKind.P,
+                Tag = this.vehicle.CurrentPosition.ToString(),
+                IsSubCode1 = true,
+                IsSubCode2 = true,
+                IsSubCode3 = true,
+            };
+            this.manager.Send(msg);
+        }
         #endregion
         public void Dispose()
         {

+ 30 - 33
Dev/OHV/VehicleControlSystem/Managers/Scheduler.cs

@@ -99,22 +99,32 @@ namespace VehicleControlSystem.Managers
                 Thread.Sleep(500);
                 try
                 {
-                    var state = this.autoManager.AutoModeStateProperty;
+                    var state = this.autoManager.OperationModeProperty;
                     switch (state)
                     {
-                        case OHV.Common.Shareds.eAutoModeState.ErrorStop:
+                        case OHV.Common.Shareds.eOperatationMode.ManualMode:
                             break;
-                        case OHV.Common.Shareds.eAutoModeState.StartRun:
-                            break;
-                        case OHV.Common.Shareds.eAutoModeState.Run:
+                        case OHV.Common.Shareds.eOperatationMode.AutoMode:
                             {
-                                Command cmd = sql.CommandDAL.GetCmd();
-                                if (cmd == null) continue;
-
-                                DoWork(cmd);
+                                switch (this.autoManager.AutoModeStateProperty)
+                                {
+                                    case OHV.Common.Shareds.eAutoModeState.ErrorStop:
+                                        break;
+                                    case OHV.Common.Shareds.eAutoModeState.StartRun:
+                                        break;
+                                    case OHV.Common.Shareds.eAutoModeState.Run:
+                                        Command cmd = sql.CommandDAL.GetCmd();
+                                        if (cmd == null) continue;
+                                        DoWork(cmd);
+                                        break;
+                                    case OHV.Common.Shareds.eAutoModeState.Stop:
+                                        break;
+                                    default:
+                                        break;
+                                }
                             }
                             break;
-                        case OHV.Common.Shareds.eAutoModeState.Stop:
+                        case OHV.Common.Shareds.eOperatationMode.InitialMode:
                             break;
                         default:
                             break;
@@ -132,7 +142,7 @@ namespace VehicleControlSystem.Managers
             switch (cmd.State)
             {
                 case OHV.Common.Shareds.eCommandState.Queued:
-                    if (sql.SubCmdDAL.Count <= 0)
+                    if (sql.SubCmdDAL.Count <= 0) //
                     {
                         switch (cmd.Type)
                         {
@@ -146,20 +156,8 @@ namespace VehicleControlSystem.Managers
                             default:
                                 break;
                         }
+                        this.sql.CommandDAL.UpdateState(cmd.CommandID, OHV.Common.Shareds.eCommandState.Processing);
                     }
-                    sql.CommandDAL.UpdateState(cmd.CommandID, OHV.Common.Shareds.eCommandState.Assign);
-                    break;
-
-                case OHV.Common.Shareds.eCommandState.Assign: //Assign 되면 Vehicle 의 상태가 Busy 면 Processing 으로 전환.
-                    { 
-                        var subCmd = sql.SubCmdDAL.GetSubCmd();
-                        if (subCmd == null) break;
-
-                        if (!subCmd.CmdID.Equals(cmd.CommandID))
-                            break;
-                    }
-
-                    sql.CommandDAL.UpdateState(cmd.CommandID, OHV.Common.Shareds.eCommandState.Processing);
                     break;
 
                 case OHV.Common.Shareds.eCommandState.Processing:
@@ -187,21 +185,20 @@ namespace VehicleControlSystem.Managers
                             }
                             else if ( cmd.Type == OHV.Common.Shareds.eCommandType.Charging)
                             {
-                                if ( this.CreateSubCommand(cmd, SubCmd.eType.Chaging))
+                                if ( this.CreateSubCommand(cmd, SubCmd.eType.Charge))
                                     cmd.IsSecondCommanded = true;
                                 break;
                             }
-                            else //Move Command
+                            else //Move Command complete
                             {
                                 sql.CommandDAL.UpdateState(cmd.CommandID, OHV.Common.Shareds.eCommandState.Complete);
-                                break;
                             }
                         }
-
-                        if (subCmd.CmdID.Equals(cmd.CommandID)) //진행중 판단
-                            break;
-                        else //다른 아이디의 일을 하고 있을 경우 가 생길까??
-                        { }
+                        else
+                        {
+                            if (subCmd.CmdID.Equals(cmd.CommandID)) //진행중 판단
+                                break;
+                        }
                     }
                     sql.CommandDAL.UpdateState(cmd.CommandID, OHV.Common.Shareds.eCommandState.Complete);
                     break;
@@ -225,7 +222,7 @@ namespace VehicleControlSystem.Managers
                     break;
                 case SubCmd.eType.Unload:
                     break;
-                case SubCmd.eType.Chaging:
+                case SubCmd.eType.Charge:
                     break;
                 default:
                     break;

+ 38 - 12
Dev/OHV/VehicleControlSystem/VCSystem.cs

@@ -19,7 +19,7 @@ using VehicleControlSystem.Managers;
 
 namespace VehicleControlSystem
 {
-    [Module(ModuleName ="VCSystem")]
+    [Module(ModuleName = "VCSystem")]
     public class VCSystem : IModule, IDisposable
     {
         Scheduler scheduler = null;
@@ -30,7 +30,7 @@ namespace VehicleControlSystem
         Vehicle vehicle = null;
         SqliteManager sql = null;
 
-        public VCSystem(IEventAggregator ea, SqliteManager sql) 
+        public VCSystem(IEventAggregator ea, SqliteManager sql)
         {
             this.sql = sql;
 
@@ -46,7 +46,7 @@ namespace VehicleControlSystem
         {
             QuartzUtils.Init(5);
             QuartzUtils.Invoke("HIS_ALARM", QuartzUtils.GetExpnMinute(1), this.CleanHisAlarm);
-            
+
             //Create IO
             this.IO = new EzIO();
             var mapPath = Path.Combine(System.Environment.CurrentDirectory) + @"\Config\IO.xlsx";
@@ -58,17 +58,15 @@ namespace VehicleControlSystem
             ezIO.OnDiscontd += EzIO_OnDiscontd;
             ezIO.OnChangedIO += EzIO_OnChangedIO;
 
-            this.autoManager = new AutoManager(this.IO);
-            this.autoManager.Init();
-
+            this.autoManager = new AutoManager(this.IO, this.eventAggregator, this.sql);
             this.scheduler = new Scheduler(eventAggregator, this.autoManager, this.sql);
-            this.scheduler.Init();
-
             this.vehicle = new Vehicle(this.IO, this.sql, this.eventAggregator, this.autoManager);
-            this.vehicle.Init();
-
             this.hostManager = new HostManager(this.eventAggregator, this.vehicle, this.sql);
+
             this.hostManager.Init();
+            this.vehicle.Init();
+            this.scheduler.Init();
+            this.autoManager.Init(this.vehicle);
         }
 
         public void CleanHisAlarm()
@@ -101,6 +99,14 @@ namespace VehicleControlSystem
                     break;
                 case VCSMessageEventArgs.eVCSMessageKind.ReqIOMapList:
                     break;
+                case VCSMessageEventArgs.eVCSMessageKind.ReqCommandList:
+                    break;
+                case VCSMessageEventArgs.eVCSMessageKind.ReqAutoModeChange:
+                    RspAutoModeChange(true);
+                    break;
+                case VCSMessageEventArgs.eVCSMessageKind.ReqManualModeChange:
+                    RspAutoModeChange(false);
+                    break;
                 default:
                     break;
             }
@@ -108,9 +114,29 @@ namespace VehicleControlSystem
 
         void RspIOObjectMessage()
         {
-            var rspMsg = new GUIMessageEventArgs(GUIMessageEventArgs.eGUIMessageKind.RspIOObject, this.IO );
+            var rspMsg = new GUIMessageEventArgs { Kind = GUIMessageEventArgs.eGUIMessageKind.RspIOObject, Args = this.IO };
             this.eventAggregator.GetEvent<GUIMessagePubSubEvent>().Publish(rspMsg);
         }
+
+        void RspAutoModeChange(bool isAutoMode)
+        {
+            GUIMessageEventArgs msg;
+            if (isAutoMode)
+            {
+                //ToDo: 자동 모드로 들어가기전 확인 할 점들.
+
+                this.autoManager.OperationModeProperty = OHV.Common.Shareds.eOperatationMode.AutoMode;
+                this.autoManager.AutoModeStateProperty = OHV.Common.Shareds.eAutoModeState.StartRun;
+                msg = new GUIMessageEventArgs { Kind = GUIMessageEventArgs.eGUIMessageKind.RspAutoModeChange, Result = FluentResults.Results.Ok() };
+            }
+            else
+            {
+                this.autoManager.AutoModeStateProperty = OHV.Common.Shareds.eAutoModeState.WaitStop;
+                msg = new GUIMessageEventArgs { Kind = GUIMessageEventArgs.eGUIMessageKind.RspManualModeChange, Result = FluentResults.Results.Ok() };
+            }
+
+            GUIMessageEventPublish(msg);
+        }
         #endregion
 
         /// <summary>
@@ -133,7 +159,7 @@ namespace VehicleControlSystem
 
         public void RegisterTypes(IContainerRegistry containerRegistry)
         {
-            if ( !containerRegistry.IsRegistered<VCSystem>() )
+            if (!containerRegistry.IsRegistered<VCSystem>())
                 containerRegistry.RegisterSingleton<VCSystem>();
         }
 

+ 1 - 0
Dev/OHV/VehicleControlSystem/VehicleControlSystem.csproj

@@ -93,6 +93,7 @@
     <Compile Include="ControlLayer\Axis\EzAxis.cs" />
     <Compile Include="ControlLayer\Axis\IAxis.cs" />
     <Compile Include="ControlLayer\Clamp.cs" />
+    <Compile Include="ControlLayer\ControlObjectBase.cs" />
     <Compile Include="ControlLayer\Conveyor.cs" />
     <Compile Include="ControlLayer\IO\BitBlock.cs" />
     <Compile Include="ControlLayer\IO\Delegates.cs" />

BIN
Documents/Schedule/OHV Set-Up 일정_20200309.xlsx