DESKTOP-Kang 6 лет назад
Родитель
Сommit
b9e5317ded
22 измененных файлов с 465 добавлено и 130 удалено
  1. 1 1
      Dev/Connection/OHVProtocolServer/OHVConnector/OCSMessage.cs
  2. 2 1
      Dev/Connection/OHVProtocolServer/OHVConnector/OHVConnector.csproj
  3. 19 3
      Dev/Connection/OHVProtocolServer/OHVProtocolClient/MainWindow.xaml.cs
  4. 4 4
      Dev/Connection/OHVProtocolServer/OHVProtocolClient/OHVProtocolClient.csproj
  5. 0 6
      Dev/Connection/OHVProtocolServer/OHVProtocolServer.sln
  6. BIN
      Dev/OHV/Assambly/OHVConnector.dll
  7. BIN
      Dev/OHV/Assambly/OHVConnector.pdb
  8. 7 7
      Dev/OHV/OHV.Module.ListViews/Views/SubCommandListView.xaml
  9. 6 1
      Dev/OHV/VehicleControlSystem/ControlLayer/DB/Redis.cs
  10. 27 5
      Dev/OHV/VehicleControlSystem/ControlLayer/Motion/GSIDrive.cs
  11. 144 66
      Dev/OHV/VehicleControlSystem/ControlLayer/Vehicle.cs
  12. 2 2
      Dev/OHV/VehicleControlSystem/Managers/AutoManager.cs
  13. 30 28
      Dev/OHV/VehicleControlSystem/Managers/HostManager.cs
  14. 3 2
      Dev/OHV/VehicleControlSystem/Managers/Scheduler.cs
  15. BIN
      Dev/OHVLoggerTest/.vs/OHVLoggerTest/v16/Server/sqlite3/storage.ide
  16. BIN
      Dev/OHVLoggerTest/.vs/OHVLoggerTest/v16/Server/sqlite3/storage.ide-shm
  17. BIN
      Dev/OHVLoggerTest/.vs/OHVLoggerTest/v16/Server/sqlite3/storage.ide-wal
  18. 13 0
      Dev/OHVLoggerTest/OHVLoggerTest/Form1.Designer.cs
  19. 169 4
      Dev/OHVLoggerTest/OHVLoggerTest/Form1.cs
  20. 3 0
      Dev/OHVLoggerTest/OHVLoggerTest/OHVLoggerTest.csproj
  21. 34 0
      Dev/OHVLoggerTest/OHVLoggerTest/Redis.cs
  22. 1 0
      Dev/OHVLoggerTest/OHVLoggerTest/packages.config

+ 1 - 1
Dev/Connection/OHVProtocolServer/OHVConnector/OCSMessage.cs

@@ -102,7 +102,7 @@ namespace OHVConnector
             mb.AppendAscii( RevID );
             mb.AppendAscii( SendID );
             mb.AppendAscii( this.Kind.ToString() );
-            mb.AppendAscii( this.Tag );
+            mb.AppendAscii( this.Tag ); //4자리로 맞춘다.
             mb.AppendAscii( MakeSubcode() );
 
             if ( this.Kind == eKind.M)

+ 2 - 1
Dev/Connection/OHVProtocolServer/OHVConnector/OHVConnector.csproj

@@ -31,7 +31,8 @@
     <WarningLevel>4</WarningLevel>
   </PropertyGroup>
   <ItemGroup>
-    <Reference Include="GSG.NET">
+    <Reference Include="GSG.NET, Version=1.0.0.0, Culture=neutral, PublicKeyToken=76fe77e7aaffb33a, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\OHV\Assambly\GSG.NET.dll</HintPath>
     </Reference>
     <Reference Include="System" />

+ 19 - 3
Dev/Connection/OHVProtocolServer/OHVProtocolClient/MainWindow.xaml.cs

@@ -40,7 +40,7 @@ namespace OHVProtocolClient
             QuartzUtils.Init( 10 );
 
             manager = new Manager();
-            manager.Config = new Config() {IpAddress="192.168.127.20", Port=5000, ID = "S0", HostID="V0002" };
+            manager.Config = new Config() {IpAddress="127.0.0.1", Port=5000, ID = "S0", HostID="V0001" };
             manager.Connect(true);
 
             manager.OnRecd += Cn_OnRecd;
@@ -72,6 +72,8 @@ namespace OHVProtocolClient
             this.lblState.Background = Brushes.Gray;
 
             QuartzUtils.StopSchedule( "Scode" );
+            QuartzUtils.StopSchedule( "Acode" );
+
         }
 
         private void Cn_OnContd(string id)
@@ -80,9 +82,24 @@ namespace OHVProtocolClient
 
             QuartzUtils.Invoke( "Scode", QuartzUtils.GetExpnMinute( 3 ), RequestScode );
 
+            QuartzUtils.Invoke( "Acode", QuartzUtils.GetExpnSecond( 3 ), AliveCheck );
+
             RequestBcode();
         }
 
