@@ -23,6 +23,7 @@ constexpr int kMqttLoopTimeoutMs = 100;
2323constexpr int kReconnectDelaySeconds = 1 ;
2424constexpr int kHealthLogIntervalSeconds = 60 ;
2525constexpr int kStartupNotificationTimeoutSeconds = 10 ;
26+ constexpr int kStartupUnknownWifiTimeoutSeconds = 30 ;
2627constexpr std::time_t kMinimumSaneEpoch = 1704067200 ;
2728constexpr std::size_t kMaxPayloadLogBytes = 256 ;
2829constexpr std::size_t kMaxObservedTopics = 256 ;
@@ -155,6 +156,7 @@ int ChimeService::Run(vc::runtime::SignalHandler &signal_handler) {
155156
156157 bool startup_notification_played = false ;
157158 bool startup_notification_unknown_logged = false ;
159+ std::optional<std::chrono::steady_clock::time_point> startup_unknown_wifi_begin;
158160 const auto startup_begin = std::chrono::steady_clock::now ();
159161
160162 while (!signal_handler.ShouldStop ()) {
@@ -224,8 +226,22 @@ int ChimeService::Run(vc::runtime::SignalHandler &signal_handler) {
224226 if (!startup_notification_unknown_logged) {
225227 logger_.Info (" audio" , " startup checks deferred: wifi state unknown" );
226228 startup_notification_unknown_logged = true ;
229+ startup_unknown_wifi_begin = now;
230+ }
231+
232+ if (startup_unknown_wifi_begin.has_value ()) {
233+ const auto unknown_wifi_elapsed =
234+ std::chrono::duration_cast<std::chrono::seconds>(now - *startup_unknown_wifi_begin).count ();
235+ if (unknown_wifi_elapsed >= kStartupUnknownWifiTimeoutSeconds ) {
236+ logger_.Warn (" audio" , " startup wifi state remained unknown for " +
237+ std::to_string (kStartupUnknownWifiTimeoutSeconds ) +
238+ " s after startup timeout, playing failure notification" );
239+ PlayNotification (NotificationSoundType::kFailure );
240+ startup_notification_played = true ;
241+ }
227242 }
228243 } else {
244+ startup_unknown_wifi_begin = std::nullopt ;
229245 logger_.Warn (" audio" , " startup checks incomplete within " +
230246 std::to_string (kStartupNotificationTimeoutSeconds ) +
231247 " s, playing failure notification" );
0 commit comments