/// <summary> /// Use the timeline to determine if the user has "pushed" enough to indicate they want to try and click /// </summary> /// <param name="timeline"></param> /// <returns></returns> protected override bool IsFulfilled(ITimeline <IEmotivState> timeline) { var lastRecorded = timeline.Latest(); if (lastRecorded == null) { return(false); } IEnumerable <IEmotivState> dataSet = timeline[lastRecorded.Time - RefreshInterval, lastRecorded.Time].ToArray(); if (dataSet == null || dataSet.Count() == 0) { return(false); } float targetRate = ((float)dataSet.Where(s => s.Command == TargetCommand).Count()) / dataSet.Count(); if (targetRate >= ThreashHold) { return(true); } return(false); }
/// <summary> /// Calculate and trigger events based on calculation. /// <see cref="GetRate(IEnumerable{IEmotivState})"/> /// </summary> public override void Interpret() { IEmotivState lastRecorded = Timeline.Latest(); if (lastRecorded == null) { return; } IEnumerable <IEmotivState> dataSet = Timeline[lastRecorded.Time - Interval, lastRecorded.Time].ToArray(); if (dataSet == null || dataSet.Count() == 0) { return; } float targetRate = GetRate(dataSet); //Update slider if (Slider != null) { Slider.value = targetRate; } //Refresh if (targetRate >= RefreshThreshhold) { if (OnRefresh != null) { OnRefresh.Invoke(); } } //Click if (targetRate >= ClickThreshhold) { Timeline = new Timeline <IEmotivState>(); if (OnClick != null) { OnClick.Invoke(); } } }