Исправление неправильной установки LOCK-зон, набор исправлений ночного режима
This commit is contained in:
parent
ab7d324b3f
commit
b83b860e1f
78
scheduler.c
78
scheduler.c
@ -82,13 +82,38 @@ short scheduler_find_task(const struct scheduler_task* tasks, const short curr_p
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void schedule_one_robot(const struct scheduler_task* tasks, const struct robot_regs* r, struct robot_code* code, const short robot_id) {
|
void schedule_one_robot(const short robot_id) {
|
||||||
|
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, robot_id);
|
||||||
|
if (tasks[i].dest_zone >= 0) {
|
||||||
|
tasks[i].priority = get_operation_priority(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// узнаем текущую зону робота
|
||||||
|
short current_zone;
|
||||||
|
if (robot_id == ROBOT_1) {
|
||||||
|
current_zone = robot1.dx.current_zone;
|
||||||
|
} else {
|
||||||
|
current_zone = robot2.dx.current_zone;
|
||||||
|
}
|
||||||
|
|
||||||
// формируем список задач
|
// формируем список задач
|
||||||
short target_task = scheduler_find_task(tasks, r->dx.current_zone);
|
short target_task = scheduler_find_task(tasks, current_zone);
|
||||||
|
|
||||||
if (target_task >= 0) {
|
if (target_task >= 0) {
|
||||||
create_operation(code, target_task, tasks[target_task].start_zone, tasks[target_task].dest_zone,
|
if (robot_id == ROBOT_1) {
|
||||||
r->dx.current_zone, robot_id);
|
create_operation(&robot1_code, target_task, tasks[target_task].start_zone, tasks[target_task].dest_zone,
|
||||||
|
current_zone, robot_id);
|
||||||
|
} else {
|
||||||
|
create_operation(&robot2_code, target_task, tasks[target_task].start_zone, tasks[target_task].dest_zone,
|
||||||
|
current_zone, robot_id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -98,7 +123,6 @@ void scheduler_main()
|
|||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
if (scheduler_start_signal) {
|
if (scheduler_start_signal) {
|
||||||
scheduler_correction_stage = 0;
|
|
||||||
robot1_code.PC = -1;
|
robot1_code.PC = -1;
|
||||||
robot2_code.PC = -1;
|
robot2_code.PC = -1;
|
||||||
|
|
||||||
@ -220,8 +244,6 @@ void scheduler_main()
|
|||||||
|
|
||||||
if (!auto_mode_pause) {
|
if (!auto_mode_pause) {
|
||||||
if ((hla_robot1_en && robot1_code.PC < 0) || (hla_robot2_en && robot2_code.PC < 0)) {
|
if ((hla_robot1_en && robot1_code.PC < 0) || (hla_robot2_en && robot2_code.PC < 0)) {
|
||||||
struct scheduler_task tasks[BARRELS_COUNT];
|
|
||||||
|
|
||||||
if (one_robot_mode) {
|
if (one_robot_mode) {
|
||||||
// режим одного робота
|
// режим одного робота
|
||||||
char robot_id = ROBOT_NONE;
|
char robot_id = ROBOT_NONE;
|
||||||
@ -248,21 +270,7 @@ void scheduler_main()
|
|||||||
robot2_code.PC = 0;
|
robot2_code.PC = 0;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (short i = 0; i < BARRELS_COUNT; i++) {
|
schedule_one_robot(robot_id);
|
||||||
// для каждой задачи:
|
|
||||||
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 == ROBOT_1) {
|
|
||||||
schedule_one_robot(tasks, &robot1, &robot1_code, ROBOT_1);
|
|
||||||
} else {
|
|
||||||
schedule_one_robot(tasks, &robot2, &robot2_code, ROBOT_2);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -302,23 +310,13 @@ void scheduler_main()
|
|||||||
} else {
|
} else {
|
||||||
// отдельно просчитаем все для первого робота
|
// отдельно просчитаем все для первого робота
|
||||||
if (robot1_code.PC < 0) {
|
if (robot1_code.PC < 0) {
|
||||||
for (short i = 0; i < BARRELS_COUNT; i++) {
|
schedule_one_robot(ROBOT_1);
|
||||||
// для каждой задачи:
|
|
||||||
tasks[i].start_zone = barrels[i].zone;
|
|
||||||
// определяем можно ли ее выполнить и что вообще нужно выполнить
|
|
||||||
tasks[i].dest_zone = can_move(barrels + i, ROBOT_1);
|
|
||||||
if (tasks[i].dest_zone >= 0) {
|
|
||||||
tasks[i].priority = get_operation_priority(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
schedule_one_robot(tasks, &robot1, &robot1_code, ROBOT_1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// и отдельно для второго (только если не в ночном режиме)
|
// и отдельно для второго (только если не в ночном режиме)
|
||||||
if (robot2_code.PC < 0) {
|
if (robot2_code.PC < 0) {
|
||||||
if (robot2.dx.current_zone < ZONE_WASHING_1A) {
|
if (robot2.dx.current_zone < ZONE_WASHING_1A) {
|
||||||
// начальная позиция робота 1 - обезжир
|
// начальная позиция робота 2 - промывка 1a
|
||||||
robot2_lock_zone = ZONE_WASHING_1A;
|
robot2_lock_zone = ZONE_WASHING_1A;
|
||||||
if (robot2_code.PC < 0) {
|
if (robot2_code.PC < 0) {
|
||||||
robot2_code.barrel_id = -1;
|
robot2_code.barrel_id = -1;
|
||||||
@ -328,17 +326,7 @@ void scheduler_main()
|
|||||||
robot2_code.PC = 0;
|
robot2_code.PC = 0;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (short i = 0; i < BARRELS_COUNT; i++) {
|
schedule_one_robot(ROBOT_2);
|
||||||
// для каждой задачи:
|
|
||||||
tasks[i].start_zone = barrels[i].zone;
|
|
||||||
// определяем можно ли ее выполнить и что вообще нужно выполнить
|
|
||||||
tasks[i].dest_zone = can_move(barrels + i, ROBOT_2);
|
|
||||||
if (tasks[i].dest_zone >= 0) {
|
|
||||||
tasks[i].priority = get_operation_priority(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
schedule_one_robot(tasks, &robot2, &robot2_code, ROBOT_2);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
86
utils.c
86
utils.c
@ -34,7 +34,7 @@ char zone_is_busy(short zone) {
|
|||||||
|
|
||||||
short get_first_night_zone() {
|
short get_first_night_zone() {
|
||||||
// TODO сделать корректное вычисление ночной зоны
|
// TODO сделать корректное вычисление ночной зоны
|
||||||
// всего зон, куда можно сныкать барабаны (всего 9 мест: 8 промывок и выгрузка)
|
// всего зон, куда можно сныкать барабаны (всего 9 мест: загрузка 1 и 8 промывок)
|
||||||
for (short nz = 0; nz < 9; nz++) {
|
for (short nz = 0; nz < 9; nz++) {
|
||||||
char found = 0;
|
char found = 0;
|
||||||
for (short i = 0; i < BARRELS_COUNT; i++) {
|
for (short i = 0; i < BARRELS_COUNT; i++) {
|
||||||
@ -144,12 +144,7 @@ short _get_dest_zone(struct barrel *bar) {
|
|||||||
|
|
||||||
case ZONE_WASHING_4B:
|
case ZONE_WASHING_4B:
|
||||||
// последняя промывка в процессе
|
// последняя промывка в процессе
|
||||||
if (hla_night_mode) {
|
return ZONE_UNLOAD;
|
||||||
// TODO изменить логику для ночного режима
|
|
||||||
return -1;
|
|
||||||
} else {
|
|
||||||
return ZONE_UNLOAD;
|
|
||||||
}
|
|
||||||
|
|
||||||
case ZONE_UNLOAD:
|
case ZONE_UNLOAD:
|
||||||
// последняя промывка, нужно разрешение на выгрузку
|
// последняя промывка, нужно разрешение на выгрузку
|
||||||
@ -188,11 +183,11 @@ short can_move(struct barrel *bar, char robot_id) {
|
|||||||
}
|
}
|
||||||
// сразу отсекаем варианты, при которых невозможно переместить барабан
|
// сразу отсекаем варианты, при которых невозможно переместить барабан
|
||||||
if (!bar->flags.is_exist) {
|
if (!bar->flags.is_exist) {
|
||||||
return -3;
|
return -4;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bar->flags.robot != 0) {
|
if (bar->flags.robot != 0) {
|
||||||
return -3;
|
return -5;
|
||||||
}
|
}
|
||||||
|
|
||||||
// проверка ночного режима
|
// проверка ночного режима
|
||||||
@ -225,7 +220,7 @@ short can_move(struct barrel *bar, char robot_id) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (bar->software_timer > -approximate_time) {
|
if (bar->software_timer > approximate_time) {
|
||||||
return -2;
|
return -2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -253,7 +248,7 @@ short can_move(struct barrel *bar, char robot_id) {
|
|||||||
border += LOCK_ZONE_BORDER;
|
border += LOCK_ZONE_BORDER;
|
||||||
|
|
||||||
if (bar->zone <= border || dest_zone <= border) {
|
if (bar->zone <= border || dest_zone <= border) {
|
||||||
dest_zone = -1;
|
dest_zone = -6;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// если робот 2, то это новый, который ближе к началу линнии.
|
// если робот 2, то это новый, который ближе к началу линнии.
|
||||||
@ -262,14 +257,14 @@ short can_move(struct barrel *bar, char robot_id) {
|
|||||||
if (border > robot1_lock_zone) {
|
if (border > robot1_lock_zone) {
|
||||||
border = robot1_lock_zone;
|
border = robot1_lock_zone;
|
||||||
}
|
}
|
||||||
if (border > ZONE_WASHING_3B) {
|
if (border > ZONE_PASSIVATION) {
|
||||||
border = ZONE_WASHING_3B;
|
border = ZONE_PASSIVATION;
|
||||||
}
|
}
|
||||||
|
|
||||||
border -= LOCK_ZONE_BORDER;
|
border -= LOCK_ZONE_BORDER;
|
||||||
|
|
||||||
if (bar->zone >= border || dest_zone >= border) {
|
if (bar->zone >= border || dest_zone >= border) {
|
||||||
dest_zone = -1;
|
dest_zone = -6;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -495,8 +490,8 @@ void create_operation(struct robot_code *code, short barrel_id, const short star
|
|||||||
if (start_zone < dest_zone) {
|
if (start_zone < dest_zone) {
|
||||||
tmp = start_zone;
|
tmp = start_zone;
|
||||||
}
|
}
|
||||||
if (tmp > ZONE_WASHING_3B) {
|
if (tmp > ZONE_PASSIVATION) {
|
||||||
tmp = ZONE_WASHING_3B;
|
tmp = ZONE_PASSIVATION;
|
||||||
}
|
}
|
||||||
robot1_lock_zone = tmp;
|
robot1_lock_zone = tmp;
|
||||||
} else {
|
} else {
|
||||||
@ -504,18 +499,13 @@ void create_operation(struct robot_code *code, short barrel_id, const short star
|
|||||||
if (start_zone > dest_zone) {
|
if (start_zone > dest_zone) {
|
||||||
tmp = start_zone;
|
tmp = start_zone;
|
||||||
}
|
}
|
||||||
if (tmp < ZONE_WASHING_2A) {
|
if (tmp < ZONE_ETCHING_2) {
|
||||||
tmp = ZONE_WASHING_2A;
|
tmp = ZONE_ETCHING_2;
|
||||||
}
|
}
|
||||||
robot2_lock_zone = tmp;
|
robot2_lock_zone = tmp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// если ночной режим, то нужно сразу обновить флаг у барабана
|
|
||||||
if (hla_night_mode && barrel_id >= 0) {
|
|
||||||
barrels[barrel_id].flags.is_night = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// первым делом добавляем команду опустить траверсу
|
// первым делом добавляем команду опустить траверсу
|
||||||
code->code[cmd_index++] = ROBOT_CMD_DOWN();
|
code->code[cmd_index++] = ROBOT_CMD_DOWN();
|
||||||
|
|
||||||
@ -524,14 +514,16 @@ void create_operation(struct robot_code *code, short barrel_id, const short star
|
|||||||
if (current_zone != start_zone) {
|
if (current_zone != start_zone) {
|
||||||
code->code[cmd_index++] = ROBOT_CMD_MOVE_TO_ZONE(ZONE_WASHING_3B);
|
code->code[cmd_index++] = ROBOT_CMD_MOVE_TO_ZONE(ZONE_WASHING_3B);
|
||||||
}
|
}
|
||||||
code->code[cmd_index++] = ROBOT_CMD_SET_LOCK_ZONE(ZONE_WASHING_4A);
|
if (!one_robot_mode) {
|
||||||
|
code->code[cmd_index++] = ROBOT_CMD_SET_LOCK_ZONE(ZONE_PASSIVATION);
|
||||||
|
}
|
||||||
code->code[cmd_index++] = ROBOT_CMD_UP_WITH_BARREL();
|
code->code[cmd_index++] = ROBOT_CMD_UP_WITH_BARREL();
|
||||||
code->code[cmd_index++] = ROBOT_CMD_MOVE_TO_ZONE_WITH_BARREL(ZONE_PASSIVATION);
|
code->code[cmd_index++] = ROBOT_CMD_MOVE_TO_ZONE_WITH_BARREL(ZONE_PASSIVATION);
|
||||||
code->code[cmd_index++] = ROBOT_CMD_DOWN_WITH_BARREL();
|
code->code[cmd_index++] = ROBOT_CMD_DOWN_WITH_BARREL();
|
||||||
|
|
||||||
// NOTE таймер робота работает точнее чем таймер барабанов
|
// NOTE таймер робота работает точнее чем таймер барабанов
|
||||||
// code->code[cmd_index++] = ROBOT_CMD_TMR_SET(barrels[barrel_id].time_passivation);
|
code->code[cmd_index++] = ROBOT_CMD_TMR_SET(barrels[barrel_id].time_passivation);
|
||||||
code->code[cmd_index++] = ROBOT_CMD_WAIT(barrels[barrel_id].time_passivation);
|
// code->code[cmd_index++] = ROBOT_CMD_WAIT(barrels[barrel_id].time_passivation);
|
||||||
|
|
||||||
code->code[cmd_index++] = ROBOT_CMD_UP_WITH_BARREL();
|
code->code[cmd_index++] = ROBOT_CMD_UP_WITH_BARREL();
|
||||||
code->code[cmd_index++] = ROBOT_CMD_WAIT(hla_time_digging);
|
code->code[cmd_index++] = ROBOT_CMD_WAIT(hla_time_digging);
|
||||||
@ -555,32 +547,32 @@ void create_operation(struct robot_code *code, short barrel_id, const short star
|
|||||||
}
|
}
|
||||||
|
|
||||||
// теперь обновляем LOCK-зону
|
// теперь обновляем LOCK-зону
|
||||||
if (!one_robot_mode && !hla_night_mode) {
|
if (!one_robot_mode) {
|
||||||
if (robot_id == 1) {
|
if (robot_id == 1) {
|
||||||
// ставим lock-зону только если она ближе к концу линии
|
// ставим lock-зону только если она ближе к концу линии
|
||||||
short tmp = dest_zone;
|
short tmp = dest_zone;
|
||||||
|
|
||||||
// lock-зона этого робота не может выходить за промывку 3А, потому что это не имеет смысла
|
// lock-зона этого робота должна быть такой, чтобы была свободна промывка 3а
|
||||||
if (tmp > ZONE_WASHING_3B) {
|
if (tmp > ZONE_PASSIVATION) {
|
||||||
tmp = ZONE_WASHING_3B;
|
tmp = ZONE_PASSIVATION;
|
||||||
}
|
}
|
||||||
|
|
||||||
// в любом случае lock-зону нельзя двигать к началу линии
|
// в любом случае lock-зону нельзя двигать к началу линии
|
||||||
if (tmp > robot1_lock_zone) {
|
if (tmp > robot1_lock_zone) {
|
||||||
code->code[cmd_index++] = ROBOT_CMD_SET_LOCK_ZONE(dest_zone);
|
code->code[cmd_index++] = ROBOT_CMD_SET_LOCK_ZONE(tmp);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// ставим lock-зону только если она ближе к началу линии
|
// ставим lock-зону только если она ближе к началу линии
|
||||||
short tmp = dest_zone;
|
short tmp = dest_zone;
|
||||||
|
|
||||||
// lock-зона этого робота не может выходить за промывку 3А, потому что это не имеет смысла
|
// lock-зона этого робота не может выходить за промывку 3А, потому что это не имеет смысла
|
||||||
if (tmp < ZONE_WASHING_2A) {
|
if (tmp < ZONE_ETCHING_2) {
|
||||||
tmp = ZONE_WASHING_2A;
|
tmp = ZONE_ETCHING_2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// в любом случае lock-зону нельзя двигать к концу линии
|
// в любом случае lock-зону нельзя двигать к концу линии
|
||||||
if (tmp < robot2_lock_zone) {
|
if (tmp < robot2_lock_zone) {
|
||||||
code->code[cmd_index++] = ROBOT_CMD_SET_LOCK_ZONE(dest_zone);
|
code->code[cmd_index++] = ROBOT_CMD_SET_LOCK_ZONE(tmp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -710,29 +702,23 @@ void create_operation(struct robot_code *code, short barrel_id, const short star
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!one_robot_mode && !hla_night_mode) {
|
if (!one_robot_mode) {
|
||||||
if (robot_id == 2) {
|
if (robot_id == 2) {
|
||||||
// суть этого предела в том, чтобы робот всегда держал свободной зону gal1,
|
// 2-му роботу нужно держать всегда свободной зону промывки 2б
|
||||||
// но при этом если зоной обмена выбрана промывка 2б, то за ней тоже, получается min(ZONE_G1, exchange_zone)
|
if (dest_zone > ZONE_ETCHING_2) {
|
||||||
const short robot2_border = (ZONE_GALVANIZING_1 < hla_exchange_zone ? ZONE_GALVANIZING_1 : hla_exchange_zone) - 1;
|
code->code[cmd_index++] = ROBOT_CMD_SET_LOCK_ZONE(ZONE_ETCHING_2);
|
||||||
|
code->code[cmd_index++] = ROBOT_CMD_MOVE_TO_ZONE(ZONE_ETCHING_2);
|
||||||
if (dest_zone >= robot2_border) {
|
|
||||||
// из промывки 2б он перекладывал, пусть едет в промывку 2а
|
|
||||||
code->code[cmd_index++] = ROBOT_CMD_SET_LOCK_ZONE(robot2_border - 1);
|
|
||||||
code->code[cmd_index++] = ROBOT_CMD_MOVE_TO_ZONE(robot2_border - 1);
|
|
||||||
} else if (dest_zone < ZONE_WASHING_1A) {
|
} else if (dest_zone < ZONE_WASHING_1A) {
|
||||||
|
// на случай если робот уехал в выгрузку или обезжир, надо его отогнать в зону промывки 1а
|
||||||
// code->code[cmd_index++] = ROBOT_CMD_SET_LOCK_ZONE(ZONE_WASHING_1A);
|
// code->code[cmd_index++] = ROBOT_CMD_SET_LOCK_ZONE(ZONE_WASHING_1A);
|
||||||
code->code[cmd_index++] = ROBOT_CMD_MOVE_TO_ZONE(ZONE_WASHING_1A);
|
code->code[cmd_index++] = ROBOT_CMD_MOVE_TO_ZONE(ZONE_WASHING_1A);
|
||||||
}
|
}
|
||||||
} else if (robot_id == 1) {
|
} else if (robot_id == 1) {
|
||||||
// суть этого предела в том, чтобы робот всегда был свободен ЗА зоной gal8,
|
// 2-му роботу нужно держать всегда свободной зону промывки 3а
|
||||||
// но при этом если зоной обмена выбрана промывка 3а, то за ней тоже, получается max(ZONE_G8, exchange_zone)
|
if (dest_zone < ZONE_PASSIVATION) {
|
||||||
const short robot1_border = (ZONE_GALVANIZING_8 > hla_exchange_zone ? ZONE_GALVANIZING_8 : hla_exchange_zone) + 1;
|
|
||||||
|
|
||||||
if (dest_zone <= robot1_border) {
|
|
||||||
// чтобы из этой зоны можно было переложить барабан первому роботу
|
// чтобы из этой зоны можно было переложить барабан первому роботу
|
||||||
code->code[cmd_index++] = ROBOT_CMD_SET_LOCK_ZONE(robot1_border + 1);
|
code->code[cmd_index++] = ROBOT_CMD_SET_LOCK_ZONE(ZONE_PASSIVATION);
|
||||||
code->code[cmd_index++] = ROBOT_CMD_MOVE_TO_ZONE(robot1_border + 1);
|
code->code[cmd_index++] = ROBOT_CMD_MOVE_TO_ZONE(ZONE_PASSIVATION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
Reference in New Issue
Block a user