terminal_command_executor.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. //
  2. // Created by zx on 2019/12/27.
  3. //
  4. #ifndef TERMINOR_H
  5. #define TERMINOR_H
  6. #include "../plc/plc_communicator.h"
  7. #include "../plc/plc_task.h"
  8. #include "../laser/Laser.h"
  9. #include "../locate/locater.h"
  10. #include "../verify/Verify_result.h"
  11. #include "../wj_lidar/fence_controller.h"
  12. #include "Terminor_parameter.pb.h"
  13. #include <thread>
  14. #include <mutex>
  15. /*
  16. * 终端指令执行状态,枚举
  17. * 列举终端指令从进入流程到测量完成过程中的进度状态
  18. */
  19. enum TerminorStatu
  20. {
  21. TERMINOR_READY=0, //终端空闲
  22. TERMINOR_BUSY, //接收到指令/被占用
  23. TERMINOR_SCANNING, //终端指令一启动扫描,扫描中
  24. TERMINOR_MEASURING, //终端指令进入测量中
  25. TERMINOR_POSTING, //终端测量完成, 正在上传数据
  26. TERMINOR_INVALID //终端指令执行异常,当出现硬件故障,功能模块bug严重错误时,时为异常状态,
  27. };
  28. /*
  29. * 终端指令执行类,执行指令,监控指令执行进度
  30. * 输入雷达数组,plc对象,测量算法对象,执行扫描测量任务
  31. */
  32. class Terminor_Command_Executor
  33. {
  34. public:
  35. /*
  36. * 构造函数
  37. * parameter:该终端指令配置参数(待定)
  38. */
  39. Terminor_Command_Executor(Terminal::Terminor_parameter parameter);
  40. ~Terminor_Command_Executor();
  41. /*
  42. * 获取终端进度状态
  43. */
  44. TerminorStatu get_terminor_statu();
  45. /*
  46. * 执行扫描,测量任务,阻塞知道任务完成或超时(单位秒)
  47. * 函数体只检测指令是否能执行,并启动线程执行指令,不等待指令完成.
  48. *lasers:需要启动的雷达
  49. * wj_lidar:万集雷达测量模块
  50. * plc:上传结果工具
  51. * locater:测量算法对象
  52. * verify_tool:结果检验工具,当该参数为NULL时,测量结果不作检验
  53. * 返回指令是否启动成功
  54. */
  55. Error_manager execute_command(std::vector<Laser_base*> lasers,Fence_controller* wj_lidar,
  56. Plc_Communicator* plc,
  57. Locater* locater,Verify_result* verify_tool,float timeout=15);
  58. /*
  59. * 强制正在执行的中断指令
  60. */
  61. Error_manager force_stop_command();
  62. /*
  63. * 设置保存文件的root路径
  64. * 执行指令时会在此路径下,生成日期文件夹,格式为:/root_path/year/month/day/YYYYMMDD-HHMMSS文件夹
  65. */
  66. void set_save_root_path(std::string root);
  67. protected:
  68. static void thread_command_working(Terminor_Command_Executor* terminor);
  69. /*
  70. * 执行指令流程函数
  71. * 扫描
  72. * 测量,保存测量结果到成员变量
  73. */
  74. Error_manager scanning_measuring();
  75. /*
  76. * 执行上传plc任务
  77. * plc终端编号从1开始
  78. */
  79. Error_manager post_measure_information();
  80. /*
  81. * 根据长宽,角度,生成cv::RotateRect
  82. */
  83. static cv::RotatedRect create_rotate_rect(float length,float width,float angle,float x,float y);
  84. protected:
  85. TerminorStatu m_terminor_statu;
  86. //指令流程线程
  87. std::thread* mp_command_thread;
  88. //
  89. std::mutex m_mutex_lock;
  90. //保存输入进来的雷达指针
  91. std::vector<Laser_base*> mp_laser_vector;
  92. //万集雷达测量模块
  93. Fence_controller* mp_wj_lidar;
  94. //plc
  95. Plc_Communicator* mp_plc;
  96. //locater*
  97. Locater* mp_locater;
  98. //配置参数
  99. Terminal::Terminor_parameter m_terminor_parameter;
  100. //本次指令超时时间 单位秒
  101. float m_timeout_second;
  102. //强制退出标示
  103. bool mb_force_quit;
  104. //保存当前指令测量结果
  105. Locate_information m_measure_information;
  106. //保存文件的root目录
  107. std::string m_save_root_path;
  108. //检验结果工具
  109. Verify_result* mp_verify_tool;
  110. //
  111. static std::mutex ms_mutex_scan_measure;
  112. };
  113. #endif //TERMINOR_H