ConveyorControlViewModel.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. using GSG.NET.Extensions;
  2. using OHV.Common.Events;
  3. using OHV.Common.Shareds;
  4. using Prism.Commands;
  5. using Prism.Events;
  6. using Prism.Mvvm;
  7. using Prism.Services.Dialogs;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Linq;
  11. using System.Text;
  12. using System.Threading.Tasks;
  13. using System.Windows.Input;
  14. using VehicleControlSystem.ControlLayer.IO;
  15. using static OHV.Common.Events.AxisControlEventArgs;
  16. namespace OHV.Module.Interactivity.PopUp
  17. {
  18. public class ConveyorControlViewModel : BindableBase, IDialogAware
  19. {
  20. private DelegateCommand<string> _closeDialogCommand;
  21. public DelegateCommand<string> CloseDialogCommand =>
  22. _closeDialogCommand ?? ( _closeDialogCommand = new DelegateCommand<string>( CloseDialog ) );
  23. public event Action<IDialogResult> RequestClose;
  24. private string _title = "ConveyorControlView";
  25. public string Title
  26. {
  27. get { return this._title; }
  28. set
  29. {
  30. this.SetProperty( ref this._title , value );
  31. }
  32. }
  33. public ICommand ConveyorRunCommand { get; set; }
  34. public ICommand PosMoveCommand { get; set; }
  35. IEventAggregator eventAggregator;
  36. MessageController messageController;
  37. List<BitBlock> allIOList = new List<BitBlock>();
  38. public ConveyorControlViewModel( IEventAggregator _ea , MessageController _msg)
  39. {
  40. this.eventAggregator = _ea;
  41. /*IO Publish Event*/
  42. //this.eventAggregator.GetEvent<IOControlPubSubEvent>().Unsubscribe( UICallbackCommunivation );
  43. //this.eventAggregator.GetEvent<IOControlPubSubEvent>().Subscribe( UICallbackCommunivation , ThreadOption.UIThread );
  44. /*Lock&UnLock Publish Event*/
  45. this.eventAggregator.GetEvent<AxisControlPubSubEvent>().Unsubscribe( AxisUICallbackCommunication );
  46. this.eventAggregator.GetEvent<AxisControlPubSubEvent>().Subscribe( AxisUICallbackCommunication , ThreadOption.UIThread );
  47. /*GUI Pubsub Event*/
  48. this.eventAggregator.GetEvent<GUIMessagePubSubEvent>().Unsubscribe( UICallbackCommunication );
  49. this.eventAggregator.GetEvent<GUIMessagePubSubEvent>().Subscribe( UICallbackCommunication, ThreadOption.UIThread );
  50. this.messageController = _msg;
  51. this.ConveyorRunCommand = new DelegateCommand<object>( ExecuteCvCommand );
  52. this.PosMoveCommand = new DelegateCommand<object>( ExecutePosMoveCommand );
  53. }
  54. private void UICallbackCommunication( GUIMessageEventArgs _args )
  55. {
  56. //TODO:[20/03/20 ys-hwang] Conveyor 에서 Vehicle 상태를 쓸 항목이 있으런지? 쓴다면 State만??
  57. if( _args.Kind == GUIMessageEventArgs.eGUIMessageKind.ModelPropertyChange)
  58. {
  59. if( _args.MessageKey.Equals(MessageKey.Vehicle))
  60. {
  61. switch(_args.ModelPropertyName)
  62. {
  63. case "ObstacleStateProperty":
  64. {
  65. var reply = CastTo<eObstacleState>.From<object>( _args.Args );
  66. this.ChangeObstacleState( reply );
  67. }
  68. break;
  69. }
  70. }
  71. }
  72. switch ( _args.Kind )
  73. {
  74. case GUIMessageEventArgs.eGUIMessageKind.ModelPropertyChange:
  75. break;
  76. case GUIMessageEventArgs.eGUIMessageKind.RspIOObject:
  77. break;
  78. case GUIMessageEventArgs.eGUIMessageKind.RspIOMapList:
  79. break;
  80. case GUIMessageEventArgs.eGUIMessageKind.RspCommandList:
  81. break;
  82. case GUIMessageEventArgs.eGUIMessageKind.RspAutoModeChange:
  83. break;
  84. case GUIMessageEventArgs.eGUIMessageKind.RspManualModeChange:
  85. break;
  86. case GUIMessageEventArgs.eGUIMessageKind.RspAlarmReset:
  87. break;
  88. case GUIMessageEventArgs.eGUIMessageKind.RspVehicleModeChange:
  89. break;
  90. case GUIMessageEventArgs.eGUIMessageKind.RspEStop:
  91. break;
  92. case GUIMessageEventArgs.eGUIMessageKind.RspVihicleState:
  93. break;
  94. }
  95. }
  96. private void ChangeObstacleState( eObstacleState _reply )
  97. {
  98. }
  99. private void ExecutePosMoveCommand( object obj )
  100. {
  101. this.messageController.ShowConfirmationPopupView( "Carrier Move To ?" , r =>
  102. {
  103. if ( r.Result == ButtonResult.OK )
  104. {
  105. var selectedPos = obj.ToString();
  106. var msg = new AxisControlEventArgs
  107. {
  108. Dir = AxisControlEventArgs.eEventDir.ToBack ,
  109. Kind = AxisControlEventArgs.eAxisControlKind.Move ,
  110. };
  111. switch ( selectedPos )
  112. {
  113. case "Lock":
  114. msg.PosDir = AxisControlEventArgs.ePosDir.Lock;
  115. break;
  116. case "UnLock":
  117. msg.PosDir = AxisControlEventArgs.ePosDir.UnLock;
  118. break;
  119. }
  120. this.AxisPublishEvent( msg );
  121. }
  122. } );
  123. }
  124. private void AxisPublishEvent( AxisControlEventArgs msg )
  125. {
  126. this.eventAggregator.GetEvent<AxisControlPubSubEvent>().Publish( msg );
  127. }
  128. private void AxisUICallbackCommunication( AxisControlEventArgs _args )
  129. {
  130. if ( _args.Dir == AxisControlEventArgs.eEventDir.ToFront )
  131. {
  132. switch ( _args.Kind )
  133. {
  134. case AxisControlEventArgs.eAxisControlKind.NONE:
  135. break;
  136. case AxisControlEventArgs.eAxisControlKind.OriginReturn:
  137. break;
  138. case AxisControlEventArgs.eAxisControlKind.Stop:
  139. break;
  140. case AxisControlEventArgs.eAxisControlKind.EStop:
  141. break;
  142. case AxisControlEventArgs.eAxisControlKind.Move:
  143. //Sync Move Success Return
  144. break;
  145. case AxisControlEventArgs.eAxisControlKind.Jog:
  146. break;
  147. case AxisControlEventArgs.eAxisControlKind.ServoOn:
  148. break;
  149. case AxisControlEventArgs.eAxisControlKind.ServoOff:
  150. break;
  151. case AxisControlEventArgs.eAxisControlKind.ReqCurrentPosition:
  152. break;
  153. case AxisControlEventArgs.eAxisControlKind.ReqStopCurrentPosition:
  154. break;
  155. case AxisControlEventArgs.eAxisControlKind.FaultReset:
  156. break;
  157. case AxisControlEventArgs.eAxisControlKind.AxisState:
  158. AxisState( _args );
  159. break;
  160. }
  161. }
  162. }
  163. private void AxisState( AxisControlEventArgs args )
  164. {
  165. var left = args.Args[ "Left" ] as AxisState;
  166. var right = args.Args[ "Right" ] as AxisState;
  167. //this.IsLeftServoOn = left.IsServoOn;
  168. //this.IsLeftServoOriginReturn = left.IsOriginReturn;
  169. //this.IsLeftServoFault = left.IsAmpFault;
  170. //this.CurrentLockLeft = left.CurrentPosition;
  171. //this.IsRightServoOn = right.IsServoOn;
  172. //this.IsRightServoOriginReturn = right.IsOriginReturn;
  173. //this.IsRightServoFault = right.IsAmpFault;
  174. //this.CurrentLockRight = right.CurrentPosition;
  175. }
  176. private void UICallbackCommunivation( IOControlEventArgs _args )
  177. {
  178. if ( _args.EventDir == IOControlEventArgs.eEventDir.ToBack )
  179. {
  180. switch ( _args.ControlKind )
  181. {
  182. case IOControlEventArgs.eControlKind.USE:
  183. break;
  184. case IOControlEventArgs.eControlKind.ON:
  185. break;
  186. case IOControlEventArgs.eControlKind.OFF:
  187. break;
  188. case IOControlEventArgs.eControlKind.STATE:
  189. break;
  190. }
  191. }
  192. }
  193. private void ExecuteCvCommand( object _obj )
  194. {
  195. var type = _obj.ToString();
  196. var order = string.Empty;
  197. switch(type)
  198. {
  199. case "CW":
  200. order = "OUT_CV_CWCCW";
  201. break;
  202. case "CCW":
  203. order = "OUT_CV_CWCCW";
  204. break;
  205. case "STOP":
  206. order = "STOP";
  207. break;
  208. }
  209. var msg = new IOControlEventArgs
  210. {
  211. EventDir = IOControlEventArgs.eEventDir.ToBack,
  212. OutPutTag = order.ToString()
  213. };
  214. this.PublishEvent( msg );
  215. }
  216. private void PublishEvent( IOControlEventArgs _args )
  217. {
  218. this.eventAggregator.GetEvent<IOControlPubSubEvent>().Publish( _args );
  219. }
  220. #region Dialog
  221. public bool CanCloseDialog( )
  222. {
  223. return true;
  224. }
  225. public void OnDialogClosed( )
  226. {
  227. this.eventAggregator.GetEvent<IOControlPubSubEvent>().Publish( new IOControlEventArgs { EventDir = IOControlEventArgs.eEventDir.ToBack } );
  228. this.eventAggregator.GetEvent<IOControlPubSubEvent>().Unsubscribe( UICallbackCommunivation );
  229. //TODO:[03-14 ys-hwang] - Closed 해제 처리해줄때 Kind == OriginReturn 값이 들어와버림 그래서 NONE 생성
  230. this.eventAggregator.GetEvent<AxisControlPubSubEvent>().Publish( new AxisControlEventArgs
  231. {
  232. Dir = AxisControlEventArgs.eEventDir.ToBack,
  233. Kind = AxisControlEventArgs.eAxisControlKind.NONE
  234. } );
  235. this.eventAggregator.GetEvent<AxisControlPubSubEvent>().Unsubscribe( AxisUICallbackCommunication );
  236. }
  237. public void OnDialogOpened( IDialogParameters parameters )
  238. {
  239. /*IO*/
  240. var ioMsg = new IOControlEventArgs
  241. {
  242. EventDir = IOControlEventArgs.eEventDir.ToBack ,
  243. ControlKind = IOControlEventArgs.eControlKind.STATE
  244. };
  245. this.PublishEvent( ioMsg );
  246. this.eventAggregator.GetEvent<IOControlPubSubEvent>().Publish( new IOControlEventArgs { EventDir = IOControlEventArgs.eEventDir.ToBack } );
  247. /*Lock Axis*/
  248. var axisMsg = new AxisControlEventArgs
  249. {
  250. Dir = AxisControlEventArgs.eEventDir.ToBack ,
  251. Kind = AxisControlEventArgs.eAxisControlKind.NONE
  252. };
  253. this.AxisPublishEvent(axisMsg);
  254. this.eventAggregator.GetEvent<AxisControlPubSubEvent>().Publish( new AxisControlEventArgs { Dir = AxisControlEventArgs.eEventDir.ToBack , Kind = AxisControlEventArgs.eAxisControlKind.NONE } );
  255. }
  256. private void CloseDialog( string parameter )
  257. {
  258. ButtonResult result = ButtonResult.None;
  259. if ( parameter?.ToLower() == "true" )
  260. result = ButtonResult.OK;
  261. else if ( parameter?.ToLower() == "false" )
  262. result = ButtonResult.Cancel;
  263. RaiseRequestClose( new DialogResult( result ) );
  264. }
  265. public virtual void RaiseRequestClose( IDialogResult dialogResult )
  266. {
  267. RequestClose?.Invoke( dialogResult );
  268. }
  269. #endregion
  270. }
  271. }