monkeycar_bus.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. #include "stdafx.h"
  2. #include "monkeycar_bus.h"
  3. #ifndef WIN32
  4. #include <unistd.h>
  5. #endif
  6. monkey_bus::monkey_bus(double speed, int direct)
  7. :m_speed(speed)
  8. ,m_direct(direct)
  9. ,m_stop(false)
  10. {
  11. //m_time_stamp = cacti::Timestamp::getNowTime().getAsMilliseconds();
  12. }
  13. void monkey_bus::start()
  14. {
  15. //start a thread.
  16. m_thread.start(this,&monkey_bus::adjust_monkeyperson_distance);
  17. }
  18. void monkey_bus::adjust_monkeyperson_distance()
  19. {
  20. bool cflag = false;
  21. std::vector<std::shared_ptr<monkey_person>> v;
  22. static u64 s_time=0;
  23. while (!m_stop)
  24. {
  25. v.clear();
  26. u64 nowTime = cacti::Timestamp::getNowTime().getAsMilliseconds();
  27. {
  28. ScopedLock lk(m_monitor);
  29. std::for_each(person_list_.begin(),person_list_.end(),[&](const std::shared_ptr<monkey_person> mp){
  30. if (nowTime - mp->m_adjustDis_timeval >= ADJUST_DISTANCE_TIMEVAL/2 && !cflag)
  31. {
  32. mp->setCompensationSpeed(0);
  33. cflag = true;
  34. }
  35. if (nowTime - mp->m_adjustDis_timeval >= ADJUST_DISTANCE_TIMEVAL)
  36. {
  37. mp->m_adjustDis_timeval = nowTime;
  38. mp->handle_monkeycar_fit(1.*(nowTime-m_Start_time)/1000.0);
  39. cflag = false;
  40. }
  41. });
  42. std::for_each(person_list_.begin(),person_list_.end(),[&](const std::shared_ptr<monkey_person> mp){
  43. if (nowTime-mp->m_timestamp > LONG_TIME_NO_DATA)
  44. v.push_back(mp);
  45. });
  46. }
  47. std::for_each(v.begin(),v.end(),[&](const std::shared_ptr<monkey_person>& mp){
  48. getOffTheBus(mp);
  49. });
  50. if (nowTime-s_time > 1000)
  51. {
  52. s_time = nowTime;
  53. }
  54. #ifndef WIN32
  55. usleep(100*1000);
  56. #else
  57. Sleep(100);
  58. #endif // WIN32
  59. }
  60. }
  61. bool monkey_bus::test_get_on(std::shared_ptr<monkey_person> mp,double speed)
  62. {
  63. //debug_print_syslog(0,"[lemon the second choice false]cardId:%s,v:%f",mp->getCardId().c_str(),speed);
  64. if (fabs(speed) >= fabs(m_speed) * ON_BUS_SPEED_LIMIT && fabs(speed) <fabs(m_speed) * ON_BUS_SPEED_MAX_LIMIT)
  65. {
  66. //debug_print_syslog(0,"[lemon the second choice GetOn]cardId:%s",mp->getCardId().c_str());
  67. return true;
  68. }
  69. return false;
  70. }
  71. /*******************************
  72. /*判断人是否下猴车
  73. /******************************/
  74. bool monkey_bus::test_get_off(std::shared_ptr<monkey_person> mp,double speed)
  75. {
  76. bool ret = false;
  77. //Get The AverageSpeed
  78. //Set_AverageSpeed(abs(speed));
  79. //判断其方向
  80. ret = (speed > ZERO_ ? NEGTIVE_DIRECTION:POSTIVE_DIRECTION) == m_direct ;
  81. //----------------------------------------
  82. if (ret)
  83. {
  84. if (fabs(speed) < fabs(m_speed) * OFF_BUS_SPEED_LIMIT)
  85. {
  86. //debug_print_syslog(0,"[lemon the second choice true]cardId:%s,v:%f",mp->getCardId().c_str(),speed);
  87. if(mp->Judge_OffIndex())
  88. {
  89. ret = false;
  90. }
  91. }
  92. else
  93. {
  94. mp->resetOffIndex();
  95. }
  96. }
  97. debug_print_syslog(0,"[lemon the second choice true___]cardId:%s,v:%f,state:%s",mp->getCardId().c_str(),speed,ret?"ON":"OFF");
  98. return ret;
  99. }
  100. void monkey_bus::Set_AverageSpeed(double speed)
  101. {
  102. m_speed = m_speed * 0.99 + speed * 0.01;
  103. //m_AverageSpeed.push_back(speed);
  104. //if(m_AverageSpeed.size()%2000 == 0)
  105. //{
  106. // //get Speed k-means
  107. // m_speed = my_k_means_algo(K_MEANS_X1,K_MEANS_X2,K_MEANS_x3);
  108. // //
  109. // m_speed = (m_direct == NEGTIVE_DIRECTION) ? m_speed : m_speed * -1.0;
  110. // debug_print_syslog(0,"[lemon the second choice AverageSpeed]v:%f",m_speed);
  111. //}
  112. }
  113. void monkey_bus::getOffTheBus(std::shared_ptr<monkey_person> mp)
  114. {
  115. //can not free here .
  116. mp->GetOffTheBus();
  117. ScopedLock lk(m_monitor);
  118. auto it = std::find(person_list_.begin(),person_list_.end(),mp);
  119. if (it != person_list_.end())
  120. {
  121. person_list_.erase(it);
  122. }
  123. }
  124. void monkey_bus::getOnTheBus(std::shared_ptr<monkey_person> mp,std::shared_ptr<monkey_bus> bus)
  125. {
  126. mp->GetOnTheBus(bus,m_speed);
  127. ScopedLock lk(m_monitor);
  128. person_list_.push_back(mp);
  129. }
  130. void monkey_bus::updata_position()
  131. {
  132. for(auto person:person_list_)
  133. {
  134. person->updata_position();
  135. }
  136. }