VCSystem.cs 8.7 KB

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