Browse Source

현장 업데이트
Map 파일 내용 추가
OCS Narmal Test 진행중

unque781 6 years ago
parent
commit
201f31050f
25 changed files with 1216 additions and 434 deletions
  1. 16 0
      Dev/OHV/OHV.Common/Model/RouteMapModels.cs
  2. 4 0
      Dev/OHV/OHV.Module.ListViews/OHV.Module.ListViews.csproj
  3. 12 5
      Dev/OHV/OHV.Module.ListViews/Views/CommandListViewModel.cs
  4. 4 4
      Dev/OHV/OHV.Module.Status/DriveStateView.xaml
  5. 105 18
      Dev/OHV/OHV.Module.Status/DriveStateViewModel.cs
  6. 23 13
      Dev/OHV/OHV.Vehicle/Concept/D_MainWindow.xaml
  7. 13 1
      Dev/OHV/OHV.Vehicle/Concept/D_MainWindowViewModel.cs
  8. BIN
      Dev/OHV/OHV.Vehicle/Config/IO.xlsx
  9. 4 4
      Dev/OHV/OHV.Vehicle/Config/log4net.xml
  10. 302 62
      Dev/OHV/VehicleControlSystem/ControlLayer/MQ/ZmqManager.cs
  11. 87 32
      Dev/OHV/VehicleControlSystem/ControlLayer/Motion/GSIDrive.cs
  12. 1 1
      Dev/OHV/VehicleControlSystem/ControlLayer/Serial/BatteryTabos/BMUManager.cs
  13. 1 1
      Dev/OHV/VehicleControlSystem/ControlLayer/Serial/BatteryTabos/Peak/Peak.cs
  14. 3 1
      Dev/OHV/VehicleControlSystem/ControlLayer/Steering.cs
  15. 323 259
      Dev/OHV/VehicleControlSystem/ControlLayer/Vehicle.cs
  16. 1 1
      Dev/OHV/VehicleControlSystem/Managers/HostManager.cs
  17. 16 4
      Dev/OHV/VehicleControlSystem/Managers/RouteManager.cs
  18. 61 9
      Dev/OHV/VehicleControlSystem/VCSystem.cs
  19. BIN
      Dev/OHVDriveLogger/OHVDriveLogger/.vs/OHVDriveLogger/v16/Server/sqlite3/storage.ide
  20. 3 0
      Dev/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger.sln
  21. 17 4
      Dev/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger/Config/log4net.xml
  22. 27 3
      Dev/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger/FTPLogger.cs
  23. 59 3
      Dev/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger/FormMain.cs
  24. 12 1
      Dev/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger.csproj
  25. 122 8
      Dev/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger/ZmqManager.cs

+ 16 - 0
Dev/OHV/OHV.Common/Model/RouteMapModels.cs

@@ -39,4 +39,20 @@ namespace OHV.Common.Model
         public int slope { get; set; }
         public int slope { get; set; }
     }
     }
 
 
+    public class equipment
+    {
+        public int ID { get; set; }
+
+        [JsonProperty( "name" )]
+        public string Name { get; set; }
+        public int pointID { get; set; }
+    }
+
+    public class obstacles
+    {
+        public int ID { get; set; }
+        public int segmentID { get; set; }
+        public int fieldset { get; set; }
+    }
+
 }
 }

+ 4 - 0
Dev/OHV/OHV.Module.ListViews/OHV.Module.ListViews.csproj

@@ -151,6 +151,10 @@
       <Project>{122d81c8-9ab9-4ced-80d2-9c4f2f9deb4c}</Project>
       <Project>{122d81c8-9ab9-4ced-80d2-9c4f2f9deb4c}</Project>
       <Name>OHV.SqliteDAL</Name>
       <Name>OHV.SqliteDAL</Name>
     </ProjectReference>
     </ProjectReference>
+    <ProjectReference Include="..\VehicleControlSystem\VehicleControlSystem.csproj">
+      <Project>{73BAB40E-FC7D-4AB5-85CA-B4CF221DFBD1}</Project>
+      <Name>VehicleControlSystem</Name>
+    </ProjectReference>
   </ItemGroup>
   </ItemGroup>
   <ItemGroup>
   <ItemGroup>
     <None Include="packages.config" />
     <None Include="packages.config" />

+ 12 - 5
Dev/OHV/OHV.Module.ListViews/Views/CommandListViewModel.cs

@@ -14,6 +14,7 @@ using OHV.SqliteDAL;
 using Prism.Commands;
 using Prism.Commands;
 using Prism.Events;
 using Prism.Events;
 using Prism.Mvvm;
 using Prism.Mvvm;
