fence_controller.h 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. //
  2. // Created by zx on 2019/12/6.
  3. //
  4. #ifndef FENCECONTROLLER_H
  5. #define FENCECONTROLLER_H
  6. #include <iostream>
  7. #include <string>
  8. #include <fstream>
  9. #include <string.h>
  10. #include <thread>
  11. #include <unistd.h>
  12. #include <atomic>
  13. #include "string.h"
  14. #include <google/protobuf/io/coded_stream.h>
  15. #include <google/protobuf/io/zero_copy_stream_impl.h>
  16. #include <google/protobuf/text_format.h>
  17. using google::protobuf::Message;
  18. using google::protobuf::io::CodedInputStream;
  19. using google::protobuf::io::CodedOutputStream;
  20. using google::protobuf::io::FileInputStream;
  21. using google::protobuf::io::FileOutputStream;
  22. using google::protobuf::io::ZeroCopyInputStream;
  23. using google::protobuf::io::ZeroCopyOutputStream;
  24. #include "glog/logging.h"
  25. #include "wj_lidar_conf.pb.h"
  26. #include "wj_lidar_encapsulation.h"
  27. #include "region_worker.h"
  28. #include "plc_data.h"
  29. #include "../tool/pathcreator.h"
  30. #include "../tool/threadSafeQueue.h"
  31. #include "../verify/Verify_result.h"
  32. #include "../error_code/error_code.h"
  33. #include "wj_lidar_task.h"
  34. #include <nnxx/message.h>
  35. #include <nnxx/message_control.h>
  36. #include <nnxx/socket.h>
  37. #include <nnxx/reqrep.h>
  38. //#include <nnxx/unittest.h>
  39. #include <nnxx/timeout.h>
  40. #include <nnxx/error.h>
  41. #include <cstring>
  42. #include <nnxx/message>
  43. #define CONNECTSTRING "tcp://127.0.0.1:9000"
  44. // 轮距计算任务结构体,监听到任务后生成该对象存入数组等待处理
  45. typedef struct MSGTASK
  46. {
  47. std::string cmd;
  48. nnxx::message_control *sock_controller;
  49. } MsgTask;
  50. /**
  51. * 电子围栏/万集雷达管理类,
  52. * 负责管理雷达数组用于获取点云,管理区域功能数组用于检测区域状态,并将区域状态实时更新到plc
  53. * */
  54. class Fence_controller
  55. {
  56. public:
  57. // 有参构造函数
  58. Fence_controller(Verify_result* verify_handle);
  59. // 析构函数
  60. ~Fence_controller();
  61. // 初始化函数
  62. Error_manager initialize(wj::wjManagerParams params);
  63. // 获取当前整体状态函数
  64. Error_manager get_current_status();
  65. // 外部获取点云
  66. Error_manager get_cloud(pcl::PointCloud<pcl::PointXYZ>::Ptr &cloud_out);
  67. // 获取初始化状态
  68. bool get_initialize_status();
  69. // 接收任务单进行阻塞式处理
  70. Error_manager execute_task(Task_Base* task);
  71. private:
  72. // 点云拼接线程函数
  73. static void cloud_merge_update(Fence_controller *fc);
  74. // 轮距指令接收线程函数,监听计算轮距消息
  75. static void wheel_msg_recv_thread(Fence_controller *fc);
  76. // 轮距消息处理线程函数,计算并反馈轮距结果
  77. static void wheel_msg_handling_thread(Fence_controller *fc);
  78. // // 测量功能函数
  79. // Error_manager wj_fence_measure();
  80. // 工具函数,根据路径读取配置参数,暂未使用
  81. bool read_proto_param(std::string path);
  82. // 工具函数,保存点云到文件
  83. void save_cloud_txt(std::string txt, pcl::PointCloud<pcl::PointXYZ>::Ptr pCloud);
  84. private:
  85. wj::wjManagerParams m_wj_manager_param; // 万集管理器配置参数
  86. std::atomic<bool> mb_initialized; // 系统初始化状态
  87. std::mutex m_cloud_mutex; // 点云更新互斥锁
  88. pcl::PointCloud<pcl::PointXYZ>::Ptr mp_merged_cloud; // 拼接后点云
  89. std::vector<Wj_lidar_encapsulation *> m_lidars_vector; // 万集雷达实例指针数组
  90. std::vector<Region_worker *> m_region_workers_vector; // 区域功能实例指针数组
  91. Plc_data *mp_plc_data; // plc 句柄
  92. nnxx::socket m_wheel_soc{nnxx::SP_RAW, nnxx::REP}; // nnxx轮距计算任务监听与反馈socket句柄
  93. std::mutex m_mutex_wheel_handling; // 轮距计算任务处理互斥锁
  94. static int S_RETRY_TIMES; // 计算失败后重试次数
  95. StdCondition m_cond_exit; // 更新线程退出标记
  96. std::thread *m_update_thread; // 更新线程
  97. std::thread *m_wheel_recv_thread; // 轮距计算任务监听线程
  98. std::thread *m_wheel_send_thread; // 轮距计算结果发送线程
  99. StdCondition m_cond_wheel_exit; // 轮距计算线程退出标记
  100. threadsafe_queue<MsgTask> m_msg_queue; // 轮距计算任务队列
  101. Verify_result* mp_verify_result_tool; //结果检验工具
  102. };
  103. #endif //FENCECONTROLLER_H