1 
2 //
3 // Copyright (c) 2010-2023 Antmicro
4 //
5 // This file is licensed under the MIT License.
6 // Full license text is available in 'licenses/MIT.txt'.
7 //
8 using System;
9 
10 namespace Antmicro.Renode.Peripherals.Timers
11 {
12     public class DateTimeWithCustomWeekday
13     {
FromDateTime(DateTime dt)14         public static DateTimeWithCustomWeekday FromDateTime(DateTime dt)
15         {
16             return new DateTimeWithCustomWeekday
17             {
18                 currentTime = dt
19             };
20         }
21 
AddSeconds(int s)22         public void AddSeconds(int s)
23         {
24             currentTime = currentTime.AddSeconds(s);
25         }
26 
27         public int Second
28         {
29             get => currentTime.Second;
30             set
31             {
32                 if(value < 0  || value > 59)
33                 {
34                     throw new ArgumentException($"Seconds value out of range: {value}");
35                 }
36 
37                 currentTime = new DateTime(Year, Month, Day, Hour, Minute, value);
38             }
39         }
40 
41         public int Minute
42         {
43             get => currentTime.Minute;
44             set
45             {
46                 if(value < 0  || value > 59)
47                 {
48                     throw new ArgumentException($"Minutes value out of range: {value}");
49                 }
50 
51                 currentTime = new DateTime(Year, Month, Day, Hour, value, Second);
52             }
53         }
54 
55         public int Hour
56         {
57             get => currentTime.Hour;
58             set
59             {
60                 if(value < 0  || value > 23)
61                 {
62                     throw new ArgumentException($"Hours value out of range: {value}");
63                 }
64 
65                 currentTime = new DateTime(Year, Month, Day, value, Minute, Second);
66             }
67         }
68 
69         public int Day
70         {
71             get => currentTime.Day;
72             set
73             {
74                 if(value < 1  || value > 31)
75                 {
76                     throw new ArgumentException($"Day value out of range: {value}");
77                 }
78 
79                 currentTime = new DateTime(Year, Month, value, Hour, Minute, Second);
80                 UpdateWeekdayOffset();
81             }
82         }
83 
84         public int Month
85         {
86             get => currentTime.Month;
87             set
88             {
89                 if(value < 1  || value > 12)
90                 {
91                     throw new ArgumentException($"Month value out of range: {value}");
92                 }
93 
94                 currentTime = new DateTime(Year, value, Day, Hour, Minute, Second);
95                 UpdateWeekdayOffset();
96             }
97         }
98 
99         public int Year
100         {
101             get => currentTime.Year;
102             set
103             {
104                 currentTime = new DateTime(value, Month, Day, Hour, Minute, Second);
105                 UpdateWeekdayOffset();
106             }
107         }
108 
109         public DayOfWeek Weekday
110         {
111             get
112             {
113                 return currentTime.DayOfWeek - weekdayOffset;
114             }
115             set
116             {
117                 currentWeekday = value;
118                 UpdateWeekdayOffset();
119             }
120         }
121 
UpdateWeekdayOffset()122         private void UpdateWeekdayOffset()
123         {
124             weekdayOffset = currentTime.DayOfWeek - currentWeekday;
125         }
126 
127         private int weekdayOffset;
128         private DayOfWeek currentWeekday;
129         private DateTime currentTime;
130     }
131 }
132