/* * @Description: 车位分配算法模块,使用单例模式,接收外部请求并通过调用通信块接口发送反馈 * @Author: yct * @Date: 2020-07-10 09:25:56 * @LastEditTime: 2020-08-06 10:18:56 * @LastEditors: yct */ #ifndef PARKSPACE_ALLOCATOR_HH #define PARKSPACE_ALLOCATOR_HH #include "../tool/thread_pool.h" #include "../tool/singleton.h" #include "../tool/thread_condition.h" #include "../error_code/error_code.h" #include "../communication/communication_message.h" #include "../message/parkspace_allocation_message.pb.h" #include "parkspace_operating_function.h" #include #include #include //Parkspace_manager class Parkspace_manager : public Singleton { friend class Singleton; public: enum Parkspace_manager_satus { eParkspace_manager_unknown, eParkspace_manager_normal, eParkspace_manager_fault }; //小型车高判断标准 默认1550mm #define MIN_CAR_HIGH 1.55 //中型车高判断标准 (暂时未定) #define MID_CAR_HIGH 1.75 //大型车高判断标准 (暂时未定) #define BIG_CAR_HIGH 2.05 //中跑车速度 米每秒 #define MEDIUM_CAR_SPEED 0.8 //电梯速度 米每秒 #define THE_ELEVATOR_SPEED 1.3 //终端间距 #define TERMINAL_SPACING 3 //中跑车楼下运动时间 #define DOWNSTAIRS_SPORTS_TIME 1 //中跑车楼上运动时间 #define UPSTAIRS_SPORTS_TIME 1 //电梯运动时间 #define ELEVATOR_MOVEMENT_TIME 1 //单元数量 #define UNIT_NUMBER 3 private: // 父类的构造函数必须保护,子类的构造函数必须私有。 Parkspace_manager(); public: // 必须关闭拷贝构造和赋值构造,只能通过 get_instance 函数来进行操作唯一的实例。 Parkspace_manager(const Parkspace_manager &) = delete; Parkspace_manager &operator=(const Parkspace_manager &) = delete; ~Parkspace_manager(); public://API functions //初始化 Error_manager parkspace_manager_init(int threads_size); //反初始化 Error_manager parkspace_manager_uninit(); // 获取模块状态 Parkspace_manager_satus get_parkspace_manage_status(); //检查执行者的状态, 判断能否处理这条消息, Error_manager check_status(); //处理消息的执行函数 Error_manager execute_msg(Communication_message* p_msg); //封装心跳消息 Error_manager encapsulating_heartbeat_messages(); //判断是否为待机,如果已经准备好,则可以执行任务。 bool is_ready(); // 检查车辆是否已存在,通常分配前调用 bool check_car_existence(std::string license); public://execute_msg创建各线程进行处理 //发送车位数据函数 在接收到请求和进行数据库操作后调用 Error_manager send_parkspace_data(); //查找一个合适的车位 Error_manager query_the_optimal_parkspace_server(message::Parkspace_info &parkspace_info,message::Car_info car_info,int terminal_id); // //找到一个最优车位---方案1 // Error_manager query_the_optimal_parkspace_serverA(message::Parkspace_info &parkspace_info,message::Car_info car_info,int terminal_id); //找到一个最优车位---方案2(带缓冲区) // //找左侧车位 // Error_manager query_the_optimal_parkspace_serverB1(message::Parkspace_info &parkspace_info,message::Car_info car_info,int terminal_id); // //找右侧车位 // Error_manager query_the_optimal_parkspace_serverB2(message::Parkspace_info &parkspace_info,message::Car_info car_info,int terminal_id); // //找缓冲区车位 // Error_manager query_the_optimal_parkspace_serverB3(message::Parkspace_info &parkspace_info,message::Car_info car_info,int terminal_id); //分配车位线程函数 void execute_for_allocate(message::Car_info car_info, int terminal_id,std::string command_key); //确认分配车位线程函数 void execute_for_confirm_alloc(message::Parkspace_confirm_alloc_request_msg space_info); //查询车位线程函数 void execute_for_search(message::Car_info car_info,std::string command_key); //手动查询车位线程函数 void execute_for_manual_search(message::Car_info car_info,std::string command_key); //释放车位线程函数 void execute_for_release(message::Parkspace_release_request_msg release_msg, std::string command_key); //强制更新车位信息线程函数 void execute_for_force_update(message::Parkspace_force_update_request_msg force_update_msg, std::string command_key); //确认分配操作函数 Error_manager confirm_alloc_function(message::Parkspace_info& confirm_alloc_space_info,message::Locate_information locate_information); //释放车位操作函数 Error_manager release_parkspace_function(message::Parkspace_info& release_space_info); private: Parkspace_manager_satus m_parkspace_manager_satus; //分配器当前状态 Thread_pool m_thread_pool; //执行多任务的线程池 Parkspace_operating_function m_parkspace_operating_function; //数据库操作函数 std::mutex m_parkspace_lock; //车位操作锁 }; #endif // !PARKSPACE_ALLOCATOR_HH