+        void AliveCheck()
+        {
+            var om = new OCSMessage();
+            om.Id = "S0";
+            om.Kind = eKind.A;
+            //om.RevID = "V0001";
+            //om.SendID = om.Id;
+            om.Tag = DateTime.Now.ToString( "mmss" );
+            om.SubCode = DateTime.Now.ToString( "fff" );
+
+            this.manager.Send( om );
+        }
+
         private void Cn_OnRecd(OCSMessage msg)
         {
             logger.I("[Received] : " + msg.LogFormat());
@@ -103,11 +120,10 @@ namespace OHVProtocolClient
                 case eKind.P:
                 case eKind.L:
                 case eKind.U:
+                case eKind.T:
                     ReplyMessage( msg );
                     break;
 
-                case eKind.T:
-                    break;
                 case eKind.C:
                     break;
                 case eKind.A:

+ 4 - 4
Dev/Connection/OHVProtocolServer/OHVProtocolClient/OHVProtocolClient.csproj

@@ -34,6 +34,10 @@
     <WarningLevel>4</WarningLevel>
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="GSG.NET, Version=1.0.0.0, Culture=neutral, PublicKeyToken=76fe77e7aaffb33a, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\OHV\Assambly\GSG.NET.dll</HintPath>
+    </Reference>
     <Reference Include="Quartz, Version=1.0.3.2, Culture=neutral, PublicKeyToken=f6b8c98a402cc8a4, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\OHV\Assambly\Quartz.dll</HintPath>
@@ -98,10 +102,6 @@
     <None Include="App.config" />
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\..\..\..\..\GSG\GSG\GSG.NET\GSG.NET.csproj">
-      <Project>{11e12a58-fdbc-444a-90e6-db96b7e98ff4}</Project>
-      <Name>GSG.NET</Name>
-    </ProjectReference>
     <ProjectReference Include="..\OHVConnector\OHVConnector.csproj">
       <Project>{b9a8b13b-518b-4ae4-b8b6-c2684df6608a}</Project>
       <Name>OHVConnector</Name>

+ 0 - 6
Dev/Connection/OHVProtocolServer/OHVProtocolServer.sln

@@ -7,8 +7,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OHVProtocolServer", "OHVPro
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OHVConnector", "OHVConnector\OHVConnector.csproj", "{B9A8B13B-518B-4AE4-B8B6-C2684DF6608A}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GSG.NET", "..\..\..\..\GSG\GSG\GSG.NET\GSG.NET.csproj", "{11E12A58-FDBC-444A-90E6-DB96B7E98FF4}"
-EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OHVProtocolClient", "OHVProtocolClient\OHVProtocolClient.csproj", "{9C0379FF-03EE-41E4-8065-C72A957E6557}"
 EndProject
 Global
@@ -25,10 +23,6 @@ Global
 		{B9A8B13B-518B-4AE4-B8B6-C2684DF6608A}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{B9A8B13B-518B-4AE4-B8B6-C2684DF6608A}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{B9A8B13B-518B-4AE4-B8B6-C2684DF6608A}.Release|Any CPU.Build.0 = Release|Any CPU
-		{11E12A58-FDBC-444A-90E6-DB96B7E98FF4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{11E12A58-FDBC-444A-90E6-DB96B7E98FF4}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{11E12A58-FDBC-444A-90E6-DB96B7E98FF4}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{11E12A58-FDBC-444A-90E6-DB96B7E98FF4}.Release|Any CPU.Build.0 = Release|Any CPU
 		{9C0379FF-03EE-41E4-8065-C72A957E6557}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{9C0379FF-03EE-41E4-8065-C72A957E6557}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{9C0379FF-03EE-41E4-8065-C72A957E6557}.Release|Any CPU.ActiveCfg = Release|Any CPU

BIN
Dev/OHV/Assambly/OHVConnector.dll


BIN
Dev/OHV/Assambly/OHVConnector.pdb


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

@@ -102,10 +102,10 @@
                             <ColumnDefinition Width="120"/>
                             <ColumnDefinition Width="*"/>
                         </Grid.ColumnDefinitions>
-                        <TextBlock Text="ID" Style="{DynamicResource MaterialDesignTextBlock}" VerticalAlignment="Center"/>
-                        <!--<TextBlock Grid.Column="1" Style="{DynamicResource MaterialDesignTextBlock}" VerticalAlignment="Center" HorizontalAlignment="Center" Text="{Binding SelectedSubCmdID, Mode=OneWay}"/>-->
-                        <ComboBox ItemsSource="{Binding TargetIDList}" SelectedItem="{Binding TargetID, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"  Grid.Column="1">
-                        </ComboBox>
+                        <TextBlock Text="ID" Style="{DynamicResource MaterialDesignTextBlock}" VerticalAlignment="Center" />
+                        <TextBlock Grid.Column="1" Style="{DynamicResource MaterialDesignTextBlock}" VerticalAlignment="Center" HorizontalAlignment="Center" Text="{Binding SelectedSubCmdID, Mode=OneWay}"/>
+                        <!--<ComboBox ItemsSource="{Binding TargetIDList}" SelectedItem="{Binding TargetID, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"  Grid.Column="1">
+                        </ComboBox>-->
                     </Grid>
 
                     <Grid Margin="0,10,0,0" Grid.Row="1" Height="25">
@@ -113,16 +113,16 @@
                             <ColumnDefinition Width="120"/>
                             <ColumnDefinition Width="*"/>
                         </Grid.ColumnDefinitions>
-                        <TextBlock Text="Type" Style="{DynamicResource MaterialDesignTextBlock}" VerticalAlignment="Center"/>
+                        <!--<TextBlock Text="Type" Style="{DynamicResource MaterialDesignTextBlock}" VerticalAlignment="Center"/>
                         <ComboBox ItemsSource="{Binding Source={StaticResource SubCommandType}}" SelectedItem="{Binding SelectedCommandType, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"  Grid.Column="1">
-                        </ComboBox>
+                        </ComboBox>-->
                         <!--<TextBlock Grid.Column="1" Style="{DynamicResource MaterialDesignTextBlock}" VerticalAlignment="Center" HorizontalAlignment="Center" Text="{Binding SelectedSubCmdType, Mode=OneWay}"/>-->
                     </Grid>
 
                 </Grid>
 
                 <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Grid.Row="2" VerticalAlignment="Top" Margin="0,15,0,0">
-                    <Button Height="45" Content="Add" Command="{Binding AddCommand}" Width="100" Margin="0,0,10,0"/>
+                    <!--<Button Height="45" Content="Add" Command="{Binding AddCommand}" Width="100" Margin="0,0,10,0"/>-->
                     <Button Height="45" Content="Delete" Command="{Binding DeleteCommand}" Width="100"/>
                 </StackPanel>
             </Grid>

+ 6 - 1
Dev/OHV/VehicleControlSystem/ControlLayer/DB/Redis.cs

@@ -94,7 +94,6 @@ namespace VehicleControlSystem.ControlLayer.DB
                 return false;
             else
                 return true;
-
         }
 
         #endregion
@@ -130,6 +129,12 @@ namespace VehicleControlSystem.ControlLayer.DB
 
         #endregion
 
+        public int GetCurrentPoint()
+        {
+            var ret =  database.HashGet( "3012", "7" );
+            return CastTo<int>.From<RedisValue>( ret );
+        }
+
         /// <summary>
         /// Steering 뱡향 요청
         /// </summary>

+ 27 - 5
Dev/OHV/VehicleControlSystem/ControlLayer/Motion/GSIDrive.cs

@@ -1,5 +1,6 @@
 using GSG.NET.Concurrent;
 using GSG.NET.Logging;
+using GSG.NET.Utils;
 using OHV.Common.Model;
 using OHV.Common.Shareds;
 using OHV.SqliteDAL;
@@ -28,8 +29,8 @@ namespace VehicleControlSystem.ControlLayer.Drive
         double currentPos = 0;
         public double CurrentPos { get { return this.currentPos; } set { SetField( ref this.currentPos, value ); } }
 
-        private string currentTag;
-        public string CurrentTag { get { return currentTag; } set { SetField( ref this.currentTag, value ); } }
+        private int currentTag;
+        public int CurrentTag { get { return currentTag; } set { SetField( ref this.currentTag, value ); } }
 
         private double currentSpeed = 0;
         public double CurrentSpeed { get { return currentSpeed; } set { SetField( ref this.currentSpeed, value ); } }
@@ -107,7 +108,9 @@ namespace VehicleControlSystem.ControlLayer.Drive
                 {
                     LockUtils.Wait( 10 );
                     this.GetReqSteeringState();
-                    //this.GetServoState();
+
+                    this.CurrentTag = Redis.Instance.GetCurrentPoint();
+
                     //if (Redis.Instance.GetDriveMove() )
                     //{
                     //    this.LoggingState();
@@ -147,8 +150,8 @@ namespace VehicleControlSystem.ControlLayer.Drive
 
                     if ( Redis.Instance.GetDriveMove() )
                     {
-                        this.IsloggingStart = true;
-                        this.LoggingState();
+                        //this.IsloggingStart = true;
+                        //this.LoggingState();
                     }
                     else
                         this.IsloggingStart = false;
@@ -211,6 +214,9 @@ namespace VehicleControlSystem.ControlLayer.Drive
             return ret == 2 ? true : false;
         }
 
+        public bool IsDriveStop() => !Redis.Instance.GetDriveMove();
+        public bool IsDriveMoving() => Redis.Instance.GetDriveMove();
+
         public void SetDriveOperationMode( eOperatationMode mode )
         {
 
@@ -249,6 +255,21 @@ namespace VehicleControlSystem.ControlLayer.Drive
                 //Todo: Error 처리
             }
 
+            int waitTime = 10000;
+            long st = SwUtils.CurrentTimeMillis;
+            while ( true )
+            {
+                LockUtils.Wait( 10 );
+
+                if ( SwUtils.Gt( st, waitTime ) )
+                {
+                    logger.D("MoveToPoint Time Out");
+                    return -1;
+                }
+
+                if ( Redis.Instance.GetDriveMove() )
+                    break;
+            }
 
             return 0;
         }
