diff --git a/CMakeLists.txt b/CMakeLists.txt
index f470257..f2d200f 100755
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -7,7 +7,7 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
option(CMAKE_EXPORT_COMPILE_COMMANDS "Export compile command" TRUE)
-project(lebai VERSION 1.0.8 LANGUAGES CXX)
+project(lebai VERSION 1.0.9 LANGUAGES CXX)
set(PROJECT_NAMESPACE lebai)
message(STATUS "${PROJECT_NAME} version: ${PROJECT_VERSION}")
# message(STATUS "major: ${PROJECT_VERSION_MAJOR}")
diff --git a/Doxyfile b/Doxyfile
index 9fd05c8..785513a 100644
--- a/Doxyfile
+++ b/Doxyfile
@@ -38,7 +38,7 @@ PROJECT_NAME = "lebai sdk"
# could be handy for archiving the generated documentation or if some version
# control system is used.
-PROJECT_NUMBER = 1.0.8
+PROJECT_NUMBER = 1.0.9
# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer a
diff --git a/TODO.md b/TODO.md
index f850fdc..fb65cb1 100644
--- a/TODO.md
+++ b/TODO.md
@@ -1,6 +1,6 @@
# TODO
-## v1.0.8
+## v1.0.9
- [x] SDK版本
- [x] 系统控制-reboot
diff --git a/doc/changelog.md b/doc/changelog.md
index 2ecc3d0..fd84f72 100644
--- a/doc/changelog.md
+++ b/doc/changelog.md
@@ -1,5 +1,11 @@
# ChangeLog
+## 1.0.9
+
+修正文档错误
+
+修正rpc的逻辑错误,该逻辑错误导致rpc调用可能卡死的问题。
+
## 1.0.8
添加关节跟随运动的接口towardj
diff --git a/sdk/include/lebai/robot.hh b/sdk/include/lebai/robot.hh
index 69dabe3..49c84b2 100644
--- a/sdk/include/lebai/robot.hh
+++ b/sdk/include/lebai/robot.hh
@@ -117,8 +117,8 @@ namespace lebai
* \brief 机械臂状态相关的接口.
*/
- /** \addtogroup IO Input and Output
- * \brief IO相关的接口
+ /** \addtogroup IO 通用输入输出
+ * \brief 通用输入输出相关的接口
*/
/** \defgroup CLAW 夹爪.
@@ -394,7 +394,7 @@ namespace lebai
* 11 | 示教中 | 机器人处于示教模式中
* 12 | 已停止 | 机器人处于停止状态,非急停状态
*
- * @note See state here.
+ * @note 查看 具体信息.
*/
int get_robot_mode();
/**
@@ -447,13 +447,13 @@ namespace lebai
/**
* @brief 获取机械臂关节当前反馈力矩
*
- * @return * std::vector
+ * @return 关节当前反馈力矩
*/
std::vector get_actual_joint_torques();
/**
* @brief 获取机械臂关节当前控制力矩
*
- * @return * std::vector
+ * @return 关节当前控制力矩
*/
std::vector get_target_joint_torques();
@@ -462,74 +462,88 @@ namespace lebai
* @{
*/
/**
- * @brief 设置控制箱数字输出
- *
+ * @brief 设置数字输出
+ * @param device 设备类型,以字符串形式传入,包括 `ROBOT`, `FLANGE`, `EXTRA`, `SHOULDER`, `FLANGE_BTN`
+ * 查看 详细信息.
* @param pin 端口,从 0 开始
* @param value 待设置的值
*/
void set_do(std::string device, unsigned int pin, unsigned int value);
/**
- * @brief 获取控制箱数字输出
- *
+ * @brief 获取数字输出
+ * @param device 设备类型,以字符串形式传入,包括 `ROBOT`, `FLANGE`, `EXTRA`, `SHOULDER`, `FLANGE_BTN`
+ * 查看 详细信息.
* @param pin 端口,从 0 开始
- * @return 返回输入数值
+ * @return 返回数字输出数值
*/
unsigned int get_do(std::string device, unsigned int pin);
/**
- * @brief 获取控制箱数字输出
- *
- * @param pin 端口,从 0 开始
- * @return 返回输入数值
+ * @brief 获取多个数字输出
+ * @param device 设备类型,以字符串形式传入,包括 `ROBOT`, `FLANGE`, `EXTRA`, `SHOULDER`, `FLANGE_BTN`
+ * 查看 详细信息.
+ * @param pin 起始数字输出端口,从 0 开始
+ * @param num 连续的数字输出个数
+ * @return 返回多个数字输出数值
*/
std::vector get_dos(std::string device, unsigned int pin, unsigned int num);
/**
- * @brief 获取控制箱数字输入
- *
+ * @brief 获取数字输入
+ * @param device 设备类型,以字符串形式传入,包括 `ROBOT`, `FLANGE`, `EXTRA`, `SHOULDER`, `FLANGE_BTN`
+ * 查看 详细信息.
* @param pin 端口,从 0 开始
* @return 返回输入数值
*/
unsigned int get_di(std::string device, unsigned int pin);
/**
- * @brief 获取控制箱数字输入
- *
- * @param pin 端口,从 0 开始
- * @return 返回输入数值
+ * @brief 获取多个数字输入
+ * @param device 设备类型,以字符串形式传入,包括 `ROBOT`, `FLANGE`, `EXTRA`, `SHOULDER`, `FLANGE_BTN`
+ * 查看 详细信息.
+ * @param pin 起始数字输入端口,从 0 开始
+ * @param num 连续的数字输入个数
+ * @return 返回多个数字输入
*/
std::vector get_dis(std::string device, unsigned int pin, unsigned int num);
/**
- * @brief 设置控制箱数字输出
- *
- * @param pin: 端口,从 0 开始
- * @param value: 待设置的值
+ * @brief 设置模拟输出
+ * @param device 设备类型,以字符串形式传入,包括 `ROBOT`, `FLANGE`, `EXTRA`, `SHOULDER`, `FLANGE_BTN`
+ * 查看 详细信息.
+ * @param pin: 模拟输出端口,从 0 开始
+ * @param value: 待设置的模拟输出值
*/
void set_ao(std::string device, unsigned int pin, double value);
/**
- * @brief 获取控制箱模拟输入
- *
+ * @brief 获取模拟输出
+ * @param device 设备类型,以字符串形式传入,包括 `ROBOT`, `FLANGE`, `EXTRA`, `SHOULDER`, `FLANGE_BTN`
+ * 查看 详细信息.
* @param pin: 端口,从 0 开始
- * @return 返回输入数值
+ * @return 返回模拟输入数值
*/
double get_ao(std::string device, unsigned int pin);
/**
- * @brief 获取控制箱模拟输入
- *
- * @param pin: 端口,从 0 开始
- * @return 返回输入数值
+ * @brief 获取多个模拟输出
+ * @param device 设备类型,以字符串形式传入,包括 `ROBOT`, `FLANGE`, `EXTRA`, `SHOULDER`, `FLANGE_BTN`
+ * 查看 详细信息.
+ * @param pin: 起始模拟输出端口,从 0 开始
+ * @param num 连续的模拟输出个数
+ * @return 返回模拟输出数值
*/
std::vector get_aos(std::string device, unsigned int pin, unsigned int num);
/**
- * @brief 获取控制箱模拟输入
- *
+ * @brief 获取模拟输入
+ * @param device 设备类型,以字符串形式传入,包括 `ROBOT`, `FLANGE`, `EXTRA`, `SHOULDER`, `FLANGE_BTN`
+ * 查看 详细信息.
* @param pin: 端口,从 0 开始
- * @return 返回输入数值
+ * @return 返回模拟输入数值
*/
double get_ai(std::string device, unsigned int pin);
/**
- * @brief 获取控制箱模拟输入
- *
- * @param pin: 端口,从 0 开始
- * @return 返回输入数值
+ * @brief 获取多个模拟输入
+ * @param device 设备类型,以字符串形式传入,包括 `ROBOT`, `FLANGE`, `EXTRA`, `SHOULDER`, `FLANGE_BTN`
+ * 查看 详细信息.
+ * @param pin: 起始模拟输入端口,从 0 开始
+ * @param num 连续的模拟输入个数
+ * @return 返回多个模拟输入数值
*/
std::vector get_ais(std::string device, unsigned int pin, unsigned int num);
/** @}*/
diff --git a/sdk/src/jsonrpc_connector.cc b/sdk/src/jsonrpc_connector.cc
index 50182f6..d22ab99 100755
--- a/sdk/src/jsonrpc_connector.cc
+++ b/sdk/src/jsonrpc_connector.cc
@@ -118,11 +118,11 @@ int JSONRpcConnector::CallRpc(const std::string & method, const std::string & re
std::string jsonrpc_resp;
jsonrpc_req = ToJSONRpcReqString(call_jsonrpc_id, method, req_data_str);
// std::cout<<"jsonrpc_req id:"< guard(promises_map_mutex_);
std::string message_str = msg->get_payload();
int callback_jsonrpc_id;
int error_code;
@@ -90,7 +91,7 @@ namespace lebai
return;
}
else
- {
+ {
if(promises_.find(callback_jsonrpc_id) != promises_.end())
{
if(ret == JSONRpcRespParseResult::kResult)
@@ -103,7 +104,9 @@ namespace lebai
promises_[callback_jsonrpc_id]->set_value(std::make_tuple(error_code, resp_data_str));
promises_.erase(callback_jsonrpc_id);
}
-
+ }
+ else{
+ // Should not happen
}
}
}
@@ -120,6 +123,7 @@ namespace lebai
std::future> createPromise(int rpc_id)
{
+ std::lock_guard guard(promises_map_mutex_);
promises_[rpc_id] = std::make_unique>>();
return promises_[rpc_id]->get_future();;
}
@@ -137,6 +141,7 @@ namespace lebai
std::string uri_;
std::string server_;
std::string error_reason_;
+ std::mutex promises_map_mutex_;
};
// std::ostream& operator<<(std::ostream& out, ConnectionMetadata const& data) {
diff --git a/sdk/test/test_robot.cc b/sdk/test/test_robot.cc
index b31dd69..260bc3f 100644
--- a/sdk/test/test_robot.cc
+++ b/sdk/test/test_robot.cc
@@ -224,7 +224,11 @@ namespace lebai
robot_.get_di("EXTRA", 0);
robot_.set_do("EXTRA", 0, static_cast(1));
robot_.get_ai("EXTRA", 0);
- robot_.set_ao("EXTRA", 0, 0.0);
+ robot_.set_ao("EXTRA", 0, 0.0);
+ for(unsigned int i = 0; i < 100; ++i)
+ {
+ robot_.get_di("EXTRA", 0);
+ }
}
TEST_F(RobotTest, TestClaw)
{