|
@@ -5,6 +5,22 @@
|
|
|
#include "Locate_communicator.h"
|
|
|
//#include "locate_message.pb.h"
|
|
|
|
|
|
+namespace message {
|
|
|
+ bool operator<(const message::Measure_request_msg msg1, const message::Measure_request_msg msg2) {
|
|
|
+ return (msg1.command_id() < msg2.command_id());
|
|
|
+ }
|
|
|
+
|
|
|
+ bool operator==(const message::Measure_request_msg msg1, const message::Measure_request_msg msg2) {
|
|
|
+ if (msg1.base_info().msg_type() == msg2.base_info().msg_type()
|
|
|
+ && msg1.base_info().sender() == msg2.base_info().sender()
|
|
|
+ && msg1.base_info().receiver() == msg2.base_info().receiver()
|
|
|
+ && msg1.command_id() == msg2.command_id()
|
|
|
+ && msg1.terminal_id() == msg2.terminal_id()) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
Locate_communicator::Locate_communicator()
|
|
|
{
|
|
@@ -23,15 +39,17 @@ Error_manager Locate_communicator::encapsulate_msg(Communication_message* messag
|
|
|
if(message->get_message_type()==Communication_message::eLocate_request_msg)
|
|
|
{
|
|
|
message::Measure_request_msg request;
|
|
|
- m_response_table[request.command_id()]=message::Measure_response_msg();
|
|
|
+ request.ParseFromString(message->get_message_buf());
|
|
|
+ m_response_table[request]=message::Measure_response_msg();
|
|
|
+ //发送请求
|
|
|
+ return Communication_socket_base::encapsulate_msg(message);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
return Error_manager(LOCATER_MSG_TABLE_NOT_EXIST,NEGLIGIBLE_ERROR,"message table is not exist");
|
|
|
}
|
|
|
|
|
|
- //发送请求
|
|
|
- return Communication_socket_base::encapsulate_msg(message);
|
|
|
+
|
|
|
}
|
|
|
|
|
|
Error_manager Locate_communicator::locate_request(message::Measure_request_msg& request,message::Measure_response_msg& result)
|
|
@@ -39,9 +57,12 @@ Error_manager Locate_communicator::locate_request(message::Measure_request_msg&
|
|
|
/*
|
|
|
* 检查request合法性,以及模块状态
|
|
|
*/
|
|
|
+
|
|
|
if(request.base_info().sender()!=message::eMain||request.base_info().receiver()!=message::eMeasurer)
|
|
|
return Error_manager(LOCATER_MSG_REQUEST_INVALID,MINOR_ERROR,"measure request invalid");
|
|
|
|
|
|
+ if(m_response_table.find(request)!=m_response_table.end())
|
|
|
+ return Error_manager(LOCATER_MSG_REQUEST_REPEATED,MAJOR_ERROR," measure reques repeated");
|
|
|
//设置超时,若没有设置,默认3000
|
|
|
int timeout=request.base_info().has_timeout_ms()?request.base_info().timeout_ms():3000;
|
|
|
//向测量节点发送测量请求,并记录请求
|
|
@@ -64,40 +85,79 @@ Error_manager Locate_communicator::locate_request(message::Measure_request_msg&
|
|
|
double time=0;
|
|
|
do{
|
|
|
//在请求表中查询结果
|
|
|
- message::Measure_response_msg response=m_response_table[request.command_id()];
|
|
|
- //判断是否接收到回应,若回应信息被赋值则证明有回应
|
|
|
- if(response.has_base_info() && response.has_command_id())
|
|
|
+ std::map<message::Measure_request_msg,message::Measure_response_msg>::iterator it=m_response_table.find(request);
|
|
|
+ //查询到记录
|
|
|
+ if(it!=m_response_table.end())
|
|
|
{
|
|
|
- message::Base_info response_base=response.base_info();
|
|
|
- //检查类型是否匹配
|
|
|
- if(response_base.msg_type() != message::eLocate_response_msg)
|
|
|
- {
|
|
|
- return Error_manager(LOCATER_MSG_RESPONSE_TYPE_ERROR,MAJOR_ERROR,"measure response msg type error");
|
|
|
- }
|
|
|
- //检查基本信息是否匹配
|
|
|
- if(response_base.sender()!=message::eMeasurer ||
|
|
|
- response_base.receiver()!=message::eMain||
|
|
|
- response.command_id()!=request.command_id())
|
|
|
+ message::Measure_response_msg response=it->second;
|
|
|
+ //判断是否接收到回应,若回应信息被赋值则证明有回应
|
|
|
+ if (response.has_base_info() && response.has_command_id())
|
|
|
{
|
|
|
- return Error_manager(LOCATER_MSG_RESPONSE_INFO_ERROR,MAJOR_ERROR,"measure response msg info error");
|
|
|
- }
|
|
|
- result=response;
|
|
|
- return SUCCESS;
|
|
|
+ message::Base_info response_base = response.base_info();
|
|
|
+ //检查类型是否匹配
|
|
|
+ if (response_base.msg_type() != message::eLocate_response_msg) {
|
|
|
+ return Error_manager(LOCATER_MSG_RESPONSE_TYPE_ERROR, MAJOR_ERROR,
|
|
|
+ "measure response msg type error");
|
|
|
+ }
|
|
|
+ //检查基本信息是否匹配
|
|
|
+ if (response_base.sender() != message::eMeasurer ||
|
|
|
+ response_base.receiver() != message::eMain ||
|
|
|
+ response.command_id() != request.command_id()) {
|
|
|
+ return Error_manager(LOCATER_MSG_RESPONSE_INFO_ERROR, MAJOR_ERROR,
|
|
|
+ "measure response msg info error");
|
|
|
+ }
|
|
|
+ result = response;
|
|
|
+ m_response_table.erase(request);
|
|
|
+
|
|
|
+ return SUCCESS;
|
|
|
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //未查询到记录,任务已经被提前取消,记录被删除
|
|
|
+ return Error_manager(LOCATER_MSG_REQUEST_CANCELED,MINOR_ERROR,"measure request canceled");
|
|
|
}
|
|
|
|
|
|
auto end_time=std::chrono::system_clock::now();
|
|
|
auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end_time - start_time);
|
|
|
time=1000.0*double(duration.count()) * std::chrono::microseconds::period::num / std::chrono::microseconds::period::den;
|
|
|
std::this_thread::yield();
|
|
|
+ usleep(1000);
|
|
|
}while(time<double(timeout));
|
|
|
-
|
|
|
return Error_manager(RESPONSE_TIMEOUT,MINOR_ERROR,"measure request timeout");
|
|
|
}
|
|
|
|
|
|
-message::Measure_status_msg Locate_communicator::get_statu()
|
|
|
+//检查消息是否可以被解析, 需要子类重载
|
|
|
+Error_manager Locate_communicator::check_executer(Communication_message* p_msg)
|
|
|
+{
|
|
|
+ return SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+Error_manager Locate_communicator::check_statu()
|
|
|
+{
|
|
|
+ return SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+//检查消息是否有效, 主要检查消息类型和接受者, 判断这条消息是不是给我的.
|
|
|
+Error_manager Locate_communicator::check_msg(Communication_message* p_msg)
|
|
|
{
|
|
|
+ //通过 p_msg->get_message_type() 和 p_msg->get_receiver() 判断这条消息是不是给我的.
|
|
|
+ //子类重载时, 增加自己模块的判断逻辑, 以后再写.
|
|
|
+ if ( p_msg->get_message_type() == Communication_message::Message_type::eLocate_response_msg
|
|
|
+ && p_msg->get_receiver() == Communication_message::Communicator::eMain )
|
|
|
+ {
|
|
|
+ return Error_code::SUCCESS;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //认为接受人
|
|
|
+ return Error_code::INVALID_MESSAGE;
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
+Error_manager Locate_communicator::encapsulate_send_data(){
|
|
|
+ return SUCCESS;
|
|
|
}
|
|
|
|
|
|
Error_manager Locate_communicator::execute_msg(Communication_message* p_msg)
|
|
@@ -114,13 +174,15 @@ Error_manager Locate_communicator::execute_msg(Communication_message* p_msg)
|
|
|
{
|
|
|
message::Measure_response_msg response;
|
|
|
response.ParseFromString(p_msg->get_message_buf());
|
|
|
+ message::Measure_request_msg request=create_request_by_response(response);
|
|
|
///查询请求表是否存在
|
|
|
- if(m_response_table.find(response.command_id())==m_response_table.end())
|
|
|
+ if(m_response_table.find(request)==m_response_table.end())
|
|
|
{
|
|
|
return Error_manager(LOCATER_MSG_RESPONSE_HAS_NO_REQUEST,NEGLIGIBLE_ERROR,"measure response without request");
|
|
|
}
|
|
|
////更新表
|
|
|
- m_response_table[response.command_id()]=response;
|
|
|
+
|
|
|
+ m_response_table[request]=response;
|
|
|
break;
|
|
|
}
|
|
|
///测量系统状态
|
|
@@ -130,7 +192,27 @@ Error_manager Locate_communicator::execute_msg(Communication_message* p_msg)
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
+ return SUCCESS;
|
|
|
+
|
|
|
+}
|
|
|
|
|
|
+Error_manager Locate_communicator::cancel_request(message::Measure_request_msg& request)
|
|
|
+{
|
|
|
+ if(m_response_table.find(request)!=m_response_table.end())
|
|
|
+ m_response_table.erase(request);
|
|
|
+ return SUCCESS;
|
|
|
+}
|
|
|
|
|
|
+message::Measure_request_msg Locate_communicator::create_request_by_response(message::Measure_response_msg& response)
|
|
|
+{
|
|
|
+ message::Measure_request_msg request;
|
|
|
+ message::Base_info baseInfo;
|
|
|
+ baseInfo.set_msg_type(message::eLocate_request_msg);
|
|
|
+ baseInfo.set_sender(response.base_info().sender());
|
|
|
+ baseInfo.set_receiver(response.base_info().receiver());
|
|
|
+ request.mutable_base_info()->CopyFrom(baseInfo);
|
|
|
+ request.set_command_id(response.command_id());
|
|
|
+ request.set_terminal_id(response.command_id());
|
|
|
+ return request;
|
|
|
}
|
|
|
|