GSIDrive.cs 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. using GSG.NET.Concurrent;
  2. using GSG.NET.Extensions;
  3. using GSG.NET.Logging;
  4. using GSG.NET.Utils;
  5. using OHV.Common.Model;
  6. using OHV.Common.Shareds;
  7. using OHV.SqliteDAL;
  8. using System;
  9. using VehicleControlSystem.ControlLayer.DB;
  10. using VehicleControlSystem.ControlLayer.MQ;
  11. using VehicleControlSystem.Managers;
  12. namespace VehicleControlSystem.ControlLayer.Drive
  13. {
  14. public class GSIDrive : ControlObjectBase
  15. {
  16. public enum eDriveServoState
  17. {
  18. ServoFault = -1,
  19. WrongServoNum = 0,
  20. ServoOn = 1,
  21. ServoOff = 2,
  22. ServoStop = 3,
  23. None,
  24. }
  25. Logger logger = Logger.GetLogger();
  26. public bool IsStop { get; set; }
  27. double currentPos = 0;
  28. public double CurrentPos { get { return this.currentPos; } set { SetField( ref this.currentPos, value ); } }
  29. private int currentTag;
  30. public int CurrentTag { get { return currentTag; } set { SetField( ref this.currentTag, value ); } }
  31. private double currentSpeed = 0;
  32. public double CurrentSpeed { get { return currentSpeed; } set { SetField( ref this.currentSpeed, value ); } }
  33. private double currentTorque = 0;
  34. public double CurrentTorque { get { return currentTorque; } set { SetField( ref this.currentTorque, value ); } }
  35. public bool IsErrorOn { get; set; }
  36. eSteeringState reqSteeringState = eSteeringState.None;
  37. public eSteeringState ReqSteeringState { get { return this.reqSteeringState; } set { SetField( ref this.reqSteeringState, value ); } }
  38. private eDriveServoState driveServoState;
  39. public eDriveServoState DriveServoState
  40. {
  41. get { return driveServoState; }
  42. set { SetField( ref driveServoState, value ); }
  43. }
  44. private DriveState frontDriveState;
  45. public DriveState FrontDriveState
  46. {
  47. get { return frontDriveState; }
  48. set { SetField(ref this.frontDriveState, value); }
  49. }
  50. private DriveState rearDriveState;
  51. public DriveState RearDriveState
  52. {
  53. get { return rearDriveState; }
  54. set { SetField( ref this.rearDriveState, value ); }
  55. }
  56. TaskCancel taskCancel = new TaskCancel();
  57. ThreadCancel threadCancel = new ThreadCancel();
  58. SqliteManager sql = null;
  59. ZmqManager zmq = new ZmqManager();
  60. public GSIDrive( SqliteManager sql )
  61. {
  62. this.sql = sql;
  63. }
  64. public void Init()
  65. {
  66. this.threadCancel.AddGo( Thread_DriveStateChcker );
  67. this.threadCancel.AddGo( Thread_Logger );
  68. zmq.Init();
  69. zmq.PropertyChanged += Zmq_PropertyChanged;
  70. //PhysicalCheckupLogger.Instance.Connecte();
  71. }
  72. private void Zmq_PropertyChanged( object sender, System.ComponentModel.PropertyChangedEventArgs e )
  73. {
  74. var property = sender.GetType().GetProperty( e.PropertyName );
  75. var newValue = property.GetValue( sender, null );
  76. switch ( property.Name )
  77. {
  78. case "RequestSteering":
  79. {
  80. var v = CastTo<eSteeringState>.From<object>( newValue );
  81. this.ReqSteeringState = v;
  82. }
  83. break;
  84. default:
  85. break;
  86. }
  87. }
  88. public void Dispose()
  89. {
  90. this.threadCancel.Cancel();
  91. LockUtils.Wait( 50 );
  92. this.threadCancel.StopWaitAll();
  93. zmq.Dispose();
  94. }
  95. void Thread_DriveStateChcker()
  96. {
  97. logger.D( "[Drive] - Thread Drive State Checker Start" );
  98. while ( !this.threadCancel.Canceled )
  99. {
  100. try
  101. {
  102. LockUtils.Wait( 10 );
  103. //this.GetReqSteeringState();
  104. //if (Redis.Instance.GetDriveMove() )
  105. //{
  106. // this.LoggingState();
  107. //}
  108. }
  109. catch ( Exception e)
  110. {
  111. logger.E( $"[Drive] - Error : [{e}]" );
  112. }
  113. }
  114. logger.D( "[Drive] - Thread Drive State Checker Disposed" );
  115. }
  116. void Thread_Logger()
  117. {
  118. while ( !this.threadCancel.Canceled )
  119. {
  120. try
  121. {
  122. LockUtils.Wait( 10 );
  123. }
  124. catch ( Exception e )
  125. {
  126. logger.E( $"[Drive] - Error : [{e}]" );
  127. }
  128. }
  129. }
  130. void LoggingState()
  131. {
  132. var currentBCR = Redis.Instance.CurrentBCRValue();
  133. var speed = Redis.Instance.ActualVelocityToSpeed();
  134. var fTorque = Redis.Instance.TorqueFront();
  135. var fRPM = Redis.Instance.ActualVelocityToFrontRPM();
  136. var fLoadFacter = Redis.Instance.LoadFacterFront();
  137. PhysicalCheckupLogger.Instance.FrontWheelLogging( speed.ToString(), fTorque.ToString(), fRPM.ToString(), fLoadFacter.ToString(), currentBCR.ToString() );
  138. var fState = new DriveState();
  139. fState.DirveName = "Front";
  140. fState.Speed = speed;
  141. fState.Torque = fTorque;
  142. fState.Rpm = fRPM;
  143. fState.Loadage = fLoadFacter;
  144. this.FrontDriveState = fState;
  145. var rTorque = Redis.Instance.TorqueRear();
  146. var rRPM = Redis.Instance.ActualVelocityToRearRPM();
  147. var rLoadFacter = Redis.Instance.LoadFacterRear();
  148. PhysicalCheckupLogger.Instance.RearWheelLoggging( speed.ToString(), rTorque.ToString(), rRPM.ToString(), rLoadFacter.ToString(), currentBCR.ToString() );
  149. var rState = new DriveState();
  150. rState.DirveName = "Rear";
  151. rState.Speed = speed;
  152. rState.Torque = rTorque;
  153. rState.Rpm = rRPM;
  154. rState.Loadage = rLoadFacter;
  155. this.RearDriveState = rState;
  156. }
  157. public void SetCurrentSteeringState(eSteeringState state )
  158. {
  159. this.zmq.SetCurrentSteeringState( state );
  160. }
  161. bool IsDriveFault()
  162. {
  163. var ret = Redis.Instance.GetSystemState();
  164. return ret == 2 ? true : false;
  165. }
  166. public bool IsDriveStop() => !Redis.Instance.GetDriveMove();
  167. public bool IsDriveMoving() => Redis.Instance.GetDriveMove();
  168. public void SetDriveOperationMode( eOperatationMode mode )
  169. {
  170. if ( mode == eOperatationMode.ManualMode )
  171. Redis.Instance.SetSystemOperation( 3 );
  172. else if ( mode == eOperatationMode.AutoMode )
  173. Redis.Instance.SetSystemOperation( 2 );
  174. else { }
  175. }
  176. public eOperatationMode GetDriveOperationMode()
  177. {
  178. var ret = Redis.Instance.GetSystemState();
  179. if ( ret == 3 )
  180. return eOperatationMode.ManualMode;
  181. else if ( ret == 4 )
  182. return eOperatationMode.AutoMode;
  183. else
  184. return eOperatationMode.InitialMode;
  185. }
  186. public int MoveToPoint( string point, double velocity )
  187. {
  188. //if ( this.DriveServoState != eDriveServoState.ServoStop )
  189. // return 9999;
  190. //Drive Fault 상태 확인
  191. if ( IsDriveFault() )
  192. return 34;
  193. //ToDo: 이동 명령 실행.
  194. int result = 0;
  195. //if (! Redis.Instance.RouteMapMoveTo( point ) )
  196. //{
  197. // //Todo: Error 처리
  198. //}
  199. int waitTime = 10000;
  200. long st = SwUtils.CurrentTimeMillis;
  201. while ( true )
  202. {
  203. LockUtils.Wait( 10 );
  204. if ( SwUtils.Gt( st, waitTime ) )
  205. {
  206. logger.D("MoveToPoint Time Out");
  207. return -1;
  208. }
  209. if ( Redis.Instance.GetDriveMove() )
  210. break;
  211. }
  212. return 0;
  213. }
  214. /// <summary>
  215. /// 급정시 사용.
  216. /// </summary>
  217. //public void EStop() => OHVdriveSetServoCommand(3);
  218. /// <summary>
  219. /// Manual 상태에서 가감속 Stop
  220. /// </summary>
  221. public void Stop()
  222. {
  223. }
  224. //public void JogForWard() => OHVdriveSetManualOperationCommand( 1 );
  225. //public void JogBackward() => OHVdriveSetManualOperationCommand( -1 );
  226. //public void ServoOn() => OHVdriveSetServoCommand( 1 );
  227. //public void ServoOff() => OHVdriveSetServoCommand( 2 );
  228. //public void AmpFaultReset() => OHVdriveSetServoCommand( -1 );
  229. public void SetObstacleState( eObstacleState state ) => zmq.SetObstruction( state );
  230. public bool VelocityChainge( double velocity )
  231. {
  232. return true;
  233. }
  234. #region Test Method
  235. #endregion
  236. }
  237. }