void ServiceResetActivity() { using (var eeLog = new Logging.EnterExitTrace(Log)) { // clear the enable auto load and enable auto unload values if (enableAutoLoadIVA.Update().VC.GetValue <bool>(false)) { enableAutoLoadIVA.Set(false); } if (enableAutoUnloadIVA.Update().VC.GetValue <bool>(false)) { enableAutoUnloadIVA.Set(false); } IValueAccessor a2pPinsStateIVA = SelectedActiveToPassivePinsStateIVA; IValueAccessor p2aPinsStateIVA = SelectedPassiveToActivePinsStateIVA; IActiveToPassivePinsState a2pPinsState = new ActiveToPassivePinsState(a2pPinsStateIVA.Update().VC); IPassiveToActivePinsState p2aPinsState = new PassiveToActivePinsState(p2aPinsStateIVA.Update().VC); if (!a2pPinsState.IsIdle) { lastSetA2PPins = new ActiveToPassivePinsState(); lastSetA2PPins.IFaceName = PartID; lastSetA2PPins.XferILock = true; a2pPinsStateIVA.Set(lastSetA2PPins as IActiveToPassivePinsState); } if (config.GetConfigKeyAccessOnce("E84Sim.ResetForcesESandHO").GetValue <bool>(false) && !p2aPinsState.IsSelectable) { p2aPinsStateIVA.Set(new PassiveToActivePinsState(p2aPinsState) { ES = true, HO_AVBL = true } as IPassiveToActivePinsState); } Spin(TimeSpan.FromSeconds(0.5)); a2pPinsState = new ActiveToPassivePinsState(a2pPinsStateIVA.Update().VC); p2aPinsState = new PassiveToActivePinsState(p2aPinsStateIVA.Update().VC); if (!p2aPinsState.IsSelectable) { SetCurrentActivity(ActivitySelect.WaitForPinsReady, Utils.Fcns.CheckedFormat("Reset complete with E84 P->A pins not selectable [{0}]", p2aPinsState)); } else if (!a2pPinsState.IsIdle) { SetCurrentActivity(ActivitySelect.WaitForPinsReady, Utils.Fcns.CheckedFormat("Reset complete with E84 A->P pins not idle [{0}]", a2pPinsState)); } else { SetCurrentActivity(ActivitySelect.Ready, "Reset complete and Ready for select"); } } }
void ServiceReadyActivity() { IValueAccessor a2pPinsStateIVA = SelectedActiveToPassivePinsStateIVA; IValueAccessor p2aPinsStateIVA = SelectedPassiveToActivePinsStateIVA; IActiveToPassivePinsState a2pPinsState = new ActiveToPassivePinsState(a2pPinsStateIVA.Update().VC); IPassiveToActivePinsState p2aPinsState = new PassiveToActivePinsState(p2aPinsStateIVA.Update().VC); if (!a2pPinsState.IsIdle) { SetCurrentActivity(ActivitySelect.WaitForPinsReady, Utils.Fcns.CheckedFormat("A2P pins are no longer idle [{0}]", a2pPinsState)); return; } if (!p2aPinsState.IsSelectable) { SetCurrentActivity(ActivitySelect.WaitForPinsReady, Utils.Fcns.CheckedFormat("P2A pins are no longer selectable [{0}]", p2aPinsState)); return; } // interface is idle and is selectable. detect auto trigger conditions and automatically request next transition accordingly. UpdateReadyToLoadAndUnload(false, true); if (nextActivitySelect == ActivitySelect.None) { PresentPlaced presentPlacedInput = lpmPresentPlacedInputIVA.Update().VC.GetValue <PresentPlaced>(false); if (presentPlacedInput.IsNeitherPresentNorPlaced() && enableAutoLoadIVA.Update().VC.GetValue <bool>(false)) { if (loadUnloadStartHoldoffTimer.StartIfNeeded(configValues.LoadUnloadStartHoldoff).IsTriggered) { nextActivitySelect = ActivitySelect.PerformLoad; loadUnloadStartHoldoffTimer.Stop(); } } else if (presentPlacedInput.IsProperlyPlaced() && enableAutoUnloadIVA.Update().VC.GetValue <bool>(false)) { if (loadUnloadStartHoldoffTimer.StartIfNeeded(configValues.LoadUnloadStartHoldoff).IsTriggered) { nextActivitySelect = ActivitySelect.PerformUnload; loadUnloadStartHoldoffTimer.Stop(); } } else { loadUnloadStartHoldoffTimer.StopIfNeeded(); } } else { loadUnloadStartHoldoffTimer.StopIfNeeded(); } }
void UpdateReadyToLoadAndUnload(bool forceUpdate, bool publishIfNeeded) { PresentPlaced presentPlacedInput = lpmPresentPlacedInputIVA.Update().VC.GetValue <PresentPlaced>(false); if (lastPresentPlacedInput != presentPlacedInput || forceUpdate) { var isReady = privateState.NotReadyReason.IsNullOrEmpty(); var isReadyToLoad = isReady && presentPlacedInput.IsNeitherPresentNorPlaced(); var isReadyToUnload = isReady && presentPlacedInput.IsProperlyPlaced(); privateState.NotReadyToLoadReason = isReadyToLoad ? "" : (isReady ? "Must be Empty: {0}".CheckedFormat(presentPlacedInput) : privateState.NotReadyReason); privateState.NotReadyToUnloadReason = isReadyToUnload ? "" : (isReady ? "Must be properly placed: {0}".CheckedFormat(presentPlacedInput) : privateState.NotReadyReason); lastPresentPlacedInput = presentPlacedInput; if (publishIfNeeded) { PublishPrivateState(); } } }
void ServiceWaitForPinsReadyActivity() { IValueAccessor a2pPinsStateIVA = SelectedActiveToPassivePinsStateIVA; IValueAccessor p2aPinsStateIVA = SelectedPassiveToActivePinsStateIVA; IActiveToPassivePinsState a2pPinsState = new ActiveToPassivePinsState(a2pPinsStateIVA.Update().VC); IPassiveToActivePinsState p2aPinsState = new PassiveToActivePinsState(p2aPinsStateIVA.Update().VC); if (!a2pPinsState.IsIdle) { privateState.TransferProgressStr = Utils.Fcns.CheckedFormat("Wait A2P Idle: {0}", a2pPinsState); } else if (!p2aPinsState.IsSelectable) { privateState.TransferProgressStr = Utils.Fcns.CheckedFormat("Wait P2A Selectable: {0}", p2aPinsState); } else { SetCurrentActivity(ActivitySelect.Ready, "A2P pins are selectable now"); } }
protected override void PerformMainLoopService() { base.PerformMainLoopService(); if (configAccessAdapter.IsUpdateNeeded) { configAccessAdapter.Update(); privateState.Config.IDSize = configAccessAdapter.ValueSet.IDSize; privateState.Config.IDStartOffset = configAccessAdapter.ValueSet.IDStartOffset; privateState.Config.Mode = configAccessAdapter.ValueSet.Mode; privateState.UpdateCounterPostfix(); PublishPrivateState(); } if (counterIsEnabledIVA.IsUpdateNeeded || tagIsPresentIVA.IsUpdateNeeded) { privateState.CounterIsEnabled = counterIsEnabledIVA.Update().VC.GetValue <bool>(false); privateState.TagIsPresent = tagIsPresentIVA.Update().VC.GetValue <bool>(false); PublishPrivateState(); } if (isOnlineIVA.IsUpdateNeeded) { if (isOnlineIVA.Update().VC.GetValue <bool>(false)) { PerformGoOnlineAction(false); } else { PerformGoOfflineAction(); } } }
bool WaitForP2ATransition(ref PassiveToActivePinBits trackBits, PassiveToActivePinBits waitForBits, PassiveToActivePinBits deltaPinsMask) { IValueAccessor p2aPinsStateIVA = SelectedPassiveToActivePinsStateIVA; PassiveToActivePinBits fixedPinsMask = PassiveToActivePinBits.PinsBitMask & ~deltaPinsMask; for (; ;) { IPassiveToActivePinsState p2aPinsState = new PassiveToActivePinsState(p2aPinsStateIVA.Update().VC); PassiveToActivePinBits packedWord = p2aPinsState.PackedWord; if (packedWord == waitForBits) { trackBits = packedWord; return(true); } if ((packedWord & fixedPinsMask) != (trackBits & fixedPinsMask)) { SetCurrentActivity(ActivitySelect.WaitForPinsReady, Utils.Fcns.CheckedFormat("{0}[{1}] failed: unexpected P2A pins transition to {2}", currentActivity, privateState.TransferProgressStr, p2aPinsState)); return(false); } if (!Spin()) { return(false); } } }
void SetCurrentActivity(ActivitySelect activity, string reason) { ActivitySelect entryActivity = currentActivity; Log.Debug.Emit("SetCurrentActivity changing activity to:{0} [from:{1}, reason:'{2}']", activity, currentActivity, reason); currentActivity = activity; privateState.StateStr = (Utils.Fcns.CheckedFormat("{0} [{1}]", activity, reason)); privateState.IsCycling = (enableAutoLoadIVA.Update().VC.GetValue <bool>(false) && enableAutoUnloadIVA.Update().VC.GetValue <bool>(false)); privateState.NotReadyReason = ((currentActivity == ActivitySelect.Ready) ? "" : currentActivity.ToString()); UpdateReadyToLoadAndUnload(true, false); if (entryActivity != currentActivity) { privateState.TransferProgressStr = String.Empty; if (!privateState.IsCycling) { privateState.TransferCount = 0; } } bool busy = false; switch (currentActivity) { case ActivitySelect.PerformLoad: case ActivitySelect.PerformUnload: case ActivitySelect.Reset: busy = true; break; default: break; } // update PrivateBaseState now. if (currentActivity == ActivitySelect.Offline) { if (!PrivateBaseState.IsOnline) { if (entryActivity == ActivitySelect.Ready || entryActivity == ActivitySelect.None) { SetBaseState(UseState.Offline, reason, true); } else { SetBaseState(UseState.FailedToOffline, reason, true); } } } else if (!PrivateBaseState.IsOnline) { SetBaseState(UseState.OnlineBusy, reason, true); } else if (!PrivateBaseState.IsBusy && busy) { SetBaseState(UseState.OnlineBusy, reason, true); } else if (PrivateBaseState.IsBusy && !busy) { SetBaseState(UseState.Online, reason, true); } PublishPrivateState(); }