/* * @Description: 车位分配算法模块,使用单例模式,接收外部请求并通过调用通信块接口发送反馈 * @Author: yct * @Date: 2020-07-10 11:02:40 * @LastEditTime: 2020-08-06 10:32:28 * @LastEditors: yct */ #include "parkspace_manager.h" #include "parkspace_communicator.h" Parkspace_manager::Parkspace_manager() { } Parkspace_manager::~Parkspace_manager() { parkspace_manager_uninit(); } //初始化 Error_manager Parkspace_manager::parkspace_manager_init(int threads_size) { // 初始化任务处理线程池 m_thread_pool.thread_pool_init(threads_size); m_parkspace_manager_satus = eParkspace_manager_normal; return Error_code::SUCCESS; } //反初始化 Error_manager Parkspace_manager::parkspace_manager_uninit() { m_thread_pool.thread_pool_uninit(); m_parkspace_manager_satus = eParkspace_manager_unknown; return Error_code::SUCCESS; } //检查执行者的状态, 判断能否处理这条消息, Error_manager Parkspace_manager::check_status() { if(get_parkspace_manage_status() != eParkspace_manager_normal) { return Error_manager(Error_code::DB_MANAGER_STATUS_ERROR, Error_level::MAJOR_ERROR, " Parkspace_manager::check_executer error "); } return SUCCESS; } //处理消息的执行函数 Error_manager Parkspace_manager::execute_msg(Communication_message* p_msg) { if ( p_msg == nullptr ) { return Error_manager(Error_code::POINTER_IS_NULL, Error_level::MINOR_ERROR, " POINTER IS NULL "); } switch ( p_msg->get_message_type() ) { ///车位分配请求消息 case Communication_message::eParkspace_allocation_request_msg: { message::Parkspace_allocation_request_msg request; bool result = request.ParseFromString(p_msg->get_message_buf()); LOG(INFO)<<"allocation request, car license: "<get_message_buf()); LOG(INFO)<<"search request, car license: "<get_message_buf()); LOG(INFO)<<"release request, parkspace id: "<get_message_buf()); LOG(INFO)<<"force update request, parkspace id: "<get_message_buf()); LOG(INFO)<<"confirm alloc request, parkspace id: "<get_database_controller_status(); t_parkspace_manager_satus = Parkspace_manager::get_instance_pointer()->get_parkspace_manage_status(); //车位信息消息赋值 message::Parkspace_allocation_status_msg t_parkspace_status_msg; message::Base_info t_base_info; message::Error_manager t_error; t_base_info.set_msg_type(message::Message_type::eParkspace_allocation_status_msg); t_base_info.set_timeout_ms(5000); t_base_info.set_sender(message::Communicator::eParkspace); t_base_info.set_receiver(message::Communicator::eMain); t_error.set_error_code(0); t_parkspace_status_msg.mutable_base_info()->CopyFrom(t_base_info); t_parkspace_status_msg.mutable_error_manager()->CopyFrom(t_error); t_parkspace_status_msg.set_database_controller_status((message::Database_controller_status)t_database_controller_status); t_parkspace_status_msg.set_parkspace_manager_satus((message::Parkspace_manager_satus)t_parkspace_manager_satus); return Parkspace_communicator::get_instance_references().encapsulate_msg(t_parkspace_status_msg.SerializeAsString()); } //判断是否为待机,如果已经准备好,则可以执行任务。 bool Parkspace_manager::is_ready() { if ( m_parkspace_manager_satus == eParkspace_manager_normal && m_thread_pool.thread_is_full_load() == false ) { return true; } else { return false; } } Parkspace_manager::Parkspace_manager_satus Parkspace_manager::get_parkspace_manage_status() { return m_parkspace_manager_satus; } // 检查车辆是否已存在,通常分配前调用 bool Parkspace_manager::check_car_existence(std::string license) { message::Parkspace_info parkspaceInfo; //获取车辆状态 Error_manager error=m_parkspace_operating_function.query_one_parkspace_with_license(license,parkspaceInfo); //如果车辆处于停车中或者已入库 则车辆已存在 if(!parkspaceInfo.has_car_info()) { return false; } return true; } Error_manager Parkspace_manager::send_parkspace_data() { message::Parkspace_allocation_data_msg all_parkspace_data; Error_manager t_error=m_parkspace_operating_function.get_all_parkspace_info(all_parkspace_data); if(t_error != SUCCESS) { return t_error; } message::Base_info t_base_info; message::Error_manager error; t_base_info.set_msg_type(message::Message_type::eParkspace_allocation_data_msg); t_base_info.set_timeout_ms(5000); t_base_info.set_sender(message::Communicator::eParkspace); t_base_info.set_receiver(message::Communicator::eMain); all_parkspace_data.mutable_base_info()->CopyFrom(t_base_info); error.set_error_code(0); all_parkspace_data.mutable_error_manager()->CopyFrom(error); return Parkspace_communicator::get_instance_references().encapsulate_msg(all_parkspace_data.SerializeAsString()); } //找到一个最优车位---方案一 Error_manager Parkspace_manager::query_the_optimal_parkspace_serverA(message::Parkspace_info &parkspace_info,message::Car_info car_info,int terminal_id) { //车辆高大于1550mm分在四楼以下,小于1550mm分在四楼以上 /* * K=j%15 * P=i%6 * S=15*d-(j%15)*(2*d-1)+[6*d-(i%6)(2*d-1)]*W W>1 */ float time_min=0; int parkingspace_index_id=-1; //判断是否是左半库 if ( terminal_id<=3 && terminal_id>=0 ) { LOG(INFO) << " 左半库 车牌号:"<= 1 && all_min_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty) { //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度 float time = (terminal_id+2) * TERMINAL_SPACING / MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME + (all_min_parkspace_data.parkspace_info(i).parkingspace_floor_id() - 2) *all_min_parkspace_data.parkspace_info(i).parkingspace_height() /THE_ELEVATOR_SPEED +ELEVATOR_MOVEMENT_TIME + (all_min_parkspace_data.parkspace_info(i).parkingspace_index_id() % 15) *all_min_parkspace_data.parkspace_info(i).parkingspace_width() / MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME; if (time_min == 0) { time_min = time; parkingspace_index_id = i; } else { if ( time < time_min ) { time_min = time; parkingspace_index_id = i; } } } ++i; } //判断小车车位(第一优先级)是否有找到合适的空车位 如果找到了 则不需要继续比较 直接返回 if ( time_min!=0 && parkingspace_index_id!=-1 ) { parkspace_info.CopyFrom(all_min_parkspace_data.parkspace_info(parkingspace_index_id)); return Error_code::SUCCESS; } else { LOG(INFO) << " 小车车位未找到合适车位 "<< this; } } if ( car_info.car_height() <= MID_CAR_HIGH ) { //第二优先级(中型车位) //获取中型车位 message::Parkspace_allocation_data_msg all_mid_parkspace_data; Error_manager t_error=m_parkspace_operating_function.get_specify_the_type_parkspace_info(all_mid_parkspace_data,message::Parkspace_type::MID_PARKINGSPACE); if(t_error != SUCCESS) { return t_error; } int i=0; while(i= 19 && room_id <= 23) { //只需计算端口到车位的距离 // 三楼中型用时=| 目标车位到电梯的距离 - 终端到电梯的距离 | / 中跑车速度 float t_min=abs( room_id%15*all_mid_parkspace_data.parkspace_info(i).parkingspace_width()-(terminal_id+2)*TERMINAL_SPACING )/MEDIUM_CAR_SPEED+DOWNSTAIRS_SPORTS_TIME; if ( time_min == 0 ) { time_min=t_min; parkingspace_index_id=i; } else { if ( t_min=61 && all_mid_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty ) { //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度 float time=(terminal_id+2)*TERMINAL_SPACING/MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME + (all_mid_parkspace_data.parkspace_info(i).parkingspace_floor_id()-2)*all_mid_parkspace_data.parkspace_info(i).parkingspace_height()/THE_ELEVATOR_SPEED + ELEVATOR_MOVEMENT_TIME + all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id()%15*all_mid_parkspace_data.parkspace_info(i).parkingspace_width()/MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME; if ( time_min == 0 ) { time_min=time; parkingspace_index_id=i; } else { if ( time=1 && all_big_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty ) { //如果是二楼车 则特殊处理 if ( all_big_parkspace_data.parkspace_info(i).parkingspace_floor_id() == 2 ) { // 二楼用时=| 目标车位到电梯的距离 - 终端到电梯的距离 | / 中跑车速度 float t_min=abs( room_id%15*all_big_parkspace_data.parkspace_info(i).parkingspace_width() - (terminal_id+2)*TERMINAL_SPACING )/MEDIUM_CAR_SPEED+DOWNSTAIRS_SPORTS_TIME; if ( time_min == 0 ) { time_min=t_min; parkingspace_index_id=i; } else { if ( t_min=4) { //如果是小车 (低于1.55米属于小车) if ( car_info.car_height() <= MIN_CAR_HIGH ) { //获取所有小型车位信息 message::Parkspace_allocation_data_msg all_min_parkspace_data; Error_manager t_error = m_parkspace_operating_function.get_specify_the_type_parkspace_info(all_min_parkspace_data, message::Parkspace_type::MIN_PARKINGSPACE); if (t_error != SUCCESS) { return t_error; } //遍历所有小型车位 int i = 0; while (i < all_min_parkspace_data.parkspace_info_size()) { int room_id=all_min_parkspace_data.parkspace_info(i).parkingspace_index_id(); //筛选出一号车库的小型车位(第一优先级)的空车位 if (room_id <= 165 && room_id >= 54 && all_min_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty) { //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度 float time = (6-terminal_id+2)* TERMINAL_SPACING / MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME + (all_min_parkspace_data.parkspace_info(i).parkingspace_floor_id() - 2) *all_min_parkspace_data.parkspace_info(i).parkingspace_height() /THE_ELEVATOR_SPEED +ELEVATOR_MOVEMENT_TIME + ( (15-all_min_parkspace_data.parkspace_info(i).parkingspace_index_id() % 15)==15?0:(15-all_min_parkspace_data.parkspace_info(i).parkingspace_index_id() % 15) ) *all_min_parkspace_data.parkspace_info(i).parkingspace_width() / MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME; if (time_min == 0) { time_min = time; parkingspace_index_id = i; } else { if ( time < time_min ) { time_min = time; parkingspace_index_id = i; } } } ++i; } //判断小车车位(第一优先级)是否有找到合适的空车位 如果找到了 则不需要继续比较 直接返回 if ( time_min!=0 && parkingspace_index_id!=-1 ) { parkspace_info.CopyFrom(all_min_parkspace_data.parkspace_info(parkingspace_index_id)); return Error_code::SUCCESS; } } if ( car_info.car_height() <= MID_CAR_HIGH ) { //第二优先级(中型车位) //获取中型车位 message::Parkspace_allocation_data_msg all_mid_parkspace_data; Error_manager t_error=m_parkspace_operating_function.get_specify_the_type_parkspace_info(all_mid_parkspace_data,message::Parkspace_type::MID_PARKINGSPACE); if(t_error != SUCCESS) { return t_error; } int i=0; while(i= 24 && room_id <= 27 ) { //只需计算端口到车位的距离 // 三楼中型车位用时=| 目标车位到电梯的距离 - 终端到电梯的距离 | / 中跑车速度 float t_min=abs( ((15-room_id%15)==15?0:(15-room_id%15))*all_mid_parkspace_data.parkspace_info(i).parkingspace_width()-(6-terminal_id+2)*TERMINAL_SPACING )/MEDIUM_CAR_SPEED+DOWNSTAIRS_SPORTS_TIME; if ( time_min == 0 ) { time_min=t_min; parkingspace_index_id=i; } else { if ( t_min= 69 && all_mid_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty ) { //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度 float time=(6-terminal_id+2)*TERMINAL_SPACING/MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME + (all_mid_parkspace_data.parkspace_info(i).parkingspace_floor_id()-2)*all_mid_parkspace_data.parkspace_info(i).parkingspace_height()/THE_ELEVATOR_SPEED + ELEVATOR_MOVEMENT_TIME + ( ((15-all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id()%15) ==15?0:(15-all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id()%15)) )*all_mid_parkspace_data.parkspace_info(i).parkingspace_width()/MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME; if ( time_min == 0 ) { time_min=time; parkingspace_index_id=i; } else { if ( time=9 && room_id %15 <=14 || room_id %15 == 0 && all_big_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty ) { //如果是二楼车 则特殊处理 if ( all_big_parkspace_data.parkspace_info(i).parkingspace_floor_id() == 2 ) { // 二楼用时=| 目标车位到电梯的距离 - 终端到电梯的距离 | / 中跑车速度 float t_min=abs( ((15-room_id%15)==15?0:(15-room_id%15))*all_big_parkspace_data.parkspace_info(i).parkingspace_width()-(6-terminal_id+2)*TERMINAL_SPACING )/MEDIUM_CAR_SPEED+DOWNSTAIRS_SPORTS_TIME; if ( time_min == 0 ) { time_min=t_min; parkingspace_index_id=i; } else { if ( t_min1 */ float time_min=0; int parkingspace_index_id=-1; //找左侧车位 //如果是小车 (低于1.55米属于小车) if ( car_info.car_height() <= MIN_CAR_HIGH ) { //获取所有小型车位信息 message::Parkspace_allocation_data_msg all_min_parkspace_data; Error_manager t_error = m_parkspace_operating_function.get_specify_the_type_parkspace_info(all_min_parkspace_data, message::Parkspace_type::MIN_PARKINGSPACE); if (t_error != SUCCESS) { return t_error; } //遍历所有小型车位 int i = 0; while (i < all_min_parkspace_data.parkspace_info_size()) { int room_id=all_min_parkspace_data.parkspace_info(i).parkingspace_index_id(); //筛选出小型车位的中间部分(第一优先级)的空车位 if (room_id % 15 <= 8 && room_id % 15 >= 4 && all_min_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty) { //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度 float time = (terminal_id+2) * TERMINAL_SPACING / MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME + (all_min_parkspace_data.parkspace_info(i).parkingspace_floor_id() - 2) *all_min_parkspace_data.parkspace_info(i).parkingspace_height() /THE_ELEVATOR_SPEED +ELEVATOR_MOVEMENT_TIME + (all_min_parkspace_data.parkspace_info(i).parkingspace_index_id() % 15) *all_min_parkspace_data.parkspace_info(i).parkingspace_width() / MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME; if (time_min == 0) { time_min = time; parkingspace_index_id = i; } else { if ( time= 1 && all_min_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty) { //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度 float time = (terminal_id+2) * TERMINAL_SPACING / MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME + (all_min_parkspace_data.parkspace_info(i).parkingspace_floor_id() - 2) *all_min_parkspace_data.parkspace_info(i).parkingspace_height() /THE_ELEVATOR_SPEED +ELEVATOR_MOVEMENT_TIME + (all_min_parkspace_data.parkspace_info(i).parkingspace_index_id() % 15) *all_min_parkspace_data.parkspace_info(i).parkingspace_width() / MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME; if (time_min == 0) { time_min = time; parkingspace_index_id = i; } else { if ( time < time_min ) { time_min = time; parkingspace_index_id = i; } } } ++i; } //判断小车车位侧边部分(第二优先级)是否有找到合适的空车位 如果找到了 则不需要继续比较 直接返回 if ( time_min!=0 && parkingspace_index_id!=-1 ) { parkspace_info.CopyFrom(all_min_parkspace_data.parkspace_info(parkingspace_index_id)); return Error_code::SUCCESS; } } } if ( car_info.car_height() <= MID_CAR_HIGH ) { //找中型车位 //获取中型车位 message::Parkspace_allocation_data_msg all_mid_parkspace_data; Error_manager t_error=m_parkspace_operating_function.get_specify_the_type_parkspace_info(all_mid_parkspace_data,message::Parkspace_type::MID_PARKINGSPACE); if(t_error != SUCCESS) { return t_error; } int i=0; while(i=64 && room_id <= 68 && all_mid_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty ) { //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度 float time=(terminal_id+2)*TERMINAL_SPACING/MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME + (all_mid_parkspace_data.parkspace_info(i).parkingspace_floor_id()-2)*all_mid_parkspace_data.parkspace_info(i).parkingspace_height()/THE_ELEVATOR_SPEED + ELEVATOR_MOVEMENT_TIME + (all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id()%15)*all_mid_parkspace_data.parkspace_info(i).parkingspace_width()/MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME; if ( time_min == 0 ) { time_min=time; parkingspace_index_id=i; } else { if ( time=61 && room_id <= 63 && all_mid_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty ) { //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度 float time=(terminal_id+2)*TERMINAL_SPACING/MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME + (all_mid_parkspace_data.parkspace_info(i).parkingspace_floor_id()-2)*all_mid_parkspace_data.parkspace_info(i).parkingspace_height()/THE_ELEVATOR_SPEED + ELEVATOR_MOVEMENT_TIME + all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id()%15*all_mid_parkspace_data.parkspace_info(i).parkingspace_width()/MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME; if ( time_min == 0 ) { time_min=time; parkingspace_index_id=i; } else { if ( time=34 && room_id<=38 && all_big_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty ) { //如果是二楼车 则特殊处理 if ( all_big_parkspace_data.parkspace_info(i).parkingspace_floor_id() == 2 ) { // 二楼用时=| 目标车位到电梯的距离 - 终端到电梯的距离 | / 中跑车速度 float t_min=abs( room_id%15*all_big_parkspace_data.parkspace_info(i).parkingspace_width()-(terminal_id+2)*TERMINAL_SPACING )/MEDIUM_CAR_SPEED+DOWNSTAIRS_SPORTS_TIME; if ( time_min == 0 ) { time_min=t_min; parkingspace_index_id=i; } else { if ( t_min1 */ float time_min=0; int parkingspace_index_id=-1; //找右侧车位 //如果是小车 (低于1.55米属于小车) if ( car_info.car_height() <= MIN_CAR_HIGH ) { //获取所有小型车位信息 message::Parkspace_allocation_data_msg all_min_parkspace_data; Error_manager t_error = m_parkspace_operating_function.get_specify_the_type_parkspace_info(all_min_parkspace_data, message::Parkspace_type::MIN_PARKINGSPACE); if (t_error != SUCCESS) { return t_error; } //遍历所有小型车位 int i = 0; while (i < all_min_parkspace_data.parkspace_info_size()) { int room_id=all_min_parkspace_data.parkspace_info(i).parkingspace_index_id(); //筛选出小型车位的中间部分(第一优先级)的空车位 if (room_id % 15 >= 9 && room_id % 15 <= 12 && all_min_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty) { //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度 float time = (6-terminal_id+2) * TERMINAL_SPACING / MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME + (all_min_parkspace_data.parkspace_info(i).parkingspace_floor_id() - 2) *all_min_parkspace_data.parkspace_info(i).parkingspace_height() /THE_ELEVATOR_SPEED +ELEVATOR_MOVEMENT_TIME + ( (15-all_min_parkspace_data.parkspace_info(i).parkingspace_index_id() % 15)==15?0:(15-all_min_parkspace_data.parkspace_info(i).parkingspace_index_id() % 15) ) *all_min_parkspace_data.parkspace_info(i).parkingspace_width() / MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME; if (time_min == 0) { time_min = time; parkingspace_index_id = i; } else { if ( time= 69 && room_id <= 72 && all_mid_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty ) { //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度 float time=(6-terminal_id+2)*TERMINAL_SPACING/MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME + (all_mid_parkspace_data.parkspace_info(i).parkingspace_floor_id()-2)*all_mid_parkspace_data.parkspace_info(i).parkingspace_height()/THE_ELEVATOR_SPEED + ELEVATOR_MOVEMENT_TIME + ( ((15-all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id()%15) ==15?0:(15-all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id()%15)) )*all_mid_parkspace_data.parkspace_info(i).parkingspace_width()/MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME; if ( time_min == 0 ) { time_min=time; parkingspace_index_id=i; } else { if ( time=73 && room_id <= 75 && all_mid_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty ) { //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度 float time=(6-terminal_id+2)*TERMINAL_SPACING/MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME + (all_mid_parkspace_data.parkspace_info(i).parkingspace_floor_id()-2)*all_mid_parkspace_data.parkspace_info(i).parkingspace_height()/THE_ELEVATOR_SPEED + ELEVATOR_MOVEMENT_TIME + ( ((15-all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id()%15) ==15?0:(15-all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id()%15)) )*all_mid_parkspace_data.parkspace_info(i).parkingspace_width()/MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME; if ( time_min == 0 ) { time_min=time; parkingspace_index_id=i; } else { if ( time=39 && room_id<=42 && all_big_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty ) { //如果是二楼车 则特殊处理 if ( all_big_parkspace_data.parkspace_info(i).parkingspace_floor_id() == 2 ) { // 二楼用时=| 目标车位到电梯的距离 - 终端到电梯的距离 | / 中跑车速度 float t_min=abs( ((15-room_id%15)==15?0:(15-room_id%15))*all_big_parkspace_data.parkspace_info(i).parkingspace_width()-(6-terminal_id+2)*TERMINAL_SPACING )/MEDIUM_CAR_SPEED+DOWNSTAIRS_SPORTS_TIME; if ( time_min == 0 ) { time_min=t_min; parkingspace_index_id=i; } else { if ( t_min1 */ float time_min=0; int parkingspace_index_id=-1; //找缓存区车位 缓冲区只有中型车位和大型车位 if ( car_info.car_height() <= MID_CAR_HIGH ) { message::Parkspace_allocation_data_msg all_mid_parkspace_data; Error_manager t_error=m_parkspace_operating_function.get_specify_the_type_parkspace_info(all_mid_parkspace_data,message::Parkspace_type::MID_PARKINGSPACE); if(t_error != SUCCESS) { return t_error; } int i=0; while (i < all_mid_parkspace_data.parkspace_info_size()) { //筛选中型车位缓冲区 int room_id=all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id(); if ( room_id >= 19 && room_id <= 27 && all_mid_parkspace_data.parkspace_info(i).parkingspace_status() == message::eParkspace_empty) { //只需计算端口到车位的距离 // 三楼中型用时=| 目标车位到电梯的距离 - 终端到电梯的距离 | / 中跑车速度 float t_min=abs( room_id%15*all_mid_parkspace_data.parkspace_info(i).parkingspace_width()-(terminal_id+2)*TERMINAL_SPACING )/MEDIUM_CAR_SPEED+DOWNSTAIRS_SPORTS_TIME; if ( time_min == 0 ) { time_min=t_min; parkingspace_index_id=i; } else { if ( t_min= 4 && room_id <= 12 && all_big_parkspace_data.parkspace_info(i).parkingspace_status() == message::eParkspace_empty) { //只需计算端口到车位的距离 // 二楼中型用时=| 目标车位到电梯的距离 - 终端到电梯的距离 | / 中跑车速度 float t_min=abs( room_id%15*all_big_parkspace_data.parkspace_info(i).parkingspace_width()-(terminal_id+2)*TERMINAL_SPACING )/MEDIUM_CAR_SPEED+DOWNSTAIRS_SPORTS_TIME; if ( time_min == 0 ) { time_min=t_min; parkingspace_index_id=i; } else { if ( t_minCopyFrom(car_info); // 分配车位后更新数据库中车位状态 error=m_parkspace_operating_function.update_parkspace_data(t_allocated_space); if ( error != SUCCESS ) { t_error.set_error_code(error.get_error_code()); t_error.set_error_level((message::Error_level)error.get_error_level()); t_error.set_error_description(error.get_error_description()); LOG(ERROR) << car_info.license()<<" 更新车位数据失败 "<CopyFrom(t_response_header); response_msg.set_command_key(command_key); response_msg.mutable_error_manager()->CopyFrom(t_error); response_msg.mutable_allocated_space_info()->CopyFrom(t_allocated_space); Communication_message response=Communication_message(); response.reset(t_response_header, response_msg.SerializeAsString()); Parkspace_communicator::get_instance_references().send_response(&response); send_parkspace_data(); std::cout<CopyFrom(t_response_header); response_msg.set_command_key(command_key); response_msg.mutable_error_manager()->CopyFrom(t_error); response_msg.mutable_car_position()->CopyFrom(t_car_position); Communication_message response=Communication_message(); response.reset(t_response_header, response_msg.SerializeAsString()); Parkspace_communicator::get_instance_references().send_response(&response); std::cout<tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec); t_release_space.set_leave_time(my_time_buf); error = m_parkspace_operating_function.update_parking_record(t_release_space, t_park_record_id); if (error != SUCCESS) { t_error.set_error_code(error.get_error_code()); t_error.set_error_level((message::Error_level) error.get_error_level()); t_error.set_error_description(error.get_error_description()); LOG(ERROR) << "更新停车记录失败: " << error.to_string(); } } } } } m_parkspace_lock.unlock(); response_msg.mutable_base_info()->CopyFrom(t_response_header); response_msg.set_command_key(command_key); response_msg.mutable_error_manager()->CopyFrom(t_error); response_msg.mutable_release_space_info()->CopyFrom(t_release_space); Communication_message response=Communication_message(); response.reset(t_response_header, response_msg.SerializeAsString()); Parkspace_communicator::get_instance_references().send_response(&response); send_parkspace_data(); std::cout<CopyFrom(t_response_header); response_msg.set_command_key(command_key); response_msg.mutable_error_manager()->CopyFrom(t_error); response_msg.mutable_update_space_info()->CopyFrom(t_update_space); Communication_message response=Communication_message(); response.reset(t_response_header, response_msg.SerializeAsString()); Parkspace_communicator::get_instance_references().send_response(&response); send_parkspace_data(); } //确认分配车位线程函数 void Parkspace_manager::execute_for_confirm_alloc(message::Parkspace_info space_info, std::string command_key) { LOG(INFO) << "确认分配 " << "牌号:" << space_info.car_info().license() << " command_key=" << command_key; //根据车位信息定位待确认占用车位 message::Parkspace_confirm_alloc_response_msg response_msg; message::Base_info t_response_header; t_response_header.set_msg_type(message::eParkspace_confirm_alloc_response_msg); t_response_header.set_sender(message::eParkspace); t_response_header.set_receiver(message::eMain); t_response_header.set_timeout_ms(1000); message::Error_manager t_error; message::Parkspace_info t_confirm_space; Error_manager error; //获取确认分配的车位 m_parkspace_lock.lock(); error = m_parkspace_operating_function.query_one_parkspace_with_parkspace_id(space_info.parkingspace_index_id(), t_confirm_space); if (error != SUCCESS) { t_error.set_error_code(error.get_error_code()); t_error.set_error_level((message::Error_level) error.get_error_level()); t_error.set_error_description(error.get_error_description()); LOG(ERROR) << "确认分配 查询车位信息失败 " << error.to_string(); } else if (!t_confirm_space.has_car_info()) { t_error.set_error_code(PARKSPACE_ALLOCATOR_RELEASE_FAILED); t_error.set_error_level(message::Error_level::MAJOR_ERROR); LOG(WARNING) << "传入待确认车位无车辆信息"; } else { //校验车位状态是否为被锁定 if (t_confirm_space.parkingspace_status() != message::Parkspace_status::eParkspace_locked) { t_error.set_error_code(DB_QUERY_DATA_FAILED); t_error.set_error_level(message::Error_level::MINOR_ERROR); t_error.set_error_description("查询车位状态错误"); LOG(ERROR) << "确认分配 查询车位状态错误 " << error.to_string(); } else { //修改车位状态为占用 t_confirm_space.set_parkingspace_status(message::Parkspace_status::eParkspace_occupied); error = m_parkspace_operating_function.update_parkspace_data(t_confirm_space); if (error != SUCCESS) { t_error.set_error_code(error.get_error_code()); t_error.set_error_level((message::Error_level) error.get_error_level()); LOG(INFO) << "确认分配 数据库更新车位失败 " << error.to_string(); } else { //修改车辆状态为已入库 message::Vehicle_status t_vehicle_status = message::Vehicle_status::eVehicle_in_garage; error = m_parkspace_operating_function.update_vehicle_with_parkspace(t_confirm_space, t_vehicle_status); if (error != SUCCESS) { t_error.set_error_code(error.get_error_code()); t_error.set_error_level((message::Error_level) error.get_error_level()); t_error.set_error_description(error.get_error_description()); LOG(ERROR) << "确认分配 更新数据库车辆数据失败 " << error.to_string(); } t_error.set_error_code(SUCCESS); t_error.set_error_level(message::Error_level::NORMAL); LOG(INFO) << "第:" << t_confirm_space.parkingspace_index_id() << "号位 车辆: " << t_confirm_space.car_info().license()<< " 确认占用成功"; //插入停车记录 time_t tt = time(NULL); tm *t = localtime(&tt); char my_time_buf[255]; memset(my_time_buf, 0, 255); sprintf(my_time_buf, "%d-%02d-%02d %02d:%02d:%02d", t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec); t_confirm_space.set_entry_time(my_time_buf); error = m_parkspace_operating_function.insert_parking_record(t_confirm_space); if ( error != SUCCESS ) { t_error.set_error_code(error.get_error_code()); t_error.set_error_level((message::Error_level) error.get_error_level()); LOG(ERROR) << "插入停车记录失败: " << error.to_string(); } //查询停车记录的ID int t_record_id; error = m_parkspace_operating_function.query_parking_record(t_confirm_space,t_record_id); if ( error != SUCCESS ) { t_error.set_error_code(error.get_error_code()); t_error.set_error_level((message::Error_level) error.get_error_level()); LOG(ERROR) << "查询停车记录ID失败: " << error.to_string(); } //更新停车记录ID error = m_parkspace_operating_function.update_record_id(t_confirm_space.car_info().license(),t_record_id); if ( error != SUCCESS ) { t_error.set_error_code(error.get_error_code()); t_error.set_error_level((message::Error_level) error.get_error_level()); LOG(ERROR) << "更新停车记录ID失败: " << error.to_string(); } } } } m_parkspace_lock.unlock(); response_msg.mutable_base_info()->CopyFrom(t_response_header); response_msg.set_command_key(command_key); response_msg.mutable_error_manager()->CopyFrom(t_error); response_msg.mutable_confirm_alloc_space_info()->CopyFrom(t_confirm_space); Communication_message response=Communication_message(); response.reset(t_response_header, response_msg.SerializeAsString()); Parkspace_communicator::get_instance_references().send_response(&response); send_parkspace_data(); std::cout<