From 31f3f258f6d3f918c198b4c397003ec1f0db7bb8 Mon Sep 17 00:00:00 2001 From: VladislavOstapov Date: Mon, 9 Jan 2023 23:35:58 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BD=D0=BE=D1=87=D0=BD=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- robot.cpp | 13 ++- scheduler.c | 30 +++++- utils.c | 277 +++++++++++++++++++++++++++------------------------- 3 files changed, 178 insertions(+), 142 deletions(-) diff --git a/robot.cpp b/robot.cpp index b7164f9..7dba122 100644 --- a/robot.cpp +++ b/robot.cpp @@ -62,9 +62,18 @@ static void emulate_robot(robot_code &code, robot_regs& r, char robot_id) { switch (code.code[code.PC] & (short)ROBOT_CMD_MASK) { case ROBOT_CMD_MOVE_TO_ZONE_code: // двигаемся в сторону цели - if (robot_move(r, (short)(cmd_arg & 0x7F), robot_id)) { - code.PC++; + { + short target = cmd_arg; + if (target & ROBOT_ZONE_PARKING) { + target = -1; + } else { + target &= 0x7F; + } + if (robot_move(r, target, robot_id)) { + code.PC++; + } } + if (cmd_arg & ROBOT_WITH_BARREL && code.barrel_id >= 0) { barrels[code.barrel_id].zone = r.dx.current_zone; } diff --git a/scheduler.c b/scheduler.c index b9a625b..9b27c50 100644 --- a/scheduler.c +++ b/scheduler.c @@ -127,6 +127,25 @@ void scheduler_main() if (hla_night_mode) { robot1_lock_zone = -1; robot2_lock_zone = -1; + + // ставим всем барабанам которые в промывках флаг ночного барабана + for (short i = 0; i < BARRELS_COUNT; i++) { + if (barrels[i].flags.is_exist) { + const short zones[] = { + ZONE_LOAD_1, + ZONE_WASHING_1A, ZONE_WASHING_1B, + ZONE_WASHING_2A, ZONE_WASHING_2B, + ZONE_WASHING_3A, ZONE_WASHING_3B, + ZONE_WASHING_4A, ZONE_WASHING_4B + }; + for (short t = 0; t < 9; t++) { + if (barrels[i].zone == zones[t]) { + barrels[i].flags.is_night = -1; + break; + } + } + } + } } if (scheduler_en) { @@ -246,7 +265,8 @@ void scheduler_main() robot1_code.PC = 0; } } else if (robot2.dx.current_zone < ZONE_DEGREASING) { - // начальная позиция робота 2 - обезжиривание + // начальная позиция робота 1 - обезжир + robot2_lock_zone = ZONE_WASHING_2A; if (robot2_code.PC < 0) { robot2_code.barrel_id = -1; robot2_code.code[0] = ROBOT_CMD_DOWN(); @@ -260,8 +280,8 @@ void scheduler_main() } if (cmd_en) { - // отдельно просчитаем все для первого робота (только если не в ночном режиме) - if (!hla_night_mode && robot1_code.PC < 0) { + // отдельно просчитаем все для первого робота + if (robot1_code.PC < 0) { for (short i = 0; i < BARRELS_COUNT; i++) { // для каждой задачи: tasks[i].start_zone = barrels[i].zone; @@ -275,8 +295,8 @@ void scheduler_main() schedule_one_robot(tasks, &robot1, &robot1_code, 1); } - // и отдельно для второго - if (robot2_code.PC < 0) { + // и отдельно для второго (только если не в ночном режиме) + if (!hla_night_mode && robot2_code.PC < 0) { for (short i = 0; i < BARRELS_COUNT; i++) { // для каждой задачи: tasks[i].start_zone = barrels[i].zone; diff --git a/utils.c b/utils.c index e5c8b46..a3f7029 100644 --- a/utils.c +++ b/utils.c @@ -45,6 +45,9 @@ short can_move(struct barrel *bar, char robot_id) { } if (hla_night_mode) { + if (bar->flags.is_night) { + return -1; + } // задача - найти первую свободную промывку const short zones[] = { ZONE_LOAD_1, @@ -54,7 +57,7 @@ short can_move(struct barrel *bar, char robot_id) { ZONE_WASHING_4A, ZONE_WASHING_4B }; - // всего зон, куда можно сныкать барабаны 9 (8 промывок и выгрузка) + // всего зон, куда можно сныкать барабаны (всего 9 мест: 8 промывок и выгрузка) for (short i = 0; i < 9; i++) { if (!zone_is_busy(zones[i])) { return zones[i]; @@ -62,143 +65,142 @@ short can_move(struct barrel *bar, char robot_id) { } return -1; } else { - // если барабан ночной, то надо проверить выгрузку (туда выгружаются ночные барабаны) - if (bar->flags.is_night) { - if (!zone_is_busy(ZONE_LOAD_1)) { - return ZONE_LOAD_1; - } - return -1; - } - // дальше нужно проверить, что можно передвигать бочку short dest_zone = -1; - switch (bar->zone) { - case ZONE_LOAD_2: - // загрузка 2, только в нее можно грузить новые барабаны, нужно обезжиривание - if (!zone_is_busy(ZONE_DEGREASING)) { - dest_zone = ZONE_DEGREASING; - } - break; - - case ZONE_DEGREASING: - // обезжиривание, нужна промывка 1А - if (!zone_is_busy(ZONE_WASHING_1A)) { - dest_zone = ZONE_WASHING_1A; - } - break; - - case ZONE_WASHING_1A: - // промывка 1А, нужна промывка 1Б - if (!zone_is_busy(ZONE_WASHING_1B)) { - dest_zone = ZONE_WASHING_1B; - } - break; - - case ZONE_WASHING_1B: - // промывка 1Б, нужно травление (зоны 5-6) - if (etching_zone < 0) { + // если барабан ночной, то надо проверить выгрузку (туда выгружаются ночные барабаны) + if (bar->flags.is_night) { + if (!zone_is_busy(ZONE_LOAD_1)) { + dest_zone = ZONE_LOAD_1; + } + } else { + switch (bar->zone) { + case ZONE_LOAD_2: + // загрузка 2, только в нее можно грузить новые барабаны, нужно обезжиривание + if (!zone_is_busy(ZONE_DEGREASING)) { + dest_zone = ZONE_DEGREASING; + } break; - } - if (!zone_is_busy((short)(ZONE_ETCHING_1 + etching_zone))) { - dest_zone = (short)(ZONE_ETCHING_1 + etching_zone); - } - break; - case ZONE_ETCHING_1: - case ZONE_ETCHING_2: - // травление, нужна промывка 2А - if (!zone_is_busy(ZONE_WASHING_2A)) { - dest_zone = ZONE_WASHING_2A; - } - break; - - case ZONE_WASHING_2A: - // промывка 2А, нужна промывка 2Б - if (!zone_is_busy(ZONE_WASHING_2B)) { - dest_zone = ZONE_WASHING_2B; - } - break; - - case ZONE_WASHING_2B: - // промывка 2Б, нужно цинкование (зоны 9-16) - if (galvanizing_zone < 0) { + case ZONE_DEGREASING: + // обезжиривание, нужна промывка 1А + if (!zone_is_busy(ZONE_WASHING_1A)) { + dest_zone = ZONE_WASHING_1A; + } break; - } - if (!zone_is_busy((short)(ZONE_GALVANIZING_1 + galvanizing_zone))) { - dest_zone = (short)(ZONE_GALVANIZING_1 + galvanizing_zone); - } - break; - case ZONE_GALVANIZING_1: - case ZONE_GALVANIZING_2: - case ZONE_GALVANIZING_3: - case ZONE_GALVANIZING_4: - case ZONE_GALVANIZING_5: - case ZONE_GALVANIZING_6: - case ZONE_GALVANIZING_7: - case ZONE_GALVANIZING_8: - // цинкование, требуется чтобы в зонах 17-22 было максимум 2 барабана (3 барабана для этой части линии - максимум) - if (!zone_is_busy(ZONE_WASHING_3A)) { - short count = 0; - // если зона 17 свободна, то диапазон начнется с 3Б - for (short i = ZONE_WASHING_3B; i <= (short)ZONE_UNLOAD; i++) { - if (zone_is_busy(i)) { - count++; + case ZONE_WASHING_1A: + // промывка 1А, нужна промывка 1Б + if (!zone_is_busy(ZONE_WASHING_1B)) { + dest_zone = ZONE_WASHING_1B; + } + break; + + case ZONE_WASHING_1B: + // промывка 1Б, нужно травление (зоны 5-6) + if (etching_zone < 0) { + break; + } + if (!zone_is_busy((short)(ZONE_ETCHING_1 + etching_zone))) { + dest_zone = (short)(ZONE_ETCHING_1 + etching_zone); + } + break; + + case ZONE_ETCHING_1: + case ZONE_ETCHING_2: + // травление, нужна промывка 2А + if (!zone_is_busy(ZONE_WASHING_2A)) { + dest_zone = ZONE_WASHING_2A; + } + break; + + case ZONE_WASHING_2A: + // промывка 2А, нужна промывка 2Б + if (!zone_is_busy(ZONE_WASHING_2B)) { + dest_zone = ZONE_WASHING_2B; + } + break; + + case ZONE_WASHING_2B: + // промывка 2Б, нужно цинкование (зоны 9-16) + if (galvanizing_zone < 0) { + break; + } + if (!zone_is_busy((short)(ZONE_GALVANIZING_1 + galvanizing_zone))) { + dest_zone = (short)(ZONE_GALVANIZING_1 + galvanizing_zone); + } + break; + + case ZONE_GALVANIZING_1: + case ZONE_GALVANIZING_2: + case ZONE_GALVANIZING_3: + case ZONE_GALVANIZING_4: + case ZONE_GALVANIZING_5: + case ZONE_GALVANIZING_6: + case ZONE_GALVANIZING_7: + case ZONE_GALVANIZING_8: + // цинкование, требуется чтобы в зонах 17-22 было максимум 2 барабана (3 барабана для этой части линии - максимум) + if (!zone_is_busy(ZONE_WASHING_3A)) { + short count = 0; + // если зона 17 свободна, то диапазон начнется с 3Б + for (short i = ZONE_WASHING_3B; i <= (short)ZONE_UNLOAD; i++) { + if (zone_is_busy(i)) { + count++; + } + } + if (count < 3) { + dest_zone = ZONE_WASHING_3A; } } - if (count < 3) { - dest_zone = ZONE_WASHING_3A; + break; + + case ZONE_WASHING_3A: + // промывка 3А, перекладываем в промывку 3Б + if (!zone_is_busy(ZONE_WASHING_3B)) { + dest_zone = ZONE_WASHING_3B; } - } - break; + break; - case ZONE_WASHING_3A: - // промывка 3А, перекладываем в промывку 3Б - if (!zone_is_busy(ZONE_WASHING_3B)) { - dest_zone = ZONE_WASHING_3B; - } - break; - - case ZONE_WASHING_3B: - // это перед пассивацией, требует свободную промывку 4А и на всякий случай свободную пассивацию - if (!zone_is_busy(ZONE_PASSIVATION) && !zone_is_busy(ZONE_WASHING_4A)) { - dest_zone = ZONE_PASSIVATION; - } - // это атомарная операция, по идее вносить барабан в пассивацию нельзя - break; - - case ZONE_PASSIVATION: - // процесс пассивации, нужна промывка 4A - // чисто теоретически сюда никогда не попадем, но если вдруг выстрелит пусть будет - if (!zone_is_busy(ZONE_WASHING_4A)) { - dest_zone = ZONE_WASHING_4A; - } - break; - - case ZONE_WASHING_4A: - // промывка 4А, перекладываем в промывку 4Б - if (!zone_is_busy(ZONE_WASHING_4B)) { - dest_zone = ZONE_WASHING_4B; - } - break; - - case ZONE_WASHING_4B: - // процесс пассивации, нужна промывка 4B (зона 21) (потому что сейчас я в 4A) - if (!zone_is_busy(ZONE_UNLOAD)) { - dest_zone = ZONE_UNLOAD; - } - break; - - case ZONE_UNLOAD: - // последняя промывка, нужно разрешение на выгрузку - if (one_robot_mode && button_unload) { - // нужно промывку загрузку 0 - if (!zone_is_busy(ZONE_LOAD_1)) { - dest_zone = ZONE_LOAD_1; + case ZONE_WASHING_3B: + // это перед пассивацией, требует свободную промывку 4А и на всякий случай свободную пассивацию + if (!zone_is_busy(ZONE_PASSIVATION) && !zone_is_busy(ZONE_WASHING_4A)) { + dest_zone = ZONE_PASSIVATION; } - } - break; + // это атомарная операция, по идее вносить барабан в пассивацию нельзя + break; + + case ZONE_PASSIVATION: + // процесс пассивации, нужна промывка 4A + // чисто теоретически сюда никогда не попадем, но если вдруг выстрелит пусть будет + if (!zone_is_busy(ZONE_WASHING_4A)) { + dest_zone = ZONE_WASHING_4A; + } + break; + + case ZONE_WASHING_4A: + // промывка 4А, перекладываем в промывку 4Б + if (!zone_is_busy(ZONE_WASHING_4B)) { + dest_zone = ZONE_WASHING_4B; + } + break; + + case ZONE_WASHING_4B: + // процесс пассивации, нужна промывка 4B (зона 21) (потому что сейчас я в 4A) + if (!zone_is_busy(ZONE_UNLOAD)) { + dest_zone = ZONE_UNLOAD; + } + break; + + case ZONE_UNLOAD: + // последняя промывка, нужно разрешение на выгрузку + if (one_robot_mode && button_unload) { + // нужно промывку загрузку 0 + if (!zone_is_busy(ZONE_LOAD_1)) { + dest_zone = ZONE_LOAD_1; + } + } + break; + } } if (!one_robot_mode) { @@ -331,7 +333,12 @@ void debug_print_robot_code(const struct robot_code *code, const short robot_id, switch ((short)(code->code[i] & (short)ROBOT_CMD_MASK)) { case ROBOT_CMD_MOVE_TO_ZONE_code: - dprintf(fd, " move to zone %d (with barrel: %d)\n", cmd_arg & (~ROBOT_WITH_BARREL), (cmd_arg & ROBOT_WITH_BARREL) != 0); + if (cmd_arg & ROBOT_ZONE_PARKING) { + dprintf(fd, " move to parking (with barrel: %d)\n", (cmd_arg & ROBOT_WITH_BARREL) != 0); + } else { + dprintf(fd, " move to zone %d (with barrel: %d)\n", + cmd_arg & (~ROBOT_WITH_BARREL), (cmd_arg & ROBOT_WITH_BARREL) != 0); + } break; case ROBOT_CMD_MOVE_OFF_code: @@ -444,7 +451,7 @@ void create_operation(struct robot_code *code, const short barrel_id, const shor code->barrel_id = barrel_id; short cmd_index = 0; - if (!one_robot_mode) { + if (!one_robot_mode && !hla_night_mode) { if (robot_id == 1) { short tmp = dest_zone; if (start_zone < dest_zone) { @@ -459,8 +466,8 @@ void create_operation(struct robot_code *code, const short barrel_id, const shor if (start_zone > dest_zone) { tmp = start_zone; } - if (tmp < ZONE_WASHING_2B) { - tmp = ZONE_WASHING_2B; + if (tmp < ZONE_WASHING_2A) { + tmp = ZONE_WASHING_2A; } robot2_lock_zone = tmp; } @@ -479,7 +486,7 @@ void create_operation(struct robot_code *code, const short barrel_id, const shor if (current_zone != start_zone) { code->code[cmd_index++] = ROBOT_CMD_MOVE_TO_ZONE(ZONE_WASHING_3B); } - + code->code[cmd_index++] = ROBOT_CMD_SET_LOCK_ZONE(ZONE_WASHING_4A); 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_DOWN_WITH_BARREL(); @@ -510,7 +517,7 @@ void create_operation(struct robot_code *code, const short barrel_id, const shor } // теперь обновляем LOCK-зону - if (!one_robot_mode) { + if (!one_robot_mode && !hla_night_mode) { if (robot_id == 1) { // ставим lock-зону только если она ближе к концу линии short tmp = dest_zone; @@ -529,8 +536,8 @@ void create_operation(struct robot_code *code, const short barrel_id, const shor short tmp = dest_zone; // lock-зона этого робота не может выходить за промывку 3А, потому что это не имеет смысла - if (tmp < ZONE_WASHING_2B) { - tmp = ZONE_WASHING_2B; + if (tmp < ZONE_WASHING_2A) { + tmp = ZONE_WASHING_2A; } // в любом случае lock-зону нельзя двигать к концу линии @@ -656,7 +663,7 @@ void create_operation(struct robot_code *code, const short barrel_id, const shor } } - if (!one_robot_mode) { + if (!one_robot_mode && !hla_night_mode) { if (robot_id == 2) { if (dest_zone >= ZONE_GALVANIZING_1) { // из промывки 2б он перекладывал, пусть едет в промывку 2а