Go to the documentation of this file.00001
00029 #include "sr_robot_lib/generic_updater.hpp"
00030 #include <boost/foreach.hpp>
00031 #include <iostream>
00032
00033 namespace generic_updater
00034 {
00035 template <class CommandType>
00036 GenericUpdater<CommandType>::GenericUpdater(std::vector<UpdateConfig> update_configs_vector,
00037 operation_mode::device_update_state::DeviceUpdateState update_state)
00038 : nh_tilde("~"), which_data_to_request(0), update_state(update_state), update_configs_vector(
00039 update_configs_vector)
00040 {
00041 mutex = boost::shared_ptr<boost::mutex>(new boost::mutex());
00042
00043 BOOST_FOREACH(UpdateConfig config, update_configs_vector)
00044 {
00045 if (config.when_to_update == -2.0)
00046 {
00047 initialization_configs_vector.push_back(config);
00048 }
00049 else if (config.when_to_update != -1.0)
00050 {
00051 double tmp_dur = config.when_to_update;
00052 ros::Duration duration(tmp_dur);
00053
00054 timers.push_back(
00055 nh_tilde.createTimer(
00056 duration,
00057 boost::bind(&GenericUpdater::timer_callback, this, _1, config.what_to_update)));
00058 }
00059 else
00060 important_update_configs_vector.push_back(config);
00061 }
00062 ROS_DEBUG_STREAM("Init config size"<<initialization_configs_vector.size());
00063 ROS_DEBUG_STREAM("Important config size"<<important_update_configs_vector.size());
00064
00065
00066 if (initialization_configs_vector.size() == 0)
00067 {
00068 ROS_INFO_STREAM("No init command. Switching to operation");
00069 update_state = operation_mode::device_update_state::OPERATION;
00070 }
00071 }
00072
00073 template <class CommandType>
00074 GenericUpdater<CommandType>::~GenericUpdater()
00075 {
00076 }
00077
00078 template <class CommandType>
00079 void GenericUpdater<CommandType>::timer_callback(const ros::TimerEvent& event, int32u data_type)
00080 {
00081 if (update_state == operation_mode::device_update_state::OPERATION)
00082 {
00083 boost::mutex::scoped_lock l(*mutex);
00084 unimportant_data_queue.push(data_type);
00085
00086 ROS_DEBUG_STREAM("Timer: data type = "<<data_type << " | queue size: "<<unimportant_data_queue.size());
00087 }
00088 }
00089
00090
00091 template class GenericUpdater<ETHERCAT_DATA_STRUCTURE_0200_PALM_EDC_COMMAND>;
00092 template class GenericUpdater<ETHERCAT_DATA_STRUCTURE_0230_PALM_EDC_COMMAND>;
00093 template class GenericUpdater<ETHERCAT_DATA_STRUCTURE_0300_PALM_EDC_COMMAND>;
00094 }
00095
00096
00097
00098
00099
00100