diff --git a/scheduler.c b/scheduler.c index c2777f9..a2da4ae 100644 --- a/scheduler.c +++ b/scheduler.c @@ -192,6 +192,61 @@ struct scheduler_task { }; +static short scheduler_find_task(struct scheduler_task* tasks, const short curr_pos) { + // ищем первый барабан слева, и ближайший справа + short left = -1, right = -1; + for (short i = 0; i < BARRELS_COUNT; i++) { + short target = tasks[i].start_zone; // фактическая зона откуда тащить барабан + if (tasks[i].dest_zone == -2) { + target = 18; + } else if (tasks[i].dest_zone < 0) { + continue; + } + + if (curr_pos <= target) { + // это таск справа, надо найти ближайший + if (right == -1) { + right = i; + } else { + if (barrels[right].zone > target) { + right = i; + } + } + } else { + // таск слева, ищем максимально дальний (с минимальной зоной) + if (left == -1) { + left = i; + } else { + if (barrels[left].zone > target) { + left = i; + } + } + } + } + + // итого есть результат: есть ли таски, которые надо тащить вперед (и если надо то какой ближний), и есть первый таск + if (left < 0) { + return right; // вернем таск справа (если его нет, в переменной будет -1) + } + if (right < 0) { + return left; // если вдруг задачи справа не оказалось, вернем задачу слева если есть + } + + // вычисляем что ближе + short ld = curr_pos - left; // левая дельта + short rd = right - curr_pos; // правая дельта + + // дальше сравниваем дельты + // по идее если они равны то с бОльшим приоритетом робот поедет в левую часть + // а левую дельту вообще уменьшу на 1, чтобы цель слева казалась ближе + if (rd > ld - 1) { + return left; + } else { + return right; + } +} + + void schedule_robot_1() { static short transaction_state = 0; @@ -209,41 +264,7 @@ void schedule_robot_1() { // найти подходящую задачу if (schedulerOneRobotMode) { - char forward_is_exist = 0; - short target_task = -1, first_task = -1; - for (short i = 0; i < BARRELS_COUNT; i++) { - short target = tasks[i].start_zone; // фактическая зона откуда тащить барабан - if (tasks[i].dest_zone == -2) { - target = 18; - } else if (tasks[i].dest_zone < 0) { - continue; - } - - if (robot1.curr_zone <= target) { - forward_is_exist = 1; - if (target_task == -1) { - target_task = i; - } else { - if (barrels[target_task].zone > target) { - target_task = i; - } - } - } - - // тут нахождение первой задачи, нужно если вдруг - if (first_task == -1) { - first_task = i; - } else { - if (barrels[first_task].zone > target) { - first_task = i; - } - } - } - - // итого есть результат: есть ли таски, которые надо тащить вперед (и если надо то какой ближний), и есть первый таск - if (!forward_is_exist) { - target_task = first_task; - } + short target_task = scheduler_find_task(tasks, robot1.curr_zone); if (target_task >= 0) { // создаем транзакцию