Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00024 #include "sr_ronex_controllers/spi_base_controller.hpp"
00025 #include "pluginlib/class_list_macros.h"
00026
00027 namespace ronex
00028 {
00029 SPIBaseController::SPIBaseController()
00030 : loop_count_(0), command_queue_(NUM_SPI_OUTPUTS), status_queue_(NUM_SPI_OUTPUTS)
00031 {}
00032
00033 bool SPIBaseController::init(ros_ethercat_model::RobotState* robot, ros::NodeHandle &n)
00034 {
00035 return pre_init_(robot, n);
00036 }
00037
00038 bool SPIBaseController::pre_init_(ros_ethercat_model::RobotState* robot, ros::NodeHandle &n)
00039 {
00040 assert(robot);
00041 node_ = n;
00042
00043 std::string ronex_id;
00044 if (!node_.getParam("ronex_id", ronex_id)) {
00045 ROS_ERROR("No RoNeX ID given (namespace: %s)", node_.getNamespace().c_str());
00046 return false;
00047 }
00048
00049
00050 std::string path;
00051 int parameter_id = get_ronex_param_id(ronex_id);
00052 {
00053 if( parameter_id == -1 )
00054 {
00055 ROS_ERROR_STREAM("Could not find the RoNeX id in the parameter server: " << ronex_id << " not loading the controller.");
00056 return false;
00057 }
00058 else
00059 {
00060 std::stringstream ss;
00061 ss << "/ronex/devices/" << parameter_id << "/path";
00062 if( !ros::param::get(ss.str(), path) )
00063 {
00064 ROS_ERROR_STREAM("Couldn't read the parameter " << ss.str() << " from the parameter server. Not loading the controller.");
00065 return false;
00066 }
00067 }
00068 }
00069 topic_prefix_ = path;
00070
00071 spi_ = static_cast<ronex::SPI*>( robot->getCustomHW(path) );
00072 if( spi_ == NULL)
00073 {
00074 ROS_ERROR_STREAM("Could not find RoNeX module: " << ronex_id << " not loading the controller");
00075 return false;
00076 }
00077
00078 return true;
00079 }
00080
00081 void SPIBaseController::starting(const ros::Time&)
00082 {
00083
00084 }
00085
00089 void SPIBaseController::update(const ros::Time&, const ros::Duration&)
00090 {
00091 for (uint16_t spi_index = 0; spi_index < NUM_SPI_OUTPUTS; ++spi_index)
00092 {
00093
00094 if( status_queue_[spi_index].size() > 0)
00095 {
00096 if( status_queue_[spi_index].front().second == NULL )
00097 {
00098 if(new_command)
00099 {
00100 new_command = false;
00101 spi_->nullify_command(spi_index);
00102 continue;
00103 }
00104
00105
00106
00107 if( spi_->state_->command_type == RONEX_COMMAND_02000002_COMMAND_TYPE_NORMAL );
00108 {
00109 status_queue_[spi_index].front().second = new SPI_PACKET_IN(spi_->state_->info_type.status_data.spi_in[spi_index]);
00110 }
00111 }
00112 }
00113
00114 if( command_queue_[spi_index].empty() )
00115 spi_->nullify_command(spi_index);
00116 else
00117 {
00118
00119
00120
00121
00122 status_queue_[spi_index].push(std::pair<SplittedSPICommand*, SPI_PACKET_IN*>());
00123 status_queue_[spi_index].front().first = command_queue_[spi_index].front();
00124
00125
00126 copy_splitted_to_cmd_(spi_index);
00127
00128 new_command = true;
00129
00130
00131
00132
00133 command_queue_[spi_index].pop();
00134 }
00135 }
00136 }
00137
00138 void SPIBaseController::copy_splitted_to_cmd_(uint16_t spi_index)
00139 {
00140
00141 uint16_t bit_mask_CS = PIN_OUTPUT_STATE_CS_0 | PIN_OUTPUT_STATE_CS_1 | PIN_OUTPUT_STATE_CS_2 | PIN_OUTPUT_STATE_CS_3;
00142 uint16_t bit_mask_no_CS = ~bit_mask_CS;
00143 uint16_t bit_mask_one_CS_bit = PIN_OUTPUT_STATE_CS_0 << spi_index;
00144
00145
00146
00147 spi_->command_->pin_output_states_pre &= bit_mask_CS;
00148
00149 spi_->command_->pin_output_states_pre |= (cmd_pin_output_states_pre_ & bit_mask_no_CS);
00150
00151 spi_->command_->pin_output_states_pre &= (~bit_mask_one_CS_bit);
00152 spi_->command_->pin_output_states_pre |= (cmd_pin_output_states_pre_ & bit_mask_one_CS_bit);
00153
00154
00155
00156 spi_->command_->pin_output_states_post &= bit_mask_CS;
00157
00158 spi_->command_->pin_output_states_post |= (cmd_pin_output_states_post_ & bit_mask_no_CS);
00159
00160 spi_->command_->pin_output_states_post &= (~bit_mask_one_CS_bit);
00161 spi_->command_->pin_output_states_post |= (cmd_pin_output_states_post_ & bit_mask_one_CS_bit);
00162
00163
00164 spi_->command_->spi_out[spi_index].clock_divider = command_queue_[spi_index].front()->packet.clock_divider;
00165 spi_->command_->spi_out[spi_index].SPI_config = command_queue_[spi_index].front()->packet.SPI_config;
00166 spi_->command_->spi_out[spi_index].inter_byte_gap = command_queue_[spi_index].front()->packet.inter_byte_gap;
00167 spi_->command_->spi_out[spi_index].num_bytes = command_queue_[spi_index].front()->packet.num_bytes;
00168
00169 for(size_t i = 0; i < SPI_TRANSACTION_MAX_SIZE; ++i)
00170 spi_->command_->spi_out[spi_index].data_bytes[i] = command_queue_[spi_index].front()->packet.data_bytes[i];
00171 }
00172 }
00173
00174
00175
00176
00177
00178