Переглянути джерело

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

# Conflicts:
#	Dev/OHV/Assambly/OHVConnector.dll
#	Dev/OHV/Assambly/OHVConnector.pdb
#	Dev/OHV/VehicleControlSystem/ControlLayer/MQ/ZmqManager.cs
yongsunghwang 6 роки тому
батько
коміт
190f3bc451
22 змінених файлів з 258 додано та 141 видалено
  1. BIN
      Dev/OHV/Assambly/CanDll/PCANBasic.dll
  2. BIN
      Dev/OHV/Assambly/OHVConnector.dll
  3. BIN
      Dev/OHV/Assambly/OHVConnector.pdb
  4. 26 16
      Dev/OHV/OHV.Module.Interactivity/PopUp/DriveServoView.xaml
  5. 2 2
      Dev/OHV/OHV.Vehicle/Concept/D_MainWindow.xaml
  6. 17 4
      Dev/OHV/OHV.Vehicle/Concept/D_MainWindowViewModel.cs
  7. BIN
      Dev/OHV/OHV.Vehicle/Config/AlarmDefind.xlsx
  8. 2 1
      Dev/OHV/OHV.Vehicle/OHV.Vehicle.csproj
  9. 5 5
      Dev/OHV/VehicleControlSystem/ControlLayer/MQ/ZmqManager.cs
  10. 11 0
      Dev/OHV/VehicleControlSystem/ControlLayer/Motion/GSIDrive.cs
  11. 65 1
      Dev/OHV/VehicleControlSystem/ControlLayer/Steering.cs
  12. 102 90
      Dev/OHV/VehicleControlSystem/ControlLayer/Vehicle.cs
  13. 4 1
      Dev/OHV/VehicleControlSystem/Managers/HostManager.cs
  14. 6 6
      Dev/OHV/VehicleControlSystem/Managers/Scheduler.cs
  15. 12 9
      Dev/OHV/VehicleControlSystem/VCSystem.cs
  16. BIN
      Dev/OHVDriveLogger/OHVDriveLogger/.vs/OHVDriveLogger/v16/Server/sqlite3/storage.ide
  17. BIN
      Dev/OHVDriveLogger/OHVDriveLogger/.vs/OHVDriveLogger/v16/Server/sqlite3/storage.ide-shm
  18. BIN
      Dev/OHVDriveLogger/OHVDriveLogger/.vs/OHVDriveLogger/v16/Server/sqlite3/storage.ide-wal
  19. 1 1
      Dev/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger/App.config
  20. 1 1
      Dev/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger/Config/log4net.xml
  21. 1 1
      Dev/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger/FTPLogger.cs
  22. 3 3
      Dev/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger/FormMain.cs

BIN
Dev/OHV/Assambly/CanDll/PCANBasic.dll


BIN
Dev/OHV/Assambly/OHVConnector.dll


BIN
Dev/OHV/Assambly/OHVConnector.pdb


+ 26 - 16
Dev/OHV/OHV.Module.Interactivity/PopUp/DriveServoView.xaml

@@ -137,7 +137,7 @@
                         <RowDefinition Height="*"/>
                         <RowDefinition Height="*"/>
                     </Grid.RowDefinitions>
-                    
+
                     <Grid Grid.Row="0" Margin="15">
                         <Grid.ColumnDefinitions>
                             <ColumnDefinition Width="*"/>
@@ -219,7 +219,7 @@
                                     BorderBrush="{Binding SteeringLeftBrushProperty}" 
                                     BorderThickness="5" 
                                     Command="{Binding SteeringMoveCommand}"
-                                    CommandParameter="CW" > 
+                                    CommandParameter="CW" >
                                     <StackPanel>
                                         <materialDesign:PackIcon Kind="ArrowLeft" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Height="42" Width="auto"/>
                                         <TextBlock Text="Steering Left" VerticalAlignment="Stretch" HorizontalAlignment="Center" FontSize="20"/>
@@ -236,7 +236,7 @@
                                     BorderBrush="{Binding SteeringRightBrushProperty}" 
                                     BorderThickness="5" 
                                     Command="{Binding SteeringMoveCommand}"
-                                    CommandParameter="CCW"> 
+                                    CommandParameter="CCW">
                                     <StackPanel>
                                         <materialDesign:PackIcon Kind="ArrowRight" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Height="42" Width="auto"/>
                                         <TextBlock Text="Steering Right" VerticalAlignment="Stretch" HorizontalAlignment="Center" FontSize="18"/>
@@ -252,9 +252,9 @@
                             <ColumnDefinition Width="*"/>
                             <ColumnDefinition Width="*"/>
                         </Grid.ColumnDefinitions>
-                    
+
                         <Border BorderThickness="1" BorderBrush="#FF00FFD3" Margin="15,0,10,169" Grid.ColumnSpan="3"></Border>
-                        
+
                         <Grid Grid.Column="0" Margin="20">
                             <RepeatButton
                             HorizontalAlignment="Right"
@@ -305,7 +305,7 @@
                         </Grid>
                     </Grid>
                 </Grid>
-                    <!--<Grid Grid.Row="1">
+                <!--<Grid Grid.Row="1">
                     <Grid.RowDefinitions>
                         <RowDefinition Height="*"/>
                         <RowDefinition Height="*"/>
@@ -323,14 +323,16 @@
                     <Border Margin="10,5,179,0" BorderBrush="#FF00FFD3" BorderThickness="2" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Grid.RowSpan="2" Grid.Column="2"/>
                     <Border Margin="33,-2,34,82" BorderBrush="#FF00FFD3" BorderThickness="2" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Grid.Column="2" Grid.ColumnSpan="3" Grid.RowSpan="2"/>
 
