monkeycar_area.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  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)
  8. :area(area_id,over_count_person,over_time_person,scale,mapid)
  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. log_info("on_enter..card_id:%d,%d",card_id,type);
  43. area::on_enter(card_id,c,speed,type);
  44. if(type != 1)
  45. return;
  46. on_card_enter(card_id,type);
  47. }
  48. void monkey_area::on_leave(int64_t card_id,std::shared_ptr<area_hover>&c,double speed,uint64_t type)
  49. {
  50. area::on_leave(card_id,c,speed,type);
  51. if(type != 1)
  52. return;
  53. on_card_leave(card_id);
  54. }
  55. void monkey_area::on_card_leave(uint32_t cardid)
  56. {
  57. log_info("[monkeycar on_card_leave]cardId:%d",cardid);
  58. std::lock_guard<std::mutex> lk(m_mtx);
  59. auto it = card_map_.find(cardid);
  60. if (it != card_map_.end())
  61. {
  62. if(auto tbus = it->second->getBus())
  63. tbus->getOffTheBus(it->second);
  64. card_map_.erase(it);
  65. }
  66. }
  67. void monkey_area::on_card_enter(uint32_t cardid,uint64_t type)
  68. {
  69. //log_info("[framework on_card_enter]cardId:%d",card_id);
  70. log_info("[monkeycar on_card_enter]cardId:%d",cardid);
  71. auto me = shared_from_this();
  72. std::shared_ptr<monkey_person> mp = std::make_shared<monkey_person>(me);
  73. uint64_t c = type<<32|cardid;
  74. const std::shared_ptr<card_location_base> card = card_list::instance()->get(c);
  75. if(card==nullptr)
  76. {
  77. log_error("[monkeycar ----on_card_enter 卡未找到。]cardId:%d",cardid);
  78. return;
  79. }
  80. card->reset(mp);
  81. std::lock_guard<std::mutex> lk(m_mtx);
  82. card_map_.insert(std::make_pair(cardid,mp));
  83. }
  84. void monkey_area::on_card_move(uint32_t cardid,const st_coord & st,uint64_t type)
  85. {
  86. log_info("[monkeycar on_card_move]cardId:%d",cardid);
  87. auto me = shared_from_this();
  88. auto mp=find(cardid);
  89. if (!mp)
  90. {
  91. //if not exist create it .because may be restart the system.then area not changed.
  92. on_card_enter(cardid,type);
  93. return ;
  94. }
  95. bool ret = mp->on_step_map(st);
  96. if (!ret)
  97. {
  98. return;
  99. }
  100. double speed=0;
  101. bool b=mp->fit_speed(&speed);
  102. if (!b || speed == DBL_MAX)
  103. {
  104. return ;
  105. }
  106. //on bus
  107. speed *= 1000;
  108. log_info("monkeycar speed :cardid:%d,speed:%.2f",cardid,speed);
  109. if(auto tbus = mp->getBus())
  110. {
  111. if(!tbus->test_get_off(mp,speed))
  112. {
  113. log_info("monkeycar get off id:%d",cardid);
  114. tbus->getOffTheBus(mp);
  115. }
  116. }
  117. else
  118. {
  119. std::shared_ptr<monkey_bus> bus=bus_[speed>0?0:1];
  120. if(bus->test_get_on(mp,speed))
  121. {
  122. log_info("monkeycar get onid:%d",cardid);
  123. bus->getOnTheBus(mp,bus);
  124. }
  125. }
  126. }