/// <summary> /// A switch was activated. Figure out the context and execute the /// appropriate action. The input manager triggers this event. Every /// switch has an action that is configured in the swtichconfigmap file. /// The action is executed depending on the state of the animation player. /// </summary> /// <param name="sender">event sender</param> /// <param name="e">event args</param> private void actuatorManager_EvtSwitchActivated(object sender, ActuatorSwitchEventArgs e) { IActuatorSwitch switchObj = e.SwitchObj; try { if (_player == null || _currentPanel == null) { return; } Log.Debug("switch: " + switchObj.Name); Log.Debug(" Panel: " + _currentPanel.Name); if (_currentPanel.UIControl is System.Windows.Forms.Form) { bool visible = Windows.GetVisible(_currentPanel.UIControl); Log.Debug("Form: " + _currentPanel.UIControl.Name + ", playerState: " + _player.State + ", visible: " + visible); if (!visible) { return; } } // get the action associated with the switch PCode onTrigger = getOnTrigger(switchObj); if (onTrigger == null) { Log.Debug("OnTrigger is null. returning"); return; } Log.Debug("onTrigger.HasCode: " + onTrigger.HasCode()); // execute action if the player is in the right state. if (_player.State != PlayerState.Stopped && _player.State != PlayerState.Unknown && _player.State != PlayerState.Paused && onTrigger.HasCode()) { Log.Debug("Executing OnTrigger for panel..." + _currentPanel.Name); _interpreter.Execute(onTrigger); return; } if (_player.State == PlayerState.Timeout || _player.State == PlayerState.Interrupted) { Log.Debug("Calling player transition for firstanimation"); _player.Transition(_firstAnimation); return; } Log.Debug("PLayer state is " + _player.State); if (_player.State != PlayerState.Running) { Log.Debug(_currentPanel.Name + ": Player is not Running. Returning"); return; } playBeep(switchObj); AnimationWidget highlightedWidget = _player.HighlightedWidget; Animation currentAnimation = _player.CurrentAnimation; highlightedWidget = _switchDownHighlightedWidget; currentAnimation = _switchDownAnimation; if (highlightedWidget == null) { highlightedWidget = _switchAcceptedHighlightedWidget; currentAnimation = _switchAcceptedAnimation; } if (highlightedWidget == null) { highlightedWidget = _player.HighlightedWidget; currentAnimation = _player.CurrentAnimation; } resetSwitchEventStates(); if (currentAnimation != null && highlightedWidget != null) { setSwitchState(false); var widgetName = (highlightedWidget.UIWidget is IButtonWidget) ? "Button" : highlightedWidget.UIWidget.Name; AuditLog.Audit(new AuditEventUISwitchDetect(switchObj.Name, _currentPanel.Name, highlightedWidget.UIWidget.GetType().Name, widgetName)); Log.Debug(_currentPanel.Name + ": Switch on " + highlightedWidget.UIWidget.Name + " type: " + highlightedWidget.UIWidget.GetType().Name); // check if the widget has a onSelect code fragment. If so execute it. Otherwise // then check if the animation seq that this widget is a part of, has a onSelect. // If it does, execute that. PCode code; SetSelectedWidget(highlightedWidget.UIWidget); if (highlightedWidget.OnSelect.HasCode()) { code = highlightedWidget.OnSelect; _interpreter.Execute(code); } else if (currentAnimation.OnSelect.HasCode()) { code = currentAnimation.OnSelect; _interpreter.Execute(code); } } else { Log.Debug(_currentPanel.Name + ": No current animation or highlighed widget!!"); } } catch (Exception ex) { Log.Debug(ex.ToString()); } finally { setSwitchState(false); } }
/// <summary> /// This function is the heart beat of ACAT. All animations are handled in this /// event. It unhighlights the currenlty highlighted animation widget and /// highlights the next one in the sequence. If it has reached the end of the /// sequence, it wraps around and repeats the animation until the number of /// iterations has reached. /// </summary> /// <param name="sender">event sender</param> /// <param name="e">event args</param> private void timer_Elapsed(object sender, ElapsedEventArgs e) { if (_syncObj.Status == SyncLock.StatusValues.Closing || _syncObj.Status == SyncLock.StatusValues.Closed) { Log.Debug("Form is closing. Returning" + _rootWidget.UIControl.Name); return; } if (_inTimer) { Log.Debug("Timer is busy. returning"); return; } _inTimer = true; try { Log.Debug("Before tryEnter " + _rootWidget.UIControl.Name + ", threadid: " + GetCurrentThreadId()); if (!tryEnter(_transitionSync)) { Log.Debug("_transition sync will block returning"); return; } Log.Debug("After tryEnter" + _rootWidget.UIControl.Name + ", status: " + _syncObj.Status); if (_syncObj.Status == SyncLock.StatusValues.Closing || _syncObj.Status == SyncLock.StatusValues.Closed) { Log.Debug("Form is closing. Returning" + _rootWidget.UIControl.Name); return; } check(); Log.Debug("CurrentAnimation: " + _currentAnimation.Name + ". Count: " + _currentAnimation.AnimationWidgetList.Count + ". currentWidgetIndex: " + _currentWidgetIndex); if (animatedWidgetCount() == 0) { Log.Debug("No widgets to animate."); _interpreter.Execute(_currentAnimation.OnEnd); return; } check(); var animationWidget = _currentAnimation.AnimationWidgetList[_currentWidgetIndex]; Log.Debug(_rootWidget.UIControl.Name + ", status: " + _syncObj.Status); // if any switch is currently engaged, keep the current widget // highlighted until the user releases the switch //if (ActuatorManager.Instance.IsSwitchActive()) if (IsSwitchActive) { Log.Debug("Some switch is active. Will try again"); return; } // if there is code associated with an onEnter, execute that if (_currentAnimation.OnEnterExecutionNotDone && _currentAnimation.OnEnter != null) { _interpreter.Execute(_currentAnimation.OnEnter); _currentAnimation.OnEnterExecutionNotDone = false; } check(); Log.Debug(_rootWidget.UIControl.Name + ", status: " + _syncObj.Status); // we have reached the end of the iteration. Turn off // the widget that was last highlighed and stop the // animation sequence if (_lastIteration) { _lastIteration = false; Widget selectedWidget = (_highlightedWidget != null && _highlightedWidget.UIWidget != null) ? _highlightedWidget.UIWidget.Parent : null; _rootWidget.HighlightOff(); if (animationWidget.OnHighlightOff.HasCode()) { _interpreter.Execute(animationWidget.OnHighlightOff); } if (_currentAnimation.IsFirst) { setPlayerState(PlayerState.Timeout); } if (_timer != null) { _timer.Stop(); } else { Log.Debug("Timer is null. returning"); return; } check(); AuditLog.Audit(new AuditEventAnimationEnd( _rootWidget.Name, (selectedWidget != null) ? selectedWidget.Name : string.Empty, (selectedWidget != null) ? selectedWidget.GetType().Name : string.Empty, _currentAnimation.Name)); // is there an onEnd code that we have to execute _interpreter.Execute(_currentAnimation.OnEnd); return; } check(); if (_highlightedWidget != null && _highlightedWidget != animationWidget) { Log.Debug(string.Format("Animation: {0}. Turning off . name = {1}. Count: {2}", _currentAnimation.Name, _highlightedWidget.UIWidget.Name, _currentAnimation.AnimationWidgetList.Count)); check(); _highlightedWidget.UIWidget.HighlightOff(); check(); if (_highlightedWidget.OnHighlightOff.HasCode()) { _interpreter.Execute(_highlightedWidget.OnHighlightOff); } } check(); // now turn the highlight on on the next widget in the sequence animationWidget = _currentAnimation.AnimationWidgetList[_currentWidgetIndex]; Log.Debug("Animation: " + _currentAnimation.Name + ". Turning on " + _currentWidgetIndex + ". name = " + animationWidget.UIWidget.Name); check(); animationWidget.UIWidget.HighlightOn(); _highlightedWidget = animationWidget; // calculate how long to wait before triggering the // next timer event. (this is how long the highlighted // widget will stay highlighted) int hesitateTime = animationWidget.HesitateTime; check(); if (hesitateTime == 0 && isFirstAnimatedWidget(_currentWidgetIndex)) { hesitateTime = _currentAnimation.HesitateTime; } if (_timer != null) { _timer.Interval = _currentAnimation.SteppingTime + hesitateTime; } else { Log.Debug("timer is null. returning"); return; } check(); if (animationWidget.OnHighlightOn.HasCode()) { _interpreter.Execute(animationWidget.OnHighlightOn); } check(); int nextIndex = getNextAnimatedWidget(_currentWidgetIndex); // if we have reached the end of the animation sequence, wrap around if (nextIndex < 0) { _iterationCount++; int iterations = CoreGlobals.AppPreferences.ResolveVariableInt(_currentAnimation.Iterations, 1, 1); if (iterations >= 0 && _iterationCount >= iterations) { _lastIteration = true; return; } _currentWidgetIndex = getFirstAnimatedWidget(); } else { _currentWidgetIndex = nextIndex; } } catch (Exception ex) { Log.Debug("AnimationPlayerexception " + ex); } finally { Log.Debug("Before release " + _rootWidget.UIControl.Name); release(_transitionSync); Log.Debug("After release " + _rootWidget.UIControl.Name); Log.Debug("Setting intimer to false " + _rootWidget.UIControl.Name); _inTimer = false; Log.Debug("Exiting timer " + _rootWidget.UIControl.Name); } }