+using VehicleControlSystem.Managers;
 
 
 namespace OHV.Module.ListViews.Views
 namespace OHV.Module.ListViews.Views
 {
 {
@@ -58,8 +59,12 @@ namespace OHV.Module.ListViews.Views
         SqliteManager sql;
         SqliteManager sql;
         MessageController messageController;
         MessageController messageController;
 
 
-        public CommandListViewModel(IEventAggregator ea, SqliteManager sql, MessageController msgController )
+        VehicleControlSystem.VCSystem vCSystem = null;
+
+        public CommandListViewModel(IEventAggregator ea, SqliteManager sql, MessageController msgController, VehicleControlSystem.VCSystem vcSystem )
         {
         {
+            this.vCSystem = vcSystem;
+
             this.eventAggregator = ea;
             this.eventAggregator = ea;
             this.messageController = msgController;
             this.messageController = msgController;
             this.sql = sql;
             this.sql = sql;
@@ -67,7 +72,8 @@ namespace OHV.Module.ListViews.Views
 
 
             this.CommandList = new ObservableCollection<Command>(sql.CommandDAL.All);
             this.CommandList = new ObservableCollection<Command>(sql.CommandDAL.All);
 
 
-            this.TargetIDList = sql.RouteDal.All.Select(x => x.Name).ToList();
+            //this.TargetIDList = sql.RouteDal.All.Select(x => x.Name).ToList();
+            this.TargetIDList = vCSystem.RouteManager.Equipments.Select( e => e.Name ).ToList();
             this.TargetIDList.Add("None");
             this.TargetIDList.Add("None");
 
 
             this.SaveCommand = new DelegateCommand(ExecuteSaveCommand);
             this.SaveCommand = new DelegateCommand(ExecuteSaveCommand);
@@ -99,12 +105,13 @@ namespace OHV.Module.ListViews.Views
 
 
         private void ExecuteSaveCommand()
         private void ExecuteSaveCommand()
         {
         {
-            var route = sql.RouteDal.GetRoute( TargetID );
-            if (route ==null )
+            var route = this.TargetIDList.Contains( TargetID );
+            if (!route )
                 messageController.ShowNotificationView( "Not Found TargetID" );
                 messageController.ShowNotificationView( "Not Found TargetID" );
             else
             else
             {
             {
-                Command cmd = new Command() { TargetID = TargetID, Type = SelectedCommandType };
+                var targetPoint = this.vCSystem.RouteManager.Equipments.Where( e => e.Name.Equals( TargetID ) ).Single().pointID.ToString();
+                Command cmd = new Command() { TargetID = targetPoint, Type = SelectedCommandType };
                 cmd.ByWho = eCommandByWho.LocalSystem;
                 cmd.ByWho = eCommandByWho.LocalSystem;
 
 
                 var msg = new VCSMessageEventArgs();
                 var msg = new VCSMessageEventArgs();

+ 4 - 4
Dev/OHV/OHV.Module.Status/DriveStateView.xaml

@@ -212,16 +212,16 @@
                         </Grid>
                         </Grid>
 
 
                         <Grid Grid.Row="2" Grid.Column="1">
                         <Grid Grid.Row="2" Grid.Column="1">
-                            <TextBlock Text="{Binding BackSpeed, FallbackValue=0.0}" VerticalAlignment="Stretch" HorizontalAlignment="Center" FontSize="20" Foreground="Orange"/>
+                            <TextBlock Text="{Binding RearSpeed, FallbackValue=0.0}" VerticalAlignment="Stretch" HorizontalAlignment="Center" FontSize="20" Foreground="Orange"/>
                         </Grid>
                         </Grid>
                         <Grid Grid.Row="2" Grid.Column="2">
                         <Grid Grid.Row="2" Grid.Column="2">
-                            <TextBlock Text="{Binding BackRpm, FallbackValue=0.0}" VerticalAlignment="Stretch" HorizontalAlignment="Center" FontSize="20" Foreground="Orange"/>
+                            <TextBlock Text="{Binding RearRpm, FallbackValue=0.0}" VerticalAlignment="Stretch" HorizontalAlignment="Center" FontSize="20" Foreground="Orange"/>
                         </Grid>
                         </Grid>
                         <Grid Grid.Row="2" Grid.Column="3">
                         <Grid Grid.Row="2" Grid.Column="3">
-                            <TextBlock Text="{Binding BackTorque, FallbackValue=0.0}" VerticalAlignment="Stretch" HorizontalAlignment="Center" FontSize="20" Foreground="Orange"/>
+                            <TextBlock Text="{Binding RearTorque, FallbackValue=0.0}" VerticalAlignment="Stretch" HorizontalAlignment="Center" FontSize="20" Foreground="Orange"/>
                         </Grid>
                         </Grid>
                         <Grid Grid.Row="2" Grid.Column="4">
                         <Grid Grid.Row="2" Grid.Column="4">
-                            <TextBlock Text="{Binding BackLoadFactor, FallbackValue=0.0}" VerticalAlignment="Stretch" HorizontalAlignment="Center" FontSize="20" Foreground="Orange"/>
+                            <TextBlock Text="{Binding RearLoadFactor, FallbackValue=0.0}" VerticalAlignment="Stretch" HorizontalAlignment="Center" FontSize="20" Foreground="Orange"/>
                         </Grid>
                         </Grid>
                     </Grid>
                     </Grid>
                 </StackPanel>
                 </StackPanel>

+ 105 - 18
Dev/OHV/OHV.Module.Status/DriveStateViewModel.cs

@@ -1,4 +1,6 @@
-using OHV.Common.Events;
+using GSG.NET.Extensions;
+using OHV.Common.Events;
+using OHV.Common.Shareds;
 using Prism.Events;
 using Prism.Events;
 using Prism.Mvvm;
 using Prism.Mvvm;
 using System;
 using System;
@@ -46,36 +48,36 @@ namespace OHV.Module.Status
         #endregion
         #endregion
 
 
         #region Back Drive
         #region Back Drive
-        private double backSpeed;
+        private double rearSpeed;
 
 
-        public double BackSpeed
+        public double RearSpeed
         {
         {
-            get { return backSpeed; }
-            set { this.SetProperty( ref this.backSpeed , value ); }
+            get { return rearSpeed; }
+            set { this.SetProperty( ref this.rearSpeed, value ); }
         }
         }
 
 
-        private double backTorque;
+        private double rearTorque;
 
 
-        public double BackTorque
+        public double RearTorque
         {
         {
-            get { return backTorque; }
-            set { this.SetProperty( ref this.backTorque , value ); }
+            get { return rearTorque; }
+            set { this.SetProperty( ref this.rearTorque, value ); }
         }
         }
 
 
-        private double backRpm;
+        private double rearRpm;
 
 
-        public double BackRpm
+        public double RearRpm
         {
         {
-            get { return backRpm; }
-            set { this.SetProperty( ref this.backRpm , value ); }
+            get { return rearRpm; }
+            set { this.SetProperty( ref this.rearRpm, value ); }
         }
         }
 
 
-        private double backLoadFactor;
+        private double rearLoadFactor;
 
 
-        public double BackLoadFactor
+        public double RearLoadFactor
         {
         {
-            get { return backLoadFactor; }
-            set { this.SetProperty( ref this.backLoadFactor , value ); }
+            get { return rearLoadFactor; }
+            set { this.SetProperty( ref this.rearLoadFactor, value ); }
         }
         }
         #endregion
         #endregion
 
 
@@ -93,7 +95,92 @@ namespace OHV.Module.Status
          
          
         private void UICallbackCommunication( GUIMessageEventArgs obj )
         private void UICallbackCommunication( GUIMessageEventArgs obj )
         {
         {
-            var drive = new OHV.Common.Model.DriveState();
+            switch ( obj.Kind )
+            {
+                case GUIMessageEventArgs.eGUIMessageKind.ModelPropertyChange:
+                    this.UICallBackModelPropertyChange( obj );
+                    break;
+                case GUIMessageEventArgs.eGUIMessageKind.RspIOObject:
+                    break;
+                case GUIMessageEventArgs.eGUIMessageKind.RspIOMapList:
+                    break;
+                case GUIMessageEventArgs.eGUIMessageKind.RspCommandList:
+                    break;
+                case GUIMessageEventArgs.eGUIMessageKind.RspAutoModeChange:
+                    break;
+                case GUIMessageEventArgs.eGUIMessageKind.RspManualModeChange:
+                    break;
+                case GUIMessageEventArgs.eGUIMessageKind.RspAlarmReset:
+                    break;
+                case GUIMessageEventArgs.eGUIMessageKind.RspVehicleModeChange:
+                    break;
+                case GUIMessageEventArgs.eGUIMessageKind.RspEStop:
+                    break;
+                case GUIMessageEventArgs.eGUIMessageKind.RspVihicleState:
+                    break;
+                case GUIMessageEventArgs.eGUIMessageKind.RspMachineModeChg:
+                    break;
+                default:
+                    break;
+            }
+        }
+
+        private void UICallBackModelPropertyChange( GUIMessageEventArgs obj )
+        {
+            if ( obj.MessageKey.Equals( MessageKey.Vehicle ) )
+            {
+                switch ( obj.ModelPropertyName )
+                {
+                    case "FrontLoadFactor":
+                        {
+                            var v = CastTo<double>.From<object>( obj.Args );
+                            this.FrontLoadFactor = v;
+                        }
+                        break;
+                    case "FrontRpm":
+                        {
+                            var v = CastTo<double>.From<object>( obj.Args );
+                            this.FrontRpm = v;
+                        }
+                        break;
+                    case "FrontSpeed":
+                        {
+                            var v = CastTo<double>.From<object>( obj.Args );
+                            this.FrontSpeed = v;
+                        }
+                        break;
+                    case "FrontTorque":
+                        {
+                            var v = CastTo<double>.From<object>( obj.Args );
+                            this.FrontTorque = v;
+                        }
+                        break;
+                    case "RearLoadFactor":
+                        {
+                            var v = CastTo<double>.From<object>( obj.Args );
+                            this.RearLoadFactor = v;
+                        }
+                        break;
+                    case "RearRpm":
+                        {
+                            var v = CastTo<double>.From<object>( obj.Args );
+                            this.RearRpm = v;
+                        }
+                        break;
+                    case "RearSpeed":
+                        {
+                            var v = CastTo<double>.From<object>( obj.Args );
+                            this.RearSpeed = v;
+                        }
+                        break;
+                    case "RearTorque":
+                        {
+                            var v = CastTo<double>.From<object>( obj.Args );
+                            this.RearTorque = v;
+                        }
+                        break;
+                }
+            }
         }
         }
 
 
         public void Init( ) { }
         public void Init( ) { }

+ 23 - 13
Dev/OHV/OHV.Vehicle/Concept/D_MainWindow.xaml

@@ -185,19 +185,29 @@
                     </StackPanel>
                     </StackPanel>
                 </Grid>
                 </Grid>
 
 
-                <Grid Grid.Row="1">
-                    <Border Margin="5" BorderBrush="#FF00FFD3" BorderThickness="2"/>
-                    <StackPanel Orientation="Vertical" VerticalAlignment="Center" HorizontalAlignment="Center">
-
-                        <StackPanel Orientation="Horizontal">
-                             <!--???    무엇을 표현 해야 할까... 흠...    -->
-                        </StackPanel>
-
-                        <StackPanel Orientation="Horizontal">
-                        </StackPanel>
-                    
-                    </StackPanel>
-                </Grid>
+                <Border Grid.Row="1" BorderBrush="#FF00FFD3" BorderThickness="2" Margin="5">
+                    <Grid>
+                        <Grid.RowDefinitions>
+                            <RowDefinition Height="*"/>
+                            <RowDefinition Height="*"/>
+                        </Grid.RowDefinitions>
+
+                        <Grid Grid.Row="0">
+                            <Border BorderBrush="{x:Null}" BorderThickness="2" Margin="5"/>
+                            <!--<Border BorderBrush="#FF00FFD3" BorderThickness="2" Margin="5"/>-->
+                            <StackPanel VerticalAlignment="Center" HorizontalAlignment="Center">
+                                <TextBlock Text="Current Tag" FontSize="20" Foreground="Orange" VerticalAlignment="Center" HorizontalAlignment="Center"/>
+                                <!--<TextBlock Text="Tag" FontSize="20" Foreground="Orange" VerticalAlignment="Center" HorizontalAlignment="Center"/>-->
+                            </StackPanel>
+                        </Grid>
+                        <Grid Grid.Row="1">
+                            <Border BorderBrush="{x:Null}" BorderThickness="2" Margin="5"/>
+                            <StackPanel VerticalAlignment="Top"  HorizontalAlignment="Center">
+                                <TextBlock Text="{Binding CurrentTag, FallbackValue=0.00}" FontSize="20" Foreground="Orange" VerticalAlignment="Center" HorizontalAlignment="Center"/>
+                            </StackPanel>
+                        </Grid>
+                    </Grid>
+                </Border>
 
 
                 <Grid Grid.Row="2">
                 <Grid Grid.Row="2">
                     <Border Margin="5" BorderBrush="#FF00FFD3" BorderThickness="2">
                     <Border Margin="5" BorderBrush="#FF00FFD3" BorderThickness="2">

+ 13 - 1
Dev/OHV/OHV.Vehicle/Concept/D_MainWindowViewModel.cs

@@ -169,6 +169,13 @@ namespace OHV.Vehicle.Concept
             set { this.SetProperty( ref this.batteryState , value ); }
             set { this.SetProperty( ref this.batteryState , value ); }
         }
         }
 
 
+        int currentTag;
+        public int CurrentTag
+        {
+            get { return this.currentTag; }
+            set { this.SetProperty( ref this.currentTag, value ); }
+        }
+
         #endregion
         #endregion
 
 
         #region Brushes
         #region Brushes
@@ -523,7 +530,7 @@ namespace OHV.Vehicle.Concept
 
 
             if ( args.MessageKey.Equals( MessageKey.Vehicle ) )
             if ( args.MessageKey.Equals( MessageKey.Vehicle ) )
             {
             {
-                switch(args.ModelPropertyName)
+                switch ( args.ModelPropertyName )
                 {
                 {
                     //TODO:[20/04/27]::비클 상태 표시 변화 확인, 리셋 후에 변화 되는지 
                     //TODO:[20/04/27]::비클 상태 표시 변화 확인, 리셋 후에 변화 되는지 
                     case "VehicleStateProperty":
                     case "VehicleStateProperty":
@@ -558,6 +565,11 @@ namespace OHV.Vehicle.Concept
                             var dTime = CastTo<double>.From<object>( args.Args );
                             var dTime = CastTo<double>.From<object>( args.Args );
                         }
                         }
                         break;
                         break;
+                    case "CurrentTag":
+                        {
+                            this.CurrentTag = CastTo<int>.From<object>( args.Args );
+                        }
+                        break;
                 }
                 }
             }
             }
         }
         }

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


+ 4 - 4
Dev/OHV/OHV.Vehicle/Config/log4net.xml

@@ -21,8 +21,8 @@
 		<appender-ref ref="remotingAppender" />
 		<appender-ref ref="remotingAppender" />
 	</logger>
 	</logger>
 
 
-	<logger name="PhysicalCheckup_Front" additivity="false">
-		<appender-ref ref="PhysicalCheckupFileAppender_Front" />
+	<logger name="BatteryLogger" additivity="false">
+		<appender-ref ref="BatteryFileAppender" />
 	</logger>
 	</logger>
 
 
 	<logger name="PhysicalCheckup_Rear" additivity="false">
 	<logger name="PhysicalCheckup_Rear" additivity="false">
@@ -40,9 +40,9 @@
 	•OFF    •OFF    •OFF    •OFF    •OFF    •OFF    •OFF
 	•OFF    •OFF    •OFF    •OFF    •OFF    •OFF    •OFF
 	-->
 	-->
 
 
-	<appender name="PhysicalCheckupFileAppender_Front" type="GSG.NET.Logging.FileAppender, GSG.NET">
+	<appender name="BatteryFileAppender" type="GSG.NET.Logging.FileAppender, GSG.NET">
 		<threshold value="INFO"/>
 		<threshold value="INFO"/>
-		<file value="C:\LOG\OHV\Vehicle\PhysicalCheckup\PhysicalCheckup_Front.log" />
+		<file value="C:\LOG\OHV\Vehicle\Battery.log" />
 		<staticLogFileName value="true"/>
 		<staticLogFileName value="true"/>
 		<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
 		<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
 		<appendToFile value="true" />
 		<appendToFile value="true" />

+ 302 - 62
Dev/OHV/VehicleControlSystem/ControlLayer/MQ/ZmqManager.cs

@@ -1,4 +1,5 @@
 using GSG.NET.Concurrent;
 using GSG.NET.Concurrent;
+using GSG.NET.Extensions;
 using GSG.NET.Logging;
 using GSG.NET.Logging;
 using GSG.NET.ObjectBase;
 using GSG.NET.ObjectBase;
 using NetMQ;
 using NetMQ;
@@ -13,6 +14,8 @@ using System.Diagnostics;
 using System.Linq;
 using System.Linq;
 using System.Text;
 using System.Text;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
+using VehicleControlSystem.ControlLayer.Serial.BatteryTabos;
+using VehicleControlSystem.ControlLayer.Serial.DataModel;
 
 
 namespace VehicleControlSystem.ControlLayer.MQ
 namespace VehicleControlSystem.ControlLayer.MQ
 {
 {
@@ -20,6 +23,8 @@ namespace VehicleControlSystem.ControlLayer.MQ
     {
     {
         Logger logger = Logger.GetLogger();
         Logger logger = Logger.GetLogger();
 
 
+        SubscriberSocket subDriveInfoSocket = null;
+        PublisherSocket pub = null;
         SubscriberSocket sub = null;
         SubscriberSocket sub = null;
         RequestSocket req = null;
         RequestSocket req = null;
         ResponseSocket rep = null;
         ResponseSocket rep = null;
@@ -27,6 +32,9 @@ namespace VehicleControlSystem.ControlLayer.MQ
         NetMQPoller poller = null;
         NetMQPoller poller = null;
         NetMQMonitor monitor = null;
         NetMQMonitor monitor = null;
 
 
+        Vehicle vehicle = null;
+        BMUManager bMUManager = null;
+
         ThreadCancel threadCancel = new ThreadCancel();
         ThreadCancel threadCancel = new ThreadCancel();
 
 
         private bool isReqConnected;
         private bool isReqConnected;
@@ -39,62 +47,108 @@ namespace VehicleControlSystem.ControlLayer.MQ
 
 
         #region Properties
         #region Properties
         private eSteeringState requestSteering;
         private eSteeringState requestSteering;
-
         public eSteeringState RequestSteering
         public eSteeringState RequestSteering
         {
         {
             get { return requestSteering; }
             get { return requestSteering; }
             set { SetField( ref this.requestSteering, value ); }
             set { SetField( ref this.requestSteering, value ); }
         }
         }
 
 
-        private bool isDriveMoving;
-
+        private bool isDriveMoving = false;
         public bool IsDriveMoving
         public bool IsDriveMoving
         {
         {
             get { return isDriveMoving; }
             get { return isDriveMoving; }
-            set { SetField( ref isDriveMoving, value ); }
-        }
-
-        private eRoadForm currentLoadForm;
-
-        public eRoadForm CurrentLoadForm
-        {
-            get { return currentLoadForm; }
-            set { SetField( ref currentLoadForm, value ); }
+            set
+            {
+                if ( SetField( ref isDriveMoving, value ) )
+                {
+                    pub.SendMoreFrame( "DriveStart" ).SendFrame( value.ToString() );
+                }
+            }
         }
         }
 
 
         private eOperatationMode operatationMode;
         private eOperatationMode operatationMode;
-
         public eOperatationMode OperationMode
         public eOperatationMode OperationMode
         {
         {
             get { return operatationMode; }
             get { return operatationMode; }
             set { operatationMode = value; }
             set { operatationMode = value; }
         }
         }
 
 
+        private int currentPointNo;
+        public int CurrentPointNo
+        {
+            get { return currentPointNo; }
+            set { SetField( ref this.currentPointNo, value ); }
+        }
+
+        private int segmentID;
+        public int SegmentID
+        {
+            get { return segmentID; }
+            set
+            {
+                if ( SetField( ref this.segmentID, value ) )
+                {
+
+                }
+            }
+        }
+
+        private double frontLoadFactor;
+        public double FrontLoadFactor
+        {
+            get { return frontLoadFactor * 0.1; }
+            set { SetField( ref this.frontLoadFactor, value ); }
+        }
 
 
+        private double rearLoadFactor;
+        public double RearLoadFactor
+        {
+            get { return rearLoadFactor * 0.1; }
+            set { SetField( ref this.rearLoadFactor, value ); }
+        }
 
 
+        private double frontRPM;
+        public double FrontRPM
+        {
+            get { return Math.Truncate( frontRPM * 10 ) / 10; }
+            set { SetField( ref this.frontRPM, value ); }
+        }
 
 
+        private double rearRPM;
+        public double RearRPM
+        {
+            get { return Math.Truncate( rearRPM * 10 ) / 10; }
+            set { SetField( ref this.rearRPM, value ); }
+        }
         #endregion
         #endregion
 
 
-        public ZmqManager()
+        public ZmqManager( Vehicle vehicle, BMUManager bMU )
         {
         {
             NetMQ.NetMQConfig.Cleanup();
             NetMQ.NetMQConfig.Cleanup();
+
+            this.bMUManager = bMU;
+            this.vehicle = vehicle;
         }
         }
 
 
         public void Init()
         public void Init()
         {
         {
-            rep = new ResponseSocket();
-            rep.Bind( "tcp://127.0.0.1:5568" );
-            rep.ReceiveReady += Rep_ReceiveReady;
+            pub = new PublisherSocket();
+            pub.Bind( "tcp://127.0.0.1:5570" );
 
 
             sub = new SubscriberSocket();
             sub = new SubscriberSocket();
             sub.Connect( "tcp://127.0.0.1:5565" );
             sub.Connect( "tcp://127.0.0.1:5565" );
             sub.Connect( "tcp://127.0.0.1:5566" );
             sub.Connect( "tcp://127.0.0.1:5566" );
+            sub.Connect( "tcp://127.0.0.1:5577" );
             sub.Subscribe( "" ); //All
             sub.Subscribe( "" ); //All
             sub.ReceiveReady += Sub_ReceiveReady;
             sub.ReceiveReady += Sub_ReceiveReady;
 
 
+            rep = new ResponseSocket();
+            rep.Bind( "tcp://127.0.0.1:5568" );
+            rep.ReceiveReady += Rep_ReceiveReady;
+
             req = new RequestSocket();
             req = new RequestSocket();
             this.monitor = new NetMQMonitor( req, "inproc://rep.inproc", SocketEvents.Disconnected | SocketEvents.Connected );
             this.monitor = new NetMQMonitor( req, "inproc://rep.inproc", SocketEvents.Disconnected | SocketEvents.Connected );
-            this.monitor.Connected += ( s, a ) => { this.IsReqConnected = true; };
+            this.monitor.Connected += ( s, a ) => { this.IsReqConnected = true; CurrentPointNo = GetCurrentPointNo(); };
             this.monitor.Disconnected += ( s, a ) => { this.IsReqConnected = false; };
             this.monitor.Disconnected += ( s, a ) => { this.IsReqConnected = false; };
             this.monitor.StartAsync();
             this.monitor.StartAsync();
 
 
@@ -102,6 +156,33 @@ namespace VehicleControlSystem.ControlLayer.MQ
 
 
             this.poller = new NetMQPoller { this.sub, this.rep };
             this.poller = new NetMQPoller { this.sub, this.rep };
             this.poller.RunAsync();
             this.poller.RunAsync();
+
+            //this.vehicle.PropertyChanged += Vehicle_PropertyChanged;
+            this.bMUManager.OnChangedReceivedData += BMUManager_OnChangedReceivedData;
+        }
+
+        private void BMUManager_OnChangedReceivedData( Serial.DataModel.ReceivedData obj )
+        {
+            var kind = CastTo<eDataKind>.From<Enum>( obj.DataKind );
+            switch ( kind )
+            {
+                case eDataKind.Current:
+                    var currnet = (double)obj.Value * obj.Scale;
+                    this.pub.SendMoreFrame( "BatteryCurrent" ).SendFrame( currnet.ToString() ); ;
+                    break;
+                case eDataKind.Voltage:
+                case eDataKind.BatteryState:
+                case eDataKind.ChargeCompleteTime:
+                case eDataKind.DisChargeCompleteTime:
+                case eDataKind.SOC:
+                case eDataKind.SOH:
+                case eDataKind.ResidualCapacity:
+                case eDataKind.ResidualEnergy:
+                case eDataKind.Temperature:
+                    break;
+                default:
+                    break;
+            }
         }
         }
 
 
         public void Dispose()
         public void Dispose()
@@ -121,7 +202,7 @@ namespace VehicleControlSystem.ControlLayer.MQ
         private void Rep_ReceiveReady( object sender, NetMQSocketEventArgs e )
         private void Rep_ReceiveReady( object sender, NetMQSocketEventArgs e )
         {
         {
             var ret = e.Socket.ReceiveMultipartStrings();
             var ret = e.Socket.ReceiveMultipartStrings();
-            logger.D( $"[rep] - {ret}" );
+            logger.D( $"[rep] - {ret[1]}" );
 
 
             if ( ret[0].Equals( "setm" ) )
             if ( ret[0].Equals( "setm" ) )
             {
             {
@@ -158,20 +239,88 @@ namespace VehicleControlSystem.ControlLayer.MQ
                         {
                         {
                         }
                         }
                         break;
                         break;
+
+                    case "4012":
+                        if ( v[1].Equals( "3" ) )
+                            IsDriveMoving = true;
+                        else
+                            IsDriveMoving = false;
+                        break;
+
+                    case "3009":
+                        {
+                            int iV = 0;
+                            int.TryParse( v[1], out iV );
+                            this.CurrentPointNo = iV;
+                            int.TryParse( v[2], out iV );
+                            this.SegmentID = iV;
+                        }
+                        break;
                     default:
                     default:
                         break;
                         break;
                 }
                 }
+
                 rep.SendMoreFrame( "setm" ).SendFrame( $"ok/{v[0]}" );
                 rep.SendMoreFrame( "setm" ).SendFrame( $"ok/{v[0]}" );
             }
             }
+
+            if ( ret[0].Equals( "getm" ) )
+            {
+                var v = ret[1].Split( '/' );
+                switch ( v[0] )
+                {
+                    case "3060":
+                        {
+                            switch ( this.vehicle.GetESteeringState() )
+                            {
+                                case eSteeringState.None:
+                                    rep.SendMoreFrame( "getm" ).SendFrame( $"ok/{v[0]}/0" );
+                                    break;
+                                case eSteeringState.Left:
+                                    rep.SendMoreFrame( "getm" ).SendFrame( $"ok/{v[0]}/1" );
+                                    break;
+                                case eSteeringState.Right:
+                                    rep.SendMoreFrame( "getm" ).SendFrame( $"ok/{v[0]}/-1" );
+                                    break;
+                                default:
+                                    rep.SendMoreFrame( "getm" ).SendFrame( $"ok/{v[0]}/0" );
+                                    break;
+                            }
+                        }
+                        break;
+                    default:
+                        break;
+                }
+
+            }
         }
         }
 
 
         private void Sub_ReceiveReady( object sender, NetMQ.NetMQSocketEventArgs e )
         private void Sub_ReceiveReady( object sender, NetMQ.NetMQSocketEventArgs e )
         {
         {
             var ret = e.Socket.ReceiveMultipartStrings();
             var ret = e.Socket.ReceiveMultipartStrings();
-            logger.I( ret );
+            //logger.I( ret );
+
+            var vl = ret[1].Split( '/' );
 
 
             switch ( ret[0] )
             switch ( ret[0] )
             {
             {
+                case "7028":
+                    {
+                        var ll = Convert.ToDouble( vl[0] );
+                        this.FrontRPM = Math.Truncate( ll * 100 ) / 100;
+                        var li = Convert.ToDouble( vl[1] );
+                        this.RearRPM = Math.Truncate( li * 100 ) / 100;
+                    }
+                    break;
+
+                case "7030":
+                    {
+                        var ll = Convert.ToDouble( vl[0] );
+                        this.FrontLoadFactor = Math.Truncate( ll * 100 ) / 100;
+                        var rL = Convert.ToDouble( vl[1] );
+                        this.RearLoadFactor = Math.Truncate( rL * 100 ) / 100;
+                    }
+                    break;
+
                 case "3050": //TargetSteering
                 case "3050": //TargetSteering
                     {
                     {
                         //switch ( ret[1] )
                         //switch ( ret[1] )
@@ -209,6 +358,12 @@ namespace VehicleControlSystem.ControlLayer.MQ
                         }
                         }
                     }
                     }
                     break;
                     break;
+                //case "Tag":
+                //    {
+                //        var v = ret[1].Split( ';' );
+                //        this.CurrentPointNo = Convert.ToInt16(v[0]);
+                //    }
+                //break;
 
 
                 default:
                 default:
                     break;
                     break;
@@ -233,75 +388,132 @@ namespace VehicleControlSystem.ControlLayer.MQ
 
 
         bool Request( string topic, string value, out string response )
         bool Request( string topic, string value, out string response )
         {
         {
+            logger.D( $"req - {value}" );
+
             List<string> repll = new List<string>();
             List<string> repll = new List<string>();
             response = string.Empty;
             response = string.Empty;
 
 
             if ( !this.IsReqConnected )
             if ( !this.IsReqConnected )
                 return false;
                 return false;
 
 
-            if ( !this.req.HasIn )
+
+            try
+            {
+                //if ( this.req.HasOut )
                 this.req.SendMoreFrame( topic ).SendFrame( value );
                 this.req.SendMoreFrame( topic ).SendFrame( value );
 
 
-            if ( this.req.TryReceiveMultipartStrings( TimeSpan.FromSeconds( 5 ), ref repll ) )
-                return true;
-            else
+                if ( this.req.TryReceiveMultipartStrings( TimeSpan.FromSeconds( 5 ), ref repll ) )
+                    return true;
+                else
+                    return false;
+
+            }
+            catch ( Exception e )
+            {
+                logger.E( e );
+                //this.req.Dispose();
+                //this.monitor.Stop();
+                //this.monitor.Dispose();
+
+                //req = new RequestSocket();
+                //this.monitor = new NetMQMonitor( req, "inproc://rep.inproc", SocketEvents.Disconnected | SocketEvents.Connected );
+                //this.monitor.Connected += ( s, a ) => { this.IsReqConnected = true; CurrentPointNo = GetCurrentPointNo(); };
+                //this.monitor.Disconnected += ( s, a ) => { this.IsReqConnected = false; };
+                //this.monitor.StartAsync();
+
+                //req.Connect( "tcp://127.0.0.1:5567" );
+
                 return false;
                 return false;
+            }
         }
         }
 
 
-        bool SetRequest(string index, string value )
+        bool SetRequest( string index, string value )
         {
         {
+            logger.D( $"req - {index} / {value}" );
+
             List<string> repll = new List<string>();
             List<string> repll = new List<string>();
 
 
             if ( !this.IsReqConnected )
             if ( !this.IsReqConnected )
                 return false;
                 return false;
 
 
-            if ( !this.req.HasIn )
+            try
+            {
+                //if ( this.req.HasOut )
                 this.req.SendMoreFrame( "setm" ).SendFrame( index + "/" + value );
                 this.req.SendMoreFrame( "setm" ).SendFrame( index + "/" + value );
 
 
-            if ( !this.req.TryReceiveMultipartStrings( TimeSpan.FromSeconds( 5 ), ref repll ) )
-                return false;
+                if ( !this.req.TryReceiveMultipartStrings( TimeSpan.FromSeconds( 5 ), ref repll ) )
+                    return false;
+
+            }
+            catch ( Exception e )
+            {
+                logger.E( e );
+                //this.req.Dispose();
+                //this.monitor.Stop();
+                //this.monitor.Dispose();
 
 
+                //req = new RequestSocket();
+                //this.monitor = new NetMQMonitor( req, "inproc://rep.inproc", SocketEvents.Disconnected | SocketEvents.Connected );
+                //this.monitor.Connected += ( s, a ) => { this.IsReqConnected = true; CurrentPointNo = GetCurrentPointNo(); };
+                //this.monitor.Disconnected += ( s, a ) => { this.IsReqConnected = false; };
+                //this.monitor.StartAsync();
+
+                //req.Connect( "tcp://127.0.0.1:5567" );
+
+                return false;
+            }
             return true;
             return true;
         }
         }
 
 
-        bool GetRequst( string index, out List<string> vll) 
+        bool GetRequst( string index, out List<string> vll )
         {
         {
+            logger.D( $"req - {index}" );
+
             vll = new List<string>();
             vll = new List<string>();
 
 
             if ( !this.IsReqConnected )
             if ( !this.IsReqConnected )
                 return false;
                 return false;
 
 
-            if ( !this.req.HasIn )
+            try
+            {
+                //if ( this.req.HasOut )
                 this.req.SendMoreFrame( "getm" ).SendFrame( index );
                 this.req.SendMoreFrame( "getm" ).SendFrame( index );
 
 
-            List<string> repll = new List<string>();
+                List<string> repll = new List<string>();
+
+                if ( !this.req.TryReceiveMultipartStrings( TimeSpan.FromSeconds( 5 ), ref repll ) )
+                    return false;
 
 
-            if ( this.req.TryReceiveMultipartStrings( TimeSpan.FromSeconds( 5 ), ref repll ) )
-            {
                 repll.RemoveAt( 0 );
                 repll.RemoveAt( 0 );
 
 
                 var ret = repll[0].Split( '/' );
                 var ret = repll[0].Split( '/' );
                 repll.Clear();
                 repll.Clear();
 
 
-                ret.ForEach( s => 
+                foreach ( var item in ret )
                 {
                 {
-                    if ( s.Equals( "ok" ) || s.Equals( "nok" ) || s.Equals( index ) )
-                        repll.Add( s );
-                } );
-
+                    if ( item.Equals( "ok" ) || item.Equals( "nok" ) || item.Equals( index ) )
+                        continue;
+                    repll.Add( item );
+                }
                 vll = repll;
                 vll = repll;
-
-                return true;
             }
             }
-            else
-                return false;
+            catch ( Exception e )
+            {
+                logger.E( e );
+            }
+
+            return true;
         }
         }
 
 
         #region Get Request Method
         #region Get Request Method
         public eOperatationMode GetOperationMode()
         public eOperatationMode GetOperationMode()
         {
         {
             List<string> rll;
             List<string> rll;
-            this.GetRequst( "111", out rll );
+            if ( !this.GetRequst( "111", out rll ) )
+            {
+                logger.E( $"[Get Operation Mode] - Response Time Out" );
+                return eOperatationMode.InitialMode;
+            }
 
 
             if ( rll[0].Equals( "1" ) )
             if ( rll[0].Equals( "1" ) )
                 return eOperatationMode.AutoMode;
                 return eOperatationMode.AutoMode;
@@ -309,82 +521,110 @@ namespace VehicleControlSystem.ControlLayer.MQ
                 return eOperatationMode.ManualMode;
                 return eOperatationMode.ManualMode;
         }
         }
 
 
-        public int CurrentPointNo()
+        public int GetCurrentPointNo()
         {
         {
-            List<string> rll;
-            this.GetRequst( "111", out rll );
-
             int ret = 0;
             int ret = 0;
-            int.TryParse( rll[1], out ret );
+            List<string> rll;
+            if ( this.GetRequst( "3009", out rll ) )
+            {
+                int.TryParse( rll[0], out ret );
+            }
+            else
+                logger.E( $"[Get Current Point] - Response Time Out" );
 
 
             return ret;
             return ret;
         }
         }
         #endregion
         #endregion
 
 
         #region Set Request Method
         #region Set Request Method
+        internal void SetStartMove()
+        {
+            if ( !SetRequest( "3031", "2" ) )
+                logger.E( $"[Set Start Move] - Response Time Out" );
+        }
+        internal void SetTargetPoint( string point )
+        {
+            if ( !SetRequest( "3033", point ))
+                logger.E( $"[Set TargetPoint] - Response Time Out" );
+        }
 
 
         internal void SetObstruction( eObstacleState state )
         internal void SetObstruction( eObstacleState state )
         {
         {
             string outStr = string.Empty;
             string outStr = string.Empty;
+            string val = string.Empty;
 
 
             switch ( state )
             switch ( state )
             {
             {
                 case eObstacleState.Normal:
                 case eObstacleState.Normal:
-                    this.Request( "setm", "5001/0", out outStr );
+                    val = "0";
                     break;
                     break;
                 case eObstacleState.Abnormal:
                 case eObstacleState.Abnormal:
-                    this.Request( "setm", "5001/3", out outStr );
+                    val = "3";
                     break;
                     break;
                 case eObstacleState.Blocked:
                 case eObstacleState.Blocked:
-                    this.Request( "setm", "5001/2", out outStr );
+                    val = "2";
                     break;
                     break;
                 case eObstacleState.Decelerate:
                 case eObstacleState.Decelerate:
-                    this.Request( "setm", "5001/1", out outStr );
+                    val = "1";
                     break;
                     break;
                 default:
                 default:
                     break;
                     break;
             }
             }
+            if ( !this.SetRequest( "5001", val ) )
+                logger.E( $"[Set Obstruction] - Response Time Out" );
         }
         }
 
 
-        internal void SetOperationSate(eOperatationMode mode)
+        internal void SetOperationState( eOperatationMode mode )
         {
         {
             string outStr = string.Empty;
             string outStr = string.Empty;
+            string val = string.Empty;
 
 
             if ( mode == eOperatationMode.AutoMode )
             if ( mode == eOperatationMode.AutoMode )
-                this.Request( "set", "112/1", out outStr );
+                val = "1";
             else if ( mode == eOperatationMode.ManualMode )
             else if ( mode == eOperatationMode.ManualMode )
-                this.Request( "set", "112/0", out outStr );
+                val = "0";
             else
             else
             { }
             { }
+
+            if ( !SetRequest("112", val))
+                logger.E( $"[Set Operation State] - Response Time Out" );
         }
         }
 
 
-        internal void SetMCState(bool isOn )
+        internal void SetMCState( bool isOn )
         {
         {
             string outStr = string.Empty;
             string outStr = string.Empty;
+            string val = string.Empty;
+
             if ( isOn )
             if ( isOn )
-                this.Request( "setm", "5000/1", out outStr );
+                val = "1";
             else
             else
-                this.Request( "setm", "5000/0", out outStr );
+                val = "0";
+
+            if ( !this.SetRequest( "5000", val ) )
+                logger.E( $"[Set MCState] - Response Time Out" );
         }
         }
 
 
         internal void SetCurrentSteeringState( eSteeringState state )
         internal void SetCurrentSteeringState( eSteeringState state )
         {
         {
             string outStr = string.Empty;
             string outStr = string.Empty;
-            bool ret = false;
+            string val = string.Empty;
+
             switch ( state )
             switch ( state )
             {
             {
                 case eSteeringState.None:
                 case eSteeringState.None:
-                    ret = this.Request( "set", "3060/0/0", out outStr );
+                    val = "0";
                     break;
                     break;
                 case eSteeringState.Left:
                 case eSteeringState.Left:
-                    ret = this.Request( "set", "3060/0/1", out outStr );
+                    val = "1";
                     break;
                     break;
                 case eSteeringState.Right:
                 case eSteeringState.Right:
-                    ret = this.Request( "set", "3060/0/-1", out outStr );
+                    val = "-1";
                     break;
                     break;
                 default:
                 default:
                     break;
                     break;
             }
             }
+            if ( !this.SetRequest( "3060", val ) )
+                logger.E( $"[Set Current Steering] - Response Time Out" );
         }
         }
         #endregion
         #endregion
     }
     }

+ 87 - 32
Dev/OHV/VehicleControlSystem/ControlLayer/Motion/GSIDrive.cs

@@ -40,14 +40,40 @@ namespace VehicleControlSystem.ControlLayer.Drive
         private double currentTorque = 0;
         private double currentTorque = 0;
         public double CurrentTorque { get { return currentTorque; } set { SetField( ref this.currentTorque, value ); } }
         public double CurrentTorque { get { return currentTorque; } set { SetField( ref this.currentTorque, value ); } }
 
 
+        double frontLoadFactor = 0;
+        public double FrontLoadFactor
+        {
+            get { return this.frontLoadFactor; }
+            set { SetField( ref this.frontLoadFactor, value ); }
+        }
+
+        double frontRpm = 0;
+        public double FrontRpm
+        {
+            get { return this.frontRpm; }
+            set { SetField( ref this.frontRpm, value ); }
+        }
+
+        double rearLoadFactor = 0;
+        public double RearLoadFactor
+        {
+            get { return this.rearLoadFactor; }
+            set { SetField( ref this.rearLoadFactor, value ); }
+        }
+
+        double rearRpm = 0;
+        public double RearRpm
+        {
+            get { return this.rearRpm; }
+            set { SetField( ref this.rearRpm, value ); }
+        }
+
         public bool IsErrorOn { get; set; }
         public bool IsErrorOn { get; set; }
 
 
         eSteeringState reqSteeringState = eSteeringState.None;
         eSteeringState reqSteeringState = eSteeringState.None;
         public eSteeringState ReqSteeringState { get { return this.reqSteeringState; } set { SetField( ref this.reqSteeringState, value ); } }
         public eSteeringState ReqSteeringState { get { return this.reqSteeringState; } set { SetField( ref this.reqSteeringState, value ); } }
 
 
-
         private eDriveServoState driveServoState;
         private eDriveServoState driveServoState;
-
         public eDriveServoState DriveServoState
         public eDriveServoState DriveServoState
         {
         {
             get { return driveServoState; }
             get { return driveServoState; }
@@ -55,31 +81,32 @@ namespace VehicleControlSystem.ControlLayer.Drive
         }
         }
 
 
         private DriveState frontDriveState;
         private DriveState frontDriveState;
-
         public DriveState FrontDriveState
         public DriveState FrontDriveState
         {
         {
             get { return frontDriveState; }
             get { return frontDriveState; }
-            set { SetField(ref this.frontDriveState, value); }
+            set { SetField( ref this.frontDriveState, value ); }
         }
         }
 
 
         private DriveState rearDriveState;
         private DriveState rearDriveState;
-
         public DriveState RearDriveState
         public DriveState RearDriveState
         {
         {
             get { return rearDriveState; }
             get { return rearDriveState; }
             set { SetField( ref this.rearDriveState, value ); }
             set { SetField( ref this.rearDriveState, value ); }
         }
         }
 
 
-
         TaskCancel taskCancel = new TaskCancel();
         TaskCancel taskCancel = new TaskCancel();
         ThreadCancel threadCancel = new ThreadCancel();
         ThreadCancel threadCancel = new ThreadCancel();
         SqliteManager sql = null;
         SqliteManager sql = null;
 
 
-        ZmqManager zmq = new ZmqManager();
+        Steering steering = null;
+
+        ZmqManager zmq = null;
 
 
-        public GSIDrive( SqliteManager sql )
+        public GSIDrive( SqliteManager sql, Steering steering, ZmqManager zmq )
         {
         {
             this.sql = sql;
             this.sql = sql;
+            this.steering = steering;
+            this.zmq = zmq;
         }
         }
 
 
         public void Init()
         public void Init()
@@ -87,7 +114,6 @@ namespace VehicleControlSystem.ControlLayer.Drive
             this.threadCancel.AddGo( Thread_DriveStateChcker );
             this.threadCancel.AddGo( Thread_DriveStateChcker );
             this.threadCancel.AddGo( Thread_Logger );
             this.threadCancel.AddGo( Thread_Logger );
 
 
-            zmq.Init();
             zmq.PropertyChanged += Zmq_PropertyChanged;
             zmq.PropertyChanged += Zmq_PropertyChanged;
 
 
             //PhysicalCheckupLogger.Instance.Connecte();
             //PhysicalCheckupLogger.Instance.Connecte();
@@ -106,18 +132,47 @@ namespace VehicleControlSystem.ControlLayer.Drive
                         this.ReqSteeringState = v;
                         this.ReqSteeringState = v;
                     }
                     }
                     break;
                     break;
+
+                case "CurrentPointNo":
+                    {
+                        var v = CastTo<int>.From<object>( newValue );
+                        this.CurrentTag = v;
+                    }
+                    break;
+                case "RearLoadFactor":
+                    {
+                        var v = CastTo<double>.From<object>( newValue );
+                        this.RearLoadFactor = v;
+                    }
+                    break;
+                case "RearRPM":
+                    {
+                        var v = CastTo<double>.From<object>( newValue );
+                        this.RearRpm = v;
+                    }
+                    break;
+                case "FrontLoadFactor":
+                    {
+                        var v = CastTo<double>.From<object>( newValue );
+                        this.FrontLoadFactor = v;
+                    }
+                    break;
+                case "FrontRPM":
+                    {
+                        var v = CastTo<double>.From<object>( newValue );
+                        this.FrontRpm = v;
+                    }
+                    break;
+
                 default:
                 default:
                     break;
                     break;
             }
             }
         }
         }