-                    --><!--<Button Grid.Column="0" Grid.Row="1" HorizontalAlignment="Stretch" Margin="5" Height="auto"
+                    -->
+                <!--<Button Grid.Column="0" Grid.Row="1" HorizontalAlignment="Stretch" Margin="5" Height="auto"
                             Style="{StaticResource MaterialDesignRaisedButton}"
                             materialDesign:ButtonAssist.CornerRadius="10">
                         <StackPanel>
                             <TextBlock HorizontalAlignment="Center"><Run Text="Target" FontSize="20"/></TextBlock>
                             <TextBlock HorizontalAlignment="Center"><Run Text="Pos" FontSize="20"/></TextBlock>
                         </StackPanel>
-                    </Button>--><!--
+                    </Button>-->
+                <!--
 
                     <Button Grid.Column="0" Grid.Row="1" HorizontalAlignment="Stretch" Margin="5" Height="auto"
                             Style="{StaticResource MaterialDesignRaisedButton}"
@@ -342,7 +344,8 @@
                         </StackPanel>
                     </Button>
 
-                    --><!--<Button Grid.Column="0" Grid.Row="3" HorizontalAlignment="Stretch" Margin="5" Height="auto"
+                    -->
+                <!--<Button Grid.Column="0" Grid.Row="3" HorizontalAlignment="Stretch" Margin="5" Height="auto"
                             Style="{StaticResource MaterialDesignRaisedButton}"
                             materialDesign:ButtonAssist.CornerRadius="10">
                         <StackPanel>
@@ -351,13 +354,14 @@
                         </StackPanel>
                     </Button>-->
 
-                    <!--<Button Grid.Column="1" Grid.Row="0" HorizontalAlignment="Stretch" Margin="5" Height="auto"
+                <!--<Button Grid.Column="1" Grid.Row="0" HorizontalAlignment="Stretch" Margin="5" Height="auto"
                             Style="{StaticResource MaterialDesignRaisedButton}"
                             materialDesign:ButtonAssist.CornerRadius="10"
                             Command="{Binding SelectAxisCommand}"
                             CommandParameter="Left">
                         <TextBlock><Run Text="Drive" FontSize="20"/></TextBlock>
-                    </Button>--><!--
+                    </Button>-->
+                <!--
 
                     <Button Grid.Column="1" Grid.Row="0" HorizontalAlignment="Stretch" Margin="5" Height="auto"
                             Style="{StaticResource MaterialDesignRaisedButton}"
@@ -370,14 +374,16 @@
                         </StackPanel>
                     </Button>
 
-                    --><!--<Button Background="{x:Null}" Grid.Column="1" Grid.Row="1" HorizontalAlignment="Stretch" Margin="5" Height="auto"
+                    -->
+                <!--<Button Background="{x:Null}" Grid.Column="1" Grid.Row="1" HorizontalAlignment="Stretch" Margin="5" Height="auto"
                             Style="{StaticResource MaterialDesignRaisedButton}"
                             materialDesign:ButtonAssist.CornerRadius="10">
                         <Button.InputBindings>
                             <MouseBinding Gesture="LeftClick" Command="{Binding KeyInTargetPosCommand}" CommandParameter="Left"/>
                         </Button.InputBindings>
                         <TextBlock><Run Text="{Binding DriveTargetPos, StringFormat=0.000, FallbackValue=0.000}" FontSize="20"/></TextBlock>
-                    </Button>--><!--
+                    </Button>-->
+                <!--
 
                     <Button Background="{x:Null}" Grid.Column="1" Grid.Row="1" HorizontalAlignment="Stretch" Margin="5" Height="auto"
                             Style="{StaticResource MaterialDesignRaisedButton}"
@@ -385,11 +391,13 @@
                         <TextBlock><Run Text="{Binding CurrentPosition, StringFormat=0.000, FallbackValue=0.000}" FontSize="20"/></TextBlock>
                     </Button>
 
-                    --><!--<Button Background="{x:Null}" Grid.Column="1" Grid.Row="3" HorizontalAlignment="Stretch" Margin="5" Height="auto"
+                    -->
+                <!--<Button Background="{x:Null}" Grid.Column="1" Grid.Row="3" HorizontalAlignment="Stretch" Margin="5" Height="auto"
                             Style="{StaticResource MaterialDesignRaisedButton}"
                             materialDesign:ButtonAssist.CornerRadius="10">
                         <TextBlock><Run Text="{Binding DifferenceDrive, StringFormat=0.000, FallbackValue=0.000}" FontSize="20"/></TextBlock>
-                    </Button>--><!--
+                    </Button>-->
+                <!--
 
                     <StackPanel Grid.Column="2" Grid.Row="1" Grid.ColumnSpan="3" Grid.RowSpan="3"  Orientation="Horizontal" HorizontalAlignment="Center" Margin="82,52,43,31" Width="379" >
 
@@ -423,7 +431,9 @@
                     </StackPanel>
 
 
-                    --><!--Jog Button--><!--
+                    -->
+                <!--Jog Button-->
+                <!--
                     <RepeatButton
                             Margin="5"
                             Grid.Row="0" 

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

@@ -174,10 +174,10 @@
 
                             <Button Margin="15" Width="200" Height="50"
                                     Command="{Binding EmergencyStopCommand}"
-                                    CommandParameter="Emergency">
+                                    CommandParameter="Emergency" Background="{c:Binding 'IsDryRun ? media:Brushes.LimeGreen : media:Brushes.DodgerBlue'}">
                                 <StackPanel Orientation="Horizontal">
                                     <materialDesign:PackIcon Kind="AlarmLightOutline" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Height="35" Width="auto" Margin="0,0,20,0"/>
-                                    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="Emergency Stop" FontSize="15"/>
+                                    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="Dry Run" FontSize="15"/>
                                 </StackPanel>
                             </Button>
 

+ 17 - 4
Dev/OHV/OHV.Vehicle/Concept/D_MainWindowViewModel.cs

@@ -166,7 +166,7 @@ namespace OHV.Vehicle.Concept
         public eBatteryState BatteryState
         {
             get { return this.batteryState; }
-            set { this.SetProperty( ref this.batteryState , value ); }
+            set { this.SetProperty( ref this.batteryState, value ); }
         }
 
         int currentTag;
