monkeycar_bus.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #include "monkeycar_bus.h"
  2. #include "monkeycar_area.h"
  3. #include "monkeycar_person.h"
  4. #include "timestamp.h"
  5. #include "log.h"
  6. #ifndef WIN32
  7. #include <unistd.h>
  8. #endif
  9. monkey_bus::monkey_bus(double speed, int direct)
  10. :m_speed(speed)
  11. ,m_direct(direct)
  12. ,m_stop(false)
  13. {
  14. m_thread.reset(new std::thread(std::bind(&monkey_bus::adjust_monkeyperson_distance,this)));
  15. }
  16. void monkey_bus::adjust_monkeyperson_distance()
  17. {
  18. bool cflag = false;
  19. std::vector<std::shared_ptr<monkey_person>> v;
  20. while (!m_stop)
  21. {
  22. v.clear();
  23. uint64_t nowTime = TIME::getMilliseconds();
  24. {
  25. std::lock_guard<std::mutex> lk(m_mtx);
  26. std::for_each(person_list_.begin(),person_list_.end(),[&](const std::shared_ptr<monkey_person> mp){
  27. if (nowTime - mp->m_adjustDis_timeval >= ADJUST_DISTANCE_TIMEVAL/2 && !cflag)
  28. {
  29. mp->setCompensationSpeed(0);
  30. cflag = true;
  31. }
  32. if (nowTime - mp->m_adjustDis_timeval >= ADJUST_DISTANCE_TIMEVAL)
  33. {
  34. mp->m_adjustDis_timeval = nowTime;
  35. mp->handle_monkeycar_fit(1.*(nowTime-monkey_area::m_startTime)/1000.0);
  36. cflag = false;
  37. }
  38. });
  39. std::for_each(person_list_.begin(),person_list_.end(),[&](const std::shared_ptr<monkey_person> mp){
  40. if (nowTime-mp->m_timestamp > LONG_TIME_NO_DATA)
  41. v.push_back(mp);
  42. });
  43. }
  44. std::for_each(v.begin(),v.end(),[&](const std::shared_ptr<monkey_person>& mp){
  45. getOffTheBus(mp);
  46. });
  47. std::this_thread::sleep_for(std::chrono::milliseconds(100));
  48. }
  49. }
  50. bool monkey_bus::test_get_on(std::shared_ptr<monkey_person> mp,double speed)
  51. {
  52. //debug_print_syslog(0,"[lemon the second choice false]cardId:%s,v:%f",mp->getCardId().c_str(),speed);
  53. if (abs(speed) >= abs(m_speed) * ON_BUS_SPEED_LIMIT && abs(speed) < abs(m_speed) * ON_BUS_SPEED_MAX_LIMIT)
  54. {
  55. //debug_print_syslog(0,"[lemon the second choice GetOn]cardId:%s",mp->getCardId().c_str());
  56. return true;
  57. }
  58. return false;
  59. }
  60. bool monkey_bus::test_get_off(std::shared_ptr<monkey_person> mp,double speed)
  61. {
  62. bool ret = false;
  63. ret = (speed > ZERO_ ? NEGTIVE_DIRECTION:POSTIVE_DIRECTION) == m_direct ;
  64. if (ret)
  65. {
  66. if (abs(speed) < abs(m_speed) * OFF_BUS_SPEED_LIMIT)
  67. {
  68. //debug_print_syslog(0,"[lemon the second choice true]cardId:%s,v:%f",mp->getCardId().c_str(),speed);
  69. if(mp->Judge_OffIndex())
  70. {
  71. ret = false;
  72. }
  73. }
  74. else
  75. {
  76. mp->resetOffIndex();
  77. }
  78. }
  79. //debug_print_syslog(0,"[lemon the second choice true___]cardId:%s,v:%f,state:%s",mp->getCardId().c_str(),speed,ret?"ON":"OFF");
  80. return ret;
  81. }
  82. void monkey_bus::Set_AverageSpeed(double speed)
  83. {
  84. m_speed = m_speed * 0.99 + speed * 0.01;
  85. }
  86. void monkey_bus::getOffTheBus(std::shared_ptr<monkey_person> mp)
  87. {
  88. //can not free here .
  89. mp->GetOffTheBus();
  90. std::lock_guard<std::mutex> lk(m_mtx);
  91. auto it = std::find(person_list_.begin(),person_list_.end(),mp);
  92. if (it != person_list_.end())
  93. {
  94. person_list_.erase(it);
  95. }
  96. }
  97. void monkey_bus::getOnTheBus(std::shared_ptr<monkey_person> mp,std::shared_ptr<monkey_bus> bus)
  98. {
  99. log_info("monkeycar getOn");
  100. mp->GetOnTheBus(bus,m_speed);
  101. std::lock_guard<std::mutex> lk(m_mtx);
  102. person_list_.push_back(mp);
  103. }