system_executor.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. //
  2. // Created by huli on 2020/7/2.
  3. //
  4. #include "system_executor.h"
  5. #include "../message/measure_message.pb.h"
  6. #include "../laser/laser_manager.h"
  7. #include "../locate/locate_manager.h"
  8. System_executor::System_executor(int thread_pool_size)
  9. :m_thread_pool(thread_pool_size)
  10. {
  11. }
  12. System_executor::~System_executor()
  13. {
  14. }
  15. //检查执行者的状态, 判断能否处理这条消息,
  16. Error_manager System_executor::check_executer(Communication_message* p_msg)
  17. {
  18. if ( p_msg == NULL )
  19. {
  20. return Error_manager(Error_code::POINTER_IS_NULL, Error_level::MINOR_ERROR,
  21. " POINTER IS NULL ");
  22. }
  23. Error_manager t_error;
  24. switch ( p_msg->get_message_type() )
  25. {
  26. case Communication_message::eLocate_request_msg:
  27. if ( Laser_manager::get_instance_references().check_status() == SUCCESS &&
  28. Locate_manager::get_instance_references().check_status() == SUCCESS )
  29. {
  30. t_error = Error_code::SUCCESS;
  31. }
  32. else if ( Laser_manager::get_instance_references().check_status() == LASER_MANAGER_STATUS_BUSY &&
  33. Locate_manager::get_instance_references().check_status() == LOCATER_MANAGER_STATUS_BUSY )
  34. {
  35. t_error = Error_code::COMMUNICATION_EXCUTER_IS_BUSY;
  36. }
  37. else
  38. {
  39. if ( Laser_manager::get_instance_references().check_status() == LASER_MANAGER_STATUS_ERROR )
  40. {
  41. t_error.compare_and_cover_error(Laser_manager::get_instance_references().check_status());
  42. }
  43. if ( Locate_manager::get_instance_references().check_status() == LOCATER_MANAGER_STATUS_ERROR )
  44. {
  45. t_error.compare_and_cover_error(Laser_manager::get_instance_references().check_status());
  46. }
  47. }
  48. break;
  49. }
  50. return t_error;
  51. }
  52. //处理消息的执行函数
  53. Error_manager System_executor::execute_msg(Communication_message* p_msg)
  54. {
  55. if ( p_msg == NULL )
  56. {
  57. return Error_manager(Error_code::POINTER_IS_NULL, Error_level::MINOR_ERROR,
  58. " POINTER IS NULL ");
  59. }
  60. switch ( p_msg->get_message_type() )
  61. {
  62. case Communication_message::eLocate_request_msg:
  63. message::Measure_request_msg t_measure_request_msg;
  64. //针对消息类型, 对消息进行二次解析
  65. if( t_measure_request_msg.ParseFromString(p_msg->get_message_buf()) )
  66. {
  67. //往线程池添加执行任务, 之后会唤醒一个线程去执行他.
  68. m_thread_pool.enqueue(&System_executor::execute_for_measure, this,
  69. t_measure_request_msg.command_id(), t_measure_request_msg.terminal_id());
  70. }
  71. else
  72. {
  73. return Error_manager(Error_code::SYSTEM_EXECUTOR_PARSE_ERROR, Error_level::MINOR_ERROR,
  74. " message::Measure_request_msg ParseFromString error ");
  75. }
  76. break;
  77. }
  78. return Error_code::SUCCESS;
  79. }
  80. //判断是否为待机,如果已经准备好,则可以执行任务。
  81. bool System_executor::is_ready()
  82. {
  83. if ( m_system_executor_status == SYSTEM_EXECUTOR_READY && m_thread_pool.thread_is_full_load() == false )
  84. {
  85. return true;
  86. }
  87. else
  88. {
  89. return false;
  90. }
  91. }
  92. //雷达感测定位 的处理函数
  93. //input::command_id, 消息指令id, 由主控制系统生成的唯一码
  94. //input::command_id, 终端id, 对应具体的某个车位
  95. //return::void, 没有返回, 执行结果直接生成一条答复消息, 然后通过通信返回
  96. void System_executor::execute_for_measure(int command_id, int terminal_id)
  97. {
  98. }