#include #include #include #include #include #include "Clock.h" using namespace Pinetime::Applications::Screens; extern lv_font_t jetbrains_mono_extrabold_compressedextrabold_compressed; extern lv_font_t jetbrains_mono_bold_20; Clock::Clock(Pinetime::Components::Gfx &gfx) : Screen(gfx), currentDateTime{{}}, version {{}} { label_battery = lv_label_create(lv_scr_act(), NULL); lv_obj_align(label_battery, lv_scr_act(), LV_ALIGN_IN_TOP_RIGHT, -80, 0); labelStyle = const_cast(lv_label_get_style(label_battery, LV_LABEL_STYLE_MAIN)); labelStyle->text.font = &jetbrains_mono_bold_20; lv_style_copy(&labelBigStyle, labelStyle); labelBigStyle.text.font = &jetbrains_mono_extrabold_compressedextrabold_compressed; lv_label_set_style(label_battery, LV_LABEL_STYLE_MAIN, labelStyle); label_ble = lv_label_create(lv_scr_act(), NULL); lv_label_set_style(label_ble, LV_LABEL_STYLE_MAIN, labelStyle); lv_obj_align(label_ble, lv_scr_act(), LV_ALIGN_IN_TOP_LEFT, 10, 0); label_time = lv_label_create(lv_scr_act(), NULL); lv_label_set_style(label_time, LV_LABEL_STYLE_MAIN, &labelBigStyle); lv_obj_align(label_time, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, 0); label_date = lv_label_create(lv_scr_act(), NULL); lv_label_set_style(label_date, LV_LABEL_STYLE_MAIN, labelStyle); lv_obj_align(label_date, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, 80); label_version = lv_label_create(lv_scr_act(), NULL); lv_label_set_style(label_version, LV_LABEL_STYLE_MAIN, labelStyle); lv_obj_align(label_version, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, 100); } void Clock::Refresh(bool fullRefresh) { if(fullRefresh) { auto dummy = currentDateTime.Get(); } if (fullRefresh || batteryPercentRemaining.IsUpdated()) { char batteryChar[11]; auto newBatteryValue = batteryPercentRemaining.Get(); newBatteryValue = (newBatteryValue > 100) ? 100 : newBatteryValue; newBatteryValue = (newBatteryValue < 0) ? 0 : newBatteryValue; sprintf(batteryChar, "BAT: %d%%", newBatteryValue); lv_label_set_text(label_battery, batteryChar); } if (fullRefresh || bleState.IsUpdated()) { uint16_t color = (bleState.Get() == BleConnectionStates::Connected) ? 0xffff : 0x0000; gfx.DrawString(10, 0, color, "BLE", &smallFont, false); lv_label_set_text(label_ble, "BLE"); // TODO color } if(fullRefresh || currentDateTime.IsUpdated()) { auto newDateTime = currentDateTime.Get(); auto dp = date::floor(newDateTime); auto time = date::make_time(newDateTime-dp); auto yearMonthDay = date::year_month_day(dp); auto year = (int)yearMonthDay.year(); auto month = static_cast((unsigned)yearMonthDay.month()); auto day = (unsigned)yearMonthDay.day(); auto dayOfWeek = static_cast(date::weekday(yearMonthDay).iso_encoding()); auto hour = time.hours().count(); auto minute = time.minutes().count(); auto second = time.seconds().count(); char minutesChar[3]; sprintf(minutesChar, "%02d", minute); char hoursChar[3]; sprintf(hoursChar, "%02d", hour); char timeStr[6]; sprintf(timeStr, "%c%c:%c%c", hoursChar[0],hoursChar[1],minutesChar[0], minutesChar[1]); lv_label_set_text(label_time, timeStr); if ((year != currentYear) || (month != currentMonth) || (dayOfWeek != currentDayOfWeek) || (day != currentDay)) { gfx.FillRectangle(0,180, 240, 15, 0x0000); char dateStr[22]; sprintf(dateStr, "%s %d %s %d", DayOfWeekToString(dayOfWeek), day, MonthToString(month), year); lv_label_set_text(label_date, dateStr); currentYear = year; currentMonth = month; currentDayOfWeek = dayOfWeek; currentDay = day; } } if(fullRefresh || version.IsUpdated()) { char version[20]; sprintf(version, "VERSION: %d.%d.%d", Version::Major(), Version::Minor(), Version::Patch()); lv_label_set_text(label_version, version); } } const char *Clock::MonthToString(Pinetime::Controllers::DateTime::Months month) { return Clock::MonthsString[static_cast(month)]; } const char *Clock::DayOfWeekToString(Pinetime::Controllers::DateTime::Days dayOfWeek) { return Clock::DaysString[static_cast(dayOfWeek)]; } char const *Clock::DaysString[] = { "", "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY" }; char const *Clock::MonthsString[] = { "", "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC" };