From f19fb94064875e279da433202e30c0a5ca651d36 Mon Sep 17 00:00:00 2001 From: jackfiled Date: Sat, 4 Jun 2022 16:45:08 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E5=86=99=E4=BA=86SSTFDirection?= =?UTF-8?q?=E5=87=BD=E6=95=B0=20=E8=B0=83=E6=95=B4=E4=BA=86main=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E7=9A=84=E6=9E=B6=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- all_test/main.c | 90 ++++++++++++++++++++++++++++++++++-------------- main.c | 90 ++++++++++++++++++++++++++++++++++-------------- src/controller.c | 19 ++++++---- 3 files changed, 141 insertions(+), 58 deletions(-) diff --git a/all_test/main.c b/all_test/main.c index 8b14198..5bf9cf9 100644 --- a/all_test/main.c +++ b/all_test/main.c @@ -108,27 +108,44 @@ int main() } break; case BUS_SSTF: - // 如果没有指定的请求就获得指定的请求 - if(target_query == NULL) - { - target_query = SSTFGetQuery(); - direction = SSTFDirection(target_query); - } - if(JudgeOnStation() == BUS_TRUE) { - // 如果到达目标的站点 - if(the_bus->rail_node_pos == target_query->node) + // 在没有目标请求的时候,获取一个目标站点 + if(target_query == NULL) { - DeleteQuery(target_query); - target_query = NULL; + target_query = SSTFGetQuery(); + direction = SSTFDirection(target_query); + + // 处理下一个需要处理的请求就在脚底下的情况 + if(target_query != NULL && direction == BUS_STOP && target_query->node == the_bus->rail_node_pos) + { + while (target_query != NULL && direction == BUS_STOP && target_query->node == the_bus->rail_node_pos) + { + DeleteQuery(target_query); + target_query = SSTFGetQuery(); + direction = SSTFDirection(target_query); + } + } + RunBus(direction); } else { - // 处理可以顺便处理的请求 bus_query_t *btw_query = SSTFBTWQuery(direction); - if (btw_query != NULL) + // 如果到站了 + if(target_query->node == the_bus->rail_node_pos) { + // 如果刚好在站点上就有不少请求,处理一波 + // 这里利用了&&运算符的短路特性,如果第一个判断为假,则不进行下一个判断,也就避免了段错误 + while (target_query != NULL && target_query->node == the_bus->rail_node_pos) + { + DeleteQuery(target_query); + target_query = SSTFGetQuery(); + direction = SSTFDirection(target_query); + } + } + else if(btw_query != NULL) + { + // 如果没有到站就看看能不能顺便服务 while (btw_query != NULL) { DeleteQuery(btw_query); @@ -137,37 +154,57 @@ int main() } else { + // 如果啥也不能做就走吧 RunBus(direction); } } } else { + // 没到站的话那就走吧 RunBus(direction); } break; case BUS_SCAN: // 如果没有指定的请求就获得指定的请求 - if(target_query == NULL) - { - target_query = SCANGetQuery(direction); - direction = SCANDirection(target_query); - } - if(JudgeOnStation() == BUS_TRUE) { - // 如果到达目标的站点 - if(the_bus->rail_node_pos == target_query->node) + // 在没有目标请求的时候,获取一个目标站点 + if(target_query == NULL) { - DeleteQuery(target_query); - target_query = NULL; + target_query = SCANGetQuery(direction); + direction = SCANDirection(target_query, direction); + + // 处理下一个需要处理的请求就在脚底下的情况 + if(target_query != NULL && direction == BUS_STOP && target_query->node == the_bus->rail_node_pos) + { + while (target_query != NULL && direction == BUS_STOP && target_query->node == the_bus->rail_node_pos) + { + DeleteQuery(target_query); + target_query = SCANGetQuery(direction); + direction = SCANDirection(target_query, direction); + } + } + RunBus(direction); } else { bus_query_t *btw_query = SCANBTWQuery(); - // 处理可以顺路处理的请求 - if(btw_query != NULL) + // 如果到站了 + if(target_query->node == the_bus->rail_node_pos) { + // 如果刚好在站点上就有不少请求,处理一波 + // 这里利用了&&运算符的短路特性,如果第一个判断为假,则不进行下一个判断,也就避免了段错误 + while (target_query != NULL && target_query->node == the_bus->rail_node_pos) + { + DeleteQuery(target_query); + target_query = SCANGetQuery(direction); + direction = SCANDirection(target_query, direction); + } + } + else if(btw_query != NULL) + { + // 如果没有到站就看看能不能顺便服务 while (btw_query != NULL) { DeleteQuery(btw_query); @@ -176,15 +213,16 @@ int main() } else { + // 如果啥也不能做就走吧 RunBus(direction); } } } else { + // 没到站的话那就走吧 RunBus(direction); } - break; default: // 这个分支只是为了符合代码规范而存在,理论上不会用到这个分支 break; diff --git a/main.c b/main.c index 6875e9d..29e83d2 100644 --- a/main.c +++ b/main.c @@ -78,27 +78,44 @@ int main() } break; case BUS_SSTF: - // 如果没有指定的请求就获得指定的请求 - if(target_query == NULL) - { - target_query = SSTFGetQuery(); - direction = SSTFDirection(target_query); - } - if(JudgeOnStation() == BUS_TRUE) { - // 如果到达目标的站点 - if(the_bus->rail_node_pos == target_query->node) + // 在没有目标请求的时候,获取一个目标站点 + if(target_query == NULL) { - DeleteQuery(target_query); - target_query = NULL; + target_query = SSTFGetQuery(); + direction = SSTFDirection(target_query); + + // 处理下一个需要处理的请求就在脚底下的情况 + if(target_query != NULL && direction == BUS_STOP && target_query->node == the_bus->rail_node_pos) + { + while (target_query != NULL && direction == BUS_STOP && target_query->node == the_bus->rail_node_pos) + { + DeleteQuery(target_query); + target_query = SSTFGetQuery(); + direction = SSTFDirection(target_query); + } + } + RunBus(direction); } else { - // 处理可以顺便处理的请求 bus_query_t *btw_query = SSTFBTWQuery(direction); - if (btw_query != NULL) + // 如果到站了 + if(target_query->node == the_bus->rail_node_pos) { + // 如果刚好在站点上就有不少请求,处理一波 + // 这里利用了&&运算符的短路特性,如果第一个判断为假,则不进行下一个判断,也就避免了段错误 + while (target_query != NULL && target_query->node == the_bus->rail_node_pos) + { + DeleteQuery(target_query); + target_query = SSTFGetQuery(); + direction = SSTFDirection(target_query); + } + } + else if(btw_query != NULL) + { + // 如果没有到站就看看能不能顺便服务 while (btw_query != NULL) { DeleteQuery(btw_query); @@ -107,37 +124,57 @@ int main() } else { + // 如果啥也不能做就走吧 RunBus(direction); } } } else { + // 没到站的话那就走吧 RunBus(direction); } break; case BUS_SCAN: // 如果没有指定的请求就获得指定的请求 - if(target_query == NULL) - { - target_query = SCANGetQuery(direction); - direction = SCANDirection(target_query); - } - if(JudgeOnStation() == BUS_TRUE) { - // 如果到达目标的站点 - if(the_bus->rail_node_pos == target_query->node) + // 在没有目标请求的时候,获取一个目标站点 + if(target_query == NULL) { - DeleteQuery(target_query); - target_query = NULL; + target_query = SCANGetQuery(direction); + direction = SCANDirection(target_query, direction); + + // 处理下一个需要处理的请求就在脚底下的情况 + if(target_query != NULL && direction == BUS_STOP && target_query->node == the_bus->rail_node_pos) + { + while (target_query != NULL && direction == BUS_STOP && target_query->node == the_bus->rail_node_pos) + { + DeleteQuery(target_query); + target_query = SCANGetQuery(direction); + direction = SCANDirection(target_query, direction); + } + } + RunBus(direction); } else { bus_query_t *btw_query = SCANBTWQuery(); - // 处理可以顺路处理的请求 - if(btw_query != NULL) + // 如果到站了 + if(target_query->node == the_bus->rail_node_pos) { + // 如果刚好在站点上就有不少请求,处理一波 + // 这里利用了&&运算符的短路特性,如果第一个判断为假,则不进行下一个判断,也就避免了段错误 + while (target_query != NULL && target_query->node == the_bus->rail_node_pos) + { + DeleteQuery(target_query); + target_query = SCANGetQuery(direction); + direction = SCANDirection(target_query, direction); + } + } + else if(btw_query != NULL) + { + // 如果没有到站就看看能不能顺便服务 while (btw_query != NULL) { DeleteQuery(btw_query); @@ -146,15 +183,16 @@ int main() } else { + // 如果啥也不能做就走吧 RunBus(direction); } } } else { + // 没到站的话那就走吧 RunBus(direction); } - break; default: // 这个分支只是为了符合代码规范而存在,理论上不会用到这个分支 break; diff --git a/src/controller.c b/src/controller.c index 3e63d2e..b940c9b 100644 --- a/src/controller.c +++ b/src/controller.c @@ -112,16 +112,23 @@ bus_query_t *SSTFGetQuery() int SSTFDirection(bus_query_t* query) { - if (query != NULL) + if (query == NULL) { - if (query->type != BUS_TARGET ) - { - return query->type; - } + return BUS_STOP; + } + + int distance = GetQueryDistance(query, BUS_CLOCK_WISE); + if(distance > all_distance / 2) + { + return BUS_COUNTER_CLOCK_WISE; + } + else if(distance == 0) + { + return BUS_STOP; } else { - return BUS_STOP; + return BUS_CLOCK_WISE; } }