From: Walter Fetter Lages Date: Sat, 4 Sep 2021 08:33:57 +0000 (-0300) Subject: Port to Galactic. X-Git-Url: http://git.ece.ufrgs.br/?a=commitdiff_plain;h=255ac62e02b12370ca028c8a7bf5268b0d700da0;p=gfxtablet_ros.git Port to Galactic. --- diff --git a/CMakeLists.txt b/CMakeLists.txt index c8574e0..220fe7d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,205 +1,41 @@ -cmake_minimum_required(VERSION 3.0.2) +cmake_minimum_required(VERSION 3.8) project(gfxtablet_ros) -## Compile as C++11, supported in ROS Kinetic and newer -# add_compile_options(-std=c++11) +if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options(-Wall -Wextra -Wpedantic) +endif() -## Find catkin macros and libraries -## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz) -## is used, also find other catkin packages -find_package(catkin REQUIRED COMPONENTS - roscpp - sensor_msgs -) - -## System dependencies are found with CMake's conventions -# find_package(Boost REQUIRED COMPONENTS system) - - -## Uncomment this if the package has a setup.py. This macro ensures -## modules and global scripts declared therein get installed -## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html -# catkin_python_setup() - -################################################ -## Declare ROS messages, services and actions ## -################################################ - -## To declare and build messages, services or actions from within this -## package, follow these steps: -## * Let MSG_DEP_SET be the set of packages whose message types you use in -## your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...). -## * In the file package.xml: -## * add a build_depend tag for "message_generation" -## * add a build_depend and a exec_depend tag for each package in MSG_DEP_SET -## * If MSG_DEP_SET isn't empty the following dependency has been pulled in -## but can be declared for certainty nonetheless: -## * add a exec_depend tag for "message_runtime" -## * In this file (CMakeLists.txt): -## * add "message_generation" and every package in MSG_DEP_SET to -## find_package(catkin REQUIRED COMPONENTS ...) -## * add "message_runtime" and every package in MSG_DEP_SET to -## catkin_package(CATKIN_DEPENDS ...) -## * uncomment the add_*_files sections below as needed -## and list every .msg/.srv/.action file to be processed -## * uncomment the generate_messages entry below -## * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...) - -## Generate messages in the 'msg' folder -# add_message_files( -# FILES -# Message1.msg -# Message2.msg -# ) - -## Generate services in the 'srv' folder -# add_service_files( -# FILES -# Service1.srv -# Service2.srv -# ) - -## Generate actions in the 'action' folder -# add_action_files( -# FILES -# Action1.action -# Action2.action -# ) - -## Generate added messages and services with any dependencies listed here -# generate_messages( -# DEPENDENCIES -# sensor_msgs -# ) - -################################################ -## Declare ROS dynamic reconfigure parameters ## -################################################ - -## To declare and build dynamic reconfigure parameters within this -## package, follow these steps: -## * In the file package.xml: -## * add a build_depend and a exec_depend tag for "dynamic_reconfigure" -## * In this file (CMakeLists.txt): -## * add "dynamic_reconfigure" to -## find_package(catkin REQUIRED COMPONENTS ...) -## * uncomment the "generate_dynamic_reconfigure_options" section below -## and list every .cfg file to be processed - -## Generate dynamic reconfigure parameters in the 'cfg' folder -# generate_dynamic_reconfigure_options( -# cfg/DynReconf1.cfg -# cfg/DynReconf2.cfg -# ) - -################################### -## catkin specific configuration ## -################################### -## The catkin_package macro generates cmake config files for your package -## Declare things to be passed to dependent projects -## INCLUDE_DIRS: uncomment this if your package contains header files -## LIBRARIES: libraries you create in this project that dependent projects also need -## CATKIN_DEPENDS: catkin_packages dependent projects also need -## DEPENDS: system dependencies of this project that dependent projects also need -catkin_package( -# INCLUDE_DIRS include -# LIBRARIES gfxtablet_ros -# CATKIN_DEPENDS roscpp sensor_msgs -# DEPENDS system_lib -) +# find dependencies +find_package(ament_cmake REQUIRED) +find_package(rclcpp REQUIRED) +find_package(sensor_msgs REQUIRED) -########### -## Build ## -########### - -## Specify additional locations of header files -## Your package locations should be listed before other locations -include_directories( - include - ${catkin_INCLUDE_DIRS} -) - -## Declare a C++ library -# add_library(${PROJECT_NAME} -# src/${PROJECT_NAME}/gfxtablet_ros.cpp -# ) - -## Add cmake target dependencies of the library -## as an example, code may need to be generated before libraries -## either from message generation or dynamic reconfigure -# add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) - -## Declare a C++ executable -## With catkin_make all packages are built within a single CMake context -## The recommended prefix ensures that target names across packages don't collide add_executable(gfxtablet_node src/gfxtablet_node.cpp) - -## Rename C++ executable without prefix -## The above recommended prefix causes long target names, the following renames the -## target back to the shorter version for ease of user use -## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node" -# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "") - -## Add cmake target dependencies of the executable -## same as for the library above -# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) - -## Specify libraries to link a library or executable target against -target_link_libraries(gfxtablet_node - ${catkin_LIBRARIES} +target_include_directories(gfxtablet_node PUBLIC + $ + $) +target_compile_features(gfxtablet_node PUBLIC c_std_99 cxx_std_17) # Require C99 and C++17 +ament_target_dependencies( + gfxtablet_node + "rclcpp" + "sensor_msgs" ) -############# -## Install ## -############# - -# all install targets should use catkin DESTINATION variables -# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html - -## Mark executable scripts (Python etc.) for installation -## in contrast to setup.py, you can choose the destination -# catkin_install_python(PROGRAMS -# scripts/my_python_script -# DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} -# ) - -## Mark executables for installation -## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_executables.html -# install(TARGETS ${PROJECT_NAME}_node -# RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} -# ) - -## Mark libraries for installation -## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html -# install(TARGETS ${PROJECT_NAME} -# ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} -# LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} -# RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} -# ) - -## Mark cpp header files for installation -# install(DIRECTORY include/${PROJECT_NAME}/ -# DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} -# FILES_MATCHING PATTERN "*.h" -# PATTERN ".svn" EXCLUDE -# ) - -## Mark other files for installation (e.g. launch and bag files, etc.) -# install(FILES -# # myfile1 -# # myfile2 -# DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} -# ) +install(TARGETS gfxtablet_node + DESTINATION lib/${PROJECT_NAME}) -############# -## Testing ## -############# +install(DIRECTORY launch + DESTINATION share/${PROJECT_NAME}) -## Add gtest based cpp test target and link libraries -# catkin_add_gtest(${PROJECT_NAME}-test test/test_gfxtablet_ros.cpp) -# if(TARGET ${PROJECT_NAME}-test) -# target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME}) -# endif() +if(BUILD_TESTING) + find_package(ament_lint_auto REQUIRED) + # the following line skips the linter which checks for copyrights + # uncomment the line when a copyright and license is not present in all source files + #set(ament_cmake_copyright_FOUND TRUE) + # the following line skips cpplint (only works in a git repo) + # uncomment the line when this package is not in a git repo + #set(ament_cmake_cpplint_FOUND TRUE) + ament_lint_auto_find_test_dependencies() +endif() -## Add folders to be run by python nosetests -# catkin_add_nosetests(test) +ament_package() diff --git a/include/gfxtablet_ros/protocol.h b/include/gfxtablet_ros/protocol.h index 17f362f..bc5fa38 100644 --- a/include/gfxtablet_ros/protocol.h +++ b/include/gfxtablet_ros/protocol.h @@ -14,19 +14,19 @@ struct event_packet char signature[9]; uint16_t version; uint8_t type; /* EVENT_TYPE_... */ - struct { /* required */ +/* struct {*/ /* required */ uint16_t x, y; uint16_t pressure; - }; +/* };*/ - struct { /* only required for EVENT_TYPE_BUTTON */ +/* struct {*/ /* only required for EVENT_TYPE_BUTTON */ int8_t button; /* button id: -1 = stylus in range, 0 = tap/left click/button 0, 1 = button 1, 2 = button 2 */ int8_t down; /* 1 = button down, 0 = button up */ - }; +/* };*/ }; #pragma pack(pop) diff --git a/launch/gfxtablet.launch b/launch/gfxtablet.launch deleted file mode 100644 index 315b98c..0000000 --- a/launch/gfxtablet.launch +++ /dev/null @@ -1,4 +0,0 @@ - - - diff --git a/launch/gfxtablet.launch.xml b/launch/gfxtablet.launch.xml new file mode 100644 index 0000000..c7b8cf2 --- /dev/null +++ b/launch/gfxtablet.launch.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/package.xml b/package.xml index dd3a70f..2f26d0b 100644 --- a/package.xml +++ b/package.xml @@ -1,66 +1,21 @@ - + + gfxtablet_ros - 2.1.0 + 3.0.0 The gfxtablet_ros package - - - - Walter Fetter Lages - - - - - GPLv3 + ament_cmake - - - - - + rclcpp + sensor_msgs - - - - - Walter Fetter Lages + ament_lint_auto + ament_lint_common - - - - - - - - - - - - - - - - - - - - - - catkin - roscpp - sensor_msgs - roscpp - sensor_msgs - roscpp - sensor_msgs - - - - - + ament_cmake diff --git a/src/gfxtablet_node.cpp b/src/gfxtablet_node.cpp index 385605c..ce6f71f 100644 --- a/src/gfxtablet_node.cpp +++ b/src/gfxtablet_node.cpp @@ -1,7 +1,7 @@ /* - gfxtablet_node: A ROS node publishing GfxTablet messages in a Joy message. + gfxtablet_node: A ROS 2 node publishing GfxTablet messages in a Joy message. - Copyright (c) 2016, 2018 Walter Fetter Lages + Copyright (c) 2016, 2018, 2021 Walter Fetter Lages This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -24,21 +24,22 @@ #include #include +#include -#include -#include +#include +#include #include int main(int argc,char* argv[]) { - ros::init(argc,argv,"gfxtablet_node"); - ros::NodeHandle node; + rclcpp::init(argc,argv); + rclcpp::Node node("gfxtablet_node"); int udp_socket; if((udp_socket=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)) == -1) { - ROS_ERROR_STREAM("socket():" << strerror(errno) << "\n"); + RCLCPP_ERROR_STREAM(node.get_logger(),"socket():" << strerror(errno) << "\n"); return -EXIT_FAILURE; } @@ -50,41 +51,41 @@ int main(int argc,char* argv[]) if(bind(udp_socket,(struct sockaddr *)&addr,sizeof(addr)) == -1) { - ROS_ERROR_STREAM("bind():" << strerror(errno) << "\n"); + RCLCPP_ERROR_STREAM(node.get_logger(),"bind():" << strerror(errno) << "\n"); return -EXIT_FAILURE; } struct event_packet ev_pkt; - ros::Publisher pub=node.advertise("joy",100); - sensor_msgs::Joy joy; + auto pub=node.create_publisher("joy",100); + sensor_msgs::msg::Joy joy; joy.axes.resize(3); joy.buttons.resize(2); - ros::Rate loop(100); + rclcpp::Rate loop(100); // every packet has at least 9 bytes - while(ros::ok()) + while(rclcpp::ok()) { - ros::spinOnce(); + rclcpp::spin_some(node.get_node_base_interface()); if(recv(udp_socket,&ev_pkt,sizeof(ev_pkt),0) < 9) continue; if(memcmp(ev_pkt.signature,"GfxTablet",9) != 0) { - ROS_WARN_STREAM("\nGot unknown packet on port " + RCLCPP_WARN_STREAM(node.get_logger(),"\nGot unknown packet on port " << GFXTABLET_PORT << ", ignoring\n"); continue; } ev_pkt.version=ntohs(ev_pkt.version); if(ev_pkt.version != PROTOCOL_VERSION) { - ROS_ERROR_STREAM("\nGfxTablet app speaks protocol version " << ev_pkt.version + RCLCPP_ERROR_STREAM(node.get_logger(),"\nGfxTablet app speaks protocol version " << ev_pkt.version << " but this program speaks version " << PROTOCOL_VERSION << ", please update\n"); break; } - joy.header.stamp=ros::Time::now(); + joy.header.stamp=node.now(); joy.axes[0]=double(ntohs(ev_pkt.x))/UINT16_MAX*2.0 - 1.0; joy.axes[1]=double(ntohs(ev_pkt.y))/UINT16_MAX*2.0 - 1.0; joy.axes[2]=double(ntohs(ev_pkt.pressure))/UINT16_MAX*2.0 - 1.0; @@ -94,15 +95,14 @@ int main(int argc,char* argv[]) case EVENT_TYPE_MOTION: break; case EVENT_TYPE_BUTTON: - if(joy.buttons.size() < ev_pkt.button+2) joy.buttons.resize(ev_pkt.button+2); + if(joy.buttons.size() < (long unsigned int)ev_pkt.button+2) joy.buttons.resize(ev_pkt.button+2); joy.buttons[ev_pkt.button+1]=ev_pkt.down; break; } - pub.publish(joy); + pub->publish(joy); } close(udp_socket); - pub.shutdown(); return 0; }