Create data structures for a calendar page view.
Diff: CalendarPage.cpp
- Revision:
- 0:a3fc9e34ea9c
diff -r 000000000000 -r a3fc9e34ea9c CalendarPage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CalendarPage.cpp Sun Apr 22 19:56:03 2018 +0000 @@ -0,0 +1,82 @@ + + +#include "CalendarPage.h" + + +CalendarPage::CalendarPage(uint8_t Month, uint16_t Year) { + month = Month; + year = Year; + verbose = false; + Compute(month, year); +} + + +// 37 Elements with Array index 0 to 36, +// populated with 0 or the day number +// +// 0 1 2 3 4 5 6 | 1 +// 7 8 9 10 11 12 13 | 2 3 4 5 6 7 8 +// 14 15 16 17 18 19 20 | 9 10 11 12 13 14 15 +// 21 22 23 24 25 26 27 | 16 17 18 19 20 21 22 +// 28 29 30 31 32 33 34 | 23 24 25 26 27 28 29 +// 35 36 | 30 31 +// +void CalendarPage::Compute(uint8_t Month, uint16_t Year) { + const int DaysInMonth[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + const char * MonthName[] = { "", "January", "February", "March", "April", "May", "June", + "July", "August", "September", "October", "November", "December" }; + const char * DayName[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; + int NumberOfDaysInMonth; + int FirstDayOfMonth = 0; + int DayOfWeekCounter = 0; + int DateCounter = 1; + int index = 0; + int day = 1; + + month = Month; + year = Year; + int y = year - (14 - month) / 12; + int m = month + 12 * ((14 - month) / 12) - 2; + + firstday = (day + y + y / 4 - y / 100 + y / 400 + (31 * m / 12)) % 7; + if ( (month == 2) && (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) ) { + NumberOfDaysInMonth = 29; + } else { + NumberOfDaysInMonth = DaysInMonth[month]; + } + + if (verbose) { + printf("%20s %d\r\n", MonthName[month], year); + for (int d = 0; d < 7; d++) { + printf("%4s", DayName[d]); + } + printf("\r\n"); + } + + memset(DayMap, 0, sizeof(DayMap)); + for (FirstDayOfMonth = 0; FirstDayOfMonth < firstday; ++FirstDayOfMonth) { + if (verbose) + printf("%4s", ""); + DayMap[index++] = 0; + } + + int tempfirstday = firstday; + DateCounter = 1; + DayOfWeekCounter = tempfirstday; + //This loop represents the date display and will continue to run until + //the number of days in that month have been reached + for (DateCounter = 1; DateCounter <= NumberOfDaysInMonth; ++DateCounter) { + DayMap[index++] = DateCounter; + if (verbose) + printf("%4d", DateCounter); + ++DayOfWeekCounter; + if (DayOfWeekCounter > 6 && DateCounter != NumberOfDaysInMonth) { + if (verbose) + printf("\r\n"); + DayOfWeekCounter = 0; + } + } + if (verbose) + printf("\r\n"); + tempfirstday = DayOfWeekCounter + 1; +}