-
         public void Dispose()
         public void Dispose()
         {
         {
             this.threadCancel.Cancel();
             this.threadCancel.Cancel();
             LockUtils.Wait( 50 );
             LockUtils.Wait( 50 );
             this.threadCancel.StopWaitAll();
             this.threadCancel.StopWaitAll();
-
-            zmq.Dispose();
         }
         }
 
 
         void Thread_DriveStateChcker()
         void Thread_DriveStateChcker()
@@ -135,7 +190,7 @@ namespace VehicleControlSystem.ControlLayer.Drive
                     //    this.LoggingState();
                     //    this.LoggingState();
                     //}
                     //}
                 }
                 }
-                catch ( Exception e)
+                catch ( Exception e )
                 {
                 {
                     logger.E( $"[Drive] - Error : [{e}]" );
                     logger.E( $"[Drive] - Error : [{e}]" );
                 }
                 }
@@ -191,27 +246,26 @@ namespace VehicleControlSystem.ControlLayer.Drive
             this.RearDriveState = rState;
             this.RearDriveState = rState;
         }
         }
 
 
-        public void SetCurrentSteeringState(eSteeringState state )
+        public void SetCurrentSteeringState( eSteeringState state )
         {
         {
             this.zmq.SetCurrentSteeringState( state );
             this.zmq.SetCurrentSteeringState( state );
         }
         }
 
 
         bool IsDriveFault()
         bool IsDriveFault()
         {
         {
-            var ret = Redis.Instance.GetSystemState();
-            return ret == 2 ? true : false;
+            return false;
         }
         }
 
 