@@ -263,6 +284,7 @@ namespace VehicleControlSystem.ControlLayer.Drive
         /// </summary>
         public void Stop()
         {
+            
         }
 
         //public void JogForWard() => OHVdriveSetManualOperationCommand( 1 );

+ 144 - 66
Dev/OHV/VehicleControlSystem/ControlLayer/Vehicle.cs

@@ -53,8 +53,8 @@ namespace VehicleControlSystem.ControlLayer
         /// <summary>
         /// Tag 위치
         /// </summary>
-        private string currentTag = "0000";
-        public string CurrentTag
+        private int currentTag = 0;
+        public int CurrentTag
         {
             get { return currentTag; }
             set
@@ -62,7 +62,7 @@ namespace VehicleControlSystem.ControlLayer
                 if ( SetField( ref this.currentTag, value ) )
                 {
                     var info = sql.VehicleInfoDAL.GetInfo();
-                    info.CurrentTag = value;
+                    info.CurrentTag = value.ToString();
                     sql.VehicleInfoDAL.Update( info );
 
                     this.OnCurrentTagChanged?.Invoke( value );
@@ -211,7 +211,7 @@ namespace VehicleControlSystem.ControlLayer
             set { }
         }
 
-        public bool IsMoving { get; set; }
+        public bool IsMoving { get => this.drive.IsDriveMoving(); }
         #region Battery Property
 
         double batteryVoltage;
@@ -316,7 +316,7 @@ namespace VehicleControlSystem.ControlLayer
         public event Action OnLoadComplete;
         public event Action OnUnloadComplete;
 
-        public event Action<string> OnCurrentTagChanged;
+        public event Action<int> OnCurrentTagChanged;
 
         public event Action OnManualMove;
         public event Action OnManualLoad;
@@ -374,7 +374,6 @@ namespace VehicleControlSystem.ControlLayer
             this.eventAggregator.GetEvent<ObstacleControlPubSubEvent>().Subscribe( ObstacleReceiveEvent );
         }
 
