Skip to content

Commit ea566a0

Browse files
authored
[RSDK-7151] Update analog reader responses to include accuracy data (#237)
Surprisingly, we don't need a protobuf update (from viamrobotics/api#492) because we're already using the new protobufs and have just been ignoring the extra data they hold! Everything compiles and the tests all pass.
1 parent f2b23f6 commit ea566a0

File tree

7 files changed

+41
-21
lines changed

7 files changed

+41
-21
lines changed

src/viam/sdk/components/board.hpp

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,23 @@ namespace sdk {
2525
/// specific board implementations. This class cannot be used on its own.
2626
class Board : public Component {
2727
public:
28-
/// @brief Represents the value received by the registered analog to digital converter (ADC).
29-
/// The range and conversion mechanism to voltage will vary depending on the specific ADC
30-
/// registered to the pin. Consult your ADC's documentation and Viam's `Board` documentation for
31-
/// more details.
28+
/// @brief Represents the raw value received by the registered analog to digital converter
29+
/// (ADC). The range and conversion mechanism to voltage will vary depending on the specific
30+
/// ADC registered to the pin.
3231
using analog_value = int32_t;
3332

33+
/// @brief Represents the response received when reading the registered analog to digital
34+
/// converter (ADC). The range and conversion mechanism to voltage will vary depending on the
35+
/// specific ADC registered to the pin, though the min and max voltages and step_size can often
36+
/// help with this conversion. Consult your ADC's documentation and Viam's `Board`
37+
/// documentation for more details.
38+
struct analog_response {
39+
analog_value value;
40+
float min_range; // Minimum possible voltage read by the analog reader
41+
float max_range; // Maximum possible voltage read by the analog reader
42+
float step_size; // Volts represented in each step in the value
43+
};
44+
3445
/// @brief Depending on the type of digital interrupt, this can have different meanings. If a
3546
/// `basic` (default) interrupt is configured, then this is the total interrupt count. If a
3647
/// `servo` interrupt is configured this tracks the pulse width value. Consult Viam's `Board`
@@ -160,16 +171,16 @@ class Board : public Component {
160171
/// @brief Reads off the current value of an analog reader on a board. Consult your ADC's docs
161172
/// or Viam's `Board` docs for more information.
162173
/// @param analog_reader_name analog reader to read from
163-
inline analog_value read_analog(const std::string& analog_reader_name) {
174+
inline analog_response read_analog(const std::string& analog_reader_name) {
164175
return read_analog(analog_reader_name, {});
165176
}
166177

167178
/// @brief Reads off the current value of an analog reader on a board. Consult your ADC's docs
168179
/// or Viam's `Board` docs for more information.
169180
/// @param analog_reader_name analog reader to read from
170181
/// @param extra Any additional arguments to the method
171-
virtual analog_value read_analog(const std::string& analog_reader_name,
172-
const AttributeMap& extra) = 0;
182+
virtual analog_response read_analog(const std::string& analog_reader_name,
183+
const AttributeMap& extra) = 0;
173184

174185
/// @brief Writes the value to the analog writer of the board.
175186
/// @param pin the pin to write to

src/viam/sdk/components/private/board_client.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,8 @@ AttributeMap BoardClient::do_command(const AttributeMap& command) {
8585

8686
// TODO(RSDK-6048) update `client_wrapper` to allow for requests without a `mutable_name()` method,
8787
// then wrap here.
88-
Board::analog_value BoardClient::read_analog(const std::string& analog_reader_name,
89-
const AttributeMap& extra) {
88+
Board::analog_response BoardClient::read_analog(const std::string& analog_reader_name,
89+
const AttributeMap& extra) {
9090
viam::component::board::v1::ReadAnalogReaderRequest request;
9191
viam::component::board::v1::ReadAnalogReaderResponse response;
9292
ClientContext ctx;
@@ -99,7 +99,8 @@ Board::analog_value BoardClient::read_analog(const std::string& analog_reader_na
9999
if (!status.ok()) {
100100
throw GRPCException(status);
101101
}
102-
return response.value();
102+
return Board::analog_response{
103+
response.value(), response.min_range(), response.max_range(), response.step_size()};
103104
}
104105

105106
void BoardClient::write_analog(const std::string& pin, int value, const AttributeMap& extra) {

src/viam/sdk/components/private/board_client.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ class BoardClient : public Board {
3434
void set_pwm_frequency(const std::string& pin,
3535
uint64_t frequency_hz,
3636
const AttributeMap& extra) override;
37-
analog_value read_analog(const std::string& analog_reader_name,
38-
const AttributeMap& extra) override;
37+
analog_response read_analog(const std::string& analog_reader_name,
38+
const AttributeMap& extra) override;
3939
void write_analog(const std::string& pin, int value, const AttributeMap& extra) override;
4040
digital_value read_digital_interrupt(const std::string& digital_interrupt_name,
4141
const AttributeMap& extra) override;

src/viam/sdk/components/private/board_server.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,11 @@ ::grpc::Status BoardServer::ReadAnalogReader(
103103
extra = struct_to_map(request->extra());
104104
}
105105

106-
const Board::analog_value result = board->read_analog(request->analog_reader_name(), extra);
107-
response->set_value(result);
106+
const Board::analog_response result = board->read_analog(request->analog_reader_name(), extra);
107+
response->set_value(result.value);
108+
response->set_min_range(result.min_range);
109+
response->set_max_range(result.max_range);
110+
response->set_step_size(result.step_size);
108111

109112
return ::grpc::Status();
110113
}

src/viam/sdk/tests/mocks/mock_board.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ AttributeMap MockBoard::do_command(const AttributeMap& command) {
5050
return command;
5151
}
5252

53-
Board::analog_value MockBoard::read_analog(const std::string& analog_reader_name,
54-
const AttributeMap&) {
53+
Board::analog_response MockBoard::read_analog(const std::string& analog_reader_name,
54+
const AttributeMap&) {
5555
this->peek_analog_reader_name = analog_reader_name;
5656
return this->peek_read_analog_ret;
5757
}

src/viam/sdk/tests/mocks/mock_board.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ class MockBoard : public viam::sdk::Board {
2222
uint64_t frequency_hz,
2323
const sdk::AttributeMap& extra) override;
2424
viam::sdk::AttributeMap do_command(const viam::sdk::AttributeMap& command) override;
25-
Board::analog_value read_analog(const std::string& analog_reader_name,
26-
const sdk::AttributeMap& extra) override;
25+
Board::analog_response read_analog(const std::string& analog_reader_name,
26+
const sdk::AttributeMap& extra) override;
2727
void write_analog(const std::string& pin, int value, const sdk::AttributeMap& extra) override;
2828
Board::digital_value read_digital_interrupt(const std::string& digital_interrupt_name,
2929
const sdk::AttributeMap& extra) override;
@@ -44,7 +44,7 @@ class MockBoard : public viam::sdk::Board {
4444
double peek_set_pwm_duty_cycle_pct;
4545
uint64_t peek_get_pwm_frequency_ret;
4646
uint64_t peek_set_pwm_frequency_hz;
47-
Board::analog_value peek_read_analog_ret;
47+
Board::analog_response peek_read_analog_ret;
4848
Board::digital_value peek_read_digital_interrupt_ret;
4949
Board::power_mode peek_set_power_mode_power_mode;
5050
boost::optional<std::chrono::microseconds> peek_set_power_mode_duration;

src/viam/sdk/tests/test_board.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,13 @@ BOOST_AUTO_TEST_CASE(test_do_command) {
107107
BOOST_AUTO_TEST_CASE(test_read_analog) {
108108
const auto mock = std::make_shared<MockBoard>("mock_board");
109109
client_to_mock_pipeline<Board>(mock, [&](Board& client) {
110-
mock->peek_read_analog_ret = 5150;
111-
BOOST_CHECK_EQUAL(5150, client.read_analog("t1"));
110+
sdk::Board::analog_response expected_result = {5150, 1.0, 5.0, 0.01};
111+
mock->peek_read_analog_ret = expected_result;
112+
sdk::Board::analog_response result = client.read_analog("t1");
113+
BOOST_CHECK_EQUAL(expected_result.value, result.value);
114+
BOOST_CHECK_EQUAL(expected_result.min_range, result.min_range);
115+
BOOST_CHECK_EQUAL(expected_result.max_range, result.max_range);
116+
BOOST_CHECK_EQUAL(expected_result.step_size, result.step_size);
112117
BOOST_CHECK_EQUAL("t1", mock->peek_analog_reader_name);
113118
});
114119
}

0 commit comments

Comments
 (0)