-        public bool IsDriveStop() => !Redis.Instance.GetDriveMove();
-        public bool IsDriveMoving() => Redis.Instance.GetDriveMove();
+        public bool IsDriveStop() => !zmq.IsDriveMoving;
+        public bool IsDriveMoving() => zmq.IsDriveMoving;
 
 
         public void SetDriveOperationMode( eOperatationMode mode )
         public void SetDriveOperationMode( eOperatationMode mode )
         {
         {
-            if ( mode == eOperatationMode.ManualMode )
-                Redis.Instance.SetSystemOperation( 3 );
-            else if ( mode == eOperatationMode.AutoMode )
-                Redis.Instance.SetSystemOperation( 2 );
-            else { }
+            //if ( mode == eOperatationMode.ManualMode )
+            //    Redis.Instance.SetSystemOperation( 3 );
+            //else if ( mode == eOperatationMode.AutoMode )
+            //    Redis.Instance.SetSystemOperation( 2 );
+            //else { }
         }
         }
 
 
         public eOperatationMode GetDriveOperationMode()
         public eOperatationMode GetDriveOperationMode()
@@ -237,10 +291,12 @@ namespace VehicleControlSystem.ControlLayer.Drive
 
 
             //ToDo: 이동 명령 실행.
             //ToDo: 이동 명령 실행.
             int result = 0;
             int result = 0;
