private void Retry(TransportOperationMachine startingPoint) { LogService.Log(LogType.System, LogMessageType.Debug, GetType().Name, string.Format(CultureInfo.InvariantCulture, "Retrying Tray move at '{0}'.", startingPoint.Station.Name)); NumberOfRetries--; // Dispose of the old machines. DisposeSubmachines(); // Create new first machine to execute. InitializeSubmachine(startingPoint.Operation); // Restart execution of whichever machine died, but don't raise the Started event. switch (startingPoint.Operation) { case TransportOperation.BeginPickup: BeginPickupMachine.Execute(); break; case TransportOperation.CompletePickup: CompletePickupMachine.Execute(); break; case TransportOperation.BeginDropoff: BeginDropoffMachine.Execute(); break; case TransportOperation.CompleteDropoff: CompleteDropoffMachine.Execute(); break; } }
/// <summary> /// Initialize one of the four transport operation machine types. Both Pick-up machines have /// CanStop turned off because there are no circumstances where a Pick-up operation can be /// stopped, even though the TrayMover as a whole can be stopped during pick-up. Both /// Drop-off machines have CanStop turned on initially so that either drop-off operation can /// be stopped. If this TrayMover has already been stopped, then this will also /// stop a newly constructed CompleteDropoff machine before returning it. /// </summary> /// <param name="startingType"></param> /// <returns>TransportOperationMachine</returns> protected TransportOperationMachine InitializeSubmachine(TransportOperation startingType) { TransportOperationMachine initialized = null; lock (_subMachineLock) { switch (startingType) { case TransportOperation.BeginPickup: BeginPickupMachine = CreateSubmachine("BeginTrayPickup", BeginPickupBuilder, _beginPickupConfig); initialized = BeginPickupMachine; break; case TransportOperation.CompletePickup: CompletePickupMachine = CreateSubmachine("CompleteTrayPickup", CompletePickupBuilder, _completePickupConfig); initialized = CompletePickupMachine; break; case TransportOperation.BeginDropoff: BeginDropoffMachine = CreateSubmachine("BeginTrayDropoff", BeginDropoffBuilder, _beginDropoffConfig); BeginDropoffMachine.CanStop = true; initialized = BeginDropoffMachine; break; case TransportOperation.CompleteDropoff: CompleteDropoffMachine = CreateSubmachine("CompleteTrayDropoff", CompleteDropoffBuilder, _completeDropoffConfig); CompleteDropoffMachine.CanStop = true; // CompleteDropoff needs to know if the mover was already stopped if (IsStopped) { CompleteDropoffMachine.Stop(); } initialized = CompleteDropoffMachine; break; } } return(initialized); }