parkspace_manager.h 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. /*
  2. * @Description: 车位分配算法模块,使用单例模式,接收外部请求并通过调用通信块接口发送反馈
  3. * @Author: yct
  4. * @Date: 2020-07-10 09:25:56
  5. * @LastEditTime: 2020-08-06 10:18:56
  6. * @LastEditors: yct
  7. */
  8. #ifndef PARKSPACE_ALLOCATOR_HH
  9. #define PARKSPACE_ALLOCATOR_HH
  10. #include "../tool/thread_pool.h"
  11. #include "../tool/singleton.h"
  12. #include "../tool/thread_condition.h"
  13. #include "../error_code/error_code.h"
  14. #include "../communication/communication_message.h"
  15. #include "../message/parkspace_allocation_message.pb.h"
  16. #include "parkspace_operating_function.h"
  17. #include <ctime>
  18. #include <stdlib.h>
  19. #include <mutex>
  20. //Parkspace_manager
  21. class Parkspace_manager : public Singleton<Parkspace_manager>
  22. {
  23. friend class Singleton<Parkspace_manager>;
  24. public:
  25. enum Parkspace_manager_satus
  26. {
  27. eParkspace_manager_unknown,
  28. eParkspace_manager_normal,
  29. eParkspace_manager_fault
  30. };
  31. //小型车高判断标准 默认1550mm
  32. #define MIN_CAR_HIGH 1.55
  33. //中型车高判断标准 (暂时未定)
  34. #define MID_CAR_HIGH 1.75
  35. //大型车高判断标准 (暂时未定)
  36. #define BIG_CAR_HIGH 2.05
  37. //中跑车速度 米每秒
  38. #define MEDIUM_CAR_SPEED 0.8
  39. //电梯速度 米每秒
  40. #define THE_ELEVATOR_SPEED 1.3
  41. //终端间距
  42. #define TERMINAL_SPACING 3
  43. //中跑车楼下运动时间
  44. #define DOWNSTAIRS_SPORTS_TIME 1
  45. //中跑车楼上运动时间
  46. #define UPSTAIRS_SPORTS_TIME 1
  47. //电梯运动时间
  48. #define ELEVATOR_MOVEMENT_TIME 1
  49. //单元数量
  50. #define UNIT_NUMBER 3
  51. private:
  52. // 父类的构造函数必须保护,子类的构造函数必须私有。
  53. Parkspace_manager();
  54. public:
  55. // 必须关闭拷贝构造和赋值构造,只能通过 get_instance 函数来进行操作唯一的实例。
  56. Parkspace_manager(const Parkspace_manager &) = delete;
  57. Parkspace_manager &operator=(const Parkspace_manager &) = delete;
  58. ~Parkspace_manager();
  59. public://API functions
  60. //初始化
  61. Error_manager parkspace_manager_init(int threads_size);
  62. //反初始化
  63. Error_manager parkspace_manager_uninit();
  64. // 获取模块状态
  65. Parkspace_manager_satus get_parkspace_manage_status();
  66. //检查执行者的状态, 判断能否处理这条消息,
  67. Error_manager check_status();
  68. //处理消息的执行函数
  69. Error_manager execute_msg(Communication_message* p_msg);
  70. //封装心跳消息
  71. Error_manager encapsulating_heartbeat_messages();
  72. //判断是否为待机,如果已经准备好,则可以执行任务。
  73. bool is_ready();
  74. // 检查车辆是否已存在,通常分配前调用
  75. bool check_car_existence(std::string license);
  76. public://execute_msg创建各线程进行处理
  77. //发送车位数据函数 在接收到请求和进行数据库操作后调用
  78. Error_manager send_parkspace_data();
  79. //查找一个合适的车位
  80. Error_manager query_the_optimal_parkspace_server(message::Parkspace_info &parkspace_info,message::Car_info car_info,int terminal_id);
  81. // //找到一个最优车位---方案1
  82. // Error_manager query_the_optimal_parkspace_serverA(message::Parkspace_info &parkspace_info,message::Car_info car_info,int terminal_id);
  83. //找到一个最优车位---方案2(带缓冲区)
  84. // //找左侧车位
  85. // Error_manager query_the_optimal_parkspace_serverB1(message::Parkspace_info &parkspace_info,message::Car_info car_info,int terminal_id);
  86. // //找右侧车位
  87. // Error_manager query_the_optimal_parkspace_serverB2(message::Parkspace_info &parkspace_info,message::Car_info car_info,int terminal_id);
  88. // //找缓冲区车位
  89. // Error_manager query_the_optimal_parkspace_serverB3(message::Parkspace_info &parkspace_info,message::Car_info car_info,int terminal_id);
  90. //分配车位线程函数
  91. void execute_for_allocate(message::Car_info car_info, int terminal_id,std::string command_key);
  92. //确认分配车位线程函数
  93. void execute_for_confirm_alloc(message::Parkspace_confirm_alloc_request_msg space_info);
  94. //查询车位线程函数
  95. void execute_for_search(message::Car_info car_info,std::string command_key);
  96. //手动查询车位线程函数
  97. void execute_for_manual_search(message::Car_info car_info,std::string command_key);
  98. //释放车位线程函数
  99. void execute_for_release(message::Parkspace_release_request_msg release_msg, std::string command_key);
  100. //强制更新车位信息线程函数
  101. void execute_for_force_update(message::Parkspace_force_update_request_msg force_update_msg, std::string command_key);
  102. //确认分配操作函数
  103. Error_manager confirm_alloc_function(message::Parkspace_info& confirm_alloc_space_info,message::Locate_information locate_information);
  104. //释放车位操作函数
  105. Error_manager release_parkspace_function(message::Parkspace_info& release_space_info);
  106. private:
  107. Parkspace_manager_satus m_parkspace_manager_satus; //分配器当前状态
  108. Thread_pool m_thread_pool; //执行多任务的线程池
  109. Parkspace_operating_function m_parkspace_operating_function; //数据库操作函数
  110. std::mutex m_parkspace_lock; //车位操作锁
  111. };
  112. #endif // !PARKSPACE_ALLOCATOR_HH