-            //if (! Redis.Instance.RouteMapMoveTo( point ) )
-            //{
-            //    //Todo: Error 처리
-            //}
+
+            zmq.SetCurrentSteeringState( steering.GetSteeringState() ); 
+            LockUtils.Wait( 100 );
+            zmq.SetTargetPoint( point );
+            LockUtils.Wait( 100 );
+            zmq.SetStartMove();
 
 
             int waitTime = 10000;
             int waitTime = 10000;
             long st = SwUtils.CurrentTimeMillis;
             long st = SwUtils.CurrentTimeMillis;
@@ -250,11 +306,11 @@ namespace VehicleControlSystem.ControlLayer.Drive
 
 
                 if ( SwUtils.Gt( st, waitTime ) )
                 if ( SwUtils.Gt( st, waitTime ) )
                 {
                 {
-                    logger.D("MoveToPoint Time Out");
+                    logger.D( "MoveToPoint Time Out" );
                     return -1;
                     return -1;
                 }
                 }
 
 
-                if ( Redis.Instance.GetDriveMove() )
+                if ( zmq.IsDriveMoving )
                     break;
                     break;
             }
             }
 
 
@@ -271,7 +327,6 @@ namespace VehicleControlSystem.ControlLayer.Drive
         /// </summary>
         /// </summary>
         public void Stop()
         public void Stop()
         {
         {
-            
         }
         }
 
 
         //public void JogForWard() => OHVdriveSetManualOperationCommand( 1 );
         //public void JogForWard() => OHVdriveSetManualOperationCommand( 1 );
@@ -287,8 +342,8 @@ namespace VehicleControlSystem.ControlLayer.Drive
             return true;
             return true;
         }
         }
 
 
-#region Test Method
+        #region Test Method
 
 
-#endregion
+        #endregion
     }
     }
 }
 }

+ 1 - 1
Dev/OHV/VehicleControlSystem/ControlLayer/Serial/BatteryTabos/BMUManager.cs

@@ -186,7 +186,7 @@ namespace VehicleControlSystem.ControlLayer.Serial.BatteryTabos
             } );
             } );
 
 
             //다음 timer 기동 시 까지 잠시 대기
             //다음 timer 기동 시 까지 잠시 대기