@@ -176,6 +176,15 @@ namespace OHV.Vehicle.Concept
             set { this.SetProperty( ref this.currentTag, value ); }
         }
 
+        private bool isDryRun;
+
+        public bool IsDryRun
+        {
+            get { return isDryRun; }
+            set { SetProperty( ref this.isDryRun, value ); }
+        }
+
+
         #endregion
 
         #region Brushes
@@ -280,9 +289,11 @@ namespace OHV.Vehicle.Concept
             this.LastBuildedTime = new Helpler.AssemblyInfo().Get_BuildDateTime();
 
             GSG.NET.Quartz.QuartzUtils.Invoke( "RESOURCE_CHECK", GSG.NET.Quartz.QuartzUtils.GetExpnSecond( 1 ), QuzOnResourceUsage );
+
+            this.IsDryRun = false;
         }
 
-        private void ExecuteBatteryPopup( )
+        private void ExecuteBatteryPopup()
         {
             this.messageController.ShowBatteryPopupView();
         }
@@ -334,6 +345,8 @@ namespace OHV.Vehicle.Concept
 
         private void ExecuteEStop()
         {
+            this.IsDryRun = !this.IsDryRun;
+
             var msg = new VCSMessageEventArgs
             {
                 Kind = VCSMessageEventArgs.eVCSMessageKind.ReqEStop,
@@ -539,7 +552,7 @@ namespace OHV.Vehicle.Concept
                             if ( vehicleState == eVehicleState.Abnormal )
                                 this.IsVehicleAlarm = true;
                             else
-                                this.IsVehicleAlarm = false; 
+                                this.IsVehicleAlarm = false;
                         }
                         break;
 
@@ -570,7 +583,7 @@ namespace OHV.Vehicle.Concept
                             //    this.BatteryState = eBatteryState.Connect;
                         }
                         break;
-                        
+
                     case "BatteryChargeState":
                         {
                             var isCharge = CastTo<bool>.From<object>( args.Args );

BIN
Dev/OHV/OHV.Vehicle/Config/AlarmDefind.xlsx


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

@@ -306,7 +306,8 @@
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <PropertyGroup>
     <PostBuildEvent>copy "$(SolutionDir)\Assambly\EzPlus2\*.*" "$(TargetDir)"
-copy "$(SolutionDir)\Assambly\OHVDrive\*.*" "$(TargetDir)"</PostBuildEvent>
+copy "$(SolutionDir)\Assambly\OHVDrive\*.*" "$(TargetDir)"
+copy "$(SolutionDir)\Assambly\CanDll\*.*" "$(TargetDir)"</PostBuildEvent>
   </PropertyGroup>
   <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
     <PropertyGroup>

+ 5 - 5
Dev/OHV/VehicleControlSystem/ControlLayer/MQ/ZmqManager.cs

@@ -7,6 +7,7 @@ using NetMQ.Monitoring;
 using NetMQ.Sockets;
 using OHV.Common.Model;
 using OHV.Common.Shareds;
+using Quartz.Xml;
 using System;
 using System.Collections;
 using System.Collections.Concurrent;
@@ -189,12 +190,11 @@ namespace VehicleControlSystem.ControlLayer.MQ
             set { SetField( ref this.faultMessage, value ); }
         }
 
-        private eVehicleAutoReadyState autoReadyState;
-
-        public eVehicleAutoReadyState AutoReadyState
+        private bool isCanStanbyLocation;
+        public bool IsCanStanbyLocation
         {
-            get { return autoReadyState; }
-            set { SetField(ref this.autoReadyState, value); }
+            get { return isCanStanbyLocation; }
+            set { SetField(ref this.isCanStanbyLocation, value); }
         }
 
         #endregion

+ 11 - 0
Dev/OHV/VehicleControlSystem/ControlLayer/Motion/GSIDrive.cs

@@ -314,6 +314,17 @@ namespace VehicleControlSystem.ControlLayer.Drive
             return true;
         }
 
+        public bool JogForword()
+        {
+            this.zmq.SetJogMove();
+            return true;
+        }
+        public bool JogBackword()
+        {
+            this.zmq.SetJogMove( false );
+            return true;
+        }
+
         #region Test Method
 
         #endregion

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

@@ -94,8 +94,8 @@ namespace VehicleControlSystem.ControlLayer
             return this.SteeringState;
         }
 
-        bool isExecuteSteering = false;
         readonly object lockObject = new object();
+        bool isExecuteSteering = false;
         public int ControlSteering( bool isLeft = false )
         {
             //if ( this.isExecuteSteering )
@@ -170,6 +170,70 @@ namespace VehicleControlSystem.ControlLayer
             return 0;
         }
 
+        /// <summary>
+        /// Error 를 만들지 않고 동작 만 한다.
+        /// </summary>
+        /// <param name="isLeft"></param>
+        public void ControlSteeringNotResult(bool isLeft = false )
+        {
+            var sT = SwUtils.CurrentTimeMillis;
+
+            lock ( lockObject )
+            {
+                if ( isLeft ) //Left IO 가 직진 이라고 생각하자.
+                {
+                    this.iO.WriteOutputIO( "OUT_F_STEERING_CWCCW", false );
+                    this.iO.WriteOutputIO( "OUT_R_STEERING_CWCCW", true );
+                    this.SetHightVolt();
+                    if ( this.SteeringState == eSteeringState.Left )
+                    {
+                        return;
+                    }
+                }
+                else
+                {
+                    this.iO.WriteOutputIO( "OUT_F_STEERING_CWCCW", true );
+                    this.iO.WriteOutputIO( "OUT_R_STEERING_CWCCW", false );
+                    this.SetHightVolt();
+                    if ( this.SteeringState == eSteeringState.Right )
+                    {
+                        return;
+                    }
+                }
+
+                var task = Task<bool>.Run( () =>
+                {
+                    long sTime = SwUtils.CurrentTimeMillis;
+                    while ( true )
+                    {
+                        LockUtils.Wait( 5 );
+
+                        if ( SwUtils.Gt( sTime, 2 * ConstUtils.ONE_SECOND ) ) //Wait 3Sec
+                            return false;
+
+                        if ( isLeft )
+                        {
+                            if ( this.IsLeft() )
+                                break;
+                        }
+                        else
+                        {
+                            if ( this.IsRight() )
+                                break;
+                        }
+                    }
+                    return true;
+                } ).ContinueWith( t =>
+                {
+                    logger.D( $"[Steer Release Lock] - {SwUtils.Elapsed( sT )} ms" );
+
+                    LockUtils.Wait( 200 );
+                    GetSteeringState();
+                } );
+            }
+        }
+
+
         void SetHightVolt()
         {
             this.iO.WriteOutputIO( "OUT_F_STEERING_DA", true );

+ 102 - 90
Dev/OHV/VehicleControlSystem/ControlLayer/Vehicle.cs

@@ -38,6 +38,8 @@ namespace VehicleControlSystem.ControlLayer
         public ZmqManager ZmqManager { get; set; }
         public List<Alarm> Alarms { get; set; }
         public HostManager HostManager { get; set; }
+        public SqliteManager Sqlite { get; set; }
+        public AutoManager AutoManager { get; set; }
     }
 
     /// <summary>
