Пример #1
0
 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;
 }
Пример #2
0
 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);
 }
Пример #3
0
        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();
        }
Пример #4
0
        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());
        }
Пример #5
0
        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));
        }
Пример #6
0
        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");
            }
        }
Пример #7
0
        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;
        }
Пример #8
0
 public int AddNewSchedule(IACSchedule schedule)
 {
     RegisterSchedule(schedule);
     return(_scheduleRepository.Add(schedule));
 }