72 {
73
74 auto now = std::chrono::system_clock::now();
75 std::time_t t = std::chrono::system_clock::to_time_t(now);
76 std::tm* local_time = std::localtime(&t);
77 int hour = local_time->tm_hour;
78 int minute = local_time->tm_min;
79
80
82
83
84 auto mode = mode_manager_.GetMode();
85 bool landscape = mode_manager_.IsLandscape();
86
87 switch (mode) {
88 case ModeManager::Mode::TIME:
89
90 if (landscape)
92 else
94 break;
95
96 case ModeManager::Mode::HUMIDITY:
97
98 gui_->RenderHumidity(
99 static_cast<uint8_t>(sensor_manager_.GetHumidity()));
100 break;
101
102 case ModeManager::Mode::TEMPERATURE:
103
104 gui_->RenderTemperature(static_cast<uint8_t>(
105 sensor_manager_.GetCompensatedTemperature()));
106 break;
107
108 case ModeManager::Mode::STOPWATCH: {
109
110 int64_t display_sec = mode_manager_.GetStopwatchSeconds();
111 if (display_sec >= 100 * 60 - 1) display_sec = 100 * 60 - 1;
113 break;
114 }
115
116 case ModeManager::Mode::TIMER: {
117
118 int64_t remaining = mode_manager_.GetRemainingTimerSeconds();
119
120
121 if (remaining == 0 && mode_manager_.IsTimerRunning()) {
122 pwm_buzzer_->
PlayNote(PWM::NoteName::C, 8, 1000);
124 mode_manager_.StopTimer();
125 }
126
127 if (landscape) {
128
130 } else if (mode_manager_.IsTimerRunning()) {
131
133 int target_grid_down_count =
134 128 - static_cast<int>(128.0f * static_cast<float>(remaining) /
135 static_cast<float>(
136 mode_manager_.GetMaxTimerDuration()));
137 target_grid_down_count = std::clamp(target_grid_down_count, 0, 128);
138
139
140 if (target_grid_down_count > gui_->
grid_down_.Count()) {
141 SandGrid::MoveSand(&gui_->grid_up_, &gui_->
grid_down_,
143 }
144 } else {
145
147 }
148 break;
149 }
150
151 default:
152 std::cout << "Unknown mode\n";
153 }
154
155
156 std::this_thread::sleep_for(std::chrono::milliseconds(5));
157 }
void RenderTimePortraitMS(uint8_t minutes, uint8_t seconds)
Render MM:SS with dynamic colon.
void RenderTimeLandscapeMS(uint8_t minutes, uint8_t seconds)
Render MM:SS with blinking colon.
void SandDisable()
Disable sand simulation.
void RenderTimePortrait(uint8_t hour, uint8_t minute)
Render HH:MM in portrait orientation.
void RenderTimeLandscape(uint8_t hour, uint8_t minute)
Render HH:MM in landscape orientation.
void SandEnable()
Enable sand simulation.
SandGrid grid_down_
Sand particle containers.
float gravity_deg_
Gravity direction (degrees)
void SetGravityDegree(float gravity_angle)
Set gravity direction for sand physics.
void PlayNote(NoteName note, uint32_t octave, uint32_t duration_ms)
Play a musical note based on note name and octave.