Добавление полноценного режима двух роботов
This commit is contained in:
148
scheduler.c
148
scheduler.c
@@ -11,7 +11,6 @@ struct scheduler_task {
|
||||
|
||||
|
||||
short scheduler_find_task(const struct scheduler_task* tasks, const short curr_pos) {
|
||||
// TODO добавить поддержку ночного режима и режима двух роботов
|
||||
// для начала надо найти максимальный приоритет у операций
|
||||
short max_priority = -1;
|
||||
for (short i = 0; i < BARRELS_COUNT; i++) {
|
||||
@@ -30,9 +29,7 @@ short scheduler_find_task(const struct scheduler_task* tasks, const short curr_p
|
||||
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) {
|
||||
if (tasks[i].dest_zone < 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -104,9 +101,34 @@ void schedule_one_robot(const struct scheduler_task* tasks, const struct robot_r
|
||||
void scheduler_main()
|
||||
#endif
|
||||
{
|
||||
if (scheduler_start_signal) {
|
||||
for (short i = 0; i < BARRELS_COUNT; i++) {
|
||||
// после рестарта планировщика надо всем барабаном убрать робота,
|
||||
// всех кто сверху удалить,
|
||||
barrels[i].flags.robot = 0;
|
||||
if (barrels[i].flags.is_up) {
|
||||
barrels[i].flags.is_up = 0;
|
||||
barrels[i].flags.is_exist = 0;
|
||||
}
|
||||
}
|
||||
scheduler_start_signal = 0;
|
||||
}
|
||||
|
||||
if (_scheduler_en) {
|
||||
// тут возможна только вставка барабанов
|
||||
if (scheduler_en) {
|
||||
|
||||
// программный таймер, применяется ко всем существующим барабанам
|
||||
if (_scheduler_software_timer) {
|
||||
_scheduler_software_timer = 0;
|
||||
for (int i = 0; i < 10; i++) {
|
||||
if (barrels[i].flags.is_exist && barrels[i].software_timer > -9999) {
|
||||
barrels[i].software_timer--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// кнопки на линии
|
||||
|
||||
// кнопка загрузки барабана
|
||||
if (button_load) {
|
||||
if (!zone_is_busy(1)) {
|
||||
for (int i = 0; i < BARRELS_COUNT; i++) {
|
||||
@@ -145,37 +167,95 @@ void scheduler_main()
|
||||
remove_barrel_from_zone(22);
|
||||
}
|
||||
|
||||
// таймер, применяется ко всем существующим барабанам
|
||||
if (_scheduler_software_timer) {
|
||||
_scheduler_software_timer = 0;
|
||||
for (int i = 0; i < 10; i++) {
|
||||
if (barrels[i].flags.is_exist && barrels[i].software_timer > -9999) {
|
||||
barrels[i].software_timer--;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!auto_mode_pause) {
|
||||
if ((hla_robot1_en && robot1_code.PC < 0) || (hla_robot2_en && robot2_code.PC < 0)) {
|
||||
struct scheduler_task tasks[BARRELS_COUNT];
|
||||
|
||||
if ((hla_robot1_en && robot1_code.PC < 0) || (hla_robot2_en && robot2_code.PC < 0)) {
|
||||
struct scheduler_task tasks[BARRELS_COUNT];
|
||||
for (short i = 0; i < BARRELS_COUNT; i++) {
|
||||
// для каждой задачи:
|
||||
tasks[i].start_zone = barrels[i].zone;
|
||||
// определяем можно ли ее выполнить и что вообще нужно выполнить
|
||||
tasks[i].dest_zone = can_move(barrels + i);
|
||||
if (tasks[i].dest_zone >= 0) {
|
||||
tasks[i].priority = get_operation_priority(i);
|
||||
}
|
||||
}
|
||||
if (one_robot_mode) {
|
||||
// режим одного робота
|
||||
char robot_id = 0;
|
||||
if (hla_robot1_en && robot1_code.PC < 0) {
|
||||
robot_id = 1;
|
||||
} else if (robot2_code.PC < 0 && hla_robot2_en) {
|
||||
robot_id = 2;
|
||||
}
|
||||
|
||||
if (one_robot_mode) {
|
||||
// режим одного робота
|
||||
if (hla_robot1_en && robot1_code.PC < 0) {
|
||||
schedule_one_robot(tasks, &robot1, &robot1_code, 1);
|
||||
} else if (robot2_code.PC < 0 && hla_robot2_en) {
|
||||
schedule_one_robot(tasks, &robot2, &robot2_code, 2);
|
||||
}
|
||||
} else {
|
||||
if (robot_id != 0) {
|
||||
for (short i = 0; i < BARRELS_COUNT; i++) {
|
||||
// для каждой задачи:
|
||||
tasks[i].start_zone = barrels[i].zone;
|
||||
// определяем можно ли ее выполнить и что вообще нужно выполнить
|
||||
tasks[i].dest_zone = can_move(barrels + i, robot_id);
|
||||
if (tasks[i].dest_zone >= 0) {
|
||||
tasks[i].priority = get_operation_priority(i);
|
||||
}
|
||||
}
|
||||
|
||||
if (robot_id == 1) {
|
||||
schedule_one_robot(tasks, &robot1, &robot1_code, 1);
|
||||
} else {
|
||||
schedule_one_robot(tasks, &robot2, &robot2_code, 2);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// а вот для режима двух роботов все интересно
|
||||
// для каждого робота нужно получить свой список задач
|
||||
// и надо еще сделать так, чтобы роботы не столкнулись
|
||||
|
||||
// логика для того, чтобы роботы не столкнулись в начале
|
||||
if (robot1.dx.current_zone < ZONE_GALVANIZING_1) {
|
||||
// начальная позиция робота 1 - промывка 3Б
|
||||
robot2_lock_zone = -1;
|
||||
robot1_lock_zone = ZONE_WASHING_3B;
|
||||
if (robot1_code.PC < 0) {
|
||||
robot1_code.barrel_id = -1;
|
||||
robot1_code.code[0] = ROBOT_CMD_DOWN();
|
||||
robot1_code.code[1] = ROBOT_CMD_MOVE_TO_ZONE(ZONE_WASHING_3B);
|
||||
robot1_code.code[2] = ROBOT_CMD_END();
|
||||
robot1_code.PC = 0;
|
||||
}
|
||||
} else if (robot2.dx.current_zone < ZONE_DEGREASING) {
|
||||
// начальная позиция робота 2 - обезжиривание
|
||||
if (robot2_code.PC < 0) {
|
||||
robot2_code.barrel_id = -1;
|
||||
robot2_code.code[0] = ROBOT_CMD_DOWN();
|
||||
robot2_code.code[1] = ROBOT_CMD_MOVE_TO_ZONE(ZONE_DEGREASING);
|
||||
robot2_code.code[2] = ROBOT_CMD_END();
|
||||
robot2_code.PC = 0;
|
||||
}
|
||||
} else {
|
||||
// отдельно просчитаем все для первого робота
|
||||
if (robot1_code.PC < 0) {
|
||||
for (short i = 0; i < BARRELS_COUNT; i++) {
|
||||
// для каждой задачи:
|
||||
tasks[i].start_zone = barrels[i].zone;
|
||||
// определяем можно ли ее выполнить и что вообще нужно выполнить
|
||||
tasks[i].dest_zone = can_move(barrels + i, 1);
|
||||
if (tasks[i].dest_zone >= 0) {
|
||||
tasks[i].priority = get_operation_priority(i);
|
||||
}
|
||||
}
|
||||
|
||||
schedule_one_robot(tasks, &robot1, &robot1_code, 1);
|
||||
}
|
||||
|
||||
// и отдельно для второго
|
||||
if (robot2_code.PC < 0) {
|
||||
for (short i = 0; i < BARRELS_COUNT; i++) {
|
||||
// для каждой задачи:
|
||||
tasks[i].start_zone = barrels[i].zone;
|
||||
// определяем можно ли ее выполнить и что вообще нужно выполнить
|
||||
tasks[i].dest_zone = can_move(barrels + i, 2);
|
||||
if (tasks[i].dest_zone >= 0) {
|
||||
tasks[i].priority = get_operation_priority(i);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
schedule_one_robot(tasks, &robot2, &robot2_code, 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user