VCSystem.cs 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using GSG.NET;
  8. using GSG.NET.Extensions;
  9. using GSG.NET.Logging;
  10. using GSG.NET.ObjectBase;
  11. using GSG.NET.Quartz;
  12. using OHV.Common.Events;
  13. using OHV.Common.Model;
  14. using OHV.Common.Shareds;
  15. using OHV.SqliteDAL;
  16. using Prism.Events;
  17. using Prism.Ioc;
  18. using Prism.Modularity;
  19. using VehicleControlSystem.ControlLayer;
  20. using VehicleControlSystem.ControlLayer.IO;
  21. using VehicleControlSystem.Managers;
  22. namespace VehicleControlSystem
  23. {
  24. [Module(ModuleName = "VCSystem")]
  25. public class VCSystem : IModule, IDisposable
  26. {
  27. Logger logger = Logger.GetLogger();
  28. Scheduler scheduler = null;
  29. IEventAggregator eventAggregator = null;
  30. public IIO IO = null;
  31. public AutoManager autoManager = null;
  32. HostManager hostManager = null;
  33. Vehicle vehicle = null;
  34. SqliteManager sql = null;
  35. public VCSystem(IEventAggregator ea, SqliteManager sql)
  36. {
  37. this.sql = sql;
  38. this.eventAggregator = ea;
  39. this.eventAggregator.GetEvent<ApplicationExitEvent>().Subscribe((o) => Dispose(), true);
  40. this.eventAggregator.GetEvent<VCSMessagePubSubEvent>().Unsubscribe(ReceivedMessageEvent);
  41. this.eventAggregator.GetEvent<VCSMessagePubSubEvent>().Subscribe(this.ReceivedMessageEvent, ThreadOption.BackgroundThread);
  42. }
  43. public void Init()
  44. {
  45. QuartzUtils.Invoke("HIS_ALARM", QuartzUtils.GetExpnMinute(1), this.CleanHisAlarm);
  46. //Create IO
  47. this.IO = new EzIO();
  48. var mapPath = Path.Combine(System.Environment.CurrentDirectory) + @"\Config\IO.xlsx";
  49. this.IO.LoadIOMap(mapPath);
  50. this.IO.RunIOThread();
  51. var ezIO = this.IO as EzIO;
  52. ezIO.OnContd += EzIO_OnContd;
  53. ezIO.OnDiscontd += EzIO_OnDiscontd;
  54. ezIO.OnChangedIO += EzIO_OnChangedIO;
  55. this.autoManager = new AutoManager(this.IO, this.eventAggregator, this.sql);
  56. this.scheduler = new Scheduler(eventAggregator, this.autoManager, this.sql );
  57. this.vehicle = new Vehicle(this.IO, this.sql, this.eventAggregator, this.autoManager);
  58. this.vehicle.PropertyChanged += Vehicle_PropertyChanged;
  59. this.hostManager = new HostManager(this.eventAggregator, this.vehicle, this.sql, this.autoManager, this.scheduler);
  60. this.hostManager.Init();
  61. this.vehicle.Init();
  62. this.scheduler.Init();
  63. this.autoManager.Init(this.vehicle);
  64. }
  65. private void Vehicle_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
  66. {
  67. var arg = new GUIMessageEventArgs();
  68. arg.Kind = GUIMessageEventArgs.eGUIMessageKind.ModelPropertyChange;
  69. arg.MessageKey = MessageKey.Vehicle;
  70. arg.ModelPropertyName = e.PropertyName;
  71. var property = sender.GetType().GetProperty(e.PropertyName);
  72. var newValue = property.GetValue(sender, null);
  73. arg.ModelPropertyName = e.PropertyName;
  74. arg.Args = newValue;
  75. GUIMessageEventPublish(arg);
  76. }
  77. public void CleanHisAlarm()
  78. {
  79. sql.HisAlarmDAL.Delete(20);
  80. }
  81. #region EzIO Event
  82. private void EzIO_OnChangedIO(BitBlock bit)
  83. {
  84. this.eventAggregator.GetEvent<IOChangedPubSubEvent>().Publish(new IOChangedMessageEventArgs { Args = bit });
  85. }
  86. private void EzIO_OnDiscontd(string ID)
  87. {
  88. //throw new NotImplementedException();
  89. }
  90. private void EzIO_OnContd(string ID)
  91. {
  92. //throw new NotImplementedException();
  93. }
  94. #endregion
  95. #region ReqMessage Method
  96. void ReceivedMessageEvent(VCSMessageEventArgs msg)
  97. {
  98. switch ( msg.Kind )
  99. {
  100. case VCSMessageEventArgs.eVCSMessageKind.ReqIOObject:
  101. ReqIOObjectMessage();
  102. break;
  103. case VCSMessageEventArgs.eVCSMessageKind.ReqIOMapList:
  104. break;
  105. case VCSMessageEventArgs.eVCSMessageKind.ReqCommandList:
  106. break;
  107. case VCSMessageEventArgs.eVCSMessageKind.ReqAutoModeChange:
  108. break;
  109. case VCSMessageEventArgs.eVCSMessageKind.ReqManualModeChange:
  110. break;
  111. case VCSMessageEventArgs.eVCSMessageKind.ModelPropertyChange:
  112. break;
  113. case VCSMessageEventArgs.eVCSMessageKind.ReqAlarmReset:
  114. ReqAlarmReset();
  115. break;
  116. case VCSMessageEventArgs.eVCSMessageKind.ReqVehicleModeChange:
  117. this.ReqVehicleModeChange( msg );
  118. break;
  119. case VCSMessageEventArgs.eVCSMessageKind.ReqEStop:
  120. ReqEStop();
  121. break;
  122. case VCSMessageEventArgs.eVCSMessageKind.ReqBuzzerStop:
  123. ReqBuzzerStop();
  124. break;
  125. case VCSMessageEventArgs.eVCSMessageKind.ReqMachineModeChg:
  126. ReqMachineModeChg( msg );
  127. break;
  128. case VCSMessageEventArgs.eVCSMessageKind.ReqAddCommand:
  129. break;
  130. case VCSMessageEventArgs.eVCSMessageKind.ReqTest:
  131. ReqTest();
  132. break;
  133. default:
  134. break;
  135. }
  136. }
  137. private void ReqTest()
  138. {
  139. logger.D( "Test Request" );
  140. if ( this.IO.WaitChangeInputIO( true, 30000, "IN_CV_DETECT_00" ) )
  141. logger.D( "Test - Time in" );
  142. else
  143. logger.D( "Test - Time out" );
  144. }
  145. private void ReqMachineModeChg( VCSMessageEventArgs msg )
  146. {
  147. var reply = new GUIMessageEventArgs();
  148. reply.Kind = GUIMessageEventArgs.eGUIMessageKind.RspMachineModeChg;
  149. var mode = CastTo<eMachineMode>.From<object>( msg.Arg );
  150. if ( mode == eMachineMode.HostMode )
  151. {
  152. if (this.autoManager.OperationModeProperty != eOperatationMode.AutoMode )
  153. reply.Result = FluentResults.Results.Fail( "Vehicle Not Start" );
  154. else
  155. {
  156. this.vehicle.MachineMode = eMachineMode.HostMode;
  157. reply.Result = FluentResults.Results.Ok();
  158. reply.Args = eMachineMode.HostMode;
  159. }
  160. }
  161. else
  162. {
  163. this.vehicle.MachineMode = eMachineMode.LocalMode;
  164. reply.Result = FluentResults.Results.Ok<eMachineMode>( eMachineMode.LocalMode );
  165. reply.Args = eMachineMode.LocalMode;
  166. }
  167. GUIMessageEventPublish( reply );
  168. }
  169. private void ReqBuzzerStop( )
  170. {
  171. this.IO.OutputOff( "OUT_BUZZER_00" );
  172. this.IO.OutputOff( "OUT_BUZZER_01" );
  173. this.IO.OutputOff( "OUT_BUZZER_02" );
  174. }
  175. private void ReqAlarmReset()
  176. {
  177. this.autoManager.IsErrorProcessing = false;
  178. this.vehicle.VehicleStateProperty = eVehicleState.Idle;
  179. }
  180. private void ReqEStop()
  181. {
  182. this.vehicle.EStop();
  183. }
  184. private void ReqVehicleModeChange(VCSMessageEventArgs msg)
  185. {
  186. GUIMessageEventArgs reply;
  187. if (msg.MessageKey.Equals(MessageKey.AutoMode))
  188. {
  189. int result = vehicle.InitializationVehicle();
  190. if (result != 0)
  191. {
  192. this.autoManager.ProcessAlarm(result); //Alarm 내용을 UI로 전달 해주니까 Reply 가 필요 없다.
  193. return;
  194. }
  195. this.autoManager.AutoModeStateProperty = eAutoModeState.StartRun;
  196. this.autoManager.OperationModeProperty = eOperatationMode.AutoMode;
  197. reply = new GUIMessageEventArgs { Kind = GUIMessageEventArgs.eGUIMessageKind.RspVehicleModeChange, Result = FluentResults.Results.Ok(), MessageKey = MessageKey.AutoMode };
  198. }
  199. else
  200. {
  201. this.autoManager.AutoModeStateProperty = OHV.Common.Shareds.eAutoModeState.WaitStop;
  202. reply = new GUIMessageEventArgs { Kind = GUIMessageEventArgs.eGUIMessageKind.RspVehicleModeChange, Result = FluentResults.Results.Ok(), MessageKey = MessageKey.ManualMode };
  203. }
  204. GUIMessageEventPublish(reply);
  205. }
  206. void ReqIOObjectMessage()
  207. {
  208. var rspMsg = new GUIMessageEventArgs { Kind = GUIMessageEventArgs.eGUIMessageKind.RspIOObject, Args = this.IO };
  209. this.eventAggregator.GetEvent<GUIMessagePubSubEvent>().Publish(rspMsg);
  210. }
  211. #endregion
  212. /// <summary>
  213. /// GUI 로 보내는 Event
  214. /// </summary>
  215. /// <param name="args"></param>
  216. public void GUIMessageEventPublish(GUIMessageEventArgs args)
  217. {
  218. this.eventAggregator.GetEvent<GUIMessagePubSubEvent>().Publish(args);
  219. }
  220. public void Dispose()
  221. {
  222. this.scheduler.Dispose();
  223. this.autoManager.Dispose();
  224. this.hostManager.Dispose();
  225. this.vehicle.Dispose();
  226. (this.IO as IDisposable).Dispose(); //IO 는 마지막에 정리함.
  227. }
  228. public void RegisterTypes(IContainerRegistry containerRegistry)
  229. {
  230. if (!containerRegistry.IsRegistered<VCSystem>())
  231. containerRegistry.RegisterSingleton<VCSystem>();
  232. }
  233. public void OnInitialized(IContainerProvider containerProvider)
  234. {
  235. this.Init();
  236. }
  237. }
  238. }