public ACSchedule(IACSchedule oldSchedule, DateTime startTime, DateTime endTime) { this.Id = oldSchedule.Id; this.StartTime = startTime; this.EndTime = endTime; this.ACSettingGuid = oldSchedule.ACSettingGuid; this.ScheduleType = oldSchedule.ScheduleType; }
private static bool CheckScheduleTimesValidity(IACSchedule schedule) { if (schedule.ScheduleType != ScheduleType.Single) { return(true); } return(schedule.StartTime > DateTime.Now && schedule.EndTime > DateTime.Now && schedule.StartTime < schedule.EndTime); }
private void DeregisterSchedule(IACSchedule schedule) { var dictEntry = SchedulesTimersDict.SingleOrDefault(x => x.Key.Equals(schedule)); var timerStart = dictEntry.Value.Item1; var timerStop = dictEntry.Value.Item2; SchedulesTimersDict.Remove(schedule); timerStart.Dispose(); timerStop.Dispose(); }
private bool CheckIfAddedScheduleOverlapsExisting(IACSchedule newSchedule) { var allSchedules = _scheduleRepository.GetAll(); var overlappingSchedules = allSchedules.Where(x => newSchedule.StartTime <= x.StartTime && newSchedule.EndTime >= x.EndTime || newSchedule.StartTime <= x.EndTime && newSchedule.EndTime >= x.StartTime || newSchedule.StartTime >= x.StartTime && newSchedule.EndTime <= x.EndTime || newSchedule.StartTime <= x.EndTime && newSchedule.EndTime >= x.EndTime).ToList(); return(overlappingSchedules.Any()); }
private void RegisterSchedule(IACSchedule schedule) { if (_currentAcDevice == null) { throw new CurrentACDeviceNotSetException(); } VerifySchedule(schedule); NormalizeDatesInSchedule(schedule); var acSetting = _currentAcDevice.AvailableSettings.Single(x => x.UniqueId.Equals(schedule.ACSettingGuid)); if (acSetting == null) { throw new ArgumentException("AcSetting with specified Guid does not exist!"); } var timerCallback = new TimerCallback(ChangeACSettings); TimeSpan period; object timerStartCallbackArg = acSetting; object timerStopCallbackArg = true; switch (schedule.ScheduleType) { case ScheduleType.Single: period = new TimeSpan(-1); break; case ScheduleType.EveryHour: period = new TimeSpan(1, 0, 0); break; case ScheduleType.EveryDay: period = new TimeSpan(24, 0, 0); break; case ScheduleType.EveryDayOfWeek: period = new TimeSpan(24, 0, 0); timerStartCallbackArg = (schedule, false); timerStopCallbackArg = (schedule, true); //day of week logic is implemented in ChangeACSetting method break; } var dueTime = schedule.StartTime - DateTime.Now; var timerStart = new Timer(timerCallback, timerStartCallbackArg, dueTime, period); var timerStop = new Timer(timerCallback, timerStopCallbackArg, schedule.EndTime - DateTime.Now, period); SchedulesTimersDict.Add(schedule, new Tuple <Timer, Timer>(timerStart, timerStop)); }
private void VerifySchedule(IACSchedule schedule) { if (schedule == null) { throw new ArgumentNullException(nameof(schedule)); } if (!CheckScheduleTimesValidity(schedule)) { throw new ArgumentException("ACSchedule have incorrect Start and/or End Times!"); } if (CheckIfAddedScheduleOverlapsExisting(schedule)) { throw new ArgumentException("Currently adding schedule overlaps some of existing schedules"); } }
private static void NormalizeDatesInSchedule(IACSchedule schedule) { DateTime newStartTime, newEndTime; switch (schedule.ScheduleType) { case ScheduleType.EveryHour: if (schedule.StartTime.Minute >= DateTime.Now.Minute) { newStartTime = DateTime.Today.AddHours(DateTime.Now.Hour).AddMinutes(schedule.StartTime.Minute); newEndTime = DateTime.Today.AddHours(DateTime.Now.Hour).AddMinutes(schedule.EndTime.Minute); } else { newStartTime = DateTime.Today.AddHours(DateTime.Now.Hour + 1).AddMinutes(schedule.StartTime.Minute); newEndTime = DateTime.Today.AddHours(DateTime.Now.Hour + 1).AddMinutes(schedule.EndTime.Minute); } break; case ScheduleType.EveryDayOfWeek: case ScheduleType.EveryDay: if (schedule.StartTime.Hour >= DateTime.Now.Hour) { newStartTime = DateTime.Today.AddHours(schedule.StartTime.Hour); newEndTime = DateTime.Today.AddHours(schedule.EndTime.Hour); } else { newStartTime = DateTime.Today.AddDays(1).AddHours(schedule.StartTime.Hour); newEndTime = DateTime.Today.AddDays(1).AddHours(schedule.EndTime.Hour); } break; default: return; } var newSchedule = new ACSchedule(schedule, newStartTime, newEndTime); schedule = newSchedule; }
public int AddNewSchedule(IACSchedule schedule) { RegisterSchedule(schedule); return(_scheduleRepository.Add(schedule)); }