blob: e5346f61926dee45dba0e67a7d3897d60479a49c [file] [log] [blame]
// Copyright 2023 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "biod/maintenance_scheduler.h"
#include <memory>
#include <base/functional/callback.h>
#include <base/time/time.h>
#include <base/timer/timer.h>
#include "biod/cros_fp_device.h"
#include "libec/fingerprint/fp_mode.h"
namespace biod {
namespace {
using Mode = ec::FpMode::Mode;
const base::TimeDelta kMaintenanceInterval = base::Days(1);
const base::TimeDelta kMaintenanceRetryInterval = base::Minutes(10);
} // namespace
MaintenanceScheduler::MaintenanceScheduler(
ec::CrosFpDeviceInterface* cros_fp_device,
BiodMetricsInterface* biod_metrics)
: timer_(std::make_unique<base::OneShotTimer>()),
cros_dev_(cros_fp_device),
metrics_(biod_metrics) {
CHECK(cros_dev_);
}
void MaintenanceScheduler::Start() {
Schedule(kMaintenanceInterval);
}
void MaintenanceScheduler::Schedule(base::TimeDelta delta) {
timer_->Start(FROM_HERE, delta,
base::BindOnce(&MaintenanceScheduler::OnMaintenanceTimerFired,
base::Unretained(this)));
}
void MaintenanceScheduler::OnMaintenanceTimerFired() {
auto fp_sensor_mode = cros_dev_->GetFpMode();
if (fp_sensor_mode != ec::FpMode(Mode::kNone)) {
LOG(INFO) << "Rescheduling maintenance due to fp_sensor_mode: "
<< fp_sensor_mode;
Schedule(kMaintenanceRetryInterval);
return;
}
LOG(INFO) << "Maintenance timer fired";
// Report the number of dead pixels
cros_dev_->UpdateFpInfo();
metrics_->SendDeadPixelCount(cros_dev_->DeadPixelCount());
// The maintenance operation can take a couple hundred milliseconds, so it's
// an asynchronous mode (the state is cleared by the FPMCU after it is
// finished with the operation).
cros_dev_->SetFpMode(ec::FpMode(Mode::kSensorMaintenance));
Schedule(kMaintenanceInterval);
}
} // namespace biod