private TimerInfo CreateTimerInfo(TalkScheduleItem talk, bool countUpByDefault) { return(new TimerInfo { TalkId = talk.Id, TalkTitle = talk.Name, MeetingSectionNameInternal = talk.MeetingSectionNameInternal, MeetingSectionNameLocalised = talk.MeetingSectionNameLocalised, OriginalDurationSecs = (int)talk.OriginalDuration.TotalSeconds, ModifiedDurationSecs = talk.ModifiedDuration == null ? null : (int?)talk.ModifiedDuration.Value.TotalSeconds, AdaptedDurationSecs = talk.AdaptedDuration == null ? null : (int?)talk.AdaptedDuration.Value.TotalSeconds, ActualDurationSecs = (int)talk.ActualDuration.TotalSeconds, UsesBell = talk.Bell, CompletedTimeSecs = talk.CompletedTimeSecs, CountUp = talk.CountUp ?? countUpByDefault }); }
private TimeSpan CalculateRemainingAdaptiveTime(TalkScheduleItem talk) { TimeSpan result = TimeSpan.Zero; var allItems = _scheduleService.GetTalkScheduleItems().Reverse(); foreach (var item in allItems) { if (item.AllowAdaptive) { result = result.Add(item.Duration); } if (item == talk) { break; } } return(result); }
/// <summary> /// Calculates the adapted talk duration for specified talk id /// </summary> /// <param name="itemId">Talk Id</param> /// <returns>Adapted time (or null if time is not adapted)</returns> public TimeSpan?CalculateAdaptedDuration(int itemId) { TalkScheduleItem talk = _scheduleService.GetTalkScheduleItem(itemId); if (talk != null) { EnsureMeetingStartTimeIsSet(talk); if (_meetingStartTimeUtc != null) { AdaptiveMode adaptiveMode = GetAdaptiveMode(); if (adaptiveMode != AdaptiveMode.None) { if (talk.AllowAdaptive) { var talkPlannedStartTime = CalculatePlannedStartTimeOfItem(talk); var talkActualStartTime = DateTime.UtcNow; var deviation = talkActualStartTime - talkPlannedStartTime; if (DeviationWithinRange(deviation)) { if (adaptiveMode == AdaptiveMode.TwoWay || talkPlannedStartTime < talkActualStartTime) { TimeSpan remainingAdaptiveTime = CalculateRemainingAdaptiveTime(talk); double fractionToApplyToThisTalk = talk.GetDurationSeconds() / remainingAdaptiveTime.TotalSeconds; double secondsToApply = deviation.TotalSeconds * fractionToApplyToThisTalk; return(talk.OriginalDuration.Subtract(TimeSpan.FromSeconds(secondsToApply))); } } } } } } return(null); }
public void TestOriginalDuration() { TimeSpan testDur = TimeSpan.FromMinutes(10); TimeSpan changedDur = TimeSpan.FromMinutes(20); TalkScheduleItem item = new TalkScheduleItem { OriginalDuration = testDur }; Assert.AreEqual(item.OriginalDuration, testDur); Assert.AreEqual(item.ActualDuration, testDur); Assert.IsNull(item.ModifiedDuration); Assert.IsNull(item.AdaptedDuration); Assert.IsTrue(item.GetDurationSeconds() == (int)testDur.TotalSeconds); item.ModifiedDuration = changedDur; Assert.AreEqual(item.OriginalDuration, testDur); Assert.AreEqual(item.ModifiedDuration, changedDur); Assert.IsTrue(item.GetDurationSeconds() == (int)changedDur.TotalSeconds); }
public void TestOriginalDuration() { var testDur = TimeSpan.FromMinutes(10); var changedDur = TimeSpan.FromMinutes(20); var item = new TalkScheduleItem(10000, "A Name", string.Empty, string.Empty) { OriginalDuration = testDur }; Assert.AreEqual(item.OriginalDuration, testDur); Assert.AreEqual(item.ActualDuration, testDur); Assert.IsNull(item.ModifiedDuration); Assert.IsNull(item.AdaptedDuration); Assert.IsTrue(item.GetPlannedDurationSeconds() == (int)testDur.TotalSeconds); item.ModifiedDuration = changedDur; Assert.AreEqual(item.OriginalDuration, testDur); Assert.AreEqual(item.ModifiedDuration, changedDur); Assert.IsTrue(item.GetPlannedDurationSeconds() == (int)changedDur.TotalSeconds); }
private TimeSpan CalculateRemainingAdaptiveTimerValues(TalkScheduleItem talk) { var result = TimeSpan.Zero; var started = false; foreach (var item in _scheduleService.GetTalkScheduleItems()) { if (item == talk) { started = true; } if (started) { if (item.AllowAdaptive) { result = result.Add(item.PlannedDuration); } } } return(result); }
private static TimeSpan GetTimeForChangeover(TalkScheduleItem item1, TalkScheduleItem item2) { var endItem1 = item1.StartOffsetIntoMeeting.Add(item1.OriginalDuration); return(item2.StartOffsetIntoMeeting - endItem1); }
public static DurationStringProperties Get(AdaptiveMode adaptiveMode, TalkScheduleItem talk) { var result = new DurationStringProperties(); if (talk != null) { result.Duration1String = TimeFormatter.FormatTimerDisplayString((int)talk.OriginalDuration.TotalSeconds); result.Duration1Tooltip = Properties.Resources.DURATION_ORIGINAL; if (talk.ModifiedDuration != null) { result.Duration2String = TimeFormatter.FormatTimerDisplayString((int)talk.ModifiedDuration.Value.TotalSeconds); result.Duration2Tooltip = Properties.Resources.DURATION_MODIFIED; var showAdaptedDuration = talk.AdaptedDuration != null && (adaptiveMode == AdaptiveMode.TwoWay || talk.AdaptedDuration.Value < talk.ModifiedDuration.Value); if (showAdaptedDuration) { result.Duration3String = TimeFormatter.FormatTimerDisplayString((int)talk.AdaptedDuration.Value.TotalSeconds); result.Duration3Tooltip = Properties.Resources.DURATION_ADAPTED; } else { result.Duration3String = string.Empty; } } else if (talk.AdaptedDuration != null) { result.Duration2String = TimeFormatter.FormatTimerDisplayString((int)talk.AdaptedDuration.Value.TotalSeconds); result.Duration2Tooltip = Properties.Resources.DURATION_ADAPTED; result.Duration3String = string.Empty; } else { result.Duration2String = string.Empty; result.Duration3String = string.Empty; } } else { result.Duration1String = string.Empty; result.Duration2String = string.Empty; result.Duration3String = string.Empty; } result.Duration1Colour = DurationDimBrush; result.Duration2Colour = DurationDimBrush; result.Duration3Colour = DurationDimBrush; if (!string.IsNullOrEmpty(result.Duration3String)) { result.Duration3Colour = DurationBrush; } else if (!string.IsNullOrEmpty(result.Duration2String)) { result.Duration2Colour = DurationBrush; } else { result.Duration1Colour = DurationBrush; } return(result); }