Kaynağa Gözat

增加terminor强制退出

zx 5 yıl önce
ebeveyn
işleme
9a344c813c

+ 2 - 0
error_code/error_code.h

@@ -139,6 +139,8 @@ enum Error_code
     TERMINOR_INPUT_PLC_NULL,
     TERMINOR_INPUT_LOCATER_NULL,
     TERMINOR_CREATE_WORKING_THREAD_FAILED,
+    TERMINOR_FORCE_QUIT,
+    TERMINOR_LASER_TIMEOUT,
 
 
 

+ 7 - 5
main.cpp

@@ -19,7 +19,7 @@ using google::protobuf::io::CodedInputStream;
 using google::protobuf::io::ZeroCopyOutputStream;
 using google::protobuf::io::CodedOutputStream;
 using google::protobuf::Message;
-GOOGLE_GLOG_DLL_DECL void ShutdownGoogleLogging(const char* data, int size)
+GOOGLE_GLOG_DLL_DECL void shut_down_logging(const char* data, int size)
 {
     time_t tt;
     time( &tt );
@@ -40,7 +40,7 @@ GOOGLE_GLOG_DLL_DECL void ShutdownGoogleLogging(const char* data, int size)
 
 }
 
-void InitGlog()
+void init_glog()
 {
     time_t tt = time(0);//时间cuo
     struct tm* t = localtime(&tt);
@@ -68,7 +68,7 @@ void InitGlog()
     google::SetStderrLogging(google::INFO);
     google::SetLogDestination(0, logPath);
     google::InstallFailureSignalHandler();
-    google::InstallFailureWriter(&ShutdownGoogleLogging);
+    google::InstallFailureWriter(&shut_down_logging);
     FLAGS_colorlogtostderr = true;        // Set log color
     FLAGS_logbufsecs = 0;                // Set log output speed(s)
     FLAGS_max_log_size = 1024;            // Set max log file size(GB)
@@ -78,9 +78,11 @@ void InitGlog()
 int main(int argc,char* argv[])
 {
     Error_manager code;
-    InitGlog();
-
+    //初始化日志
+    init_glog();
+    //创建system实例
     System_Manager system_manager;
+    //初始化实例,包括雷达,plc,locater,terminal的创建及初始化
     code=system_manager.init();
     if(code!=SUCCESS)
     {

+ 51 - 7
terminor/terminal_command_executor.cpp

@@ -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;
 }

+ 2 - 0
terminor/terminal_command_executor.h

@@ -82,6 +82,8 @@ protected:
     Terminal::Terminor_parameter    m_terminor_parameter;
     //本次指令超时时间 单位秒
     float                       m_timeout_second;
+    //强制退出标示
+    bool                        mb_force_quit;
 
 };
 

+ 7 - 0
terminor/terminor_msg.proto

@@ -0,0 +1,7 @@
+syntax="proto2";
+package Terminal;
+
+message Terminal_message
+{
+
+}