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(); } } }