|
@@ -45,13 +45,24 @@ pcl::PointCloud<pcl::PointXYZ>::Ptr ReadTxtCloud(std::string file)
|
|
|
//////////
|
|
|
|
|
|
Terminor_Command_Executor::Terminor_Command_Executor(Terminal::Terminor_parameter parameter)
|
|
|
- :m_terminor_statu(TERMINOR_READY), mp_command_thread(0),m_timeout_second(15)
|
|
|
+ :m_terminor_statu(TERMINOR_READY), mp_command_thread(0),m_timeout_second(15),mb_force_quit(false)
|
|
|
{
|
|
|
m_terminor_parameter=parameter;
|
|
|
}
|
|
|
|
|
|
Error_manager Terminor_Command_Executor::force_stop_command()
|
|
|
{
|
|
|
+ mb_force_quit=true;
|
|
|
+ //等待执行线程退出
|
|
|
+ if(mp_command_thread!=NULL)
|
|
|
+ {
|
|
|
+ if(mp_command_thread->joinable())
|
|
|
+ {
|
|
|
+ mp_command_thread->join();
|
|
|
+ delete mp_command_thread;
|
|
|
+ mp_command_thread=NULL;
|
|
|
+ }
|
|
|
+ }
|
|
|
return SUCCESS;
|
|
|
}
|
|
|
|
|
@@ -159,14 +170,18 @@ Error_manager Terminor_Command_Executor::execute_command(std::vector<Laser_base*
|
|
|
|
|
|
void Terminor_Command_Executor::thread_command_working(Terminor_Command_Executor* terminor)
|
|
|
{
|
|
|
- if(terminor==0)
|
|
|
+ if(terminor==NULL)
|
|
|
{
|
|
|
return ;
|
|
|
}
|
|
|
- terminor->working();
|
|
|
+ //执行指令,阻塞直到指令执行完成或者异常结束
|
|
|
+ Error_manager code=terminor->working();
|
|
|
+ //更新终端状态为Ready状态
|
|
|
+ terminor->m_terminor_statu=TERMINOR_READY;
|
|
|
}
|
|
|
Error_manager Terminor_Command_Executor::working()
|
|
|
{
|
|
|
+ //计时起点
|
|
|
auto t_start_point=std::chrono::system_clock::now();
|
|
|
Error_manager code;
|
|
|
//第一步,启动雷达扫描点云,切换当前状态为扫描中
|
|
@@ -182,6 +197,14 @@ Error_manager Terminor_Command_Executor::working()
|
|
|
//等待雷达完成任务单
|
|
|
while(1)
|
|
|
{
|
|
|
+ //判断是否强制退出
|
|
|
+ if(mb_force_quit==true)
|
|
|
+ {
|
|
|
+ char description[255]={0};
|
|
|
+ sprintf(description,"ternimal is force quit terminal id : %d",m_terminor_parameter.id());
|
|
|
+ return Error_manager(TERMINOR_FORCE_QUIT,NORMAL,description);
|
|
|
+ }
|
|
|
+ //判断雷达任务单是否全部完成
|
|
|
bool tb_laser_complete=true;
|
|
|
for(int i=0;i<laser_task_vector.size();++i)
|
|
|
{
|
|
@@ -191,15 +214,21 @@ Error_manager Terminor_Command_Executor::working()
|
|
|
{
|
|
|
break;
|
|
|
}
|
|
|
+ //计算扫描时间,若超时,并且没有点,则返回错误.
|
|
|
auto t_end_point=std::chrono::system_clock::now();
|
|
|
auto duration=std::chrono::duration_cast<std::chrono::milliseconds>(t_end_point - t_start_point);
|
|
|
double second=double(duration.count()) *
|
|
|
std::chrono::milliseconds::period::num / std::chrono::milliseconds::period::den;
|
|
|
if(second>m_timeout_second)
|
|
|
{
|
|
|
- //扫描超时处理
|
|
|
+ //扫描超时,点云中没有点,则返回错误
|
|
|
+ if(scan_cloud->size()==0)
|
|
|
+ {
|
|
|
+ return Error_manager(TERMINOR_LASER_TIMEOUT,NORMAL,"laser scanning timeout");
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
+ usleep(1000*100);
|
|
|
}
|
|
|
//检查雷达任务完成情况,是否是正常完成
|
|
|
|
|
@@ -209,6 +238,7 @@ Error_manager Terminor_Command_Executor::working()
|
|
|
if(laser_task_vector[i]!=0)
|
|
|
{
|
|
|
delete laser_task_vector[i];
|
|
|
+ laser_task_vector[i]=NULL;
|
|
|
}
|
|
|
}
|
|
|
//第二步,根据区域筛选点云
|
|
@@ -224,9 +254,16 @@ Error_manager Terminor_Command_Executor::working()
|
|
|
{
|
|
|
//对于失败情况作分别处理
|
|
|
}
|
|
|
+ //获取测量结果
|
|
|
+ Locate_information locate_information=locate_task->get_locate_information();
|
|
|
+ //释放locate task
|
|
|
+ if(locate_task!=NULL)
|
|
|
+ {
|
|
|
+ delete locate_task;
|
|
|
+ locate_task=NULL;
|
|
|
+ }
|
|
|
//第四步,测量完成,上传数据
|
|
|
m_terminor_statu=TERMINOR_POSTING;
|
|
|
- Locate_information locate_information=locate_task->get_locate_information();
|
|
|
measure_result measure_information;
|
|
|
measure_information.x=locate_information.locate_x;
|
|
|
measure_information.y=locate_information.locate_y;
|
|
@@ -238,11 +275,19 @@ Error_manager Terminor_Command_Executor::working()
|
|
|
measure_information.terminal_id=m_terminor_parameter.id();
|
|
|
measure_information.correctness=locate_information.locate_correct;
|
|
|
|
|
|
+ //执行plc上传任务
|
|
|
Plc_Task* plc_task=new Plc_Task();
|
|
|
plc_task->set_result(measure_information);
|
|
|
code=mp_plc->execute_task(plc_task);
|
|
|
while(code!=SUCCESS)
|
|
|
{
|
|
|
+ //判断是否强制退出
|
|
|
+ if(mb_force_quit==true)
|
|
|
+ {
|
|
|
+ char description[255]={0};
|
|
|
+ sprintf(description,"ternimal is force quit terminal id : %d",m_terminor_parameter.id());
|
|
|
+ return Error_manager(TERMINOR_FORCE_QUIT,NORMAL,description);
|
|
|
+ }
|
|
|
//对于上传不成功,作失败处理,重新传输
|
|
|
code=mp_plc->execute_task(plc_task);
|
|
|
///不成功,检测本次流程是否超时
|
|
@@ -261,6 +306,5 @@ Error_manager Terminor_Command_Executor::working()
|
|
|
}
|
|
|
|
|
|
}
|
|
|
- //处理完成,修改状态为ready
|
|
|
- m_terminor_statu=TERMINOR_READY;
|
|
|
+ return code;
|
|
|
}
|