-
         private void ObstacleReceiveEvent( ObstacleControlEventArgs obj )
         {
             if ( this.autoManager.OperationModeProperty != eOperatationMode.ManualMode )
@@ -590,7 +589,7 @@ namespace VehicleControlSystem.ControlLayer
             VehicleInfo state = new VehicleInfo();
             state.CurrentPosition = this.CurrentPosition;
             state.CurrentSpeed = this.CurrentSpeed;
-            state.CurrentTag = this.CurrentTag;
+            state.CurrentTag = this.CurrentTag.ToString();
             state.CurrentTorque = this.CurrentTorque;
 
             var msg = new DriveControlEventArgs();
@@ -819,7 +818,7 @@ namespace VehicleControlSystem.ControlLayer
         {
             //Move 시작 시 충전 중이면 충전 중지 실행.
             int result = 0;
-            if ( this.IsCharging() )
+            if ( this.IsCharging() || this.VehicleStateProperty == eVehicleState.Charge )
             {
                 result = this.StopBatteryCharge();
                 if ( result != 0 )
@@ -838,10 +837,10 @@ namespace VehicleControlSystem.ControlLayer
 
         bool MoveTo( string pointID )
         {
-            //this.BuzzerOnOff(true, eBuzzerKind.StartWarn);
+            //this.BuzzerOnOff( true, eBuzzerKind.StartWarn );
             ////TimerUtils.Once(3000, BuzzerOnOff, false, eBuzzerKind.StartWarn );
-            //Thread.Sleep(3000);
-            //this.BuzzerOnOff(false);
+            //Thread.Sleep( 3000 );
+            //this.BuzzerOnOff( false );
 
             if ( this.VehicleStateProperty == eVehicleState.Idle )
             {
@@ -854,7 +853,6 @@ namespace VehicleControlSystem.ControlLayer
             }
 
             this.OnMoving?.Invoke();
-            this.IsMoving = true;
 
             //이전에 있던 작업들 종료 및 삭제
             this.taskMoveCancel.Cancel();
@@ -862,7 +860,7 @@ namespace VehicleControlSystem.ControlLayer
 
             this.taskMoveCancel.Add( CheckCrossPoint() );
 
-            PhysicalCheckupLogger.Instance.SetPLCStartDrive();
+            //PhysicalCheckupLogger.Instance.SetPLCStartDrive();
             this.VehicleStateProperty = eVehicleState.Move;
             //this.BuzzerOnOff(true, eBuzzerKind.Moving);
             this.drive.MoveToPoint( pointID, 100 );
@@ -874,23 +872,21 @@ namespace VehicleControlSystem.ControlLayer
             this.taskMoveCancel.WaitAll();
 
             //Drive 에서 정지 확인 후 상태 변경
-            if ( drive.IsStop )
+            if ( drive.IsDriveStop() )
             {
-                this.IsMoving = false;
                 this.OnMoveFinish?.Invoke();
 
-                PhysicalCheckupLogger.Instance.ResetPLCStartDrive();
+                //PhysicalCheckupLogger.Instance.ResetPLCStartDrive();
                 this.VehicleStateProperty = eVehicleState.Idle;
+                logger.D( "Move Finish" );
             }
 
-            //PhysicalCheckupLogger.Instance.UploadPhysicalCheckupLog();
-
             return result;
         }
 
         bool Wait4MoveDone()
         {
-            int waitTime = 9000; //설정 할 수있게.
+            int waitTime = 60000; //설정 할 수있게.
             long st = SwUtils.CurrentTimeMillis;
 
             //Todo: 이동시 확인 사항들.
@@ -898,11 +894,12 @@ namespace VehicleControlSystem.ControlLayer
             {
                 Thread.Sleep( 5 );
 
-                if ( SwUtils.Gt( st, waitTime ) )
-                {
-                    //Todo: 이동시간 초과 시 동작들.
-                    break;
-                }
+                //if ( SwUtils.Gt( st, waitTime ) )
+                //{
+                //    //Todo: 이동시간 초과 시 동작들.
+                //    logger.D( "Wait4MoveDone Time Over" );
+                //    break;
+                //}
 
                 //Todo: 이동중 명령이 삭제 되면 처리 할일들.
                 //이동중 메인 명력이 없어진다면 정지 후 
@@ -923,6 +920,9 @@ namespace VehicleControlSystem.ControlLayer
                     }
                 }
 
+                if ( this.drive.IsDriveStop() )
+                    break;
+
                 //PhysicalCheckupLogger.Instance.DriveStateLog( this.drive.CurrentSpeed.ToString(), this.drive.CurrentTorque.ToString(), "12315", "100", "1234" );
                 //PhysicalCheckupLogger.Instance.DriveStateLog( this.drive.CurrentSpeed.ToString(), this.drive.CurrentTorque.ToString(), "12315", "100", "1234", false );
 
@@ -970,11 +970,11 @@ namespace VehicleControlSystem.ControlLayer
 
             var route = sql.RouteDal.GetRoute( sub.TargetID );
 
-            if ( !CorrectPosition( route, this.CurrentPosition ) )
-            {
-                this.OccurVehicleAlarm( 20 );
-                return false; //Alarm
-            }
+            //if ( !CorrectPosition( route, this.CurrentPosition ) )
+            //{
+            //    this.OccurVehicleAlarm( 20 );
+            //    return false; //Alarm
+            //}
 
             //PIO 내부로 이동.
             //int result = this.clamp.Unlock_Sync();
@@ -1016,14 +1016,20 @@ namespace VehicleControlSystem.ControlLayer
         {
             this.VehicleStateProperty = eVehicleState.Unload;
 
-            var route = sql.RouteDal.GetRoute( sub.TargetID );
-
-            if ( !CorrectPosition( route, this.CurrentPosition ) )
+            if ( !this.CurrentTag.ToString().Equals( sub.TargetID ) )
             {
                 this.OccurVehicleAlarm( 21 );
                 return false; //Alarm
             }
 
+            //var route = sql.RouteDal.GetRoute( sub.TargetID );
+
+            //if ( !CorrectPosition( route, this.CurrentPosition ) )
+            //{
+            //    this.OccurVehicleAlarm( 21 );
+            //    return false; //Alarm
+            //}
+
             //PIO 내부로 이동.
             //int result = this.clamp.Unlock_Sync();
             //if ( result != 0 )
@@ -1055,15 +1061,11 @@ namespace VehicleControlSystem.ControlLayer
 
         public void BatteryCharge( SubCmd subCmd )
         {
-            this.VehicleStateProperty = eVehicleState.Charge;
-
             int result = 0;
             result = this.StartBatteryCharge();
 
             sql.CommandDAL.UpdateState( subCmd.CmdID, eCommandState.Complete );
             sql.SubCmdDAL.Delete( subCmd );
-
-            this.VehicleStateProperty = eVehicleState.Idle;
         }
 
         /// <summary>
@@ -1142,6 +1144,45 @@ namespace VehicleControlSystem.ControlLayer
 
         public int StartBatteryCharge()
         {
+#if SIMULATION
+            this.PIOSensorOn();
+
+            var pioTimeout = sql.ConfigDal.GetValueToInt( ConstString.PIOTimeOut );
+
+            PIOClear();
+            loggerPIO.I( $"Start Battery Charge PIO" );
+
+            //if ( !this.iO.WaitChangeInputIO( true, pioTimeout, "IN_PIO_SENDABLE" ) )
+            //{
+            //    PIOClear();
+            //    loggerPIO.E( "[Port] - 4 Ready Time Out" );
+            //    return 34;
+            //}
+            Thread.Sleep( 1000 );
+            loggerPIO.E( "[Port] - 4 Ready On" );
+
+            this.iO.WriteOutputIO( "OUT_PIO_RECEIVABLE", true );
+            loggerPIO.I( "[Vehicle] - 4 Receivable" );
+
+            //if ( !this.iO.WaitChangeInputIO( true, 20000, "IN_PIO_SEND_RUN" ) )
+            //{
+            //    PIOClear();
+            //    loggerPIO.E( "[Port] - 5 Sending Run Time Out" );
+            //    return 35;
+            //}
+            Thread.Sleep( 1000 );
+            loggerPIO.I( "[Port] - 5 Sending Run On" );
+
+            this.iO.WriteOutputIO( "OUT_PIO_RECEIVE_RUN", true );
+            loggerPIO.I( "[Vehicle] - 5 Receive Run On" );
+
+            this.VehicleStateProperty = eVehicleState.Charge;
+            this.OnChargingStart?.Invoke();
+            Thread.Sleep( 1000 );
+            this.OnCharging?.Invoke();
+
+            return 0;
+#else
             this.PIOSensorOn();
 
             var pioTimeout = sql.ConfigDal.GetValueToInt( ConstString.PIOTimeOut );
@@ -1174,10 +1215,42 @@ namespace VehicleControlSystem.ControlLayer
             this.VehicleStateProperty = eVehicleState.Charge;
 
             return 0;
+#endif
+
         }
 
         public int StopBatteryCharge()
         {
+#if SIMULATION
+            loggerPIO.I( $"Stop Battery Charge PIO" );
+
+            var pioTimeout = sql.ConfigDal.GetValueToInt( ConstString.PIOTimeOut );
+
+            this.PIOClear();
+
+            this.iO.WriteOutputIO( "OUT_PIO_RECIVE_COMPLITE", true );
+            loggerPIO.I( "[Vehicle] Receive Complete On" );
+
+            //if ( !this.iO.WaitChangeInputIO( true, 20000, "IN_PIO_SEND_COMPLITE" ) )
+            //{
+            //    this.iO.WriteOutputIO( "OUT_PIO_RECIVE_COMPLITE", false );
+            //    loggerPIO.E( "[Port]  IN_PIO_SEND_COMPLITE On Time Out" );
+            //    return 36;
+            //}
+            Thread.Sleep( 1000 );
+            loggerPIO.I( "[Port] Send Complete On" );
+
+            Thread.Sleep( 1000 );
+            this.iO.WriteOutputIO( "OUT_PIO_RECIVE_COMPLITE", false );
+
+            this.OnChargingFull?.Invoke();
+
+            this.PIOSensorOff();
+
+            this.VehicleStateProperty = eVehicleState.Idle;
+
+            return 0;
+#else
             loggerPIO.I( $"Stop Battery Charge PIO" );
 
             var pioTimeout = sql.ConfigDal.GetValueToInt( ConstString.PIOTimeOut );
@@ -1203,11 +1276,12 @@ namespace VehicleControlSystem.ControlLayer
             this.VehicleStateProperty = eVehicleState.Idle;
 
             return 0;
+#endif
         }
 
-        #endregion
+#endregion
 
-        #region Check Method
+#region Check Method
         bool CheckObstacle()
         {
             if ( this.iO.IsOn( "IN_OBSTRUCTION_DETECT_SAFETY" ) || this.iO.IsOn( "IN_OBSTRUCTION_DETECT_ERROR" ) )
@@ -1245,11 +1319,11 @@ namespace VehicleControlSystem.ControlLayer
             //if ( !this.iO.IsOn( "IN_MC_ON" ) ) this.OccurVehicleAlarm( 29 );
         }
 
-        #endregion
+#endregion
 
-        #region Mechanical Method
+#region Mechanical Method
 
-        #region IO
+#region IO
         /// <summary>
         /// Out Put 을 On 이면 Sensor Off
         /// </summary>
@@ -1265,14 +1339,14 @@ namespace VehicleControlSystem.ControlLayer
         /// </summary>
         /// <returns></returns>
         public bool IsCharging() => this.iO.IsOn( "IN_PIO_SEND_RUN" ) && this.iO.IsOn( "IN_PIO_SENDABLE" );
-        #endregion
+#endregion
 
-        #region Drive
+#region Drive
         //public void DriveServoOff() => this.drive.ServoOff();
         //public void DriveServoOn() => this.drive.ServoOn();
-        #endregion
+#endregion
 
-        #region Conveyor
+#region Conveyor
         public void ConveyorOff() => this.conveyor.OnOffConveyor( false );
         public int ConveyorLoad() => this.conveyor.ConveyorLoad();
 
@@ -1306,20 +1380,21 @@ namespace VehicleControlSystem.ControlLayer
             this.OnLoadComplete?.Invoke();
 #else
 
-            int result = this.clamp.Unlock_Sync();
+            int result = 0;
+            var pioTimeout = sql.ConfigDal.GetValueToInt( ConstString.PIOTimeOut );
+
+            result = this.clamp.Unlock_Sync();
             if ( result != 0 )
             {
                 this.OccurVehicleAlarm( result );
                 return result;
             }
 
-            var pioTimeout = sql.ConfigDal.GetValueToInt( ConstString.PIOTimeOut );
-
             if ( this.conveyor.IsInverterError() )
                 return 16;
 
-            //if ( !this.conveyor.IsLifterPositinCheck() )
-            //    return 14;
+            if ( !this.conveyor.IsLifterPositinCheck() )
+                return 14;
 
             //Todo: Sensor Setting 이 후 주석 풀기.
             //if ( !this.IsLifterDuplication() )
@@ -1350,6 +1425,7 @@ namespace VehicleControlSystem.ControlLayer
             }
             loggerPIO.E( "[Port] - 4 Ready On" );
 
+
             //this.conveyor.SetConveyorSpeed( true );
             this.conveyor.OnOffConveyor( true, true );
             this.iO.WriteOutputIO( "OUT_PIO_RECEIVE_RUN", true, 1000 ); //1Sec 이후 On
@@ -1459,13 +1535,7 @@ namespace VehicleControlSystem.ControlLayer
             Thread.Sleep( 1000 );
             this.OnUnloadComplete?.Invoke();
 #else
-
-            int result = this.clamp.Unlock_Sync();
-            if ( result != 0 )
-            {
-                this.OccurVehicleAlarm( result );
-                return result;
-            }
+            int result = 0;
 
             var pioTimeout = sql.ConfigDal.GetValueToInt( ConstString.PIOTimeOut );
 
@@ -1510,6 +1580,13 @@ namespace VehicleControlSystem.ControlLayer
             }
             loggerPIO.E( "[Port] - 2 Receive CV Run On" );
 
+            result = this.clamp.Unlock_Sync();
+            if ( result != 0 )
+            {
+                this.OccurVehicleAlarm( result );
+                return result;
+            }
+
             this.iO.WriteOutputIO( "OUT_PIO_SENDING_RUN", true );
             loggerPIO.I( "[Vehicle] - 2 Send Run On" );
 
@@ -1569,11 +1646,11 @@ namespace VehicleControlSystem.ControlLayer
             pio.FwEach( x => { this.iO.OutputOff( x ); } );
         }
 
-        #endregion
+#endregion
 
-        #endregion
+#endregion
 
-        #region Hardware Create Method
+#region Hardware Create Method
         void CreateSteering()
         {
             this.steering = new Steering( this.iO, this.sql, this.eventAggregator );
@@ -1672,9 +1749,9 @@ namespace VehicleControlSystem.ControlLayer
             }
         }
 
