diff --git a/smacc/include/smacc/client_bases/smacc_http_client.h b/smacc/include/smacc/client_bases/smacc_http_client.h new file mode 100644 index 000000000..1b8055823 --- /dev/null +++ b/smacc/include/smacc/client_bases/smacc_http_client.h @@ -0,0 +1,190 @@ +#pragma once + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace smacc { +namespace client_bases { + +class session : public std::enable_shared_from_this { + boost::asio::ip::tcp::resolver resolver_; + boost::beast::tcp_stream stream_; + boost::beast::flat_buffer buffer_; // (Must persist between reads) + boost::beast::http::request req_; + boost::beast::http::response res_; + + public: + // Objects are constructed with a strand to + // ensure that handlers do not execute concurrently. + session(boost::asio::io_context &ioc, + const std::function &)> + response) + : resolver_(boost::asio::make_strand(ioc)), + stream_(boost::asio::make_strand(ioc)), + onResponse{response} {} + + // Start the asynchronous operation + void run(const std::string &host, const std::string &port, + const std::string &target, const int &version) { + // Set up an HTTP GET request message + req_.version(version); + req_.method(boost::beast::http::verb::get); + req_.target(target); + req_.set(boost::beast::http::field::host, host); + req_.set(boost::beast::http::field::user_agent, BOOST_BEAST_VERSION_STRING); + + // Look up the domain name + resolver_.async_resolve(host.c_str(), port.c_str(), + boost::beast::bind_front_handler( + &session::on_resolve, shared_from_this())); + } + + void on_resolve(boost::beast::error_code ec, + boost::asio::ip::tcp::resolver::results_type results) { + if (ec) return fail(ec, "resolve"); + + // Set a timeout on the operation + stream_.expires_after(std::chrono::seconds(30)); + + // Make the connection on the IP address we get from a lookup + stream_.async_connect(results, + boost::beast::bind_front_handler(&session::on_connect, + shared_from_this())); + } + + private: + void fail(boost::beast::error_code ec, char const *what) { + std::cerr << what << ": " << ec.message() << "\n"; + res_.result(boost::beast::http::status::bad_request); + res_.reason() = ec.message(); + onResponse(res_); + } + + void on_connect(boost::beast::error_code ec, + boost::asio::ip::tcp::resolver::results_type::endpoint_type) { + if (ec) return fail(ec, "connect"); + + // Set a timeout on the operation + stream_.expires_after(std::chrono::seconds(30)); + + // Send the HTTP request to the remote host + boost::beast::http::async_write( + stream_, req_, + boost::beast::bind_front_handler(&session::on_write, + shared_from_this())); + } + + void on_write(boost::beast::error_code ec, std::size_t bytes_transferred) { + boost::ignore_unused(bytes_transferred); + + if (ec) return fail(ec, "write"); + + // Receive the HTTP response + boost::beast::http::async_read(stream_, buffer_, res_, + boost::beast::bind_front_handler( + &session::on_read, shared_from_this())); + } + + void on_read(boost::beast::error_code ec, std::size_t bytes_transferred) { + boost::ignore_unused(bytes_transferred); + + if (ec) return fail(ec, "read"); + + // Gracefully close the socket + stream_.socket().shutdown(boost::asio::ip::tcp::socket::shutdown_both, ec); + + // not_connected happens sometimes so don't bother reporting it. + if (ec && ec != boost::beast::errc::not_connected) + return fail(ec, "shutdown"); + + // If we get here then the connection is closed gracefully + onResponse(res_); + } + + std::function &response)> + onResponse; +}; + +class SmaccHttpClient : public smacc::ISmaccClient { + public: + boost::optional serverName; + boost::optional timeout; + + SmaccHttpClient() + : worker_guard_{boost::asio::make_work_guard(io_context_)}, + initialized_{false} {} + + SmaccHttpClient(const std::string &serverName, const int &timeout) + : worker_guard_{boost::asio::make_work_guard(io_context_)}, + initialized_{false} { + this->serverName = serverName; + this->timeout = timeout; + } + + ~SmaccHttpClient() { + worker_guard_.reset(); + tcp_connection_runner_.join(); + } + + template + boost::signals2::connection onResponseReceived( + void (T::*callback)(const boost::beast::http::response< + boost::beast::http::string_body> &), + T *object) { + return this->getStateMachine()->createSignalConnection(onResponseReceived_, + callback, object); + } + + template + void onOrthogonalAllocation() {} + + virtual void initialize() { + if (!initialized_) { + if (!timeout) timeout = 2000; // 2s timeout default + if (!serverName) { + ROS_ERROR("Server URL not set, skipping initialisation"); + } else { + ROS_INFO_STREAM("[" << this->getName() + << "] Initialising HTTP client for " << serverName); + tcp_connection_runner_ = std::thread{[&]() { io_context_.run(); }}; + initialized_ = true; + } + } + } + + void makeRequest(const std::string &path) { + std::make_shared(io_context_, runSignal) + ->run(serverName.get(), "80", path, 11); + } + + private: + smacc::SmaccSignal &)> + onResponseReceived_; + + boost::asio::io_context io_context_; + boost::asio::executor_work_guard + worker_guard_; + std::thread tcp_connection_runner_; + + bool initialized_; + + std::function &response)> + runSignal{[&](const boost::beast::http::response< + boost::beast::http::string_body> &response) { + onResponseReceived_(response); + }}; +}; +} // namespace client_bases +} // namespace smacc diff --git a/smacc_sm_reference_library/sm_atomic_http/CHANGELOG.rst b/smacc_sm_reference_library/sm_atomic_http/CHANGELOG.rst new file mode 100644 index 000000000..8347cdb5c --- /dev/null +++ b/smacc_sm_reference_library/sm_atomic_http/CHANGELOG.rst @@ -0,0 +1,114 @@ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Changelog for package sm_atomic +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Forthcoming +----------- + +* creating feature smacc_runtime test +* Merge branch 'master' into melodic-devel +* adding xterm dependency to examples +* Final CbTimer Push +* Merge branch 'master' into melodic-devel +* fixed Doxygen Client Namespaces +* refactoring client namespaces names +* Merge branch 'master' into melodic-devel +* Merge branch 'master' of https://github.com/reelrbtx/SMACC +* Update README.md +* sm_atomic diagrams +* Update README.md +* Update README.md +* Update README.md +* Merge branch 'master' of https://github.com/reelrbtx/SMACC +* Improved sm_atomic +* more formatting & commenting +* renaming runtimeConfiguration to runtimeConfigure +* pushing renaming of runtimeConfigure +* more on smacc behaviors +* Changed static_configure to configure_orthogonal +* unpushed code +* Replaced all smacc::transition's with Transition +* Merge branch 'master' of https://github.com/reelrbtx/SMACC +* Update README.md +* Update README.md +* Adding sm images +* Update README.md +* Update README.md +* Merge branch 'master' of https://github.com/reelrbtx/SMACC +* Update README.md +* adding launch file to sm_atomic +* Renaming transition +* sm dance bot and refactoring namings +* namespaces iteration 3, orthogonal recurrent pattern, more tsts on sm_dance_bot_2 +* more refactoring and renaming examples and namespaces +* progressing in the API and testing timers and callbacks +* ros timer client behaviors, refactoring sm_atomic and logic unit hierarchy. other improvements on rosout +* Update README.md +* Update README.md +* Update README.md +* Update README.md +* Update README.md +* Update README.md +* Create README.md +* more naming refactoring in move_base_z_client +* renaming move_base client to ClMoveBaseZ (zorro) +* renaming orthogonals +* more on refactoring renaming +* adding object tagging to clients, specifically action clients +* renaming consistently SmAtomic +* testing countdown logic unit more refactoring and analyzing propagating issue +* Contributors: Brett Aldrich, Pablo Iñigo Blasco, Pabo Iñigo Blasco, Unknown, Víctor Ferrer García, brett2@reelrobotics.com, brettpac, pablo.inigo.blasco, reelrbtx + +* creating feature smacc_runtime test +* Merge branch 'master' into melodic-devel +* adding xterm dependency to examples +* Final CbTimer Push +* Merge branch 'master' into melodic-devel +* fixed Doxygen Client Namespaces +* refactoring client namespaces names +* Merge branch 'master' into melodic-devel +* Merge branch 'master' of https://github.com/reelrbtx/SMACC +* Update README.md +* sm_atomic diagrams +* Update README.md +* Update README.md +* Update README.md +* Merge branch 'master' of https://github.com/reelrbtx/SMACC +* Improved sm_atomic +* more formatting & commenting +* renaming runtimeConfiguration to runtimeConfigure +* pushing renaming of runtimeConfigure +* more on smacc behaviors +* Changed static_configure to configure_orthogonal +* unpushed code +* Replaced all smacc::transition's with Transition +* Merge branch 'master' of https://github.com/reelrbtx/SMACC +* Update README.md +* Update README.md +* Adding sm images +* Update README.md +* Update README.md +* Merge branch 'master' of https://github.com/reelrbtx/SMACC +* Update README.md +* adding launch file to sm_atomic +* Renaming transition +* sm dance bot and refactoring namings +* namespaces iteration 3, orthogonal recurrent pattern, more tsts on sm_dance_bot_2 +* more refactoring and renaming examples and namespaces +* progressing in the API and testing timers and callbacks +* ros timer client behaviors, refactoring sm_atomic and logic unit hierarchy. other improvements on rosout +* Update README.md +* Update README.md +* Update README.md +* Update README.md +* Update README.md +* Update README.md +* Create README.md +* more naming refactoring in move_base_z_client +* renaming move_base client to ClMoveBaseZ (zorro) +* renaming orthogonals +* more on refactoring renaming +* adding object tagging to clients, specifically action clients +* renaming consistently SmAtomic +* testing countdown logic unit more refactoring and analyzing propagating issue +* Contributors: Brett Aldrich, Pablo Iñigo Blasco, Pabo Iñigo Blasco, Unknown, Víctor Ferrer García, brett2@reelrobotics.com, brettpac, pablo.inigo.blasco, reelrbtx diff --git a/smacc_sm_reference_library/sm_atomic_http/CMakeLists.txt b/smacc_sm_reference_library/sm_atomic_http/CMakeLists.txt new file mode 100644 index 000000000..cfd03e0cf --- /dev/null +++ b/smacc_sm_reference_library/sm_atomic_http/CMakeLists.txt @@ -0,0 +1,51 @@ +cmake_minimum_required(VERSION 3.11.0) +project(sm_atomic_http) + +## Find catkin macros and libraries +find_package(catkin REQUIRED smacc ros_timer_client) + +################################### +## catkin specific configuration ## +################################### +catkin_package() + +########### +## Build ## +########### +set(CMAKE_CXX_STANDARD 14) +add_compile_options(-std=c++11) #workaround for ubuntu 16.04, to extinguish + +## Specify additional locations of header files +## Your package locations should be listed before other locations +include_directories( + include + ${catkin_INCLUDE_DIRS} +) + +## Declare a C++ executable +add_executable(${PROJECT_NAME}_node src/sm_atomic_http_node.cpp) + +## Specify libraries to link a library or executable target against +target_link_libraries(${PROJECT_NAME}_node + ${catkin_LIBRARIES} +) + +############# +## Install ## +############# + +## Mark executables for installation +install(TARGETS ${PROJECT_NAME}_node + RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} +) + +## Mark other files for installation (e.g. launch and config files, etc.) +install(FILES + launch/sm_atomic.launch + DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/launch +) + +install(DIRECTORY + config/ + DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/config +) diff --git a/smacc_sm_reference_library/sm_atomic_http/README.md b/smacc_sm_reference_library/sm_atomic_http/README.md new file mode 100644 index 000000000..2ab9e9fce --- /dev/null +++ b/smacc_sm_reference_library/sm_atomic_http/README.md @@ -0,0 +1,39 @@ +