@@ -74,9 +76,9 @@ namespace VehicleControlSystem.ControlLayer
             {
                 if ( SetField( ref this.currentTag, value ) )
                 {
-                    var info = sql.VehicleInfoDAL.GetAll().FirstOrDefault();
+                    var info = this.refObjects.Sqlite.VehicleInfoDAL.GetAll().FirstOrDefault();
                     info.CurrentTag = value.ToString();
-                    sql.VehicleInfoDAL.Update( info );
+                    this.refObjects.Sqlite.VehicleInfoDAL.Update( info );
 
                     this.OnCurrentTagChanged?.Invoke( value );
                 }
@@ -168,9 +170,9 @@ namespace VehicleControlSystem.ControlLayer
             {
                 if ( SetField( ref this.vehicleState, value ) )
                 {
-                    var info = sql.VehicleInfoDAL.GetAll().FirstOrDefault();
+                    var info = this.refObjects.Sqlite.VehicleInfoDAL.GetAll().FirstOrDefault();
                     info.VehicleState = value;
-                    sql.VehicleInfoDAL.Update( info );
+                    this.refObjects.Sqlite.VehicleInfoDAL.Update( info );
                 }
             }
         }
@@ -183,9 +185,9 @@ namespace VehicleControlSystem.ControlLayer
             {
                 if ( SetField( ref this.machineMode, value ) )
                 {
-                    var info = sql.VehicleInfoDAL.GetAll().FirstOrDefault();
+                    var info = this.refObjects.Sqlite.VehicleInfoDAL.GetAll().FirstOrDefault();
                     info.MachineMode = value;
-                    sql.VehicleInfoDAL.Update( info );
+                    this.refObjects.Sqlite.VehicleInfoDAL.Update( info );
                 }
             }
         }
@@ -447,8 +449,8 @@ namespace VehicleControlSystem.ControlLayer
 
         VehicleRefObjects refObjects = null;
 
-        SqliteManager sql = null;
-        AutoManager autoManager = null;
+        //SqliteManager sql = null;
+        //AutoManager autoManager = null;
 
         ThreadCancel cancel = new ThreadCancel();
         TaskCancel taskCancel = new TaskCancel();
@@ -456,9 +458,29 @@ namespace VehicleControlSystem.ControlLayer
 
         IEventAggregator eventAggregator;
 
-        public Vehicle( VehicleRefObjects vehicleRef, IIO io, SqliteManager sqliteManager, IEventAggregator ea, AutoManager auto )
+        public Vehicle( IEventAggregator ea )
         {
-            this.refObjects = vehicleRef;
+            this.obstacleBitList.AddRange( new string[]
+            {
+                "OUT_OBSTRUCTION_PATTERN_00",
+                "OUT_OBSTRUCTION_PATTERN_01",
+                "OUT_OBSTRUCTION_PATTERN_02",
+                "OUT_OBSTRUCTION_PATTERN_03",
+                "OUT_OBSTRUCTION_PATTERN_04",
+            } );
+
+            this.eventAggregator = ea;
+
+            this.eventAggregator.GetEvent<DriveControlPubSubEvent>().Unsubscribe( ReceiveDriveControlEvent );
+            this.eventAggregator.GetEvent<DriveControlPubSubEvent>().Subscribe( ReceiveDriveControlEvent );
+
+            this.eventAggregator.GetEvent<ObstacleControlPubSubEvent>().Unsubscribe( ObstacleReceiveEvent );
+            this.eventAggregator.GetEvent<ObstacleControlPubSubEvent>().Subscribe( ObstacleReceiveEvent );
+        }
+
+        public void DependencyInjection( VehicleRefObjects vehicleRefObjects )
+        {
+            this.refObjects = vehicleRefObjects;
 
             this.refObjects.IO.OnChangedIO += IO_OnChangedIO;
 
@@ -476,33 +498,13 @@ namespace VehicleControlSystem.ControlLayer
 
             this.refObjects.ZmqManager.PropertyChanged += ZmqManager_PropertyChanged;
 
-
-            this.sql = sqliteManager;
-            this.autoManager = auto;
-            this.autoManager.OnOperationModeChanged += AutoManager_OnOperationModeChanged;
-
-            this.obstacleBitList.AddRange( new string[]
-            {
-                "OUT_OBSTRUCTION_PATTERN_00",
-                "OUT_OBSTRUCTION_PATTERN_01",
-                "OUT_OBSTRUCTION_PATTERN_02",
-                "OUT_OBSTRUCTION_PATTERN_03",
-                "OUT_OBSTRUCTION_PATTERN_04",
-            } );
-
-            this.eventAggregator = ea;
-
-            this.eventAggregator.GetEvent<DriveControlPubSubEvent>().Unsubscribe( ReceiveDriveControlEvent );
-            this.eventAggregator.GetEvent<DriveControlPubSubEvent>().Subscribe( ReceiveDriveControlEvent );
-
-            this.eventAggregator.GetEvent<ObstacleControlPubSubEvent>().Unsubscribe( ObstacleReceiveEvent );
-            this.eventAggregator.GetEvent<ObstacleControlPubSubEvent>().Subscribe( ObstacleReceiveEvent );
+            this.refObjects.AutoManager.OnOperationModeChanged += AutoManager_OnOperationModeChanged;
         }
 
 
         private void ObstacleReceiveEvent( ObstacleControlEventArgs obj )
         {
-            if ( this.autoManager.OperationModeProperty != eOperatationMode.ManualMode )
+            if ( this.refObjects.AutoManager.OperationModeProperty != eOperatationMode.ManualMode )
                 return;
 
             if ( obj.EventDir == ObstacleControlEventArgs.eEventDir.ToBack )
@@ -649,21 +651,19 @@ namespace VehicleControlSystem.ControlLayer
             this.eventAggregator.GetEvent<DriveControlPubSubEvent>().Publish( args );
         }
 
