| // Copyright 2020 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 "temperature_sensor.h" |
| |
| #include <fuchsia/hardware/thermal/cpp/fidl.h> |
| #include <lib/async-loop/cpp/loop.h> |
| #include <lib/fdio/directory.h> |
| #include <lib/zx/status.h> |
| #include <stdio.h> |
| #include <unistd.h> |
| #include <zircon/assert.h> |
| #include <zircon/status.h> |
| #include <zircon/syscalls.h> |
| |
| #include <string> |
| #include <string_view> |
| #include <utility> |
| |
| #include <fbl/unique_fd.h> |
| |
| #include "device.h" |
| #include "src/lib/fxl/strings/string_printf.h" |
| #include "status.h" |
| #include "util.h" |
| |
| namespace hwstress { |
| |
| class SystemTemperatureSensor : public TemperatureSensor { |
| public: |
| explicit SystemTemperatureSensor(fuchsia::hardware::thermal::DeviceSyncPtr channel) |
| : channel_(std::move(channel)) {} |
| |
| // |TemperatureSensor| implementation. |
| std::optional<double> ReadCelcius() override { |
| float value; |
| zx_status_t status2; |
| zx_status_t status = channel_->GetTemperatureCelsius(&status2, &value); |
| if (status != ZX_OK || status2 != ZX_OK) { |
| return std::nullopt; |
| } |
| |
| return value; |
| } |
| |
| private: |
| fuchsia::hardware::thermal::DeviceSyncPtr channel_; |
| }; |
| |
| std::unique_ptr<TemperatureSensor> CreateSystemTemperatureSensor(std::string_view device_path) { |
| zx::status<zx::channel> channel = OpenDeviceChannel(device_path); |
| if (channel.is_error()) { |
| fprintf(stderr, "Could not open device: %s\n", channel.status_string()); |
| return nullptr; |
| } |
| return CreateSystemTemperatureSensor(std::move(channel.value())); |
| } |
| |
| std::unique_ptr<TemperatureSensor> CreateSystemTemperatureSensor(zx::channel channel) { |
| fuchsia::hardware::thermal::DeviceSyncPtr device{}; |
| device.Bind(std::move(channel)); |
| return std::make_unique<SystemTemperatureSensor>(std::move(device)); |
| } |
| |
| class NullTemperatureSensor : public TemperatureSensor { |
| std::optional<double> ReadCelcius() override { return std::nullopt; } |
| }; |
| |
| std::unique_ptr<TemperatureSensor> CreateNullTemperatureSensor() { |
| return std::make_unique<NullTemperatureSensor>(); |
| } |
| |
| TemperatureSensor* GetNullTemperatureSensor() { |
| static NullTemperatureSensor sensor; |
| return &sensor; |
| } |
| |
| std::string TemperatureToString(std::optional<double> temperature) { |
| return temperature.has_value() ? fxl::StringPrintf("%0.1f°C", temperature.value()) : "unknown"; |
| } |
| |
| } // namespace hwstress |