Create data structures for a calendar page view.
CalendarPage.cpp@0:a3fc9e34ea9c, 2018-04-22 (annotated)
- Committer:
- WiredHome
- Date:
- Sun Apr 22 19:56:03 2018 +0000
- Revision:
- 0:a3fc9e34ea9c
Integrate CalendarPage into TimeInterface
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
WiredHome | 0:a3fc9e34ea9c | 1 | |
WiredHome | 0:a3fc9e34ea9c | 2 | |
WiredHome | 0:a3fc9e34ea9c | 3 | #include "CalendarPage.h" |
WiredHome | 0:a3fc9e34ea9c | 4 | |
WiredHome | 0:a3fc9e34ea9c | 5 | |
WiredHome | 0:a3fc9e34ea9c | 6 | CalendarPage::CalendarPage(uint8_t Month, uint16_t Year) { |
WiredHome | 0:a3fc9e34ea9c | 7 | month = Month; |
WiredHome | 0:a3fc9e34ea9c | 8 | year = Year; |
WiredHome | 0:a3fc9e34ea9c | 9 | verbose = false; |
WiredHome | 0:a3fc9e34ea9c | 10 | Compute(month, year); |
WiredHome | 0:a3fc9e34ea9c | 11 | } |
WiredHome | 0:a3fc9e34ea9c | 12 | |
WiredHome | 0:a3fc9e34ea9c | 13 | |
WiredHome | 0:a3fc9e34ea9c | 14 | // 37 Elements with Array index 0 to 36, |
WiredHome | 0:a3fc9e34ea9c | 15 | // populated with 0 or the day number |
WiredHome | 0:a3fc9e34ea9c | 16 | // |
WiredHome | 0:a3fc9e34ea9c | 17 | // 0 1 2 3 4 5 6 | 1 |
WiredHome | 0:a3fc9e34ea9c | 18 | // 7 8 9 10 11 12 13 | 2 3 4 5 6 7 8 |
WiredHome | 0:a3fc9e34ea9c | 19 | // 14 15 16 17 18 19 20 | 9 10 11 12 13 14 15 |
WiredHome | 0:a3fc9e34ea9c | 20 | // 21 22 23 24 25 26 27 | 16 17 18 19 20 21 22 |
WiredHome | 0:a3fc9e34ea9c | 21 | // 28 29 30 31 32 33 34 | 23 24 25 26 27 28 29 |
WiredHome | 0:a3fc9e34ea9c | 22 | // 35 36 | 30 31 |
WiredHome | 0:a3fc9e34ea9c | 23 | // |
WiredHome | 0:a3fc9e34ea9c | 24 | void CalendarPage::Compute(uint8_t Month, uint16_t Year) { |
WiredHome | 0:a3fc9e34ea9c | 25 | const int DaysInMonth[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; |
WiredHome | 0:a3fc9e34ea9c | 26 | const char * MonthName[] = { "", "January", "February", "March", "April", "May", "June", |
WiredHome | 0:a3fc9e34ea9c | 27 | "July", "August", "September", "October", "November", "December" }; |
WiredHome | 0:a3fc9e34ea9c | 28 | const char * DayName[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; |
WiredHome | 0:a3fc9e34ea9c | 29 | int NumberOfDaysInMonth; |
WiredHome | 0:a3fc9e34ea9c | 30 | int FirstDayOfMonth = 0; |
WiredHome | 0:a3fc9e34ea9c | 31 | int DayOfWeekCounter = 0; |
WiredHome | 0:a3fc9e34ea9c | 32 | int DateCounter = 1; |
WiredHome | 0:a3fc9e34ea9c | 33 | int index = 0; |
WiredHome | 0:a3fc9e34ea9c | 34 | int day = 1; |
WiredHome | 0:a3fc9e34ea9c | 35 | |
WiredHome | 0:a3fc9e34ea9c | 36 | month = Month; |
WiredHome | 0:a3fc9e34ea9c | 37 | year = Year; |
WiredHome | 0:a3fc9e34ea9c | 38 | int y = year - (14 - month) / 12; |
WiredHome | 0:a3fc9e34ea9c | 39 | int m = month + 12 * ((14 - month) / 12) - 2; |
WiredHome | 0:a3fc9e34ea9c | 40 | |
WiredHome | 0:a3fc9e34ea9c | 41 | firstday = (day + y + y / 4 - y / 100 + y / 400 + (31 * m / 12)) % 7; |
WiredHome | 0:a3fc9e34ea9c | 42 | if ( (month == 2) && (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) ) { |
WiredHome | 0:a3fc9e34ea9c | 43 | NumberOfDaysInMonth = 29; |
WiredHome | 0:a3fc9e34ea9c | 44 | } else { |
WiredHome | 0:a3fc9e34ea9c | 45 | NumberOfDaysInMonth = DaysInMonth[month]; |
WiredHome | 0:a3fc9e34ea9c | 46 | } |
WiredHome | 0:a3fc9e34ea9c | 47 | |
WiredHome | 0:a3fc9e34ea9c | 48 | if (verbose) { |
WiredHome | 0:a3fc9e34ea9c | 49 | printf("%20s %d\r\n", MonthName[month], year); |
WiredHome | 0:a3fc9e34ea9c | 50 | for (int d = 0; d < 7; d++) { |
WiredHome | 0:a3fc9e34ea9c | 51 | printf("%4s", DayName[d]); |
WiredHome | 0:a3fc9e34ea9c | 52 | } |
WiredHome | 0:a3fc9e34ea9c | 53 | printf("\r\n"); |
WiredHome | 0:a3fc9e34ea9c | 54 | } |
WiredHome | 0:a3fc9e34ea9c | 55 | |
WiredHome | 0:a3fc9e34ea9c | 56 | memset(DayMap, 0, sizeof(DayMap)); |
WiredHome | 0:a3fc9e34ea9c | 57 | for (FirstDayOfMonth = 0; FirstDayOfMonth < firstday; ++FirstDayOfMonth) { |
WiredHome | 0:a3fc9e34ea9c | 58 | if (verbose) |
WiredHome | 0:a3fc9e34ea9c | 59 | printf("%4s", ""); |
WiredHome | 0:a3fc9e34ea9c | 60 | DayMap[index++] = 0; |
WiredHome | 0:a3fc9e34ea9c | 61 | } |
WiredHome | 0:a3fc9e34ea9c | 62 | |
WiredHome | 0:a3fc9e34ea9c | 63 | int tempfirstday = firstday; |
WiredHome | 0:a3fc9e34ea9c | 64 | DateCounter = 1; |
WiredHome | 0:a3fc9e34ea9c | 65 | DayOfWeekCounter = tempfirstday; |
WiredHome | 0:a3fc9e34ea9c | 66 | //This loop represents the date display and will continue to run until |
WiredHome | 0:a3fc9e34ea9c | 67 | //the number of days in that month have been reached |
WiredHome | 0:a3fc9e34ea9c | 68 | for (DateCounter = 1; DateCounter <= NumberOfDaysInMonth; ++DateCounter) { |
WiredHome | 0:a3fc9e34ea9c | 69 | DayMap[index++] = DateCounter; |
WiredHome | 0:a3fc9e34ea9c | 70 | if (verbose) |
WiredHome | 0:a3fc9e34ea9c | 71 | printf("%4d", DateCounter); |
WiredHome | 0:a3fc9e34ea9c | 72 | ++DayOfWeekCounter; |
WiredHome | 0:a3fc9e34ea9c | 73 | if (DayOfWeekCounter > 6 && DateCounter != NumberOfDaysInMonth) { |
WiredHome | 0:a3fc9e34ea9c | 74 | if (verbose) |
WiredHome | 0:a3fc9e34ea9c | 75 | printf("\r\n"); |
WiredHome | 0:a3fc9e34ea9c | 76 | DayOfWeekCounter = 0; |
WiredHome | 0:a3fc9e34ea9c | 77 | } |
WiredHome | 0:a3fc9e34ea9c | 78 | } |
WiredHome | 0:a3fc9e34ea9c | 79 | if (verbose) |
WiredHome | 0:a3fc9e34ea9c | 80 | printf("\r\n"); |
WiredHome | 0:a3fc9e34ea9c | 81 | tempfirstday = DayOfWeekCounter + 1; |
WiredHome | 0:a3fc9e34ea9c | 82 | } |