Планировщик, который умеет взвешивать операции и выполнять либо дальнюю левую (относительно робота), либо ближайшую правую (относительно робота). Есть небольшой приоритет в левую сторону.
This commit is contained in:
parent
4d7350ac69
commit
aa8d949323
91
scheduler.c
91
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) {
|
||||
// создаем транзакцию
|
||||
|
Reference in New Issue
Block a user