| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "src/cobalt/bin/system-metrics/temperature_fetcher_impl.h" |
| |
| #include <errno.h> |
| #include <fcntl.h> |
| #include <fuchsia/hardware/thermal/c/fidl.h> |
| #include <lib/fdio/fdio.h> |
| #include <lib/syslog/cpp/macros.h> |
| #include <lib/trace/event.h> |
| #include <stdio.h> |
| #include <zircon/status.h> |
| |
| #include <cmath> |
| |
| #include <fbl/unique_fd.h> |
| |
| namespace cobalt { |
| |
| TemperatureFetcherImpl::TemperatureFetcherImpl() { GetDeviceHandle(); } |
| |
| TemperatureFetchStatus TemperatureFetcherImpl::FetchTemperature(int32_t *temperature) { |
| float temperature_float; |
| zx_status_t status, status2; |
| status = fuchsia_hardware_thermal_DeviceGetTemperatureCelsius(channel_.get(), &status2, |
| &temperature_float); |
| if (status == ZX_ERR_NOT_SUPPORTED || status2 == ZX_ERR_NOT_SUPPORTED || |
| status == ZX_ERR_BAD_HANDLE || status2 == ZX_ERR_BAD_HANDLE) { |
| FX_LOGS(ERROR) << "Cobalt SystemMetricsDaemon: Temperature fetching not supported: " |
| << zx_status_get_string(status) << " " << zx_status_get_string(status2); |
| return TemperatureFetchStatus::NOT_SUPPORTED; |
| } else if (status != ZX_OK || status2 != ZX_OK) { |
| FX_LOGS(ERROR) << "Cobalt SystemMetricsDaemon: Failed to get current temperature: " |
| << zx_status_get_string(status) << " " << zx_status_get_string(status2); |
| return TemperatureFetchStatus::FAIL; |
| } |
| // Round to the nearest degree. |
| *temperature = static_cast<int32_t>(std::round(temperature_float)); |
| TRACE_COUNTER("system_metrics", "temperature", 0, "temperature", *temperature); |
| return TemperatureFetchStatus::SUCCEED; |
| } |
| |
| zx_status_t TemperatureFetcherImpl::GetDeviceHandle() { |
| fbl::unique_fd fd(open("/dev/class/thermal/000", O_RDWR)); |
| if (fd.get() < 0) { |
| FX_LOGS(ERROR) << "Failed to open thermal device: " << fd.get() << ", errno=" << errno; |
| return ZX_ERR_IO; |
| } |
| zx_status_t status = fdio_get_service_handle(fd.release(), channel_.reset_and_get_address()); |
| if (status != ZX_OK) { |
| FX_LOGS(ERROR) << "Failed to get FDIO handle for thermal device: " << status; |
| } |
| return status; |
| } |
| |
| } // namespace cobalt |