diff --git a/src/viam/sdk/components/board.hpp b/src/viam/sdk/components/board.hpp index 650edaa7e..1e198c9d3 100644 --- a/src/viam/sdk/components/board.hpp +++ b/src/viam/sdk/components/board.hpp @@ -25,12 +25,23 @@ namespace sdk { /// specific board implementations. This class cannot be used on its own. class Board : public Component { public: - /// @brief Represents the value received by the registered analog to digital converter (ADC). - /// The range and conversion mechanism to voltage will vary depending on the specific ADC - /// registered to the pin. Consult your ADC's documentation and Viam's `Board` documentation for - /// more details. + /// @brief Represents the raw value received by the registered analog to digital converter + /// (ADC). The range and conversion mechanism to voltage will vary depending on the specific + /// ADC registered to the pin. using analog_value = int32_t; + /// @brief Represents the response received when reading the registered analog to digital + /// converter (ADC). The range and conversion mechanism to voltage will vary depending on the + /// specific ADC registered to the pin, though the min and max voltages and step_size can often + /// help with this conversion. Consult your ADC's documentation and Viam's `Board` + /// documentation for more details. + struct analog_response { + analog_value value; + float min_range; // Minimum possible voltage read by the analog reader + float max_range; // Maximum possible voltage read by the analog reader + float step_size; // Volts represented in each step in the value + }; + /// @brief Depending on the type of digital interrupt, this can have different meanings. If a /// `basic` (default) interrupt is configured, then this is the total interrupt count. If a /// `servo` interrupt is configured this tracks the pulse width value. Consult Viam's `Board` @@ -160,7 +171,7 @@ class Board : public Component { /// @brief Reads off the current value of an analog reader on a board. Consult your ADC's docs /// or Viam's `Board` docs for more information. /// @param analog_reader_name analog reader to read from - inline analog_value read_analog(const std::string& analog_reader_name) { + inline analog_response read_analog(const std::string& analog_reader_name) { return read_analog(analog_reader_name, {}); } @@ -168,8 +179,8 @@ class Board : public Component { /// or Viam's `Board` docs for more information. /// @param analog_reader_name analog reader to read from /// @param extra Any additional arguments to the method - virtual analog_value read_analog(const std::string& analog_reader_name, - const AttributeMap& extra) = 0; + virtual analog_response read_analog(const std::string& analog_reader_name, + const AttributeMap& extra) = 0; /// @brief Writes the value to the analog writer of the board. /// @param pin the pin to write to diff --git a/src/viam/sdk/components/private/board_client.cpp b/src/viam/sdk/components/private/board_client.cpp index 40a1d9f8a..725045a67 100644 --- a/src/viam/sdk/components/private/board_client.cpp +++ b/src/viam/sdk/components/private/board_client.cpp @@ -85,8 +85,8 @@ AttributeMap BoardClient::do_command(const AttributeMap& command) { // TODO(RSDK-6048) update `client_wrapper` to allow for requests without a `mutable_name()` method, // then wrap here. -Board::analog_value BoardClient::read_analog(const std::string& analog_reader_name, - const AttributeMap& extra) { +Board::analog_response BoardClient::read_analog(const std::string& analog_reader_name, + const AttributeMap& extra) { viam::component::board::v1::ReadAnalogReaderRequest request; viam::component::board::v1::ReadAnalogReaderResponse response; ClientContext ctx; @@ -99,7 +99,8 @@ Board::analog_value BoardClient::read_analog(const std::string& analog_reader_na if (!status.ok()) { throw GRPCException(status); } - return response.value(); + return Board::analog_response{ + response.value(), response.min_range(), response.max_range(), response.step_size()}; } void BoardClient::write_analog(const std::string& pin, int value, const AttributeMap& extra) { diff --git a/src/viam/sdk/components/private/board_client.hpp b/src/viam/sdk/components/private/board_client.hpp index b5aa7e7dc..e98807acc 100644 --- a/src/viam/sdk/components/private/board_client.hpp +++ b/src/viam/sdk/components/private/board_client.hpp @@ -34,8 +34,8 @@ class BoardClient : public Board { void set_pwm_frequency(const std::string& pin, uint64_t frequency_hz, const AttributeMap& extra) override; - analog_value read_analog(const std::string& analog_reader_name, - const AttributeMap& extra) override; + analog_response read_analog(const std::string& analog_reader_name, + const AttributeMap& extra) override; void write_analog(const std::string& pin, int value, const AttributeMap& extra) override; digital_value read_digital_interrupt(const std::string& digital_interrupt_name, const AttributeMap& extra) override; diff --git a/src/viam/sdk/components/private/board_server.cpp b/src/viam/sdk/components/private/board_server.cpp index 2f8d9381a..418307cb2 100644 --- a/src/viam/sdk/components/private/board_server.cpp +++ b/src/viam/sdk/components/private/board_server.cpp @@ -103,8 +103,11 @@ ::grpc::Status BoardServer::ReadAnalogReader( extra = struct_to_map(request->extra()); } - const Board::analog_value result = board->read_analog(request->analog_reader_name(), extra); - response->set_value(result); + const Board::analog_response result = board->read_analog(request->analog_reader_name(), extra); + response->set_value(result.value); + response->set_min_range(result.min_range); + response->set_max_range(result.max_range); + response->set_step_size(result.step_size); return ::grpc::Status(); } diff --git a/src/viam/sdk/tests/mocks/mock_board.cpp b/src/viam/sdk/tests/mocks/mock_board.cpp index 44f934cd8..15b5e5d11 100644 --- a/src/viam/sdk/tests/mocks/mock_board.cpp +++ b/src/viam/sdk/tests/mocks/mock_board.cpp @@ -50,8 +50,8 @@ AttributeMap MockBoard::do_command(const AttributeMap& command) { return command; } -Board::analog_value MockBoard::read_analog(const std::string& analog_reader_name, - const AttributeMap&) { +Board::analog_response MockBoard::read_analog(const std::string& analog_reader_name, + const AttributeMap&) { this->peek_analog_reader_name = analog_reader_name; return this->peek_read_analog_ret; } diff --git a/src/viam/sdk/tests/mocks/mock_board.hpp b/src/viam/sdk/tests/mocks/mock_board.hpp index 4fef88dec..1a8b4171a 100644 --- a/src/viam/sdk/tests/mocks/mock_board.hpp +++ b/src/viam/sdk/tests/mocks/mock_board.hpp @@ -22,8 +22,8 @@ class MockBoard : public viam::sdk::Board { uint64_t frequency_hz, const sdk::AttributeMap& extra) override; viam::sdk::AttributeMap do_command(const viam::sdk::AttributeMap& command) override; - Board::analog_value read_analog(const std::string& analog_reader_name, - const sdk::AttributeMap& extra) override; + Board::analog_response read_analog(const std::string& analog_reader_name, + const sdk::AttributeMap& extra) override; void write_analog(const std::string& pin, int value, const sdk::AttributeMap& extra) override; Board::digital_value read_digital_interrupt(const std::string& digital_interrupt_name, const sdk::AttributeMap& extra) override; @@ -44,7 +44,7 @@ class MockBoard : public viam::sdk::Board { double peek_set_pwm_duty_cycle_pct; uint64_t peek_get_pwm_frequency_ret; uint64_t peek_set_pwm_frequency_hz; - Board::analog_value peek_read_analog_ret; + Board::analog_response peek_read_analog_ret; Board::digital_value peek_read_digital_interrupt_ret; Board::power_mode peek_set_power_mode_power_mode; boost::optional peek_set_power_mode_duration; diff --git a/src/viam/sdk/tests/test_board.cpp b/src/viam/sdk/tests/test_board.cpp index f01dd7029..b2dba1a03 100644 --- a/src/viam/sdk/tests/test_board.cpp +++ b/src/viam/sdk/tests/test_board.cpp @@ -107,8 +107,13 @@ BOOST_AUTO_TEST_CASE(test_do_command) { BOOST_AUTO_TEST_CASE(test_read_analog) { const auto mock = std::make_shared("mock_board"); client_to_mock_pipeline(mock, [&](Board& client) { - mock->peek_read_analog_ret = 5150; - BOOST_CHECK_EQUAL(5150, client.read_analog("t1")); + sdk::Board::analog_response expected_result = {5150, 1.0, 5.0, 0.01}; + mock->peek_read_analog_ret = expected_result; + sdk::Board::analog_response result = client.read_analog("t1"); + BOOST_CHECK_EQUAL(expected_result.value, result.value); + BOOST_CHECK_EQUAL(expected_result.min_range, result.min_range); + BOOST_CHECK_EQUAL(expected_result.max_range, result.max_range); + BOOST_CHECK_EQUAL(expected_result.step_size, result.step_size); BOOST_CHECK_EQUAL("t1", mock->peek_analog_reader_name); }); }