-        public void Init(HostManager host)
+        public void Init()
         {
             ThreadStart();
 
-            this.refObjects.HostManager = host;
-
             //TimerUtils.Once(5000, () => { this.CurrentPosition = 1000; });
-            var v = sql.VehicleInfoDAL.GetAll().FirstOrDefault();
+            var v = refObjects.Sqlite.VehicleInfoDAL.GetAll().FirstOrDefault();
             v.CurrentTag = "0000";
             v.VehicleState = eVehicleState.None;
             v.MachineMode = eMachineMode.LocalMode;
 
-            sql.VehicleInfoDAL.Update( v );
+            refObjects.Sqlite.VehicleInfoDAL.Update( v );
         }
-        
+
         public int InitializationVehicle()
         {
 #if SIMULATION
@@ -737,7 +737,7 @@ namespace VehicleControlSystem.ControlLayer
             var reply = new DriveControlEventArgs();
 
             int targetTag = args.TargetRouteID;
-            var route = sql.RouteDal.Get( x => x.Name.Equals( targetTag ) ).FirstOrDefault();
+            var route = this.refObjects.Sqlite.RouteDal.Get( x => x.Name.Equals( targetTag ) ).FirstOrDefault();
             if ( route == null )
             {
                 reply.Result = Results.Fail( "Not Found Route" );
@@ -771,13 +771,9 @@ namespace VehicleControlSystem.ControlLayer
         void ReqJog( DriveControlEventArgs _args )
         {
             if ( _args.JogDir == DriveControlEventArgs.eJogMoveDir.Positive )
-            {
-                //this.drive.JogForWard();
-            }
+                this.refObjects.Drive.JogForword();
             else
-            {
-                //this.drive.JogBackward();
-            }
+                this.refObjects.Drive.JogBackword();
         }
 
         Logger batteryLogger = Logger.GetLogger( "BatteryLogger" );
@@ -882,18 +878,18 @@ namespace VehicleControlSystem.ControlLayer
                     if ( this.ObstacleStateProperty != eObstacleState.Normal ) //장애물 감지 상태 시 조그 동작만 가능하게.
                         continue;
 
-                    if ( this.autoManager.AutoModeStateProperty != eAutoModeState.Run ) // 
+                    if ( this.refObjects.AutoManager.AutoModeStateProperty != eAutoModeState.Run ) // 
                         continue;
 
 
-                    var subCmd = sql.SubCmdDAL.GetAll().FirstOrDefault();
+                    var subCmd = this.refObjects.Sqlite.SubCmdDAL.GetAll().FirstOrDefault();
                     if ( subCmd == null ) continue;
 
-                    if ( !sql.CommandDAL.GetAll().Any( x => x.CommandID.Equals( subCmd.CmdID ) ) )
+                    if ( !this.refObjects.Sqlite.CommandDAL.GetAll().Any( x => x.CommandID.Equals( subCmd.CmdID ) ) )
                     {
                         if ( subCmd.CmdType == SubCmd.eCmdType.Auto ) //자동 명령중 Main Command 가 없으면 삭제.
                         {
-                            sql.SubCmdDAL.Delete( subCmd.ID );
+                            this.refObjects.Sqlite.SubCmdDAL.Delete( subCmd.ID );
                             logger.I( $"SubCmd Deleted - ID={subCmd.ID}, CommandID={subCmd.CmdID}" );
                         }
                     }
@@ -903,9 +899,6 @@ namespace VehicleControlSystem.ControlLayer
                         case eSubCommandType.Move:
                             this.CurrentSubCommand = subCmd;
                             this.Move( subCmd );
-
-                            if ( !refObjects.HostManager.IsConnected )
-                                OccurVehicleAlarm( 43 );
                             break;
 
                         case eSubCommandType.Load:
@@ -946,10 +939,10 @@ namespace VehicleControlSystem.ControlLayer
         {
             this.refObjects.Drive.CancelCommand( subCmd );
 
-            var cmd = sql.CommandDAL.GetById( subCmd.CmdID );
+            var cmd = this.refObjects.Sqlite.CommandDAL.GetById( subCmd.CmdID );
             cmd.State = eCommandState.Complete;
-            sql.CommandDAL.Update( cmd );
-            sql.SubCmdDAL.Clean();
+            this.refObjects.Sqlite.CommandDAL.Update( cmd );
+            this.refObjects.Sqlite.SubCmdDAL.Clean();
 
             logger.D( $"[Cancel Command] {cmd.TargetID} / {cmd.Type}" );
         }
@@ -994,11 +987,13 @@ namespace VehicleControlSystem.ControlLayer
                 }
             }
 
-            sql.SubCmdDAL.Clean();
+            this.refObjects.Sqlite.SubCmdDAL.Clean();
 
             this.taskMoveCancel.Cancel();
             this.taskMoveCancel.WaitAll();
 
+            this.CheckOCSConnectionState();
+
             logger.I( $"[SubCommand Complete] - Target : {sub.TargetID} / Type : {sub.Type}" );
         }
 