-            polling.Once( _OnTimePoll, 1000 );
+            polling.Once( _OnTimePoll, 300 );
         }
         }
 
 
         void _OnTimePoll()
         void _OnTimePoll()

+ 1 - 1
Dev/OHV/VehicleControlSystem/ControlLayer/Serial/BatteryTabos/Peak/Peak.cs

@@ -323,7 +323,7 @@ namespace VehicleControlSystem.ControlLayer.Serial.BatteryTabos
                     break;
                     break;
                 case eCanRecvCase.CASE1:
                 case eCanRecvCase.CASE1:
                     this.manager.ReceivedDataDic[ eDataKind.Voltage ].Value = mb.ReadLeShort();
                     this.manager.ReceivedDataDic[ eDataKind.Voltage ].Value = mb.ReadLeShort();
-                    this.manager.ReceivedDataDic[ eDataKind.Current ].Value = mb.ReadLeShort();
+                    this.manager.ReceivedDataDic[eDataKind.Current].Value = mb.ReadLeShort();
                     this.manager.ReceivedDataDic[ eDataKind.BatteryState ].Value = mb.ReadLeShort();
                     this.manager.ReceivedDataDic[ eDataKind.BatteryState ].Value = mb.ReadLeShort();
                     break;
                     break;
                 case eCanRecvCase.CASE2:
                 case eCanRecvCase.CASE2:

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

@@ -45,7 +45,7 @@ namespace VehicleControlSystem.ControlLayer
             //    this.GetSteeringState();
             //    this.GetSteeringState();
         }
         }
 
 
-        void GetSteeringState( )
+        public eSteeringState GetSteeringState( )
         {
         {
             eSteeringState frontState = eSteeringState.None;
             eSteeringState frontState = eSteeringState.None;
             if ( this.IsFrontLeft() && this.IsFrontRight() )
             if ( this.IsFrontLeft() && this.IsFrontRight() )
@@ -75,6 +75,8 @@ namespace VehicleControlSystem.ControlLayer
                 this.SteeringState = eSteeringState.Right;
                 this.SteeringState = eSteeringState.Right;
             else
             else
                 this.SteeringState = eSteeringState.None;
                 this.SteeringState = eSteeringState.None;
+
+            return this.SteeringState;
         }
         }
 
 
         bool isExecuteSteering = false;
         bool isExecuteSteering = false;

File diff suppressed because it is too large
+ 323 - 259
Dev/OHV/VehicleControlSystem/ControlLayer/Vehicle.cs


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

@@ -523,7 +523,7 @@ namespace VehicleControlSystem.Managers
         {
         {
             var msg = new OCSMessage();
             var msg = new OCSMessage();
             msg.Kind = eKind.B;
             msg.Kind = eKind.B;
-            var bData = 54.32;
+            var bData = volt;
             msg.Tag = bData.ToString( "00.00" ).Replace( ".", "" );
             msg.Tag = bData.ToString( "00.00" ).Replace( ".", "" );
             msg.IsSubCode1 = this.vehicle.IsContain;
             msg.IsSubCode1 = this.vehicle.IsContain;
             msg.IsSubCode2 = vehicle.IsMoving;
             msg.IsSubCode2 = vehicle.IsMoving;

+ 16 - 4
Dev/OHV/VehicleControlSystem/Managers/RouteManager.cs

@@ -1,4 +1,5 @@
-using Newtonsoft.Json.Linq;
+using GSG.NET.ObjectBase;
+using Newtonsoft.Json.Linq;
 using OHV.Common.Model;
 using OHV.Common.Model;
 using OHV.Common.Shareds;
 using OHV.Common.Shareds;
 using OHV.SqliteDAL;
 using OHV.SqliteDAL;
@@ -11,17 +12,22 @@ using System.Threading.Tasks;
 
 
 namespace VehicleControlSystem.Managers
 namespace VehicleControlSystem.Managers
 {
 {
-    public class RouteManager
+    public class RouteManager : SingletonBase<RouteManager>, IDisposable
     {
     {
         SqliteManager sql = null;
         SqliteManager sql = null;
 
 
         public List<segment> Segments = new List<segment>();
         public List<segment> Segments = new List<segment>();
         public List<point> Points = new List<point>();
         public List<point> Points = new List<point>();
+        public List<equipment> Equipments = new List<equipment>();
+        public List<obstacles> Obstacles = new List<obstacles>();
 
 
-        public RouteManager( SqliteManager sql )
+        private RouteManager( )
+        {
+        }
+        
+        public void Init( SqliteManager sql )
         {
         {
             this.sql = sql;
             this.sql = sql;
-
             this.LoadJson();
             this.LoadJson();
         }
         }
 
 
@@ -37,6 +43,8 @@ namespace VehicleControlSystem.Managers
                 var o = JObject.Parse( json );
                 var o = JObject.Parse( json );
                 this.Points = o["points"].ToObject<List<point>>();
                 this.Points = o["points"].ToObject<List<point>>();
                 this.Segments = o["segments"].ToObject<List<segment>>();
                 this.Segments = o["segments"].ToObject<List<segment>>();
+                this.Obstacles = o["obstacles"].ToObject<List<obstacles>>();
+                this.Equipments = o["equipments"].ToObject<List<equipment>>();
             }
             }
 
 
             this.WriteToDB();
             this.WriteToDB();
@@ -59,5 +67,9 @@ namespace VehicleControlSystem.Managers
                  sql.RouteDal.Add( route );
                  sql.RouteDal.Add( route );
              } );
              } );
         }
         }
+
+        public void Dispose()
+        {
+        }
     }
     }
 }
 }

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

@@ -12,7 +12,10 @@ using Prism.Events;
 using Prism.Ioc;
 using Prism.Ioc;
 using Prism.Modularity;
 using Prism.Modularity;
 using VehicleControlSystem.ControlLayer;
 using VehicleControlSystem.ControlLayer;
+using VehicleControlSystem.ControlLayer.Drive;
 using VehicleControlSystem.ControlLayer.IO;
 using VehicleControlSystem.ControlLayer.IO;
+using VehicleControlSystem.ControlLayer.MQ;
+using VehicleControlSystem.ControlLayer.Serial.BatteryTabos;
 using VehicleControlSystem.Managers;
 using VehicleControlSystem.Managers;
 
 
 namespace VehicleControlSystem
 namespace VehicleControlSystem
@@ -23,13 +26,22 @@ namespace VehicleControlSystem
         Logger logger = Logger.GetLogger();
         Logger logger = Logger.GetLogger();
 
 
         Scheduler scheduler = null;
         Scheduler scheduler = null;
-        IEventAggregator eventAggregator = null;
-        public IIO IO = null;
         public AutoManager autoManager = null;
         public AutoManager autoManager = null;
         HostManager hostManager = null;
         HostManager hostManager = null;
-        Vehicle vehicle = null;
         SqliteManager sql = null;
         SqliteManager sql = null;
