diff --git a/tm_driver/include/tm_driver/tm_robot_state.h b/tm_driver/include/tm_driver/tm_robot_state.h index fa7b8ec..829bd8a 100755 --- a/tm_driver/include/tm_driver/tm_robot_state.h +++ b/tm_driver/include/tm_driver/tm_robot_state.h @@ -91,109 +91,171 @@ class TmRobotState ~TmRobotState(); public: - unsigned char is_linked() { return tmRobotStateDataToPublish.is_linked; } - unsigned char has_error() { return tmRobotStateDataToPublish.has_error; } - bool is_data_table_correct() { return isDataTableCorrect; } - unsigned char is_project_running() { return tmRobotStateDataToPublish.is_proj_running; } - unsigned char is_project_paused() { return tmRobotStateDataToPublish.is_proj_paused; } - unsigned char is_safeguard_A() { return tmRobotStateDataToPublish.is_safeguard_A_triggered; } - unsigned char is_EStop() { return tmRobotStateDataToPublish.is_ESTOP_pressed; } - unsigned char camera_light() { return tmRobotStateDataToPublish.camera_light; } // R/W - int error_code() { return tmRobotStateDataToPublish.error_code; } + unsigned char is_linked() const { + std::lock_guard lck(_deserialize_mtx); + return tmRobotStateDataToPublish.is_linked; + } + unsigned char has_error() const { + std::lock_guard lck(_deserialize_mtx); + return tmRobotStateDataToPublish.has_error; + } + bool is_data_table_correct() const { + std::lock_guard lck(_deserialize_mtx); + return isDataTableCorrect; + } + unsigned char is_project_running() const { + std::lock_guard lck(_deserialize_mtx); + return tmRobotStateDataToPublish.is_proj_running; + } + unsigned char is_project_paused() const { + std::lock_guard lck(_deserialize_mtx); + return tmRobotStateDataToPublish.is_proj_paused; + } + unsigned char is_safeguard_A() const { + std::lock_guard lck(_deserialize_mtx); + return tmRobotStateDataToPublish.is_safeguard_A_triggered; + } + unsigned char is_EStop() const { + std::lock_guard lck(_deserialize_mtx); + return tmRobotStateDataToPublish.is_ESTOP_pressed; + } + unsigned char camera_light() const { + std::lock_guard lck(_deserialize_mtx); + return tmRobotStateDataToPublish.camera_light; + } // R/W + int error_code() const { + std::lock_guard lck(_deserialize_mtx); + return tmRobotStateDataToPublish.error_code; + } std::optional robot_model() const; std::optional is_model_s() const; - std::string error_content() { return ""; } + std::string error_content() const { return ""; } - std::vector flange_pose() { + std::vector flange_pose() const { + std::lock_guard lck(_deserialize_mtx); std::vector flangePose; flangePose.assign(6, 0.0); si_pose(flangePose, tmRobotStateDataToPublish.flange_pose, 6); return flangePose; } - std::vector joint_angle(){ + std::vector joint_angle() const { + std::lock_guard lck(_deserialize_mtx); std::vector jointAngle; jointAngle.assign(6, 0.0); jointAngle = rads(tmRobotStateDataToPublish.joint_angle, 6); return jointAngle; } - std::vector tool_pose(){ + std::vector tool_pose() const { + std::lock_guard lck(_deserialize_mtx); std::vector toolPose; toolPose.assign(6, 0.0); si_pose(toolPose, tmRobotStateDataToPublish.tool_pose, 6); return toolPose; } - std::vector tcp_force_vec(){ + std::vector tcp_force_vec() const { + std::lock_guard lck(_deserialize_mtx); std::vector tcpForceVec; tcpForceVec.assign(3, 0.0); for (int i = 0; i < 3; ++i) { tcpForceVec[i] = double(tmRobotStateDataToPublish.tcp_force_vec[i]); } return tcpForceVec; } - double tcp_force() { + double tcp_force() const { + std::lock_guard lck(_deserialize_mtx); return tmRobotStateDataToPublish.tcp_force; } - std::vector tcp_speed_vec(){ + std::vector tcp_speed_vec() const { + std::lock_guard lck(_deserialize_mtx); std::vector tcpSpeedVec; tcpSpeedVec.assign(6, 0.0); si_pose(tcpSpeedVec, tmRobotStateDataToPublish.tcp_speed_vec, 6); return tcpSpeedVec; } - double tcp_speed() { return tmRobotStateDataToPublish.tcp_speed; } - std::vector joint_speed(){ + double tcp_speed() const + { + std::lock_guard lck(_deserialize_mtx); + return tmRobotStateDataToPublish.tcp_speed; + } + std::vector joint_speed() const { + std::lock_guard lck(_deserialize_mtx); std::vector jointSpeed; jointSpeed.assign(6, 0.0); jointSpeed = rads( tmRobotStateDataToPublish.joint_speed, 6); return jointSpeed; - } - std::vector joint_torque(){ + } + + std::vector joint_torque() const { + std::lock_guard lck(_deserialize_mtx); std::vector jointTorque; jointTorque.assign(6, 0.0); jointTorque = meters( tmRobotStateDataToPublish.joint_torque, 6); return jointTorque; } - std::vector joint_torque_average(){ + std::vector joint_torque_average() const { + std::lock_guard lck(_deserialize_mtx); std::vector jointTorqueAverage; jointTorqueAverage.assign(6, 0.0); jointTorqueAverage = meters( tmRobotStateDataToPublish.joint_torque_average, 6); return jointTorqueAverage; } - std::vector joint_torque_min() { + std::vector joint_torque_min() const { + std::lock_guard lck(_deserialize_mtx); std::vector jointTorqueMin; jointTorqueMin.assign(6, 0.0); jointTorqueMin = meters( tmRobotStateDataToPublish.joint_torque_min, 6); return jointTorqueMin; } - std::vector joint_torque_max() { + std::vector joint_torque_max() const { + std::lock_guard lck(_deserialize_mtx); std::vector jointTorqueMax; jointTorqueMax.assign(6, 0.0); jointTorqueMax = meters( tmRobotStateDataToPublish.joint_torque_max, 6); return jointTorqueMax; } - int32_t project_speed() { return tmRobotStateDataToPublish.proj_speed; } - int ma_mode() { return tmRobotStateDataToPublish.ma_mode; } - unsigned char stick_play_pause() { return tmRobotStateDataToPublish.stick_play_pause; } // R/W - int32_t robot_light() { return tmRobotStateDataToPublish.robot_light; } + int32_t project_speed() const { + std::lock_guard lck(_deserialize_mtx); + return tmRobotStateDataToPublish.proj_speed; + } + int ma_mode() const { + std::lock_guard lck(_deserialize_mtx); + return tmRobotStateDataToPublish.ma_mode; + } + unsigned char stick_play_pause() const { + std::lock_guard lck(_deserialize_mtx); + return tmRobotStateDataToPublish.stick_play_pause; + } + int32_t robot_light() const { + std::lock_guard lck(_deserialize_mtx); + return tmRobotStateDataToPublish.robot_light; + } - std::vector ctrller_DO(){ + std::vector ctrller_DO() const { + std::lock_guard lck(_deserialize_mtx); return std::vector (tmRobotStateDataToPublish.ctrller_DO.begin(), tmRobotStateDataToPublish.ctrller_DO.end()); } - std::vector ctrller_DI() { + std::vector ctrller_DI() const { + std::lock_guard lck(_deserialize_mtx); return std::vector (tmRobotStateDataToPublish.ctrller_DI.begin(), tmRobotStateDataToPublish.ctrller_DI.end()); } - std::vector ctrller_AO(){ + std::vector ctrller_AO() const { + std::lock_guard lck(_deserialize_mtx); return std::vector (tmRobotStateDataToPublish.ctrller_AO.begin(), tmRobotStateDataToPublish.ctrller_AO.end()); } - std::vector ctrller_AI(){ - return std::vector (tmRobotStateDataToPublish.ctrller_AI.begin(), tmRobotStateDataToPublish.ctrller_AI.end()); - } - std::vector ee_DO(){ - return std::vector (tmRobotStateDataToPublish.ee_DO.begin(), tmRobotStateDataToPublish.ee_DO.end()); + std::vector ctrller_AI() const { + std::lock_guard lck(_deserialize_mtx); + return std::vector (tmRobotStateDataToPublish.ctrller_AI.begin(), tmRobotStateDataToPublish.ctrller_AI.end()); + } + std::vector ee_DO() const { + std::lock_guard lck(_deserialize_mtx); + return std::vector (tmRobotStateDataToPublish.ee_DO.begin(), tmRobotStateDataToPublish.ee_DO.end()); } - std::vector ee_DI(){ + std::vector ee_DI() const { + std::lock_guard lck(_deserialize_mtx); return std::vector (tmRobotStateDataToPublish.ee_DI.begin(), tmRobotStateDataToPublish.ee_DI.end()); } - std::vector ee_AI(){ - return std::vector (tmRobotStateDataToPublish.ee_AI.begin(), tmRobotStateDataToPublish.ee_AI.end()); + std::vector ee_AI() const { + std::lock_guard lck(_deserialize_mtx); + return std::vector (tmRobotStateDataToPublish.ee_AI.begin(), tmRobotStateDataToPublish.ee_AI.end()); } @@ -275,4 +337,5 @@ class TmRobotState void set_receive_state(TmCommRC state); void update_tm_robot_publish_state(); void print(); + mutable std::mutex _deserialize_mtx; }; diff --git a/tm_driver/src/tm_robot_state.cpp b/tm_driver/src/tm_robot_state.cpp index 0104828..e6c8125 100755 --- a/tm_driver/src/tm_robot_state.cpp +++ b/tm_driver/src/tm_robot_state.cpp @@ -307,7 +307,10 @@ size_t TmRobotState::_deserialize(const char *data, size_t size) } multiThreadCache.set_catch_data(tmRobotStateDataFromEthernet); - tmRobotStateDataToPublish = *_data_table->get_rsd(); + { + std::lock_guard lck(_deserialize_mtx); + tmRobotStateDataToPublish = *_data_table->get_rsd(); + } static bool print_model = true; const auto model = robot_model(); @@ -331,6 +334,7 @@ void TmRobotState::set_receive_state(TmCommRC state){ std::optional TmRobotState::robot_model() const { + std::lock_guard lck(_deserialize_mtx); auto robot_name_item_it = _data_table->find("Robot_Model"); if (robot_name_item_it == _data_table->end() || !robot_name_item_it->second.checked || tmRobotStateDataFromEthernet.robot_model[0] == '\0') { return std::nullopt;