@@ -1008,7 +1003,7 @@ namespace VehicleControlSystem.ControlLayer
             {
                 this.OnMoveReady?.Invoke();
 
-                var moveReadyBuzzerTime = Convert.ToInt32( sql.ConfigDal.GetById( ConstString.BuzzerStartReadyTime ).Value );
+                var moveReadyBuzzerTime = Convert.ToInt32( this.refObjects.Sqlite.ConfigDal.GetById( ConstString.BuzzerStartReadyTime ).Value );
                 Thread.Sleep( moveReadyBuzzerTime );
 
                 this.VehicleStateProperty = eVehicleState.Move;
@@ -1061,10 +1056,10 @@ namespace VehicleControlSystem.ControlLayer
 
                 //Todo: 이동중 명령이 삭제 되면 처리 할일들.
                 //이동중 메인 명력이 없어진다면 정지 후 
-                if ( null == sql.CommandDAL.GetById( this.CurrentSubCommand.CmdID ) )
+                if ( null == this.refObjects.Sqlite.CommandDAL.GetById( this.CurrentSubCommand.CmdID ) )
                 {
                     logger.D( "[Wait Move Done] - 메인 명령 사라짐" );
-                    var cmd = sql.CommandDAL.GetAll();
+                    var cmd = this.refObjects.Sqlite.CommandDAL.GetAll();
                     if ( cmd == null )
                     {
                         logger.D( "[Wait Move Done] - Main Command not Exist Motion Stop" );
@@ -1132,12 +1127,12 @@ namespace VehicleControlSystem.ControlLayer
 
             //Load, Unload 가 끝나면 메인 Command 를 완료 했다고 판단.
             logger.I( $"[SubCommand Complete] - Target : {sub.TargetID} / Type : {sub.Type}" );
-            sql.SubCmdDAL.Clean();
-            var cmd = sql.CommandDAL.GetById( sub.CmdID );
+            this.refObjects.Sqlite.SubCmdDAL.Clean();
+            var cmd = this.refObjects.Sqlite.CommandDAL.GetById( sub.CmdID );
             if ( cmd != null )
             {
                 cmd.State = eCommandState.Complete;
-                sql.CommandDAL.Update( cmd );
+                this.refObjects.Sqlite.CommandDAL.Update( cmd );
             }
 
             TimerUtils.Once( 1000, this.OnLoadComplete );
@@ -1190,12 +1185,12 @@ namespace VehicleControlSystem.ControlLayer
             this.PIOSensorOff();
 
             logger.I( $"[SubCommand Complete] - Target : {sub.TargetID} / Type : {sub.Type}" );
-            sql.SubCmdDAL.Clean();
-            var cmd = sql.CommandDAL.GetById( sub.CmdID );
+            this.refObjects.Sqlite.SubCmdDAL.Clean();
+            var cmd = this.refObjects.Sqlite.CommandDAL.GetById( sub.CmdID );
             if ( cmd != null )
             {
                 cmd.State = eCommandState.Complete;
-                sql.CommandDAL.Update( cmd );
+                this.refObjects.Sqlite.CommandDAL.Update( cmd );
             }
 
             TimerUtils.Once( 1000, this.OnUnloadComplete );
@@ -1214,14 +1209,14 @@ namespace VehicleControlSystem.ControlLayer
             if ( result != ConstInt.EXECUTE_SUCCESS )
                 this.OccurVehicleAlarm( result );
 
-            sql.SubCmdDAL.Clean();
+            this.refObjects.Sqlite.SubCmdDAL.Clean();
 
-            var cmd = sql.CommandDAL.GetById( subCmd.CmdID );
+            var cmd = this.refObjects.Sqlite.CommandDAL.GetById( subCmd.CmdID );
             if ( cmd == null )
                 return;
 
             cmd.State = eCommandState.Complete;
-            sql.CommandDAL.Update( cmd );
+            this.refObjects.Sqlite.CommandDAL.Update( cmd );
         }
 
         /// <summary>
@@ -1232,7 +1227,7 @@ namespace VehicleControlSystem.ControlLayer
         /// <returns></returns>
         int PIOBatteryCharge( SubCmd sub )
         {
-            var route = sql.RouteDal.GetById( sub.TargetID );
+            var route = this.refObjects.Sqlite.RouteDal.GetById( sub.TargetID );
 
             if ( !CorrectPosition( route, this.CurrentPosition ) )
             {
@@ -1240,7 +1235,7 @@ namespace VehicleControlSystem.ControlLayer
                 return 0; //Alarm
             }
 
-            var pioTimeout = CastTo<int>.From<string>( sql.ConfigDal.GetById( ConstString.PIOTimeOut ).Value );
+            var pioTimeout = CastTo<int>.From<string>( this.refObjects.Sqlite.ConfigDal.GetById( ConstString.PIOTimeOut ).Value );
 
             PIOClear();
             loggerPIO.I( $"Start Charge PIO - [{sub.TargetID}]" );
@@ -1273,7 +1268,7 @@ namespace VehicleControlSystem.ControlLayer
                 if ( !this.refObjects.IO.IsOn( "IN_PIO_READY" ) || this.refObjects.IO.IsOn( "IN_PIO_RECEIVE_RUN" ) )
                     break;
 
-                if ( null == sql.CommandDAL.GetById( this.CurrentSubCommand.CmdID ) )
+                if ( null == this.refObjects.Sqlite.CommandDAL.GetById( this.CurrentSubCommand.CmdID ) )
                 {
                     PIOClear();
                     logger.D( "[Wait Charging] - 메인 명령 사라짐" );
@@ -1342,7 +1337,7 @@ namespace VehicleControlSystem.ControlLayer
             this.PIOSensorOn();
             LockUtils.Wait( 500 );
 
-            var pioTimeout = Convert.ToInt32( sql.ConfigDal.GetById( ConstString.PIOTimeOut ).Value );
+            var pioTimeout = Convert.ToInt32( this.refObjects.Sqlite.ConfigDal.GetById( ConstString.PIOTimeOut ).Value );
 
             PIOClear();
             loggerPIO.I( $"Start Battery Charge PIO" );
@@ -1410,7 +1405,7 @@ namespace VehicleControlSystem.ControlLayer
 #else
             loggerPIO.I( $"Stop Battery Charge PIO" );
 
-            var pioTimeout = Convert.ToInt32( sql.ConfigDal.GetById( ConstString.PIOTimeOut ).Value );
+            var pioTimeout = Convert.ToInt32( this.refObjects.Sqlite.ConfigDal.GetById( ConstString.PIOTimeOut ).Value );
 
             this.PIOClear();
 
@@ -1561,7 +1556,7 @@ namespace VehicleControlSystem.ControlLayer
             LockUtils.Wait( 500 );
 
             int result = 0;
-            var pioTimeout = Convert.ToInt32( sql.ConfigDal.GetById( ConstString.PIOTimeOut ).Value );
+            var pioTimeout = Convert.ToInt32( this.refObjects.Sqlite.ConfigDal.GetById( ConstString.PIOTimeOut ).Value );
 
             result = this.refObjects.Clamp.Unlock_Sync();
             if ( result != 0 )
@@ -1733,7 +1728,7 @@ namespace VehicleControlSystem.ControlLayer
 
             int result = 0;
 
-            var pioTimeout = Convert.ToInt32( sql.ConfigDal.GetById( ConstString.PIOTimeOut ).Value );
+            var pioTimeout = Convert.ToInt32( this.refObjects.Sqlite.ConfigDal.GetById( ConstString.PIOTimeOut ).Value );
 
             if ( this.refObjects.Conveyor.IsInverterError() )
                 return 16;
@@ -1872,6 +1867,36 @@ namespace VehicleControlSystem.ControlLayer
         #endregion
 
         #region Help Method
+        Task taskHostConnection = null;
+        /// <summary>
+        /// Move 이후 OCS 연결을 확인 후 Disconnected 상태이면 5분 상태 확인 후 Alarm 발생.
+        /// </summary>
+        void CheckOCSConnectionState()
+        {
+            if ( this.taskHostConnection != null )
+                return;
+
+            if ( refObjects.HostManager.IsConnected )
+                return;
+
+            this.taskHostConnection = new Task( () =>
+             {
+                 long sTime = SwUtils.CurrentTimeMillis;
+                 while ( !refObjects.HostManager.IsConnected )
+                 {
+                     LockUtils.Wait( 100 );
+
+                     if ( SwUtils.Gt( sTime, 30 * ConstUtils.ONE_SECOND ) )
+                     {
+                         OccurVehicleAlarm( 43 );
+                         break;
+                     }
+                 }
+             } );
+
+            this.taskHostConnection = null;
+        }
+
         void BatteryChargeStateLED( double percent )
         {
             if ( percent > 60 )
@@ -2001,7 +2026,7 @@ namespace VehicleControlSystem.ControlLayer
                     hisAlarm.Solution = alarm.Solution;
 
                     var clone = ObjectCopyUtils.DeepClone<Alarm>( alarm );
-                    sql.HisAlarmDAL.Insert( hisAlarm );
+                    this.refObjects.Sqlite.HisAlarmDAL.Insert( hisAlarm );
 
                     return;
                 }
@@ -2011,7 +2036,7 @@ namespace VehicleControlSystem.ControlLayer
             this.VehicleStateProperty = eVehicleState.Abnormal;
             this.ConveyorOff();
 
-            this.autoManager.ProcessAlarm( alarmID );
+            this.refObjects.AutoManager.ProcessAlarm( alarmID );
         }
 
         public void SetObstaclePattern( ObstacleControlEventArgs.eControlKind state, int value )
@@ -2081,19 +2106,6 @@ namespace VehicleControlSystem.ControlLayer
 
                 case eDataKind.SOC:
                     this.BatteryStateOfCharge = (double)obj.Value;
-                    //if ( this.BatteryStateOfCharge >= 78 )
-                    //{
-                    //    if ( this.autoManager.AutoModeStateProperty != eAutoModeState.Run )
-                    //        return;
-
-                    //    if ( this.VehicleStateProperty == eVehicleState.Charge || this.CheckBatteryCharge() || this.BatteryChargeState )
-                    //    {
-                    //        int result = ConstInt.EXECUTE_SUCCESS;
-                    //        result = this.StopBatteryCharge();
-                    //        if ( result != ConstInt.EXECUTE_SUCCESS )
-                    //            this.OccurVehicleAlarm( result );
-                    //    }
-                    //}
                     break;
 
                 case eDataKind.SOH:

+ 4 - 1
Dev/OHV/VehicleControlSystem/Managers/HostManager.cs

@@ -589,7 +589,10 @@ namespace VehicleControlSystem.Managers
 
         private void Manager_OnDiscontd( string id, Exception e )
         {
-            //this.vehicle.OccurVehicleAlarm( 43 );
+            //명령이 없는 상태에서는 Alarm 발생
+            var cl = this.sql.CommandDAL.GetAll().FirstOrDefault();
+            if (cl == null )
+                this.vehicle.OccurVehicleAlarm( 43 );
 
             var msg = new HostConnectedEventArgs( HostConnectedEventArgs.eConnectedState.Disconnected );
             this.eventAggregator.GetEvent<HostConnectedPubSubEvent>().Publish( msg );

+ 6 - 6
Dev/OHV/VehicleControlSystem/Managers/Scheduler.cs

@@ -167,13 +167,13 @@ namespace VehicleControlSystem.Managers
             if ( !IsCreateDryRunCommand )
                 return;
 
-            if ( this.bMUManager.ReceivedDataDic[eDataKind.SOC].Value <= 15 )
+            if ( this.bMUManager.ReceivedDataDic[eDataKind.SOC].Value <= 25 )
             {
-                var chargePoint = "2";
-                Command chageCmd = new Command() { TargetID = chargePoint, Type = eCommandType.Charging };
-                chageCmd.ByWho = eCommandByWho.LocalSystem;
+//!                var chargePoint = "2";
+//                Command chageCmd = new Command() { TargetID = chargePoint, Type = eCommandType.Charging };
+//                chageCmd.ByWho = eCommandByWho.LocalSystem;
 
-                this.AddCommand( chageCmd );
+//                this.AddCommand( chageCmd );
 
                 this.IsCreateDryRunCommand = false;
                 return;
@@ -182,7 +182,7 @@ namespace VehicleControlSystem.Managers
             string targetPoint = string.Empty;
             if ( isSTK )
             {
-                targetPoint = RouteManager.Instance.Equipments.Where( x => x.Name.Equals( "CAN_STATION_IP01" ) ).SingleOrDefault().pointID.ToString();
+                targetPoint = RouteManager.Instance.Equipments.Where( x => x.Name.Equals( "CHARGING_02" ) ).SingleOrDefault().pointID.ToString();
                 isSTK = false;
             }
             else

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

@@ -124,6 +124,13 @@ namespace VehicleControlSystem
             this.drive = new GSIDrive( this.sql, this.steering, this.zmqManager );
             this.drive.Init();
 
+            //Process
+            this.autoManager = new AutoManager( this.IO, this.eventAggregator, this.sql, this.Alarms );
+            this.scheduler = new Scheduler( eventAggregator, this.autoManager, this.sql, this.bMUManager );
+            this.vehicle = new Vehicle( this.eventAggregator );
+
+            this.hostManager = new HostManager( this.eventAggregator, this.vehicle, this.sql, this.autoManager, this.scheduler );
+
             var refObject = new VehicleRefObjects();
             refObject.IO = this.IO as EzIO;
             refObject.BMUManager = this.bMUManager;
@@ -133,23 +140,19 @@ namespace VehicleControlSystem
             refObject.Steering = this.steering;
             refObject.ZmqManager = this.zmqManager;
             refObject.Alarms = this.Alarms;
+            refObject.Sqlite = this.sql;
+            refObject.AutoManager = this.autoManager;
+            refObject.HostManager = this.hostManager;
 
-            //Process
-            this.autoManager = new AutoManager( this.IO, this.eventAggregator, this.sql, this.Alarms );
-            this.scheduler = new Scheduler( eventAggregator, this.autoManager, this.sql, this.bMUManager );
-
-            this.vehicle = new Vehicle( refObject, this.IO, this.sql, this.eventAggregator, this.autoManager );
+            this.vehicle.DependencyInjection( refObject );
             this.vehicle.PropertyChanged += Vehicle_PropertyChanged;
 
-            this.hostManager = new HostManager( this.eventAggregator, this.vehicle, this.sql, this.autoManager, this.scheduler );
-
             this.hostManager.Init();
-            this.vehicle.Init(this.hostManager);
+            this.vehicle.Init();
             this.scheduler.Init();
             this.autoManager.Init( this.vehicle );
         }
 
-
         private void Vehicle_PropertyChanged( object sender, System.ComponentModel.PropertyChangedEventArgs e )
         {
             var arg = new GUIMessageEventArgs();

BIN
Dev/OHVDriveLogger/OHVDriveLogger/.vs/OHVDriveLogger/v16/Server/sqlite3/storage.ide


BIN
Dev/OHVDriveLogger/OHVDriveLogger/.vs/OHVDriveLogger/v16/Server/sqlite3/storage.ide-shm


BIN
Dev/OHVDriveLogger/OHVDriveLogger/.vs/OHVDriveLogger/v16/Server/sqlite3/storage.ide-wal


+ 1 - 1
Dev/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger/App.config

@@ -5,7 +5,7 @@
     </startup>
 
 	<appSettings>
-		<add key="VehicleID" value="V02"/>
+		<add key="VehicleID" value="V01"/>
 		<add key="FTPUploadIP" value="192.168.127.123"/>
 		<add key="PLC_IP" value="192.168.0.20"/>
 		<add key="PLC_PORT" value="5000"/>

+ 1 - 1
Dev/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger/Config/log4net.xml

@@ -82,7 +82,7 @@
 	</appender>
 
 	<appender name="FileAppender" type="GSG.NET.Logging.FileAppender, GSG.NET">
-		<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
+		<!--<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />-->
 		<file type="log4net.Util.PatternString">
 			<conversionPattern value="C:\LOG\OHV\DriveLogger\DriveLogger.log"  />
 		</file>

+ 1 - 1
Dev/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger/FTPLogger.cs

@@ -22,7 +22,7 @@ namespace OHVDriveLogger
             using ( var ftp = new FtpClient( UploadIP ) )
             {
                 ftp.Connect();
-                ftp.UploadDirectory( @"C:\LOG\FTP\", @"\LOG\", FtpFolderSyncMode.Update );
+                //ftp.UploadDirectory( @"C:\LOG\FTP\", @"\LOG\", FtpFolderSyncMode.Update );
                 ftp.UploadDirectory( @"C:\LOG\OHV\DriveLogger\PhysicalCheckup\", @"\LOG\", FtpFolderSyncMode.Update);
 
                 ftp.Disconnect();

+ 3 - 3
Dev/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger/FormMain.cs

@@ -175,7 +175,7 @@ namespace OHVDriveLogger
             {
             }
 
-            //Buffer 에 있는 내용을 써야지.;
+            //Buffer 에 있는 내용을 써야지.
             var appenders = logger.logger.Logger.Repository.GetAppenders();
             foreach ( var a in appenders )
             {
@@ -186,8 +186,8 @@ namespace OHVDriveLogger
 
             this.plc.WriteBit( "DRIVE_LOGGING_ONOFF", false );
 
-            LockUtils.Wait( 200 );
-            FTPLogger.Instance.FTPDownload();
+            //LockUtils.Wait( 200 );
+            //FTPLogger.Instance.FTPDownload();
             LockUtils.Wait( 500 );
             FTPLogger.Instance.FTPUpload();
             LockUtils.Wait( 100 );