From 315ec77812802e263891d25181bfdb09dd57ba56 Mon Sep 17 00:00:00 2001 From: Pimpest <82343504+Pimpest@users.noreply.github.com> Date: Mon, 5 May 2025 15:04:42 +0200 Subject: [PATCH] Added simple node fore i2c comunication --- mg_bt/CMakeLists.txt | 3 +++ mg_bt/i2cmodule/i2cnode.cpp | 35 +++++++++++++++++++++++++++++++++++ mg_bt/package.xml | 1 + mg_msgs/CMakeLists.txt | 1 + mg_msgs/srv/I2c.srv | 4 ++++ 5 files changed, 44 insertions(+) create mode 100644 mg_bt/i2cmodule/i2cnode.cpp create mode 100644 mg_msgs/srv/I2c.srv diff --git a/mg_bt/CMakeLists.txt b/mg_bt/CMakeLists.txt index 837a473..a684a21 100644 --- a/mg_bt/CMakeLists.txt +++ b/mg_bt/CMakeLists.txt @@ -37,6 +37,7 @@ set(SOURCES add_executable(mg_bt_executor ${SOURCES}) +add_executable(mg_i2cnode i2cmodule/i2cnode.cpp) target_include_directories( mg_bt_executor @@ -46,9 +47,11 @@ target_include_directories( ) ament_target_dependencies(mg_bt_executor ${PACKAGE_DEPS}) +ament_target_dependencies(mg_i2cnode rclcpp mg_msgs) install( TARGETS mg_bt_executor + mg_i2cnode DESTINATION lib/${PROJECT_NAME} ) diff --git a/mg_bt/i2cmodule/i2cnode.cpp b/mg_bt/i2cmodule/i2cnode.cpp new file mode 100644 index 0000000..398cf2a --- /dev/null +++ b/mg_bt/i2cmodule/i2cnode.cpp @@ -0,0 +1,35 @@ +#include "rclcpp/rclcpp.hpp" +#include "mg_msgs/srv/i2c.hpp" + +#include +#include +#include +#include + +class MgI2c : public rclcpp::Node { + using I2cSrv = mg_msgs::srv::I2c; + + public: + MgI2c(const std::string& name) : rclcpp::Node(name), i2c_fd_(open("/dev/i2c-1", O_RDWR)) { // NOLINT + auto cb + = [this](I2cSrv::Request::ConstSharedPtr req, I2cSrv::Response::SharedPtr resp) { send_req(req, resp); }; + i2c_srv_ = create_service("/i2c", cb); + } + + void send_req(I2cSrv::Request::ConstSharedPtr req, I2cSrv::Response::SharedPtr resp) const { + ioctl(i2c_fd_, I2C_SLAVE, req->addr); // NOLINT + int ch = i2c_smbus_read_byte_data(i2c_fd_, req->data); + resp->resp.push_back(ch); + RCLCPP_INFO(get_logger(), "Recieved %d", resp->resp.front()); + } + + private: + rclcpp::Service::SharedPtr i2c_srv_; + int i2c_fd_; +}; + +int main(int argc, const char* const* argv) { + rclcpp::init(argc, argv); + + return 0; +} \ No newline at end of file diff --git a/mg_bt/package.xml b/mg_bt/package.xml index 0c34014..c3161ab 100644 --- a/mg_bt/package.xml +++ b/mg_bt/package.xml @@ -14,6 +14,7 @@ behaviortree_ros2 btcpp_ros2_interfaces mg_msgs + libi2c-dev ament_lint_auto ament_lint_common diff --git a/mg_msgs/CMakeLists.txt b/mg_msgs/CMakeLists.txt index d062b16..baf9be1 100644 --- a/mg_msgs/CMakeLists.txt +++ b/mg_msgs/CMakeLists.txt @@ -19,6 +19,7 @@ rosidl_generate_interfaces(${PROJECT_NAME} "action/Rotate.action" "srv/CalcPath.srv" "srv/SendDouble.srv" + "srv/I2c.srv" ) ament_package() \ No newline at end of file diff --git a/mg_msgs/srv/I2c.srv b/mg_msgs/srv/I2c.srv new file mode 100644 index 0000000..7ef0a5b --- /dev/null +++ b/mg_msgs/srv/I2c.srv @@ -0,0 +1,4 @@ +uint8 addr +uint8 data +--- +uint8[] resp \ No newline at end of file