-        #endregion
+#endregion
 
-        #region Help Method
+#region Help Method
         /// <summary>
         /// 현재 좌표 값이 등록된 Route 에 맞는 위치인지 확인한다.
         /// 판단 기준은 Route 에 Tolerance 범위를 사용.
@@ -1764,9 +1841,9 @@ namespace VehicleControlSystem.ControlLayer
             else
                 return;
         }
-        #endregion
+#endregion
 
-        #region Event Subscribe 
+#region Event Subscribe 
         private void AutoManager_OnOperationModeChanged( eOperatationMode obj )
         {
             this.drive.SetDriveOperationMode( obj );
@@ -1787,7 +1864,8 @@ namespace VehicleControlSystem.ControlLayer
                     break;
                 case "CurrentTag":
                     {
-                        var v = CastTo<string>.From<object>( newValue );
+                        var v = CastTo<int>.From<object>( newValue );
+                        logger.D( $"{this.CurrentTag} -> {v}" );
                         this.CurrentTag = v;
                     }
                     break;
@@ -1933,6 +2011,6 @@ namespace VehicleControlSystem.ControlLayer
 
         }
 
-        #endregion
+#endregion
     }
 }

+ 2 - 2
Dev/OHV/VehicleControlSystem/Managers/AutoManager.cs

@@ -318,10 +318,10 @@ namespace VehicleControlSystem.Managers
             this.sql.CommandDAL.Clean();
             this.sql.SubCmdDAL.Clean();
 
-            IsErrorProcessing = true;
-
             this.activeAlarm = ObjectCopyUtils.DeepClone<Alarm>( alarm );
 
