11#include < array>
2+ #include < bit>
3+ #include < cstdint>
24#include < cstring>
35#include < memory>
46#include < string>
@@ -25,36 +27,20 @@ class PressureLinkNode : public baseLink::LinkNodeBase
2527 }
2628
2729private:
28- void onSerialBytes (const uint8_t *data, size_t length) override
30+ void publishRaw (const float value)
2931 {
30- serial_line_buffer_.append (reinterpret_cast <const char *>(data), length);
31-
32- size_t delimiter_pos = 0 ;
33- while ((delimiter_pos = serial_line_buffer_.find_first_of (" \r\n " )) !=
34- std::string::npos)
35- {
36- std::string line = serial_line_buffer_.substr (0 , delimiter_pos);
37- serial_line_buffer_.erase (0 , delimiter_pos + 1 );
38-
39- while (!serial_line_buffer_.empty () &&
40- (serial_line_buffer_.front () == ' \r ' ||
41- serial_line_buffer_.front () == ' \n ' ))
42- {
43- serial_line_buffer_.erase (0 , 1 );
44- }
45-
46- if (!line.empty ())
47- {
48- publishRaw (line);
49- }
50- }
32+ auto msg = std_msgs::msg::String ();
33+ msg.data = std::to_string (value);
34+ data_raw_pub_->publish (std::move (msg));
5135 }
5236
53- void publishRaw (const std::string &raw_data )
37+ static float decodeFloatLE (const uint8_t *data )
5438 {
55- auto msg = std_msgs::msg::String ();
56- msg.data = raw_data;
57- data_raw_pub_->publish (std::move (msg));
39+ const uint32_t raw = static_cast <uint32_t >(data[0 ]) |
40+ (static_cast <uint32_t >(data[1 ]) << 8U ) |
41+ (static_cast <uint32_t >(data[2 ]) << 16U ) |
42+ (static_cast <uint32_t >(data[3 ]) << 24U );
43+ return std::bit_cast<float >(raw);
5844 }
5945
6046 hydrolib::ReturnCode memoryRead (void *buffer, unsigned address,
@@ -72,32 +58,33 @@ class PressureLinkNode : public baseLink::LinkNodeBase
7258 hydrolib::ReturnCode memoryWrite (const void *buffer, unsigned address,
7359 unsigned length)
7460 {
61+ RCLCPP_DEBUG (this ->get_logger (),
62+ " Pressure slave write: addr=%u len=%u" ,
63+ address, length);
64+
7565 if (address + length > memory_.size ())
7666 {
7767 return hydrolib::ReturnCode::FAIL;
7868 }
7969
8070 std::memcpy (memory_.data () + address, buffer, length);
8171
82- if (address == 0U && length > 0U )
83- {
84- const auto *bytes = static_cast <const char *>(buffer);
85- std::string raw_data (bytes, bytes + length);
86-
87- const auto null_pos = raw_data.find (' \0 ' );
88- if (null_pos != std::string::npos)
89- {
90- raw_data.resize (null_pos);
91- }
72+ constexpr unsigned kValueAddress = 0U ;
73+ constexpr unsigned kValueLength = sizeof (float );
74+ const bool value_is_written =
75+ (address <= kValueAddress ) &&
76+ ((address + length) >= (kValueAddress + kValueLength ));
9277
93- publishRaw (raw_data);
78+ if (value_is_written)
79+ {
80+ const float value = decodeFloatLE (memory_.data () + kValueAddress );
81+ publishRaw (value);
9482 }
9583
9684 return hydrolib::ReturnCode::OK;
9785 }
9886
9987 std::array<uint8_t , 256 > memory_{};
100- std::string serial_line_buffer_;
10188 rclcpp::Publisher<std_msgs::msg::String>::SharedPtr data_raw_pub_;
10289};
10390
0 commit comments