|
@@ -257,9 +257,9 @@ Error_manager Parkspace_manager::query_the_optimal_parkspace_serverA(message::Pa
|
|
|
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 (all_min_parkspace_data.parkspace_info(i).parkingspace_index_id() % 15 <= 8
|
|
|
- && all_min_parkspace_data.parkspace_info(i).parkingspace_index_id() % 15 >= 1
|
|
|
+ if (room_id %15 <= 8 && room_id %15 >= 1
|
|
|
&& all_min_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty)
|
|
|
{
|
|
|
//用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
|
|
@@ -300,8 +300,9 @@ Error_manager Parkspace_manager::query_the_optimal_parkspace_serverA(message::Pa
|
|
|
while(i<all_mid_parkspace_data.parkspace_info_size())
|
|
|
{
|
|
|
//三楼的中型车位有单独的中跑车停车 且机械臂可以直接抓车到三楼
|
|
|
- if ( all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id() >= 19
|
|
|
- && all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id() <= 23)
|
|
|
+ int room_id=all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id();
|
|
|
+
|
|
|
+ if ( room_id >= 19 && room_id <= 23)
|
|
|
{
|
|
|
//只需计算端口到车位的距离
|
|
|
// 三楼中型用时=| 目标车位到电梯的距离 - 终端到电梯的距离 | / 中跑车速度
|
|
@@ -318,9 +319,8 @@ Error_manager Parkspace_manager::query_the_optimal_parkspace_serverA(message::Pa
|
|
|
}
|
|
|
}
|
|
|
//如果是六楼的中型车位
|
|
|
- if ( all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id() <= 68
|
|
|
- && all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id() >=61
|
|
|
- && all_mid_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty )
|
|
|
+ if ( room_id <= 68 && room_id >=61
|
|
|
+ && all_mid_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty )
|
|
|
{
|
|
|
//用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
|
|
|
float time=terminal_id%6*TERMINAL_SPACING/MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME +
|
|
@@ -360,10 +360,10 @@ Error_manager Parkspace_manager::query_the_optimal_parkspace_serverA(message::Pa
|
|
|
int i=0;
|
|
|
while(i<all_big_parkspace_data.parkspace_info_size())
|
|
|
{
|
|
|
- //筛选出一号车库的小型车位的靠近电梯的左侧三排(第二优先级)的空车位
|
|
|
- if ( all_big_parkspace_data.parkspace_info(i).parkingspace_index_id()%15 <= 8
|
|
|
- && all_big_parkspace_data.parkspace_info(i).parkingspace_index_id()%15 >=1
|
|
|
- && all_big_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty )
|
|
|
+ int room_id=all_big_parkspace_data.parkspace_info(i).parkingspace_index_id();
|
|
|
+ //筛选出一号车库的大型车位
|
|
|
+ if ( room_id%15 <= 8 && room_id %15 >=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 )
|
|
@@ -432,9 +432,10 @@ Error_manager Parkspace_manager::query_the_optimal_parkspace_serverA(message::Pa
|
|
|
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 (all_min_parkspace_data.parkspace_info(i).parkingspace_index_id() <= 165
|
|
|
- && all_min_parkspace_data.parkspace_info(i).parkingspace_index_id() >= 54
|
|
|
+ if (room_id <= 165 && room_id >= 54
|
|
|
&& all_min_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty)
|
|
|
{
|
|
|
//用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
|
|
@@ -474,9 +475,10 @@ Error_manager Parkspace_manager::query_the_optimal_parkspace_serverA(message::Pa
|
|
|
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 ( all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id() >= 24
|
|
|
- && all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id() <= 27 )
|
|
|
+ if ( room_id >= 24 && room_id <= 27 )
|
|
|
{
|
|
|
//只需计算端口到车位的距离
|
|
|
// 三楼中型车位用时=| 目标车位到电梯的距离 - 终端到电梯的距离 | / 中跑车速度
|
|
@@ -492,8 +494,7 @@ Error_manager Parkspace_manager::query_the_optimal_parkspace_serverA(message::Pa
|
|
|
parkingspace_index_id=i;
|
|
|
}
|
|
|
}
|
|
|
- if ( all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id() <= 75
|
|
|
- && all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id() >= 69
|
|
|
+ if ( room_id <= 75 && room_id >= 69
|
|
|
&& all_mid_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty )
|
|
|
{
|
|
|
//用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
|
|
@@ -534,10 +535,11 @@ Error_manager Parkspace_manager::query_the_optimal_parkspace_serverA(message::Pa
|
|
|
int i=0;
|
|
|
while(i<all_big_parkspace_data.parkspace_info_size())
|
|
|
{
|
|
|
+ int room_id=all_big_parkspace_data.parkspace_info(i).parkingspace_index_id();
|
|
|
+
|
|
|
//筛选出二号车库的大型车位的空车位
|
|
|
- if ( all_big_parkspace_data.parkspace_info(i).parkingspace_index_id() <= 45
|
|
|
- && all_big_parkspace_data.parkspace_info(i).parkingspace_index_id() >= 9
|
|
|
- && all_big_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty )
|
|
|
+ if ( room_id %15 >=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 )
|
|
@@ -606,7 +608,7 @@ Error_manager Parkspace_manager::query_the_optimal_parkspace_serverB1(message::P
|
|
|
*/
|
|
|
int time_min=0;
|
|
|
int parkingspace_index_id=-1;
|
|
|
- //
|
|
|
+ //找左侧车位
|
|
|
//如果是小车 (低于1.55米属于小车)
|
|
|
if ( car_info.car_height() <= MIN_CAR_HIGH )
|
|
|
{
|
|
@@ -621,9 +623,9 @@ Error_manager Parkspace_manager::query_the_optimal_parkspace_serverB1(message::P
|
|
|
int i = 0;
|
|
|
while (i < all_min_parkspace_data.parkspace_info_size())
|
|
|
{
|
|
|
- //筛选出一号车库的小型车位的中间部分(第一优先级)的空车位
|
|
|
- if (all_min_parkspace_data.parkspace_info(i).parkingspace_index_id() % 15 <= 8
|
|
|
- && all_min_parkspace_data.parkspace_info(i).parkingspace_index_id() % 15 >= 4
|
|
|
+ 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)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
|
|
@@ -655,9 +657,10 @@ Error_manager Parkspace_manager::query_the_optimal_parkspace_serverB1(message::P
|
|
|
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 (all_min_parkspace_data.parkspace_info(i).parkingspace_index_id() % 15 <= 3
|
|
|
- && all_min_parkspace_data.parkspace_info(i).parkingspace_index_id() % 15 >= 1
|
|
|
+ if (room_id % 15 <= 3 && room_id % 15 >= 1
|
|
|
&& all_min_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty)
|
|
|
{
|
|
|
//用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
|
|
@@ -687,7 +690,7 @@ Error_manager Parkspace_manager::query_the_optimal_parkspace_serverB1(message::P
|
|
|
}
|
|
|
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);
|
|
@@ -698,9 +701,10 @@ Error_manager Parkspace_manager::query_the_optimal_parkspace_serverB1(message::P
|
|
|
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 ( all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id() <= 68
|
|
|
- && all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id() >=64
|
|
|
+ if ( room_id >=64 && room_id <= 68
|
|
|
&& all_mid_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty )
|
|
|
{
|
|
|
//用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
|
|
@@ -721,16 +725,53 @@ Error_manager Parkspace_manager::query_the_optimal_parkspace_serverB1(message::P
|
|
|
}
|
|
|
++i;
|
|
|
}
|
|
|
- //判断中型车位(第二优先级)是否有找到合适的空车位 如果找到了 直接返回
|
|
|
+ //判断中型车位的中间部分(第一优先级)是否有找到合适的空车位 如果找到了 直接返回
|
|
|
if ( time_min!=0 && parkingspace_index_id!=-1 )
|
|
|
{
|
|
|
parkspace_info.CopyFrom(all_mid_parkspace_data.parkspace_info(parkingspace_index_id));
|
|
|
return Error_code::SUCCESS;
|
|
|
}
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //如果没找到则找侧边中型车位(第二优先级)
|
|
|
+ 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 >=61 && room_id <= 63
|
|
|
+ && all_mid_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty )
|
|
|
+ {
|
|
|
+ //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
|
|
|
+ float time=terminal_id%6*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
|
|
|
+ {
|
|
|
+ time_min=time<time_min?time:time_min;
|
|
|
+ parkingspace_index_id=i;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ++i;
|
|
|
+ }
|
|
|
+ //判断中型车位侧边(第二优先级)是否有找到合适的空车位 如果找到了 直接返回
|
|
|
+ if ( time_min!=0 && parkingspace_index_id!=-1 )
|
|
|
+ {
|
|
|
+ parkspace_info.CopyFrom(all_mid_parkspace_data.parkspace_info(parkingspace_index_id));
|
|
|
+ return Error_code::SUCCESS;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
if ( car_info.car_height() <= BIG_CAR_HIGH )
|
|
|
{
|
|
|
- //第三优先级(大型车位)
|
|
|
+ //找大型车位
|
|
|
//获取大型车位
|
|
|
message::Parkspace_allocation_data_msg all_big_parkspace_data;
|
|
|
Error_manager t_error=m_parkspace_operating_function.get_specify_the_type_parkspace_info(all_big_parkspace_data,message::Parkspace_type::BIG_PARKINGSPACE);
|
|
@@ -741,9 +782,10 @@ Error_manager Parkspace_manager::query_the_optimal_parkspace_serverB1(message::P
|
|
|
int i=0;
|
|
|
while(i<all_big_parkspace_data.parkspace_info_size())
|
|
|
{
|
|
|
+ int room_id=all_big_parkspace_data.parkspace_info(i).parkingspace_index_id();
|
|
|
+
|
|
|
//筛选出一号车库的小型车位的靠近电梯的左侧三排(第二优先级)的空车位
|
|
|
- if ( all_big_parkspace_data.parkspace_info(i).parkingspace_index_id()%15 <= 8
|
|
|
- && all_big_parkspace_data.parkspace_info(i).parkingspace_index_id()%15 >=1
|
|
|
+ if ( room_id %15 == 1 || room_id %15 == 2 || room_id %15 == 3 || room_id>=34 && room_id<=38
|
|
|
&& all_big_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty )
|
|
|
{
|
|
|
//如果是二楼车 则特殊处理
|
|
@@ -783,7 +825,7 @@ Error_manager Parkspace_manager::query_the_optimal_parkspace_serverB1(message::P
|
|
|
}
|
|
|
++i;
|
|
|
}
|
|
|
- //判断大型车位(第三优先级)是否有找到合适的空车位 如果找到了 直接返回
|
|
|
+ //判断大型车位是否有找到合适的空车位 如果找到了 直接返回
|
|
|
if ( time_min!=0 && parkingspace_index_id!=-1 )
|
|
|
{
|
|
|
parkspace_info.CopyFrom(all_big_parkspace_data.parkspace_info(parkingspace_index_id));
|
|
@@ -791,11 +833,14 @@ Error_manager Parkspace_manager::query_the_optimal_parkspace_serverB1(message::P
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- return Error_manager(Error_code::PARKSPACE_ALLOCATOR_ALLOCATE_FAILED, Error_level::MINOR_ERROR,
|
|
|
- " query_the_optimal_parkspace_serverA error ");
|
|
|
+ //如果没找到则代表左侧没找到合适车位
|
|
|
+ parkspace_info.set_parkingspace_index_id(-1);
|
|
|
+ return Error_manager(Error_code::PARKSPACE_ALLOCATOR_ALLOCATE_FAILED, Error_level::NEGLIGIBLE_ERROR,
|
|
|
+ "query_the_optimal_parkspace_serverB1 error ");
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+ return Error_manager(Error_code::PARAMETER_ERROR, Error_level::MINOR_ERROR,
|
|
|
+ " query_the_optimal_parkspace_serverB1 error ");
|
|
|
|
|
|
}
|
|
|
//找右侧车位
|
|
@@ -809,6 +854,239 @@ Error_manager Parkspace_manager::query_the_optimal_parkspace_serverB2(message::P
|
|
|
*/
|
|
|
int 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 = terminal_id % 6 * 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
|
|
|
+ {
|
|
|
+ time_min = time < time_min ? time : time_min;
|
|
|
+ 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
|
|
|
+ {
|
|
|
+ //如果没找到则找小车车位第二优先级 (侧边)
|
|
|
+ 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 == 13 || room_id % 15 == 14 || room_id % 15 == 0
|
|
|
+ && all_min_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty)
|
|
|
+ {
|
|
|
+ //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
|
|
|
+ float time = terminal_id % 6 * 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
|
|
|
+ {
|
|
|
+ time_min = time < time_min ? time : time_min;
|
|
|
+ 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<all_mid_parkspace_data.parkspace_info_size())
|
|
|
+ {
|
|
|
+ int room_id=all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id();
|
|
|
+
|
|
|
+ //如果是六楼的中型车位的中间部分(第一优先级)
|
|
|
+ if ( room_id >= 69 && room_id <= 72
|
|
|
+ && all_mid_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty )
|
|
|
+ {
|
|
|
+ //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
|
|
|
+ float time=terminal_id%6*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
|
|
|
+ {
|
|
|
+ time_min=time<time_min?time:time_min;
|
|
|
+ parkingspace_index_id=i;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ++i;
|
|
|
+ }
|
|
|
+ //判断中型车位的中间部分(第一优先级)是否有找到合适的空车位 如果找到了 直接返回
|
|
|
+ if ( time_min!=0 && parkingspace_index_id!=-1 )
|
|
|
+ {
|
|
|
+ parkspace_info.CopyFrom(all_mid_parkspace_data.parkspace_info(parkingspace_index_id));
|
|
|
+ return Error_code::SUCCESS;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //如果没找到则找侧边中型车位(第二优先级)
|
|
|
+ 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 >=73 && room_id <= 75
|
|
|
+ && all_mid_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty )
|
|
|
+ {
|
|
|
+ //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
|
|
|
+ float time=terminal_id%6*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
|
|
|
+ {
|
|
|
+ time_min=time<time_min?time:time_min;
|
|
|
+ parkingspace_index_id=i;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ++i;
|
|
|
+ }
|
|
|
+ //判断中型车位侧边(第二优先级)是否有找到合适的空车位 如果找到了 直接返回
|
|
|
+ if ( time_min!=0 && parkingspace_index_id!=-1 )
|
|
|
+ {
|
|
|
+ parkspace_info.CopyFrom(all_mid_parkspace_data.parkspace_info(parkingspace_index_id));
|
|
|
+ return Error_code::SUCCESS;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if ( car_info.car_height() <= BIG_CAR_HIGH )
|
|
|
+ {
|
|
|
+ //找大型车位
|
|
|
+ //获取大型车位
|
|
|
+ message::Parkspace_allocation_data_msg all_big_parkspace_data;
|
|
|
+ Error_manager t_error=m_parkspace_operating_function.get_specify_the_type_parkspace_info(all_big_parkspace_data,message::Parkspace_type::BIG_PARKINGSPACE);
|
|
|
+ if(t_error != SUCCESS)
|
|
|
+ {
|
|
|
+ return t_error;
|
|
|
+ }
|
|
|
+ int i=0;
|
|
|
+ while(i<all_big_parkspace_data.parkspace_info_size())
|
|
|
+ {
|
|
|
+ int room_id=all_big_parkspace_data.parkspace_info(i).parkingspace_index_id();
|
|
|
+
|
|
|
+ //筛选出大型车位的靠近电梯的右侧三排(第二优先级)的空车位
|
|
|
+ if ( room_id %15 == 13 || room_id %15 == 14 || room_id %15 == 0|| room_id>=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 )
|
|
|
+ {
|
|
|
+ // 二楼用时=| 目标车位到电梯的距离 - 终端到电梯的距离 | / 中跑车速度
|
|
|
+ int t_min=abs( i%15*all_big_parkspace_data.parkspace_info(i).parkingspace_width()-terminal_id%6*TERMINAL_SPACING )/MEDIUM_CAR_SPEED+DOWNSTAIRS_SPORTS_TIME;
|
|
|
+ if ( time_min == 0 )
|
|
|
+ {
|
|
|
+ time_min=t_min;
|
|
|
+ parkingspace_index_id=i;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ time_min=t_min<time_min?t_min:time_min;
|
|
|
+ parkingspace_index_id=i;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
|
|
|
+ float time=terminal_id%6*TERMINAL_SPACING/MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME +
|
|
|
+ (all_big_parkspace_data.parkspace_info(i).parkingspace_floor_id()-2)*all_big_parkspace_data.parkspace_info(i).parkingspace_height()/THE_ELEVATOR_SPEED + ELEVATOR_MOVEMENT_TIME +
|
|
|
+ all_big_parkspace_data.parkspace_info(i).parkingspace_index_id()%15*all_big_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
|
|
|
+ {
|
|
|
+ time_min=time<time_min?time:time_min;
|
|
|
+ parkingspace_index_id=i;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ++i;
|
|
|
+ }
|
|
|
+ //判断大型车位是否有找到合适的空车位 如果找到了 直接返回
|
|
|
+ if ( time_min!=0 && parkingspace_index_id!=-1 )
|
|
|
+ {
|
|
|
+ parkspace_info.CopyFrom(all_big_parkspace_data.parkspace_info(parkingspace_index_id));
|
|
|
+ return Error_code::SUCCESS;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //如果没找到则代表右侧没找到合适车位
|
|
|
+ parkspace_info.set_parkingspace_index_id(-1);
|
|
|
+ return Error_manager(Error_code::PARKSPACE_ALLOCATOR_ALLOCATE_FAILED, Error_level::NEGLIGIBLE_ERROR,
|
|
|
+ "query_the_optimal_parkspace_serverB2 error ");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return Error_manager(Error_code::PARAMETER_ERROR, Error_level::MINOR_ERROR,
|
|
|
+ " query_the_optimal_parkspace_serverB2 error ");
|
|
|
}
|
|
|
//找缓存区车位
|
|
|
Error_manager Parkspace_manager::query_the_optimal_parkspace_serverB3(message::Parkspace_info &parkspace_info,message::Car_info car_info,int terminal_id)
|
|
@@ -821,6 +1099,92 @@ Error_manager Parkspace_manager::query_the_optimal_parkspace_serverB3(message::P
|
|
|
*/
|
|
|
int 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)
|
|
|
+ {
|
|
|
+ //只需计算端口到车位的距离
|
|
|
+ // 三楼中型用时=| 目标车位到电梯的距离 - 终端到电梯的距离 | / 中跑车速度
|
|
|
+ int t_min=abs( i%15*all_mid_parkspace_data.parkspace_info(i).parkingspace_width()-terminal_id%6*TERMINAL_SPACING )/MEDIUM_CAR_SPEED+DOWNSTAIRS_SPORTS_TIME;
|
|
|
+ if ( time_min == 0 )
|
|
|
+ {
|
|
|
+ time_min=t_min;
|
|
|
+ parkingspace_index_id=i;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ time_min=t_min<time_min?t_min:time_min;
|
|
|
+ parkingspace_index_id=i;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //判断缓冲区的中型车位是否有找到合适的空车位 如果找到了 直接返回
|
|
|
+ if ( time_min!=0 && parkingspace_index_id!=-1 )
|
|
|
+ {
|
|
|
+ parkspace_info.CopyFrom(all_mid_parkspace_data.parkspace_info(parkingspace_index_id));
|
|
|
+ return Error_code::SUCCESS;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if( car_info.car_height() <= BIG_CAR_HIGH )
|
|
|
+ {
|
|
|
+ message::Parkspace_allocation_data_msg all_big_parkspace_data;
|
|
|
+ Error_manager t_error=m_parkspace_operating_function.get_specify_the_type_parkspace_info(all_big_parkspace_data,message::Parkspace_type::BIG_PARKINGSPACE);
|
|
|
+ if(t_error != SUCCESS)
|
|
|
+ {
|
|
|
+ return t_error;
|
|
|
+ }
|
|
|
+ int i=0;
|
|
|
+ while (i < all_big_parkspace_data.parkspace_info_size())
|
|
|
+ {
|
|
|
+ //筛选中型车位缓冲区
|
|
|
+ int room_id=all_big_parkspace_data.parkspace_info(i).parkingspace_index_id();
|
|
|
+ if ( room_id >= 4 && room_id <= 12
|
|
|
+ && all_big_parkspace_data.parkspace_info(i).parkingspace_status() == message::eParkspace_empty)
|
|
|
+ {
|
|
|
+ //只需计算端口到车位的距离
|
|
|
+ // 二楼中型用时=| 目标车位到电梯的距离 - 终端到电梯的距离 | / 中跑车速度
|
|
|
+ int t_min=abs( i%15*all_big_parkspace_data.parkspace_info(i).parkingspace_width()-terminal_id%6*TERMINAL_SPACING )/MEDIUM_CAR_SPEED+DOWNSTAIRS_SPORTS_TIME;
|
|
|
+ if ( time_min == 0 )
|
|
|
+ {
|
|
|
+ time_min=t_min;
|
|
|
+ parkingspace_index_id=i;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ time_min=t_min<time_min?t_min:time_min;
|
|
|
+ parkingspace_index_id=i;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //判断缓冲区的中型车位是否有找到合适的空车位 如果找到了 直接返回
|
|
|
+ if ( time_min!=0 && parkingspace_index_id!=-1 )
|
|
|
+ {
|
|
|
+ parkspace_info.CopyFrom(all_big_parkspace_data.parkspace_info(parkingspace_index_id));
|
|
|
+ return Error_code::SUCCESS;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //如果没找到则代表缓冲区没找到合适车位
|
|
|
+ parkspace_info.set_parkingspace_index_id(-1);
|
|
|
+ return Error_manager(Error_code::PARKSPACE_ALLOCATOR_ALLOCATE_FAILED, Error_level::NEGLIGIBLE_ERROR,
|
|
|
+ "query_the_optimal_parkspace_serverB2 error ");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return Error_manager(Error_code::PARAMETER_ERROR, Error_level::MINOR_ERROR,
|
|
|
+ " query_the_optimal_parkspace_serverB3 error ");
|
|
|
}
|
|
|
//分配车位线程函数
|
|
|
void Parkspace_manager::execute_for_allocate(message::Car_info car_info, int terminal_id, std::string command_key)
|