From 885e64062ee19543b8f874b5f3ddeab6673d985d Mon Sep 17 00:00:00 2001 From: VladislavOstapov Date: Sun, 5 Feb 2023 16:32:32 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9C=D0=BE=D0=B4=D0=B5=D1=80=D0=BD=D0=B8?= =?UTF-8?q?=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B0=D0=BB=D0=B3=D0=BE=D1=80?= =?UTF-8?q?=D0=B8=D1=82=D0=BC=D0=B0=20=D0=BF=D0=BB=D0=B0=D0=BD=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- emulator.cpp | 2 +- scheduler.c | 191 ++++++++++++++++++++++++++++++--------------------- utils.h | 4 +- 3 files changed, 115 insertions(+), 82 deletions(-) diff --git a/emulator.cpp b/emulator.cpp index ebb3255..72b106f 100644 --- a/emulator.cpp +++ b/emulator.cpp @@ -20,7 +20,7 @@ struct robot_regs robot1; struct robot_regs robot2; char _scheduler_software_timer = 0; -short scheduler_correction_stage = 0; +short scheduler_stage = 0; // кнопка загрузки в зоне 0, означает что барабан надо изъять из этой загрузки (а перед этим создать) char button_load = 0; diff --git a/scheduler.c b/scheduler.c index 8db7c62..883c3af 100644 --- a/scheduler.c +++ b/scheduler.c @@ -128,7 +128,7 @@ void scheduler_main() 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; @@ -136,11 +136,22 @@ void scheduler_main() } } scheduler_start_signal = 0; + scheduler_stage = 0; + } + + // программный таймер, применяется ко всем существующим барабанам во всех режимах + 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 (hla_correct_command) { if (one_robot_mode) { - switch (scheduler_correction_stage) { + switch (scheduler_stage) { case 0: if (hla_robot2_en) { if (robot2_code.PC < 0) { @@ -150,7 +161,7 @@ void scheduler_main() robot2_code.code[2] = ROBOT_CMD_END(); robot2_code.PC = 0; - scheduler_correction_stage++; + scheduler_stage++; } } else { if (robot1_code.PC < 0) { @@ -161,23 +172,23 @@ void scheduler_main() robot1_code.code[3] = ROBOT_CMD_END(); robot1_code.PC = 0; - scheduler_correction_stage++; + scheduler_stage++; } } break; case 1: if (robot2_code.PC < 0 && robot1_code.PC < 0) { - scheduler_correction_stage++; + scheduler_stage++; } break; default: - scheduler_correction_stage = 0; + scheduler_stage = 0; hla_correct_command = 0; } } else { - switch (scheduler_correction_stage) { + switch (scheduler_stage) { case 0: // сначала робота 2 отправляем на коррекцию if (robot2_code.PC < 0) { @@ -187,13 +198,13 @@ void scheduler_main() robot2_code.code[2] = ROBOT_CMD_END(); robot2_code.PC = 0; - scheduler_correction_stage++; + scheduler_stage++; } break; case 1: if (robot2_code.PC < 0) { - scheduler_correction_stage++; + scheduler_stage++; } break; @@ -207,33 +218,23 @@ void scheduler_main() robot1_code.code[3] = ROBOT_CMD_END(); robot1_code.PC = 0; - scheduler_correction_stage++; + scheduler_stage++; } break; case 3: if (robot1_code.PC < 0) { - scheduler_correction_stage++; + scheduler_stage++; } break; default: - scheduler_correction_stage = 0; + scheduler_stage = 0; hla_correct_command = 0; } } } else 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 (!is_accessible_zone(ROBOT_ZONE_ETCH)) { increment_zone(ROBOT_ZONE_ETCH); @@ -247,88 +248,120 @@ void scheduler_main() if (one_robot_mode) { // режим одного робота char robot_id = ROBOT_NONE; - if (hla_robot1_en && robot1_code.PC < 0) { + if (hla_robot1_en) { robot_id = ROBOT_1; - } else if (hla_robot2_en && robot2_code.PC < 0) { + } else { robot_id = ROBOT_2; } - if (robot_id != ROBOT_NONE) { - if ((robot_id == ROBOT_1 && robot1.dx.current_zone < ZONE_WASHING_1A) || - (robot_id == ROBOT_2 && robot2.dx.current_zone < ZONE_WASHING_1A)) { - if (robot_id == 1) { - robot1_code.barrel_id = -1; - robot1_code.code[0] = ROBOT_CMD_DOWN(); - robot1_code.code[1] = ROBOT_CMD_MOVE_TO_ZONE(ZONE_WASHING_1A); - robot1_code.code[2] = ROBOT_CMD_END(); - robot1_code.PC = 0; + switch (scheduler_stage) { + case 0: + if ((robot_id == ROBOT_1 && robot1.dx.current_zone < ZONE_WASHING_1A) || + (robot_id == ROBOT_2 && robot2.dx.current_zone < ZONE_WASHING_1A)) { + if (robot_id == ROBOT_1 && 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_1A); + robot1_code.code[2] = ROBOT_CMD_END(); + robot1_code.PC = 0; + scheduler_stage++; + } else 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_WASHING_1A); + robot2_code.code[2] = ROBOT_CMD_END(); + robot2_code.PC = 0; + scheduler_stage++; + } } else { - robot2_code.barrel_id = -1; - robot2_code.code[0] = ROBOT_CMD_DOWN(); - robot2_code.code[1] = ROBOT_CMD_MOVE_TO_ZONE(ZONE_WASHING_1A); - robot2_code.code[2] = ROBOT_CMD_END(); - robot2_code.PC = 0; + scheduler_stage += 2; } - } else { + break; + + case 1: + if ((robot_id == ROBOT_1 && robot1_code.PC < 0) || (robot_id == ROBOT_2 && robot2_code.PC < 0)) { + scheduler_stage++; + } + break; + + case 2: schedule_one_robot(robot_id); - } + break; + + default: + scheduler_stage = 0; } } else { // а вот для режима двух роботов все интересно // для каждого робота нужно получить свой список задач // и надо еще сделать так, чтобы роботы не столкнулись - // суть этого предела в том, чтобы робот всегда был свободен ЗА зоной gal8, - // но при этом если зоной обмена выбрана промывка 3а, то за ней тоже, получается max(ZONE_G8, exchange_zone) - const short robot1_border = ZONE_GALVANIZING_8 > hla_exchange_zone ? ZONE_GALVANIZING_8 : hla_exchange_zone; + switch (scheduler_stage) { + case 0: + // посылаем робота 1 в жопу линии, если он не в жопе + if (robot1.dx.current_zone < ZONE_PASSIVATION) { + if (robot1_code.PC < 0) { + robot2_lock_zone = -1; + robot1_lock_zone = ZONE_PASSIVATION; + robot1_code.barrel_id = -1; + robot1_code.code[0] = ROBOT_CMD_DOWN(); + robot1_code.code[1] = ROBOT_CMD_MOVE_TO_ZONE(ZONE_PASSIVATION); + robot1_code.code[2] = ROBOT_CMD_END(); + robot1_code.PC = 0; + scheduler_stage++; + } + } else { + scheduler_stage++; + } + break; - // суть этого предела в том, чтобы робот всегда держал свободной зону gal1, - // но при этом если зоной обмена выбрана промывка 2б, то за ней тоже, получается min(ZONE_G1, exchange_zone) - const short robot2_border = ZONE_GALVANIZING_1 < hla_exchange_zone ? ZONE_GALVANIZING_1 : hla_exchange_zone; + case 1: + // ждем пока робот съебет в зону дальше, чем зона 8 + if (robot1.dx.current_zone > ZONE_WASHING_2A + 1 && robot1_lock_zone > ZONE_WASHING_2A + 1) { + robot2_lock_zone = ZONE_ETCHING_2; + scheduler_stage++; + } + break; - // логика для того, чтобы роботы не столкнулись в начале - if (robot1.dx.current_zone < robot1_border) { - if (robot1_code.PC < 0) { - robot2_lock_zone = -1; - robot1_lock_zone = robot1_border; - robot1_code.barrel_id = -1; - robot1_code.code[0] = ROBOT_CMD_DOWN(); - robot1_code.code[1] = ROBOT_CMD_MOVE_TO_ZONE(robot1_border + 2); - robot1_code.code[2] = ROBOT_CMD_END(); - robot1_code.PC = 0; - } - } else if (robot2.dx.current_zone > robot2_border) { - // это уже граница робота 2 - if (robot2_code.PC < 0) { - robot2_lock_zone = robot2_border - 2; - robot2_code.barrel_id = -1; - robot2_code.code[0] = ROBOT_CMD_DOWN(); - robot2_code.code[1] = ROBOT_CMD_MOVE_TO_ZONE(robot2_border - 2); - robot2_code.code[2] = ROBOT_CMD_END(); - robot2_code.PC = 0; - } - } else { - // отдельно просчитаем все для первого робота - if (robot1_code.PC < 0) { - schedule_one_robot(ROBOT_1); - } - - // и отдельно для второго (только если не в ночном режиме) - if (robot2_code.PC < 0) { + case 2: + // отправляем второго робота в зону 3, если он левее if (robot2.dx.current_zone < ZONE_WASHING_1A) { - // начальная позиция робота 2 - промывка 1a - robot2_lock_zone = ZONE_WASHING_1A; if (robot2_code.PC < 0) { + robot2_lock_zone = ZONE_ETCHING_2; robot2_code.barrel_id = -1; robot2_code.code[0] = ROBOT_CMD_DOWN(); robot2_code.code[1] = ROBOT_CMD_MOVE_TO_ZONE(ZONE_WASHING_1A); robot2_code.code[2] = ROBOT_CMD_END(); robot2_code.PC = 0; + scheduler_stage++; } } else { - schedule_one_robot(ROBOT_2); + scheduler_stage++; } - } + break; + + case 3: + // ну а теперь конечная стадия - собсна раздача команд + + // отдельно просчитаем все для первого робота + if (robot1_code.PC < 0) { + schedule_one_robot(ROBOT_1); + } + + // и отдельно для второго + if (robot2_code.PC < 0) { + if (robot2.dx.current_zone < ZONE_WASHING_1A) { + // вернемся к стадии 2, ну его нафиг, код переписывать + + } else { + schedule_one_robot(ROBOT_2); + } + } + + break; + + default: + scheduler_stage = 0; } } } diff --git a/utils.h b/utils.h index d312f10..58aa645 100644 --- a/utils.h +++ b/utils.h @@ -204,7 +204,7 @@ extern char scheduler_en; // сигнал инициализации планировщика, должен быть установлен по фронту разрешения на работу extern char scheduler_start_signal; -extern short scheduler_correction_stage; +extern short scheduler_stage; #else #define barrels ((struct barrel*)barrels_array) @@ -243,7 +243,7 @@ extern short scheduler_correction_stage; #define hla_night_mode _c_hla_night_mode #define hla_correct_command _c_hla_correct_command -#define scheduler_correction_stage _c_scheduler_correction_stage +#define scheduler_stage _c_scheduler_stage #endif