State Machine Diagram

+ + +

Description

A completely minimal state machine example.

+Doxygen Namespace & Class Reference + +

Build Instructions

+Before you build, make sure you've installed all the dependencies... + +``` +rosdep install --from-paths src --ignore-src -r -y +``` + +Then you build with either catkin build or catkin make... + +``` +catkin build +``` +

Operating Instructions

+After you build, remember to source the proper devel folder... + +``` +source ~/catkin_ws/devel/setup.bash +``` + +And then run the launch file... + +``` +roslaunch sm_atomic sm_atomic.launch +``` + +

Viewer Instructions

+If you have the SMACC Viewer installed then type... + +``` +rosrun smacc_viewer smacc_viewer_node.py +``` + +If you don't have the SMACC Viewer installed, click here for instructions. diff --git a/smacc_sm_reference_library/sm_atomic_http/config/sm_atomic_http_config.yaml b/smacc_sm_reference_library/sm_atomic_http/config/sm_atomic_http_config.yaml new file mode 100644 index 000000000..d9b6656ee --- /dev/null +++ b/smacc_sm_reference_library/sm_atomic_http/config/sm_atomic_http_config.yaml @@ -0,0 +1,2 @@ +SmAtomicHttp: + signal_detector_loop_freq: 20 \ No newline at end of file diff --git a/smacc_sm_reference_library/sm_atomic_http/config/sm_atomic_http_test.yaml b/smacc_sm_reference_library/sm_atomic_http/config/sm_atomic_http_test.yaml new file mode 100644 index 000000000..2a81cc1f0 --- /dev/null +++ b/smacc_sm_reference_library/sm_atomic_http/config/sm_atomic_http_test.yaml @@ -0,0 +1,7 @@ +state_machine_rosparam_ws: /SmAtomicHttp +success_switch: + - type: state_reached + state_name: "sm_atomic_http::State2" +failure_switch: + - type: timeout + duration: 10.0 # sec diff --git a/smacc_sm_reference_library/sm_atomic_http/docs/smacc_state_machine_20200207-004735.dot.pdf b/smacc_sm_reference_library/sm_atomic_http/docs/smacc_state_machine_20200207-004735.dot.pdf new file mode 100644 index 000000000..d59a3fd54 Binary files /dev/null and b/smacc_sm_reference_library/sm_atomic_http/docs/smacc_state_machine_20200207-004735.dot.pdf differ diff --git a/smacc_sm_reference_library/sm_atomic_http/docs/smacc_state_machine_20200207-004740.dot.svg b/smacc_sm_reference_library/sm_atomic_http/docs/smacc_state_machine_20200207-004740.dot.svg new file mode 100644 index 000000000..d7c7310dd --- /dev/null +++ b/smacc_sm_reference_library/sm_atomic_http/docs/smacc_state_machine_20200207-004740.dot.svg @@ -0,0 +1,150 @@ + + + + + + +%3 + +cluster_0 + +sm_atomic::State1 + +cluster_orthogonals_block_0 + + +cluster_Orthogonal_0_0 + +OrTimer + +cluster_statereactor_block_id0 + + +cluster_transition_block_0 + + +cluster_children_block_id0 + + +cluster_1 + +sm_atomic::State2 + +cluster_orthogonals_block_1 + + +cluster_Orthogonal_1_0 + +OrTimer + +cluster_statereactor_block_id1 + + +cluster_transition_block_1 + + +cluster_children_block_id1 + + + +entry_0 + + + +ClRosTimer_0 + +ClRosTimer + + + +CbTimerCountdownLoop_0 + +CbTimerCountdownLoop + + + +CbTimerCountdownOnce_0 + +CbTimerCountdownOnce + + + + + +EvTimer_sm_atomic::State2_0 + +SUCCESS + + +CbTimerCountdownOnce_0:e->EvTimer_sm_atomic::State2_0:w + + +EvTimer + + + + + + +entry_1 + + + +EvTimer_sm_atomic::State2_0:e->entry_1:w + + + + + + + +initial_sm_node + + + +initial_sm_node->entry_0 + + + + +ClRosTimer_1 + +ClRosTimer + + + +CbTimerCountdownOnce_1 + +CbTimerCountdownOnce + + + + + +EvTimer_sm_atomic::State1_1 + +SUCCESS + + +CbTimerCountdownOnce_1:e->EvTimer_sm_atomic::State1_1:w + + +EvTimer + + + + + + +EvTimer_sm_atomic::State1_1:e->entry_0:w + + + + + + + + diff --git a/smacc_sm_reference_library/sm_atomic_http/include/sm_atomic_http/clients/cl_http.h b/smacc_sm_reference_library/sm_atomic_http/include/sm_atomic_http/clients/cl_http.h new file mode 100644 index 000000000..289a543f1 --- /dev/null +++ b/smacc_sm_reference_library/sm_atomic_http/include/sm_atomic_http/clients/cl_http.h @@ -0,0 +1,14 @@ +#include +#include + +namespace sm_atomic_http { + +template +struct EvHttp : sc::event> {}; + +class ClHttp : public smacc::client_bases::SmaccHttpClient { + public: + ClHttp(const std::string& server, const int& timeout) + : smacc::client_bases::SmaccHttpClient(server, timeout) {} +}; +} // namespace sm_atomic_http diff --git a/smacc_sm_reference_library/sm_atomic_http/include/sm_atomic_http/clients/client_behaviors/cb_request.h b/smacc_sm_reference_library/sm_atomic_http/include/sm_atomic_http/clients/client_behaviors/cb_request.h new file mode 100644 index 000000000..141acc217 --- /dev/null +++ b/smacc_sm_reference_library/sm_atomic_http/include/sm_atomic_http/clients/client_behaviors/cb_request.h @@ -0,0 +1,40 @@ +#include + +namespace sm_atomic_http { + +class CbRequest : public smacc::ISmaccClientBehavior { + public: + void onEntry() override { + ClHttp* cl_http; + this->requiresClient(cl_http); + cl_http->onResponseReceived(&CbRequest::onResponseReceived, this); + + cl_http->makeRequest("/"); + } + + void onResponseReceived( + const boost::beast::http::response& + response) { + if (response.result_int() == 200) { + ROS_INFO("Good response received"); + ROS_INFO_STREAM(response.body()); + ROS_INFO_STREAM(response.result_int()); + ROS_INFO_STREAM(response.base()); + exitState(); + } else { + ROS_WARN("Response error: %s", response.reason()); + } + } + + template + void onOrthogonalAllocation() { + exitState = [=]() { + this->postEvent>(); + }; + } + + private: + std::function exitState; +}; + +} // namespace sm_atomic_http diff --git a/smacc_sm_reference_library/sm_atomic_http/include/sm_atomic_http/orthogonals/or_http.h b/smacc_sm_reference_library/sm_atomic_http/include/sm_atomic_http/orthogonals/or_http.h new file mode 100644 index 000000000..afed20aa9 --- /dev/null +++ b/smacc_sm_reference_library/sm_atomic_http/include/sm_atomic_http/orthogonals/or_http.h @@ -0,0 +1,11 @@ +#include + +namespace sm_atomic_http { +class OrHttp : public smacc::Orthogonal { + public: + virtual void onInitialize() override { + auto client = this->createClient("www.example.com", 2000); + client->initialize(); + } +}; +} // namespace sm_atomic_http diff --git a/smacc_sm_reference_library/sm_atomic_http/include/sm_atomic_http/orthogonals/or_timer.h b/smacc_sm_reference_library/sm_atomic_http/include/sm_atomic_http/orthogonals/or_timer.h new file mode 100644 index 000000000..79ec3d7fd --- /dev/null +++ b/smacc_sm_reference_library/sm_atomic_http/include/sm_atomic_http/orthogonals/or_timer.h @@ -0,0 +1,15 @@ +#include +#include + +namespace sm_atomic_http +{ +class OrTimer : public smacc::Orthogonal +{ +public: + virtual void onInitialize() override + { + auto client = this->createClient(ros::Duration(1)); + client->initialize(); + } +}; +} // namespace sm_atomic \ No newline at end of file diff --git a/smacc_sm_reference_library/sm_atomic_http/include/sm_atomic_http/sm_atomic_http.h b/smacc_sm_reference_library/sm_atomic_http/include/sm_atomic_http/sm_atomic_http.h new file mode 100644 index 000000000..3de7217d4 --- /dev/null +++ b/smacc_sm_reference_library/sm_atomic_http/include/sm_atomic_http/sm_atomic_http.h @@ -0,0 +1,39 @@ +#include + +// CLIENTS +#include +#include + +// ORTHOGONALS +#include +#include + +// CLIENT BEHAVIORS +#include +#include + +using namespace boost; +using namespace smacc; + +namespace sm_atomic_http { + +// STATE +class State1; +class State2; + +//-------------------------------------------------------------------- +// STATE_MACHINE +struct SmAtomicHttp + : public smacc::SmaccStateMachineBase { + using SmaccStateMachineBase::SmaccStateMachineBase; + + virtual void onInitialize() override { + this->createOrthogonal(); + this->createOrthogonal(); + } +}; + +} // namespace sm_atomic_http + +#include +#include \ No newline at end of file diff --git a/smacc_sm_reference_library/sm_atomic_http/include/sm_atomic_http/states/st_state_1.h b/smacc_sm_reference_library/sm_atomic_http/include/sm_atomic_http/states/st_state_1.h new file mode 100644 index 000000000..977ca7a33 --- /dev/null +++ b/smacc_sm_reference_library/sm_atomic_http/include/sm_atomic_http/states/st_state_1.h @@ -0,0 +1,42 @@ +#include + +namespace sm_atomic_http +{ +using namespace cl_ros_timer; +using namespace smacc::default_transition_tags; + +// STATE DECLARATION +struct State1 : smacc::SmaccState +{ + using SmaccState::SmaccState; + +// TRANSITION TABLE + typedef mpl::list< + + Transition, State2, SUCCESS> + + >reactions; + + +// STATE FUNCTIONS + static void staticConfigure() + { + configure_orthogonal(5); // EvTimer triggers once at 10 client ticks + } + + void runtimeConfigure() + { + } + + void onEntry() + { + ROS_INFO("On Entry!"); + } + + void onExit() + { + ROS_INFO("On Exit!"); + } + +}; +} // namespace sm_atomic \ No newline at end of file diff --git a/smacc_sm_reference_library/sm_atomic_http/include/sm_atomic_http/states/st_state_2.h b/smacc_sm_reference_library/sm_atomic_http/include/sm_atomic_http/states/st_state_2.h new file mode 100644 index 000000000..5f32394d7 --- /dev/null +++ b/smacc_sm_reference_library/sm_atomic_http/include/sm_atomic_http/states/st_state_2.h @@ -0,0 +1,40 @@ +#include + +namespace sm_atomic_http +{ +// STATE DECLARATION +struct State2 : smacc::SmaccState +{ + using SmaccState::SmaccState; + +// TRANSITION TABLE + typedef mpl::list< + + Transition, State1, SUCCESS> + + >reactions; + + +// STATE FUNCTIONS + static void staticConfigure() + { + configure_orthogonal(); // EvTimer triggers once at 10 client ticks + } + + void runtimeConfigure() + { + ROS_INFO("Entering State2"); + } + + void onEntry() + { + ROS_INFO("On Entry!"); + } + + void onExit() + { + ROS_INFO("On Exit!"); + } + +}; +} \ No newline at end of file diff --git a/smacc_sm_reference_library/sm_atomic_http/launch/sm_atomic.launch b/smacc_sm_reference_library/sm_atomic_http/launch/sm_atomic.launch new file mode 100644 index 000000000..a54a4611e --- /dev/null +++ b/smacc_sm_reference_library/sm_atomic_http/launch/sm_atomic.launch @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/smacc_sm_reference_library/sm_atomic_http/package.xml b/smacc_sm_reference_library/sm_atomic_http/package.xml new file mode 100644 index 000000000..a19e94e9f --- /dev/null +++ b/smacc_sm_reference_library/sm_atomic_http/package.xml @@ -0,0 +1,37 @@ + + + sm_atomic_http + 0.9.1 + The sm_atomic_http package + + + Jacobus C. Lock + + + + BSD-3 + + + + + + + + + + + + + catkin + roscpp + smacc + ros_timer_client + xterm + smacc_runtime_test + + + + + + + \ No newline at end of file diff --git a/smacc_sm_reference_library/sm_atomic_http/src/sm_atomic_http_node.cpp b/smacc_sm_reference_library/sm_atomic_http/src/sm_atomic_http_node.cpp new file mode 100644 index 000000000..d4e4f6273 --- /dev/null +++ b/smacc_sm_reference_library/sm_atomic_http/src/sm_atomic_http_node.cpp @@ -0,0 +1,10 @@ +#include + +//-------------------------------------------------------------------- +int main(int argc, char **argv) +{ + ros::init(argc, argv, "sm_atomic_htt"); + ros::NodeHandle nh; + + smacc::run(); +} \ No newline at end of file diff --git a/smacc_sm_reference_library/sm_atomic_http/test/sm_atomic.test b/smacc_sm_reference_library/sm_atomic_http/test/sm_atomic.test new file mode 100644 index 000000000..dcdc7eb62 --- /dev/null +++ b/smacc_sm_reference_library/sm_atomic_http/test/sm_atomic.test @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file