monkeycar_area.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #include "stdafx.h"
  2. #include "monkeycar_area.h"
  3. #include "classdef.h"
  4. monkey_area::monkey_area(std::shared_ptr<db_area> db_area_ptr)
  5. :area(db_area_ptr)
  6. ,m_path(db_area_ptr->m_point.begin(),db_area_ptr->m_point.end())
  7. {
  8. //反向
  9. std::shared_ptr<monkey_bus> bus = std::make_shared<monkey_bus>(db_area_ptr->m_default_speed,NEGTIVE_DIRECTION);
  10. bus_.push_back(bus);
  11. //正向
  12. //这里需要吧vector里面的字段逆序,然后放入到fp_path里
  13. bus = std::make_shared<monkey_bus>(db_area_ptr->m_default_speed * -1.0,POSTIVE_DIRECTION);
  14. bus_.push_back(bus);
  15. for (auto bus:bus_)
  16. {
  17. bus->start();
  18. }
  19. }
  20. std::shared_ptr<monkey_person> monkey_area::find(std::string cardid)
  21. {
  22. ScopedLock lk(m_monitor);
  23. auto it = card_map_.find(cardid);
  24. if(it == card_map_.end())
  25. return nullptr;
  26. return it->second;
  27. }
  28. void monkey_area::on_card_leave(const std::string& cardid, int next_area)
  29. {
  30. debug_print_syslog(0,"[framework on_card_leave]cardId:%s,pre_areaId:%d",cardid.c_str(),next_area);
  31. ScopedLock lk(m_monitor);
  32. auto it = card_map_.find(cardid);
  33. if (it != card_map_.end())
  34. {
  35. if (it->second->is_on_bus())
  36. {
  37. if (!it->second->m_bus.expired())
  38. {
  39. std::shared_ptr<monkey_bus> tbus = it->second->m_bus.lock();
  40. //
  41. tbus->getOffTheBus(it->second);
  42. }
  43. }
  44. card_map_.erase(it);
  45. }
  46. }
  47. void monkey_area::on_card_enter(std::shared_ptr<Card>& ccard, int prev_area)
  48. {
  49. debug_print_syslog(0,"[framework on_card_enter]cardId:%s,pre_areaId:%d",ccard->card_id.c_str(),prev_area);
  50. std::shared_ptr<monkey_person> mp = std::make_shared<monkey_person>(ccard,this);
  51. mp->m_person->set_position_interface(mp);
  52. ScopedLock lk(m_monitor);
  53. card_map_.insert(std::make_pair(ccard->card_id,mp));
  54. }
  55. void monkey_area::on_card_move(std::shared_ptr<Card> &card)
  56. {
  57. //debug_print_syslog(0,"[framework on_card_move]cardId:%s",card->card_id.c_str());
  58. auto mp=find(card->card_id);
  59. if (!mp)
  60. {
  61. //if not exist create it .because may be restart the system.then area not changed.
  62. on_card_enter(card,card->pre_area_id);
  63. return ;
  64. }
  65. bool ret = mp->on_step_map(m_path);
  66. if (!ret)
  67. {
  68. return;
  69. }
  70. double speed=0;
  71. bool b=mp->fit_speed(&speed);
  72. if (!b || speed == DBL_MAX)
  73. {
  74. return ;
  75. }
  76. //on bus
  77. speed *= cacti::Timestamp::ONE_SEC_IN_MILLISEC;
  78. if(mp->is_on_bus())
  79. {
  80. if (!mp->m_bus.expired())
  81. {
  82. std::shared_ptr<monkey_bus> tbus = mp->m_bus.lock();
  83. if(!tbus->test_get_off(mp,speed))
  84. {
  85. tbus->getOffTheBus(mp);
  86. }
  87. }
  88. }
  89. else
  90. {
  91. std::shared_ptr<monkey_bus> bus=bus_[speed>0?0:1];
  92. if(bus->test_get_on(mp,speed))
  93. {
  94. bus->getOnTheBus(mp,bus);
  95. }
  96. }
  97. }