| // 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 "ti-ina231.h" |
| |
| #include <lib/fake-i2c/fake-i2c.h> |
| #include <lib/fake_ddk/fake_ddk.h> |
| |
| #include <zxtest/zxtest.h> |
| |
| namespace { |
| |
| bool FloatNear(float a, float b) { return std::abs(a - b) < 0.001f; } |
| |
| } // namespace |
| |
| namespace power_sensor { |
| |
| class FakeIna231Device : public fake_i2c::FakeI2c { |
| public: |
| uint16_t configuration() const { return configuration_; } |
| uint16_t calibration() const { return calibration_; } |
| |
| void set_power(uint16_t power) { power_ = power; } |
| |
| protected: |
| zx_status_t Transact(const uint8_t* write_buffer, size_t write_buffer_size, uint8_t* read_buffer, |
| size_t* read_buffer_size) override { |
| if (write_buffer_size == 1) { |
| if (write_buffer[0] == 0) { |
| read_buffer[0] = configuration_ >> 8; |
| read_buffer[1] = configuration_ & 0xff; |
| *read_buffer_size = 2; |
| return ZX_OK; |
| } |
| if (write_buffer[0] == 3) { |
| read_buffer[0] = power_ >> 8; |
| read_buffer[1] = power_ & 0xff; |
| *read_buffer_size = 2; |
| return ZX_OK; |
| } |
| } else if (write_buffer_size == 3) { |
| const uint16_t value = (write_buffer[1] << 8) | write_buffer[2]; |
| if (write_buffer[0] == 0) { |
| configuration_ = value; |
| return ZX_OK; |
| } |
| if (write_buffer[0] == 5) { |
| calibration_ = value; |
| return ZX_OK; |
| } |
| } |
| |
| return ZX_ERR_IO; |
| } |
| |
| private: |
| uint16_t configuration_ = 0; |
| uint16_t power_ = 0; |
| uint16_t calibration_ = 0; |
| }; |
| |
| TEST(TiIna231Test, GetPowerWatts) { |
| fake_ddk::Bind ddk; |
| FakeIna231Device fake_i2c; |
| Ina231Device dut(fake_ddk::kFakeParent, 10'000, fake_i2c.GetProto()); |
| |
| EXPECT_OK(dut.Init()); |
| EXPECT_EQ(fake_i2c.configuration(), 0b11); |
| EXPECT_EQ(fake_i2c.calibration(), 2048); |
| |
| EXPECT_OK(dut.DdkAdd("ti-ina231")); |
| |
| power_sensor_fidl::Device::SyncClient client(std::move(ddk.FidlClient())); |
| |
| { |
| fake_i2c.set_power(4792); |
| auto response = client.GetPowerWatts(); |
| ASSERT_TRUE(response.ok()); |
| ASSERT_FALSE(response.value().result.is_err()); |
| EXPECT_TRUE(FloatNear(response.value().result.response().power, 29.95f)); |
| } |
| |
| { |
| fake_i2c.set_power(0); |
| auto response = client.GetPowerWatts(); |
| ASSERT_TRUE(response.ok()); |
| ASSERT_FALSE(response.value().result.is_err()); |
| EXPECT_TRUE(FloatNear(response.value().result.response().power, 0.0f)); |
| } |
| |
| { |
| fake_i2c.set_power(65535); |
| auto response = client.GetPowerWatts(); |
| ASSERT_TRUE(response.ok()); |
| ASSERT_FALSE(response.value().result.is_err()); |
| EXPECT_TRUE(FloatNear(response.value().result.response().power, 409.59375f)); |
| } |
| } |
| |
| } // namespace power_sensor |