pickup_terminal.cpp 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. //
  2. // Created by zx on 2020/7/16.
  3. //
  4. #include "pickup_terminal.h"
  5. #include "Terminal_communication.h"
  6. pickup_terminal::pickup_terminal(int terminal_id)
  7. {
  8. m_terminal_id=terminal_id;
  9. m_thread_safe_queue= nullptr;
  10. }
  11. Error_manager pickup_terminal::init(threadsafe_queue<message::Car_info>* queue)
  12. {
  13. m_thread_safe_queue=queue;
  14. m_exit_cond.reset(false,false,false);
  15. m_pthread=new std::thread(pickup_thread,this);
  16. return SUCCESS;
  17. }
  18. pickup_terminal::~pickup_terminal()
  19. {
  20. m_exit_cond.set_pass_ever(true);
  21. if(m_pthread)
  22. {
  23. if(m_pthread->joinable())
  24. m_pthread->join();
  25. delete m_pthread;
  26. m_pthread=nullptr;
  27. }
  28. }
  29. Error_manager pickup_terminal::pickup(message::Car_info& car_info)
  30. {
  31. message::Pickup_command_request_msg request;
  32. message::Base_info base_info;
  33. base_info.set_msg_type(message::ePickup_command_request_msg);
  34. base_info.set_sender(message::eTerminor);
  35. base_info.set_receiver(message::eMain);
  36. request.mutable_base_info()->CopyFrom(base_info);
  37. request.mutable_car_info()->CopyFrom(car_info);
  38. request.set_terminal_id(m_terminal_id);
  39. //发送停车请求
  40. Error_manager code;
  41. message::Pickup_command_response_msg response;
  42. code=Terminal_communication::get_instance_pointer()->pickup_request(request,response);
  43. if(code!=SUCCESS)
  44. {
  45. std::cout<<"取车请求失败:"<<code.to_string()<<std::endl;
  46. return ERROR;
  47. }
  48. //等待停车完成
  49. message::Entrance_statu statu;
  50. while(m_exit_cond.wait_for_millisecond(200)==false)
  51. {
  52. code = Terminal_communication::get_instance_pointer()->check_pickup_entrance_statu(m_terminal_id, statu);
  53. if (code != SUCCESS) {
  54. continue;
  55. }
  56. if (statu == message::eReady) {
  57. return SUCCESS;
  58. }
  59. }
  60. return FAILED;
  61. }
  62. void pickup_terminal::pickup_thread(pickup_terminal* picker)
  63. {
  64. while(picker->m_exit_cond.wait_for_millisecond(100)==false)
  65. {
  66. message::Car_info car_info;
  67. if(picker->m_thread_safe_queue== nullptr)
  68. continue;
  69. if(picker->m_thread_safe_queue->try_pop(car_info)==true)
  70. {
  71. if(picker->pickup(car_info)==SUCCESS)
  72. LOG(WARNING)<<"取车终端:"<<picker->m_terminal_id<<",车辆:"<<car_info.license().c_str()
  73. <<",已经取车完成,剩余out:"<<picker->m_thread_safe_queue->size();
  74. else
  75. {
  76. LOG(ERROR)<<"取车终端:"<<picker->m_terminal_id<<",车辆:"<<car_info.license().c_str()
  77. <<",已经取车失败,剩余out:"<<picker->m_thread_safe_queue->size();
  78. }
  79. }
  80. }
  81. }