1
0

monkeycar_area.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #include "monkeycar_area.h"
  2. #include "monkeycar_bus.h"
  3. #include "monkeycar_person.h"
  4. #include "card.h"
  5. #include "log.h"
  6. uint64_t monkey_area::m_startTime=time(NULL)*1000;
  7. monkey_area::monkey_area(std::shared_ptr<db_area> dap,int area_id,int over_count_person,int over_time_person,double scale,int32_t mapid,int32_t type)
  8. :area(area_id,over_count_person,over_time_person,scale,mapid,type)
  9. ,m_path(dap->m_point.begin(),dap->m_point.end())
  10. {
  11. log_info("monkeycar _area init ");
  12. std::shared_ptr<monkey_bus> bus = std::make_shared<monkey_bus>(dap->m_default_speed,NEGTIVE_DIRECTION);
  13. bus_.push_back(bus);
  14. bus = std::make_shared<monkey_bus>(dap->m_default_speed * -1.0,POSTIVE_DIRECTION);
  15. bus_.push_back(bus);
  16. }
  17. std::shared_ptr<monkey_person> monkey_area::find(uint32_t cardid)
  18. {
  19. std::lock_guard<std::mutex> lk(m_mtx);
  20. auto it = card_map_.find(cardid);
  21. if(it == card_map_.end())
  22. return nullptr;
  23. return it->second;
  24. }
  25. void monkey_area::on_hover(int64_t card_id,std::shared_ptr<area_hover>&c,double speed,uint64_t type)
  26. {
  27. area::on_hover(card_id,c,speed,type);
  28. //人卡走下面的业务
  29. if(type != 1)
  30. return;
  31. uint64_t cid = type<<32|card_id;
  32. const std::shared_ptr<card_location_base> card = card_list::instance()->get(cid);
  33. st_coord pt;
  34. pt.x_=card->x;
  35. pt.y_=card->y;
  36. pt.m_ct = card->m_ct;
  37. pt.gen_time_ = card->m_time-m_startTime;
  38. on_card_move(card_id,pt,type);
  39. }
  40. void monkey_area::on_enter(int64_t card_id,std::shared_ptr<area_hover>&c,double speed,uint64_t type)
  41. {
  42. area::on_enter(card_id,c,speed,type);
  43. if(type != 1)
  44. return;
  45. on_card_enter(card_id,type);
  46. }
  47. void monkey_area::on_leave(int64_t card_id,std::shared_ptr<area_hover>&c,double speed,uint64_t type)
  48. {
  49. area::on_leave(card_id,c,speed,type);
  50. if(type != 1)
  51. return;
  52. on_card_leave(card_id);
  53. }
  54. void monkey_area::on_card_leave(uint32_t cardid)
  55. {
  56. log_info("[monkeycar on_card_leave]cardId:%d",cardid);
  57. std::lock_guard<std::mutex> lk(m_mtx);
  58. auto it = card_map_.find(cardid);
  59. if (it != card_map_.end())
  60. {
  61. if(auto tbus = it->second->getBus())
  62. tbus->getOffTheBus(it->second);
  63. card_map_.erase(it);
  64. }
  65. }
  66. void monkey_area::on_card_enter(uint32_t cardid,uint64_t type)
  67. {
  68. //log_info("[framework on_card_enter]cardId:%d",card_id);
  69. log_info("[monkeycar on_card_enter]cardId:%d",cardid);
  70. auto me = shared_from_this();
  71. std::shared_ptr<monkey_person> mp = std::make_shared<monkey_person>(me);
  72. uint64_t c = type<<32|cardid;
  73. const std::shared_ptr<card_location_base> card = card_list::instance()->get(c);
  74. if(card==nullptr)
  75. {
  76. log_error("[monkeycar ----on_card_enter 卡未找到。]cardId:%d",cardid);
  77. return;
  78. }
  79. card->reset(mp);
  80. std::lock_guard<std::mutex> lk(m_mtx);
  81. card_map_.insert(std::make_pair(cardid,mp));
  82. }
  83. void monkey_area::on_card_move(uint32_t cardid,const st_coord & st,uint64_t type)
  84. {
  85. log_info("[monkeycar on_card_move]cardId:%d",cardid);
  86. auto me = shared_from_this();
  87. auto mp=find(cardid);
  88. if (!mp)
  89. {
  90. //if not exist ,create it .because may be restart the system.then area has not changed.
  91. on_card_enter(cardid,type);
  92. return ;
  93. }
  94. bool ret = mp->on_step_map(st);
  95. if (!ret)
  96. return;
  97. double speed=0;
  98. bool b=mp->fit_speed(&speed);
  99. if (!b || speed == DBL_MAX)
  100. return ;
  101. //on bus
  102. speed *= 1000;
  103. log_info("monkeycar speed :cardid:%d,speed:%.2f",cardid,speed);
  104. if(auto tbus = mp->getBus())
  105. {
  106. if(!tbus->test_get_off(mp,speed))
  107. {
  108. log_info("monkeycar get off id:%d",cardid);
  109. tbus->getOffTheBus(mp);
  110. }
  111. }
  112. else
  113. {
  114. std::shared_ptr<monkey_bus> bus=bus_[speed>0?0:1];
  115. if(bus->test_get_on(speed))
  116. {
  117. log_info("monkeycar get onid:%d",cardid);
  118. bus->getOnTheBus(mp,bus);
  119. }
  120. }
  121. }