-        RouteManager routeManager = null;
+
+        IEventAggregator eventAggregator = null;
+
+        public IIO IO = null;
+        ZmqManager zmqManager = null;
+        BMUManager bMUManager = null;
+        Conveyor conveyor = null;
+        Steering steering = null;
+        GSIDrive drive = null;
+        Clamp clamp = null;
+        Vehicle vehicle = null;
+
+        public RouteManager RouteManager { get; set; }
 
 
         public VCSystem(IEventAggregator ea, SqliteManager sql)
         public VCSystem(IEventAggregator ea, SqliteManager sql)
         {
         {
@@ -47,6 +59,9 @@ namespace VehicleControlSystem
         {
         {
             QuartzUtils.Invoke("HIS_ALARM", QuartzUtils.GetExpnMinute(1), this.CleanHisAlarm);
             QuartzUtils.Invoke("HIS_ALARM", QuartzUtils.GetExpnMinute(1), this.CleanHisAlarm);
 
 
+            this.RouteManager = RouteManager.Instance;
+            RouteManager.Instance.Init( this.sql );
+
             //Create IO
             //Create IO
             this.IO = new EzIO();
             this.IO = new EzIO();
             var mapPath = Path.Combine(System.Environment.CurrentDirectory) + @"\Config\IO.xlsx";
             var mapPath = Path.Combine(System.Environment.CurrentDirectory) + @"\Config\IO.xlsx";
@@ -58,9 +73,43 @@ namespace VehicleControlSystem
             ezIO.OnDiscontd += EzIO_OnDiscontd;
             ezIO.OnDiscontd += EzIO_OnDiscontd;
             ezIO.OnChangedIO += EzIO_OnChangedIO;
             ezIO.OnChangedIO += EzIO_OnChangedIO;
 
 
+            //Battery
+            this.bMUManager = new BMUManager();
+            this.bMUManager.BMUConfig = new ControlLayer.Serial.BatteryTabos.Config() { ID = "0" };
+            var setV = sql.ConfigDal.GetValueToInt( ConstString.BatteryCanType );
+            var canType = CastTo<BMUManager.eCANSelect>.From<int>( setV );
+            this.bMUManager.Connect( canType );
+
+            //Conveyor
+            this.conveyor = new Conveyor( this.IO as EzIO );
+
+            //Clamp
+            this.clamp = new Clamp( this.sql, this.eventAggregator );
+            this.clamp.Init();
+
+            //Steering
+            this.steering = new Steering( this.IO, this.sql, this.eventAggregator );
+
+            this.zmqManager = new ZmqManager( vehicle, this.bMUManager );
+            this.zmqManager.Init();
+
+            //Drive
+            this.drive = new GSIDrive( this.sql, this.steering, this.zmqManager );
+            this.drive.Init();
+
+            var refObject = new VehicleRefObjects();
+            refObject.IO = this.IO as EzIO;
+            refObject.BMUManager = this.bMUManager;
+            refObject.Drive = this.drive;
+            refObject.Conveyor = this.conveyor;
+            refObject.Clamp = this.clamp;
+            refObject.Steering = this.steering;
+
+            //Process
             this.autoManager = new AutoManager(this.IO, this.eventAggregator, this.sql);
             this.autoManager = new AutoManager(this.IO, this.eventAggregator, this.sql);
             this.scheduler = new Scheduler(eventAggregator, this.autoManager, this.sql );
             this.scheduler = new Scheduler(eventAggregator, this.autoManager, this.sql );
-            this.vehicle = new Vehicle(this.IO, this.sql, this.eventAggregator, this.autoManager);
+
+            this.vehicle = new Vehicle(refObject, this.IO, this.sql, this.eventAggregator, this.autoManager );
             this.vehicle.PropertyChanged += Vehicle_PropertyChanged;
             this.vehicle.PropertyChanged += Vehicle_PropertyChanged;
 
 
             this.hostManager = new HostManager(this.eventAggregator, this.vehicle, this.sql, this.autoManager, this.scheduler);
             this.hostManager = new HostManager(this.eventAggregator, this.vehicle, this.sql, this.autoManager, this.scheduler);
@@ -69,8 +118,6 @@ namespace VehicleControlSystem
             this.vehicle.Init();
             this.vehicle.Init();
             this.scheduler.Init();
             this.scheduler.Init();
             this.autoManager.Init(this.vehicle);
             this.autoManager.Init(this.vehicle);
-
-            this.routeManager = new RouteManager(this.sql);
         }
         }
 
 
         private void Vehicle_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
         private void Vehicle_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
@@ -381,8 +428,8 @@ namespace VehicleControlSystem
         private void ReqVehicleModeChange(VCSMessageEventArgs msg)
         private void ReqVehicleModeChange(VCSMessageEventArgs msg)
         {
         {
             GUIMessageEventArgs reply;
             GUIMessageEventArgs reply;
-
             if (msg.MessageKey.Equals(MessageKey.AutoMode))
             if (msg.MessageKey.Equals(MessageKey.AutoMode))
+
             {
             {
                 int result = vehicle.InitializationVehicle();
                 int result = vehicle.InitializationVehicle();
                 if (result != 0)
                 if (result != 0)
@@ -427,7 +474,12 @@ namespace VehicleControlSystem
             this.autoManager.Dispose();
             this.autoManager.Dispose();
             this.hostManager.Dispose();
             this.hostManager.Dispose();
             this.vehicle.Dispose();
             this.vehicle.Dispose();
-            (this.IO as IDisposable).Dispose(); //IO 는 마지막에 정리함.
+
+            this.bMUManager.Disconnect();
+            this.drive.Dispose();
+            this.zmqManager.Dispose();
+
+            ( this.IO as IDisposable).Dispose(); //IO 는 마지막에 정리함.
         }
         }
 
 
         public void RegisterTypes(IContainerRegistry containerRegistry)
         public void RegisterTypes(IContainerRegistry containerRegistry)

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


+ 3 - 0
Dev/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger.sln

@@ -10,6 +10,7 @@ Global
 		Debug|Any CPU = Debug|Any CPU
 		Debug|Any CPU = Debug|Any CPU
 		Release|Any CPU = Release|Any CPU
 		Release|Any CPU = Release|Any CPU
 		Remote|Any CPU = Remote|Any CPU
 		Remote|Any CPU = Remote|Any CPU
+		RRmode|Any CPU = RRmode|Any CPU
 	EndGlobalSection
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
 		{2C4A899E-68A7-45AB-BB81-65D0D941AF1E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{2C4A899E-68A7-45AB-BB81-65D0D941AF1E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
@@ -18,6 +19,8 @@ Global
 		{2C4A899E-68A7-45AB-BB81-65D0D941AF1E}.Release|Any CPU.Build.0 = Release|Any CPU
 		{2C4A899E-68A7-45AB-BB81-65D0D941AF1E}.Release|Any CPU.Build.0 = Release|Any CPU
 		{2C4A899E-68A7-45AB-BB81-65D0D941AF1E}.Remote|Any CPU.ActiveCfg = Remote|Any CPU
 		{2C4A899E-68A7-45AB-BB81-65D0D941AF1E}.Remote|Any CPU.ActiveCfg = Remote|Any CPU
 		{2C4A899E-68A7-45AB-BB81-65D0D941AF1E}.Remote|Any CPU.Build.0 = Remote|Any CPU
 		{2C4A899E-68A7-45AB-BB81-65D0D941AF1E}.Remote|Any CPU.Build.0 = Remote|Any CPU
+		{2C4A899E-68A7-45AB-BB81-65D0D941AF1E}.RRmode|Any CPU.ActiveCfg = RRmode|Any CPU
+		{2C4A899E-68A7-45AB-BB81-65D0D941AF1E}.RRmode|Any CPU.Build.0 = RRmode|Any CPU
 	EndGlobalSection
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
 		HideSolutionNode = FALSE

+ 17 - 4
Dev/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger/Config/log4net.xml

@@ -8,11 +8,11 @@
 	</root>
 	</root>
 
 
 	<logger name="PhysicalCheckup_Front" additivity="false">
 	<logger name="PhysicalCheckup_Front" additivity="false">
-		<appender-ref ref="PhysicalCheckupFileAppender_Front" />
+		<appender-ref ref="Front_BufferingForwarder" />
 	</logger>
 	</logger>
 
 
 	<logger name="PhysicalCheckup_Rear" additivity="false">
 	<logger name="PhysicalCheckup_Rear" additivity="false">
-		<appender-ref ref="PhysicalCheckupFileAppender_Rear" />
+		<appender-ref ref="Rear_BufferingForwarder" />
 	</logger>
 	</logger>
 
 
 	<!--
 	<!--
@@ -26,9 +26,22 @@
 	•OFF    •OFF    •OFF    •OFF    •OFF    •OFF    •OFF
 	•OFF    •OFF    •OFF    •OFF    •OFF    •OFF    •OFF
 	-->
 	-->
 
 
+	<appender name="Front_BufferingForwarder" type="log4net.Appender.BufferingForwardingAppender">
+		<bufferSize value="512"/>
+		<lossy value="false"/>
+		<Fix value ="268"/>
+		<appender-ref ref="PhysicalCheckupFileAppender_Front"/>
+	</appender>
+	<appender name="Rear_BufferingForwarder" type="log4net.Appender.BufferingForwardingAppender">
+		<bufferSize value="512"/>
+		<lossy value="false"/>
+		<Fix value ="268"/>
+		<appender-ref ref="PhysicalCheckupFileAppender_Rear"/>
+	</appender>
+
 	<appender name="PhysicalCheckupFileAppender_Front" type="GSG.NET.Logging.FileAppender, GSG.NET">
 	<appender name="PhysicalCheckupFileAppender_Front" type="GSG.NET.Logging.FileAppender, GSG.NET">
 		<threshold value="INFO"/>
 		<threshold value="INFO"/>
-		<file value="C:\LOG\OHV\Vehicle\PhysicalCheckup\Front_Wheel.log" />
+		<file value="C:\LOG\OHV\DriveLogger\PhysicalCheckup\Front_Wheel.log" />
 		<staticLogFileName value="true"/>
 		<staticLogFileName value="true"/>
 		<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
 		<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
 		<appendToFile value="true" />
 		<appendToFile value="true" />
@@ -42,7 +55,7 @@
 
 
 	<appender name="PhysicalCheckupFileAppender_Rear" type="GSG.NET.Logging.FileAppender, GSG.NET">
 	<appender name="PhysicalCheckupFileAppender_Rear" type="GSG.NET.Logging.FileAppender, GSG.NET">
 		<threshold value="INFO"/>
 		<threshold value="INFO"/>
-		<file value="C:\LOG\OHV\Vehicle\PhysicalCheckup\Rear_Wheel.log" />
+		<file value="C:\LOG\OHV\DriveLogger\PhysicalCheckup\Rear_Wheel.log" />
 		<staticLogFileName value="true"/>
 		<staticLogFileName value="true"/>
 		<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
 		<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
 		<appendToFile value="true" />
 		<appendToFile value="true" />

+ 27 - 3
Dev/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger/FTPLogger.cs

@@ -1,5 +1,6 @@
 using FluentFTP;
 using FluentFTP;
 using GSG.NET.FileSystem;
 using GSG.NET.FileSystem;
+using GSG.NET.ObjectBase;
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.Linq;
 using System.Linq;
@@ -9,14 +10,34 @@ using System.Threading.Tasks;
 
 
 namespace OHVDriveLogger
 namespace OHVDriveLogger
 {
 {
-    public class FTPLogger
+    public class FTPLogger : SingletonBase<FTPLogger>
     {
     {
+        private FTPLogger() { }
+
         public void FTPUpload()
         public void FTPUpload()
         {
         {
             using ( var ftp = new FtpClient( "192.168.127.123" ) )
             using ( var ftp = new FtpClient( "192.168.127.123" ) )
             {
             {
                 ftp.Connect();
                 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();
+                ftp.Dispose();
+            }
+
+            DeleteLocalFiles( @"C:\LOG\FTP\" );
+        }
+
+        public void FTPDriveLogUplaod()
+        {
+            using ( var ftp = new FtpClient( "192.168.127.123" ) )
+            {
+                ftp.Connect();
+                ftp.UploadDirectory( @"C:\LOG\OHV\DriveLogger\PhysicalCheckup\", @"\LOG\", FtpFolderSyncMode.Update );
+
+                ftp.Disconnect();
+                ftp.Dispose();
             }
             }
         }
         }
 
 
@@ -35,17 +56,20 @@ namespace OHVDriveLogger
                     return;
                     return;
 
 
                 ftp.DeleteDirectory( @"/0_CARD/log0/" );
                 ftp.DeleteDirectory( @"/0_CARD/log0/" );
+
+                ftp.Disconnect();
+                ftp.Dispose();
             }
             }
         }
         }
 
 
         async Task DeleteDirectoryAsync()
         async Task DeleteDirectoryAsync()
         {
         {
             var token = new CancellationToken();
             var token = new CancellationToken();
-            using ( var conn = new FtpClient( "127.0.0.1", "ftptest", "ftptest" ) )
+            using ( var conn = new FtpClient( "192.168.0.20", "KV", "1234" ) )
             {
             {
                 await conn.ConnectAsync( token );
                 await conn.ConnectAsync( token );
 
 
-                await conn.DeleteFileAsync( "/full/or/relative/path/to/file" );
+                await conn.DeleteFileAsync( "/0_CARD/log0/" );
             }
             }
         }
         }
 
 

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

@@ -1,4 +1,5 @@
-using GSG.NET.Logging;
+using GSG.NET.Concurrent;
+using GSG.NET.Logging;
 using GSG.NET.PLC;
 using GSG.NET.PLC;
 using GSG.NET.PLC.Keyence;
 using GSG.NET.PLC.Keyence;
 using GSG.NET.PLC.KNC;
 using GSG.NET.PLC.KNC;
@@ -17,9 +18,14 @@ namespace OHVDriveLogger
     public partial class FormMain : Form
     public partial class FormMain : Form
     {
     {
         Logger logger = Logger.GetLogger();
         Logger logger = Logger.GetLogger();
+        Logger frontlogger = Logger.GetLogger( "PhysicalCheckup_Front" );
+        Logger rearlogger = Logger.GetLogger( "PhysicalCheckup_Rear" );
+
         KncManager plc = new KncManager();
         KncManager plc = new KncManager();
         ZmqManager zmp = new ZmqManager();
         ZmqManager zmp = new ZmqManager();
 
 
+        ThreadCancel threadCancel = new ThreadCancel( );
+
         public FormMain()
         public FormMain()
         {
         {
             InitializeComponent();
             InitializeComponent();
@@ -30,6 +36,8 @@ namespace OHVDriveLogger
 
 
         private void FormMain_FormClosing( object sender, FormClosingEventArgs e )
         private void FormMain_FormClosing( object sender, FormClosingEventArgs e )
         {
         {
+            this.threadCancel.Cancel();
+
             this.plc.Disconnect();
             this.plc.Disconnect();
             this.zmp.Dispose();
             this.zmp.Dispose();
         }
         }
@@ -39,7 +47,7 @@ namespace OHVDriveLogger
             this.plc.Config.Id = "KV8000";
             this.plc.Config.Id = "KV8000";
             this.plc.Config.IpAddress = "192.168.0.20";
             this.plc.Config.IpAddress = "192.168.0.20";
             this.plc.Config.Port = 5000; //5000
             this.plc.Config.Port = 5000; //5000
-            this.plc.Config.MonitorInterval = 1000;
+            this.plc.Config.MonitorInterval = 500;
 
 
             var grpB = new KncGroup { Device = KncDevice.MR, Name = "MR" };
             var grpB = new KncGroup { Device = KncDevice.MR, Name = "MR" };
             grpB.AddBitBlock( new KncBitBlock { Name = $"DRIVE_LOGGING_ONOFF", Address = 16, SubNo = 0 } );
             grpB.AddBitBlock( new KncBitBlock { Name = $"DRIVE_LOGGING_ONOFF", Address = 16, SubNo = 0 } );
@@ -53,7 +61,10 @@ namespace OHVDriveLogger
 
 
             this.plc.Connect();
             this.plc.Connect();
 
 
-            this.zmp.CrateClientSocket();
+            this.zmp.Init();
+
+            this.threadCancel.AddGo( Th_DoWorker );
+
         }
         }
 
 
         private void Plc_OnDisconnect( string id )
         private void Plc_OnDisconnect( string id )
@@ -89,5 +100,50 @@ namespace OHVDriveLogger
             else
             else
                 plc.WriteBit( "DRIVE_LOGGING_ONOFF", true );
                 plc.WriteBit( "DRIVE_LOGGING_ONOFF", true );
         }
         }
+
+        void Th_DoWorker()
+        {
+            while ( !this.threadCancel.Canceled )
+            {
+                LockUtils.Wait( 20 );
+
+                if ( this.zmp.IsDriveMoving )
+                    this.LoggingStart();
+            }
+        }
+
+        void LoggingStart()
+        {
+            this.zmp.IsDriveMoving = true;
+
+            this.plc.WriteBit( "DRIVE_LOGGING_ONOFF", true );
+
+            while( this.zmp.IsDriveMoving )
+            {
+                LockUtils.Wait( 100 );
+
+                //rpm -> rpm/60 * 2math.Pie * 0.06 / 10(감속비율 10:1) :: 단위 m/s^2
+                //1.9; //단위 Nm(뉴튼 미터)
+
+                //Front
+                var frontSpeed = ( ( ( ( zmp.FrontRPM / 60 ) * ( 2 * Math.PI ) ) * 0.06 ) / 10 );
+                var frontTorque = (zmp.FrontLoadFacter * 1.9) / 100; //0.1% 단위 //\\
+
+                //Rear
+                var rearSpeed = ((((zmp.RearRPM / 60) * (2 * Math.PI) ) * 0.06) / 10) ;
+                var rearTorque = (zmp.RearLoadFacter * 1.9) / 100;
+
+                frontlogger.I( $"Speed : {frontSpeed} / Torque : {frontTorque} / RPM : {zmp.FrontRPM} / LoadFactor : {zmp.FrontLoadFacter} / Battery Current : {zmp.BatteryCurrent}" );
+                rearlogger.I( $"Speed : {rearSpeed} / Torque : {rearTorque} / RPM : {zmp.RearRPM} / LoadFactor : {zmp.RearLoadFacter} / Battery Current : {zmp.BatteryCurrent}" );
+            }
+
+            this.plc.WriteBit( "DRIVE_LOGGING_ONOFF", false );
+
+            LockUtils.Wait( 1000 );
+            FTPLogger.Instance.FTPDownload();
+            LockUtils.Wait( 1000 );
+            FTPLogger.Instance.FTPUpload();
+            LockUtils.Wait( 1000 );
+        }
     }
     }
 }
 }

+ 12 - 1
Dev/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger.csproj

@@ -33,7 +33,7 @@
   </PropertyGroup>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Remote|AnyCPU'">
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Remote|AnyCPU'">
     <DebugSymbols>true</DebugSymbols>
     <DebugSymbols>true</DebugSymbols>
-    <OutputPath>\\192.168.127.10\KV8000\</OutputPath>
+    <OutputPath>\\192.168.127.10\DriveLogger\</OutputPath>
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <DebugType>full</DebugType>
     <DebugType>full</DebugType>
     <PlatformTarget>AnyCPU</PlatformTarget>
     <PlatformTarget>AnyCPU</PlatformTarget>
@@ -42,6 +42,17 @@
     <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
     <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
     <Prefer32Bit>true</Prefer32Bit>
     <Prefer32Bit>true</Prefer32Bit>
   </PropertyGroup>
   </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'RRmode|AnyCPU'">
+    <OutputPath>\\192.168.127.20\DriveLogger\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <LangVersion>7.3</LangVersion>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>true</Prefer32Bit>
+  </PropertyGroup>
   <ItemGroup>
   <ItemGroup>
     <Reference Include="FluentFTP">
     <Reference Include="FluentFTP">
       <HintPath>..\..\..\OHV\Assambly\FluentFTP.dll</HintPath>
       <HintPath>..\..\..\OHV\Assambly\FluentFTP.dll</HintPath>

+ 122 - 8
Dev/OHVDriveLogger/OHVDriveLogger/OHVDriveLogger/ZmqManager.cs

@@ -17,6 +17,7 @@ namespace OHVDriveLogger
 
 
         SubscriberSocket sub = null;
         SubscriberSocket sub = null;
         RequestSocket req = null;
         RequestSocket req = null;
+        ResponseSocket rep = null;
 
 
         NetMQPoller poller = null;
         NetMQPoller poller = null;
         NetMQMonitor monitor = null;
         NetMQMonitor monitor = null;
@@ -24,26 +25,77 @@ namespace OHVDriveLogger
         ThreadCancel threadCancel = new ThreadCancel();
         ThreadCancel threadCancel = new ThreadCancel();
 
 
         private bool isReqConnected;
         private bool isReqConnected;
-
         public bool IsReqConnected
         public bool IsReqConnected
         {
         {
             get { return isReqConnected; }
             get { return isReqConnected; }
             set { isReqConnected = value; }
             set { isReqConnected = value; }
         }
         }
 
 
+        private bool isDriveMoving = false;
+        public bool IsDriveMoving
+        {
+            get { return isDriveMoving; }
+            set { isDriveMoving = value; }
+        }
+
+        private double frontLoadFacter;
+        public double FrontLoadFacter
+        {
+            get { return frontLoadFacter * 0.1; }
+            set { frontLoadFacter = value; }
+        }
+
+        private double rearLoadFacter;
+        public double RearLoadFacter
+        {
+            get { return rearLoadFacter * 0.1; }
+            set { rearLoadFacter = value; }
+        }
+
+        private double frontRPM;
+        public double FrontRPM
+        {
+            get { return Math.Truncate( frontRPM * 10 )/10; }
+            set { frontRPM = value; }
+        }
+
+        private double rearRPM;
+        public double RearRPM
+        {
+            get { return Math.Truncate( rearRPM * 10 ) / 10; }
+            set { rearRPM = value; }
+        }
+
+        private double batteryCurrent;
+
+        public double BatteryCurrent
+        {
+            get { return batteryCurrent; }
+            set { batteryCurrent = value; }
+        }
+
+        private int currentPoint;
+
+        public int CurrentPoint
+        {
+            get { return currentPoint; }
+            set { currentPoint = value; }
+        }
+
+
+
+
+
         public ZmqManager()
         public ZmqManager()
         {
         {
             NetMQ.NetMQConfig.Cleanup();
             NetMQ.NetMQConfig.Cleanup();
         }
         }
 
 
-        public void CrateClientSocket()
+        public void Init()
         {
         {
-            //pub = new PublisherSocket();
-            //pub.Bind( "tcp://127.0.0.1:5565" );
-
             sub = new SubscriberSocket();
             sub = new SubscriberSocket();
             sub.Connect( "tcp://127.0.0.1:5565" );
             sub.Connect( "tcp://127.0.0.1:5565" );
-            sub.Connect( "tcp://127.0.0.1:5566" );
+            sub.Connect( "tcp://127.0.0.1:5570" );
             sub.Subscribe( "" ); //All
             sub.Subscribe( "" ); //All
 
 
             sub.ReceiveReady += Sub_ReceiveReady;
             sub.ReceiveReady += Sub_ReceiveReady;
@@ -58,8 +110,30 @@ namespace OHVDriveLogger
 
 
             this.poller = new NetMQPoller { this.sub };
             this.poller = new NetMQPoller { this.sub };
             this.poller.RunAsync();
             this.poller.RunAsync();
+        }
 
 
-            //this.threadCancel.AddGo( Th_SubPoller );
+        private void Rep_ReceiveReady( object sender, NetMQSocketEventArgs e )
+        {
+            var ret = e.Socket.ReceiveMultipartStrings();
+            logger.D( $"[rep] - {ret[1]}" );
+
+            if ( ret[0].Equals( "setm" ) )
+            {
+                var v = ret[1].Split( '/' );
+                switch ( v[0] )
+                {
+                    case "4012":
+                        if ( v[1].Equals( "3" ) )
+                            IsDriveMoving = true;
+                        else
+                            IsDriveMoving = false;
+                        break;
+
+                    default:
+                        break;
+                }
+                rep.SendMoreFrame( "setm" ).SendFrame( $"ok/{v[0]}" );
+            }
         }
         }
 
 
         public void Dispose()
         public void Dispose()
@@ -78,7 +152,47 @@ namespace OHVDriveLogger
 
 
         private void Sub_ReceiveReady( object sender, NetMQ.NetMQSocketEventArgs e )
         private void Sub_ReceiveReady( object sender, NetMQ.NetMQSocketEventArgs e )
         {
         {
-            logger.I( e.Socket.ReceiveMultipartStrings() );
+            var ret = e.Socket.ReceiveMultipartStrings();
+            //logger.I( ret );
+
+            try
+            {
+                var v = ret[1].Split( '/' );
+                switch ( ret[0] )
+                {
+                    case "7028":
+                        this.FrontRPM = Convert.ToDouble( v[0] );
+                        this.RearRPM = Convert.ToDouble( v[1] );
+                        break;
+
+                    case "7030":
+                        this.FrontLoadFacter = Convert.ToDouble( v[0] );
+                        this.RearLoadFacter = Convert.ToDouble( v[1] );
+                        break;
+
+                    case "BatteryCurrent":
+                        this.BatteryCurrent = Convert.ToDouble( v[0] );
+                        break;
+
+                    case "DriveStart":
+                        if ( v[0].Equals( "True" ) )
+                            this.IsDriveMoving = true;
+                        else
+                            this.IsDriveMoving = false;
+                        break;
+
+                    case "CurrentPoint":
+                        CurrentPoint = Convert.ToInt32( v[0] );
+                        break;
+
+                    default:
+                        break;
+                }
+            }
+            catch ( Exception excpetion )
+            {
+                logger.E( excpetion );
+            }
         }
         }
 
 
         void Th_SubPoller()
         void Th_SubPoller()