Esempio n. 1
0
        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");
                }
            }
        }
Esempio n. 2
0
        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();
            }
        }
Esempio n. 3
0
        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();
                }
            }
        }
Esempio n. 4
0
        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();
                }
            }
        }
Esempio n. 6
0
        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);
                }
            }
        }
Esempio n. 7
0
        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();
        }