+            IsErrorProcessing = true;
+
             var msg = new GUIMessageEventArgs
             {
                 Kind = GUIMessageEventArgs.eGUIMessageKind.ModelPropertyChange,

+ 30 - 28
Dev/OHV/VehicleControlSystem/Managers/HostManager.cs

@@ -9,6 +9,7 @@ using VehicleControlSystem.ControlLayer;
 using GSG.NET.Extensions;
 using OHV.Common.Model;
 using GSG.NET.Quartz;
+using System.Text;
 
 namespace VehicleControlSystem.Managers
 {
@@ -37,11 +38,12 @@ namespace VehicleControlSystem.Managers
 
         private void Scheduler_OnMaualAddedCommand( Command obj )
         {
-            var route = sql.RouteDal.GetRoute( obj.TargetID );
+            var tID = Convert.ToInt32( obj.TargetID );
+
             var msg = new OCSMessage()
             {
                 Kind = eKind.P,
-                Tag = route.OCSMatchID,
+                Tag = tID.ToString("0000"),
             };
 
             switch ( obj.Type )
@@ -70,7 +72,7 @@ namespace VehicleControlSystem.Managers
         {
             var msg = new OCSMessage();
             msg.Kind = eKind.E;
-            msg.Tag = obj.ToString();
+            msg.Tag = obj.ToString("0000");
             msg.SubCode = "100";
             this.manager.Send( msg );
         }
@@ -79,7 +81,7 @@ namespace VehicleControlSystem.Managers
         {
             var msg = new OCSMessage();
             msg.Kind = eKind.E;
-            msg.Tag = obj.ToString();
+            msg.Tag = obj.ToString("0000");
             msg.SubCode = "101";
             this.manager.Send( msg );
         }
@@ -97,7 +99,7 @@ namespace VehicleControlSystem.Managers
                 if ( mode == eMachineMode.HostMode )
                 {
                     msg.Kind = eKind.I;
-                    msg.Tag = this.vehicle.CurrentTag;
+                    msg.Tag = this.vehicle.CurrentTag.ToString( "0000" );
                     msg.IsSubCode1 = this.vehicle.IsContain;
                     msg.IsSubCode2 = vehicle.IsMoving;
                     msg.IsSubCode3 = vehicle.IsError;
@@ -105,7 +107,7 @@ namespace VehicleControlSystem.Managers
                 else
                 {
                     msg.Kind = eKind.O;
-                    msg.Tag = this.vehicle.CurrentTag;
+                    msg.Tag = this.vehicle.CurrentTag.ToString( "0000" );
                     msg.IsSubCode1 = this.vehicle.IsContain;
                     msg.IsSubCode2 = vehicle.IsMoving;
                     msg.IsSubCode3 = vehicle.IsError;
@@ -163,7 +165,7 @@ namespace VehicleControlSystem.Managers
         {
             var msg = new OCSMessage();
             msg.Kind = eKind.F;
-            msg.Tag = this.vehicle.CurrentTag;
+            msg.Tag = this.vehicle.CurrentTag.ToString( "0000" );
             msg.SubCode = CastTo<int>.From( obj ).ToString( "000" );
 
             this.manager.Send( msg );
@@ -173,7 +175,7 @@ namespace VehicleControlSystem.Managers
         {
             var msg = new OCSMessage();
             msg.Kind = eKind.H;
-            msg.Tag = this.vehicle.CurrentTag;
+            msg.Tag = this.vehicle.CurrentTag.ToString( "0000" );
             msg.IsSubCode1 = false;
             msg.IsSubCode2 = false;
             msg.IsSubCode3 = false;
@@ -185,7 +187,7 @@ namespace VehicleControlSystem.Managers
         {
             var msg = new OCSMessage();
             msg.Kind = eKind.H;
-            msg.Tag = this.vehicle.CurrentTag;
+            msg.Tag = this.vehicle.CurrentTag.ToString( "0000" );
             msg.IsSubCode1 = false;
             msg.IsSubCode2 = true;
             msg.IsSubCode3 = false;
@@ -197,7 +199,7 @@ namespace VehicleControlSystem.Managers
         {
             var msg = new OCSMessage();
             msg.Kind = eKind.H;
-            msg.Tag = this.vehicle.CurrentTag;
+            msg.Tag = this.vehicle.CurrentTag.ToString( "0000" );
             msg.IsSubCode1 = true;
             msg.IsSubCode2 = false;
             msg.IsSubCode3 = false;
@@ -214,7 +216,7 @@ namespace VehicleControlSystem.Managers
             else
                 msg.Kind = eKind.U;
 
-            msg.Tag = this.vehicle.CurrentTag;
+            msg.Tag = this.vehicle.CurrentTag.ToString( "0000" );
             msg.IsSubCode1 = true;
             msg.IsSubCode2 = true;
             msg.IsSubCode3 = false;
@@ -226,7 +228,7 @@ namespace VehicleControlSystem.Managers
         {
             var msg = new OCSMessage();
             msg.Kind = eKind.U;
-            msg.Tag = this.vehicle.CurrentTag;
+            msg.Tag = this.vehicle.CurrentTag.ToString( "0000" );
             msg.IsSubCode1 = true;
             msg.IsSubCode2 = true;
             msg.IsSubCode3 = true;
@@ -238,7 +240,7 @@ namespace VehicleControlSystem.Managers
         {
             var msg = new OCSMessage();
             msg.Kind = eKind.L;
-            msg.Tag = this.vehicle.CurrentTag;
+            msg.Tag = this.vehicle.CurrentTag.ToString( "0000" );
             msg.IsSubCode1 = true;
             msg.IsSubCode2 = true;
             msg.IsSubCode3 = true;
@@ -255,7 +257,7 @@ namespace VehicleControlSystem.Managers
             else
                 msg.Kind = eKind.U;
 
-            msg.Tag = this.vehicle.CurrentTag;
+            msg.Tag = this.vehicle.CurrentTag.ToString( "0000" );
             msg.IsSubCode1 = true;
             msg.IsSubCode2 = false;
             msg.IsSubCode3 = true;
@@ -272,7 +274,7 @@ namespace VehicleControlSystem.Managers
             else
                 msg.Kind = eKind.U;
 
-            msg.Tag = this.vehicle.CurrentTag;
+            msg.Tag = this.vehicle.CurrentTag.ToString( "0000" );
             msg.IsSubCode1 = true;
             msg.IsSubCode2 = false;
             msg.IsSubCode3 = false;
@@ -289,7 +291,7 @@ namespace VehicleControlSystem.Managers
             else
                 msg.Kind = eKind.U;
 
-            msg.Tag = this.vehicle.CurrentTag;
+            msg.Tag = this.vehicle.CurrentTag.ToString( "0000" );
             msg.IsSubCode1 = false;
             msg.IsSubCode2 = false;
             msg.IsSubCode3 = false;
@@ -317,7 +319,7 @@ namespace VehicleControlSystem.Managers
         //    this.Send_ManualLoad();
         //}
 
-        private void Vehicle_OnCurrentTagChanged( string point )
+        private void Vehicle_OnCurrentTagChanged( int point )
         {
             this.Send_Tcmd( point );
         }
@@ -396,7 +398,7 @@ namespace VehicleControlSystem.Managers
 
             if ( msg.SubCode.Equals( "100" ) )
             {
-                Send_Scmd( (int)this.vehicle.CurrentPosition );
+                Send_Scmd( );
             }
             if ( msg.SubCode.Equals( "010" ) )
             {
@@ -500,11 +502,11 @@ namespace VehicleControlSystem.Managers
         /// <summary>
         /// 현재 위치 보고 
         /// </summary>
-        public void Send_Scmd( int point )
+        public void Send_Scmd( )
         {
             var msg = new OCSMessage();
             msg.Kind = eKind.S;
-            msg.Tag = point.ToString( "0000" );
+            msg.Tag = this.vehicle.CurrentTag.ToString("0000");
             msg.IsSubCode1 = this.vehicle.IsContain;
             msg.IsSubCode2 = vehicle.IsMoving;
             msg.IsSubCode3 = vehicle.IsError;
@@ -525,10 +527,10 @@ namespace VehicleControlSystem.Managers
             this.manager.Send( msg );
         }
 
-        public void Send_Ecmd()
+        public void Send_Ecmd(int AlarmNo)
         {
             var msg = new OCSMessage();
-            msg.Tag = vehicle.CurrentTag;
+            msg.Tag = AlarmNo.ToString( "0000" );
             msg.IsSubCode1 = this.vehicle.IsContain;
             msg.IsSubCode2 = vehicle.IsMoving;
             msg.IsSubCode3 = vehicle.IsError;
@@ -536,11 +538,11 @@ namespace VehicleControlSystem.Managers
             this.manager.Send( msg );
         }
 
-        public void Send_Tcmd( string point )
+        public void Send_Tcmd( int point )
         {
             var msg = new OCSMessage();
             msg.Kind = eKind.T;
-            msg.Tag = point;
+            msg.Tag = point.ToString( "0000" );
             msg.IsSubCode1 = this.vehicle.IsContain;
             msg.IsSubCode2 = vehicle.IsMoving;
             msg.IsSubCode3 = vehicle.IsError;
@@ -565,7 +567,7 @@ namespace VehicleControlSystem.Managers
             var msg = new OCSMessage()
             {
                 Kind = eKind.P,
-                Tag = this.vehicle.CurrentTag,
+                Tag = this.vehicle.CurrentTag.ToString( "0000" ),
                 IsSubCode1 = false,
                 IsSubCode2 = false,
                 IsSubCode3 = true,
@@ -578,7 +580,7 @@ namespace VehicleControlSystem.Managers
             var msg = new OCSMessage()
             {
                 Kind = eKind.P,
-                Tag = this.vehicle.CurrentTag,
+                Tag = this.vehicle.CurrentTag.ToString( "0000" ),
                 IsSubCode1 = false,
                 IsSubCode2 = true,
                 IsSubCode3 = false,
@@ -591,7 +593,7 @@ namespace VehicleControlSystem.Managers
             var msg = new OCSMessage()
             {
                 Kind = eKind.P,
-                Tag = this.vehicle.CurrentTag,
+                Tag = this.vehicle.CurrentTag.ToString( "0000" ),
                 IsSubCode1 = true,
                 IsSubCode2 = false,
                 IsSubCode3 = false,
@@ -604,7 +606,7 @@ namespace VehicleControlSystem.Managers
             var msg = new OCSMessage()
             {
                 Kind = eKind.P,
-                Tag = this.vehicle.CurrentTag,
+                Tag = this.vehicle.CurrentTag.ToString( "0000" ),
                 IsSubCode1 = true,
                 IsSubCode2 = true,
                 IsSubCode3 = true,

+ 3 - 2
Dev/OHV/VehicleControlSystem/Managers/Scheduler.cs

@@ -56,8 +56,6 @@ namespace VehicleControlSystem.Managers
                 //    this.sql.CommandDAL.Clean();
 
                 this.AddCommand( obj.Command );
-                if ( obj.Command.ByWho == OHV.Common.Shareds.eCommandByWho.LocalSystem || obj.Command.ByWho == OHV.Common.Shareds.eCommandByWho.LocalOverWrite )
-                    this.OnMaualAddedCommand?.BeginInvoke( obj.Command, null, null );
             }
 
             //var m = new GUIMessageEventArgs() { MessageText = obj.MessageText, MessageKey = obj.MessageKey };
@@ -168,6 +166,9 @@ namespace VehicleControlSystem.Managers
                                 break;
                         }
                         this.sql.CommandDAL.UpdateState( cmd.CommandID, OHV.Common.Shareds.eCommandState.Processing );
+
+                        if ( cmd.ByWho == OHV.Common.Shareds.eCommandByWho.LocalSystem || cmd.ByWho == OHV.Common.Shareds.eCommandByWho.LocalOverWrite )
+                            this.OnMaualAddedCommand?.BeginInvoke( cmd, null, null );
                     }
                     break;
 

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


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


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


+ 13 - 0
Dev/OHVLoggerTest/OHVLoggerTest/Form1.Designer.cs

@@ -29,6 +29,7 @@
         private void InitializeComponent()
         {
             this.button1 = new System.Windows.Forms.Button();
+            this.button2 = new System.Windows.Forms.Button();
             this.SuspendLayout();
             // 
             // button1
@@ -41,11 +42,22 @@
             this.button1.UseVisualStyleBackColor = true;
             this.button1.Click += new System.EventHandler(this.button1_Click);
             // 
+            // button2
+            // 
+            this.button2.Location = new System.Drawing.Point(172, 22);
+            this.button2.Name = "button2";
+            this.button2.Size = new System.Drawing.Size(132, 49);
+            this.button2.TabIndex = 1;
+            this.button2.Text = "button2";
+            this.button2.UseVisualStyleBackColor = true;
+            this.button2.Click += new System.EventHandler(this.button2_Click);
+            // 
             // Form1
             // 
             this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
             this.ClientSize = new System.Drawing.Size(800, 450);
+            this.Controls.Add(this.button2);
             this.Controls.Add(this.button1);
             this.Name = "Form1";
             this.Text = "Form1";
@@ -56,6 +68,7 @@
         #endregion
 
         private System.Windows.Forms.Button button1;
+        private System.Windows.Forms.Button button2;
     }
 }
 

+ 169 - 4
Dev/OHVLoggerTest/OHVLoggerTest/Form1.cs

@@ -8,6 +8,9 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using System.Windows.Forms;
+using Dijkstra.NET.Graph;
+using Dijkstra.NET.Graph.Simple;
+using Dijkstra.NET.ShortestPath;
 using GSG.NET.Concurrent;
 using GSG.NET.Logging;
 using Newtonsoft.Json;
@@ -19,10 +22,16 @@ namespace OHVLoggerTest
     {
         Logger frontWheelLogger = Logger.GetLogger( "PhysicalCheckup_Front" );
         Logger rearWheelLogger = Logger.GetLogger( "PhysicalCheckup_Rear" );
+        Logger logger = Logger.GetLogger();
 
         ThreadCancel threadCancel = new ThreadCancel();
         KV8000 plc = new KV8000();
 
+        List<point> Points = null;
+        List<segment> Segments = null;
+
+        Graph<int, string> graph = new Graph<int, string>();
+
         public Form1()
         {
             InitializeComponent();
@@ -42,8 +51,10 @@ namespace OHVLoggerTest
         private void Form1_Load( object sender, EventArgs e )
         {
             Redis.Instance.Init();
+            this.button1_Click( this, null );
 
             this.threadCancel.AddGo( Thread_Dowork );
+            this.threadCancel.AddGo( Thread_DriveRun );
         }
 
         void Thread_Dowork()
@@ -52,7 +63,30 @@ namespace OHVLoggerTest
             {
                 try
                 {
-                    LockUtils.Wait( 10 );
+                    LockUtils.Wait( 1000 );
+
+                    if ( Redis.Instance.GetMoveStart() )
+                    {
+                        Redis.Instance.ResetMoveStart();
+
+                        this.RunDrive();
+                    }
+
+                }
+                catch ( Exception e)
+                {
+                }
+            }
+        }
+
+        bool isDriveRun = false;
+        void Thread_DriveRun()
+        {
+            while ( !this.threadCancel.Canceled )
+            {
+                try
+                {
+                    LockUtils.Wait( 2000 );
                 }
                 catch ( Exception )
                 {
@@ -60,6 +94,131 @@ namespace OHVLoggerTest
             }
         }
 
+        void AddNode()
+        {
+            this.Points.ForEach( p =>
+            {
+                this.graph.AddNode( p.ID );
+                logger.D( $"AddNode : {p.ID}" );
+            } );
+
+            this.graph.Connect( 20, 19, 20, null );
+            this.graph.Connect( 1, 21, 10, null );
+            this.graph.Connect( 2, 22, 10, null);
+            this.graph.Connect( 3, 2, 10, null );
+            this.graph.Connect( 4, 3, 10, null );
+            this.graph.Connect( 5, 23, 10, null );
+
+            this.graph.Connect( 6, 5, 10, null );
+            this.graph.Connect( 7, 6, 20, null );
+            this.graph.Connect( 8, 24, 10, null );
+            this.graph.Connect( 9, 8, 10, null );
+            this.graph.Connect( 10, 25, 10, null );
+            this.graph.Connect( 10, 4, 20, null );
+
+            this.graph.Connect( 11, 26, 10, null );
+            this.graph.Connect( 12, 11, 10, null );
+            this.graph.Connect( 13, 12, 10, null );
+            this.graph.Connect( 14, 13, 10, null );
+            this.graph.Connect( 15, 14, 10, null );
+
+            this.graph.Connect( 16, 15, 10, null );
+            this.graph.Connect( 17, 27, 10, null );
+            this.graph.Connect( 18, 17, 10, null );
+            this.graph.Connect( 19, 18, 10, null );
+
+            this.graph.Connect( 20, 19, 10, null );
+
+            this.graph.Connect( 21, 20, 10, null );
+            this.graph.Connect( 22, 1, 10, null );
+            this.graph.Connect( 23, 4, 10, null );
+            this.graph.Connect( 24, 7, 10, null );
+            this.graph.Connect( 25, 9, 10, null );
+
+            this.graph.Connect( 26, 10, 10, null );
+            this.graph.Connect( 27, 16, 10, null );
+            this.graph.Connect( 27, 21, 20, null );
+
+            //this.Segments.ForEach( s => 
+            //{ 
+            //    if ( s.Middle == null )
+            //    {
+            //        this.graph.Connect( (uint)s.Start.pointID, (uint)s.End.pointID, 10, $"Segment ID {s.ID}" );
+            //        logger.D( $"Connect : {s.Start.pointID} -> {s.End.pointID} / SegmentID [{s.ID}]" );
+            //    }
+            //    else
+            //    {
+            //        this.graph.Connect( (uint)s.Start.pointID, (uint)s.Middle.pointID, 10, $"Segment ID {s.ID}" );
+            //        logger.D( $"Connect : {s.Start.pointID} -> {s.Middle.pointID} / SegmentID [{s.ID}]" );
+            //        this.graph.Connect( (uint)s.Middle.pointID, (uint)s.End.pointID, 10, $"Segment ID {s.ID}" );
+            //        logger.D( $"Connect : {s.Middle.pointID} -> {s.End.pointID} / SegmentID [{s.ID}]" );
+            //    }
+            //} );
+        }
+
+        void RunDrive( )
+        {
+            var redis = Redis.Instance;
+            var currentPoint = redis.CurrentPointID();
+            var targetPoint = redis.GetMovePoint();
+
+            List<int> routeIDList = new List<int>();
+            routeIDList.Add( currentPoint );
+
+            var cuttentSegment = this.Segments.Where( x => x.Start.pointID == currentPoint ).FirstOrDefault();
+
+            uint f = (uint)currentPoint;
+            uint t = (uint)targetPoint;
+            ShortestPathResult result = this.graph.Dijkstra( f, t );
+            var route = result.GetPath();
+
+            //segment preS = null;
+            //int noPoint = currentPoint;
+            //foreach ( var s in this.Segments )
+            //{
+
+            //    if ( preS == null )
+            //    {
+            //        if ( s.Start.pointID == currentPoint )
+            //            preS = s;
+            //    }
+
+            //    foreach ( var ss in this.Segments )
+            //    {
+            //        if ( ss.Start.pointID == noPoint )
+            //        {
+            //            noPoint = ss.End.pointID;
+            //            routeIDList.Add( ss.Start.pointID );
+            //            break;
+            //        }
+            //        else if ( ss.Middle != null )
+            //        {
+            //            if ( ss.Middle.pointID == noPoint )
+            //            {
+            //                noPoint = ss.End.pointID;
+            //                routeIDList.Add( ss.Start.pointID );
+            //                break;
+            //            }
+            //        }
+            //        else { }
+            //    }
+
+            //    if ( s.End.pointID == 3 )
+            //        break;
+            //}
+
+
+            var ll = route.ToList();
+
+            redis.SetDriveMove();
+            foreach ( var point in ll )
+            {
+                LockUtils.Wait( 1000 );
+                redis.SetCurrentPointID( (int)point );
+            }
+            redis.ResetDriveMove();
+        }
+
         private void button1_Click( object sender, EventArgs e )
         {
             if ( !System.IO.File.Exists( Application.StartupPath + @"\Json\ohv_testmap7.json" ) )
@@ -70,10 +229,16 @@ namespace OHVLoggerTest
                 string json = r.ReadToEnd();
                 var o = JObject.Parse( json );
 
-                var ll = JsonConvert.DeserializeObject<JObject>( json );
-                var pll = o["points"].ToObject<List<point>>();
-                var sll = o["segments"].ToObject<List<segment>>();
+                this.Points = o["points"].ToObject<List<point>>();
+                this.Segments = o["segments"].ToObject<List<segment>>();
             }
+
+            AddNode();
+        }
+
+        private void button2_Click( object sender, EventArgs e )
+        {
+            //RunDrive( 0 );
         }
     }
 

+ 3 - 0
Dev/OHVLoggerTest/OHVLoggerTest/OHVLoggerTest.csproj

@@ -35,6 +35,9 @@
     <Reference Include="Common.Logging">
       <HintPath>..\..\OHV\Assambly\Common.Logging.dll</HintPath>
     </Reference>
+    <Reference Include="Dijkstra.NET, Version=1.2.1.0, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>..\packages\Dijkstra.NET.1.2.1\lib\net40\Dijkstra.NET.dll</HintPath>
+    </Reference>
     <Reference Include="GSG.NET">
       <HintPath>..\..\OHV\Assambly\GSG.NET.dll</HintPath>
     </Reference>

+ 34 - 0
Dev/OHVLoggerTest/OHVLoggerTest/Redis.cs

@@ -95,9 +95,17 @@ namespace OHVLoggerTest
                 return false;
             else
                 return true;
+        }
 
+        public bool ResetDriveMove()
+        {
+            return database.HashSet( "3011", "7", 0 );
         }
 
+        public bool SetDriveMove()
+        {
+            return database.HashSet( "3011", "7", 1 );
+        }
         #endregion
 
         /// <summary>
@@ -110,5 +118,31 @@ namespace OHVLoggerTest
             return CastTo<int>.From<RedisValue>( ret );
         }
 
+        public int GetMovePoint()
+        {
+            var ret = database.HashGet( "3033", "7" );
+            return CastTo<int>.From<RedisValue>( ret );
+        }
+
+        public bool GetMoveStart()
+        {
+            return database.HashGet( "3031", "7" ).ToString().Equals( "1" ) ? true : false;
+        }
+        public bool ResetMoveStart()
+        {
+            return database.HashSet( "3031", "7", 0 );
+        }
+
+        public int CurrentPointID()
+        {
+            var ret = database.HashGet( "3012", "7" );
+            return CastTo<int>.From<RedisValue>( ret );
+        }
+
+        public void SetCurrentPointID(int point)
+        {
+            database.HashSet( "3012", "7", point );
+        }
+
     }
 }

+ 1 - 0
Dev/OHVLoggerTest/OHVLoggerTest/packages.config

@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
+  <package id="Dijkstra.NET" version="1.2.1" targetFramework="net45" />
   <package id="StackExchange.Redis.Extensions.Core" version="3.5.0" targetFramework="net45" />
   <package id="StackExchange.Redis.StrongName" version="1.2.6" targetFramework="net45" />
 </packages>