From 9624d917252a9b0f5fd623ac45a8a7b3fd3cbe6e Mon Sep 17 00:00:00 2001 From: VladislavOstapov Date: Mon, 5 Dec 2022 23:18:32 +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=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B?= =?UTF-8?q?=20=D0=B0=D0=BB=D0=B3=D0=BE=D1=80=D0=B8=D1=82=D0=BC=D0=B0=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=D0=BE=D1=80=D0=B8=D1=82=D0=B5=D1=82=D0=BE?= =?UTF-8?q?=D0=B2,=20=D1=82=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20=D0=BE=D0=BD?= =?UTF-8?q?=20=D0=BE=D1=82=D0=BB=D0=B0=D0=B6=D0=B5=D0=BD=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=B7=D0=BE=D0=BD=20=D1=82=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B8=20=D1=86=D0=B8=D0=BD=D0=BA?= =?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 | 4 ++++ scheduler.c | 54 ++++++++++++++++++++-------------------------------- 2 files changed, 25 insertions(+), 33 deletions(-) diff --git a/emulator.cpp b/emulator.cpp index 9713949..e9b745d 100644 --- a/emulator.cpp +++ b/emulator.cpp @@ -192,6 +192,10 @@ int main() { // } barrels[5] = makeBarrel(1, 21, 3); + barrels[6] = makeBarrel(1, 5, -6); + barrels[7] = makeBarrel(1, 6, -7); + + barrels[8] = makeBarrel(1, 10, -8); current_tic = 0; const char* message = nullptr; diff --git a/scheduler.c b/scheduler.c index 4ce4a36..6b2379b 100644 --- a/scheduler.c +++ b/scheduler.c @@ -1,6 +1,5 @@ #ifdef EMULATOR #include -#include #include "emulator.h" short etching_zone = 0, galvanizing_zone = 0; #endif @@ -15,15 +14,6 @@ char zone_is_busy(short zone) { return 0; } -short get_robot_barrel(char robot_id) { - for (short i = 0; i < BARRELS_COUNT; i++) { - if (barrels[i].flags.robot == robot_id) { - return i; - } - } - return -1; -} - // TODO обновить метод для работы с двумя роботами // вернет можно ли ехать и главное куда ехать, если можно (нельзя если вернулось значение < 0) // -1 вернет что перемещать нельзя @@ -188,8 +178,7 @@ short get_operation_priority(short barrel_id) { // теперь надо выяснить, есть ли барабаны с большим временем ожидания // тут возможны несколько случаев: // 1) когда барабан один такой (больше в цинковании нет барабанов чтобы их изъять), - // 2) когда барабанов несколько, соотвественно если есть барабан с наибольшим временем, то надо ему дать приоритет 1, а остальным 0, - // + // 2) когда барабанов несколько, соответственно если есть барабан с наибольшим временем, то надо ему дать приоритет 1, а остальным 0, char is_not_one = 0; char is_with_max_time = 1; @@ -201,19 +190,19 @@ short get_operation_priority(short barrel_id) { if (barrels[i].flags.is_exist && barrels[i].zone >= ZONE_GALVANIZING_1 && barrels[i].zone <= ZONE_GALVANIZING_8) { if (can_move(barrels + i) >= 0) { is_not_one = 1; - if (barrels[i].software_timer > barrels[barrel_id].software_timer) { + // чем больше у барабана время ожидания тем меньше у него число + if (barrels[i].software_timer < barrels[barrel_id].software_timer) { is_with_max_time = 0; break; } } } - if (is_not_one == 0) { - return 1; - } - return is_with_max_time; - } - return 0; + + if (is_not_one == 0) { + return 1; + } + return is_with_max_time; } @@ -227,17 +216,16 @@ short get_operation_priority(short barrel_id) { if (barrels[i].flags.is_exist && barrels[i].zone >= ZONE_ETCHING_1 && barrels[i].zone <= ZONE_ETCHING_2) { if (can_move(barrels + i) >= 0) { - if (barrels[i].software_timer > barrels[barrel_id].software_timer) { - return 0; // у этого барабана меньше время операции, так что приоритет ему 0 + if (barrels[i].software_timer < barrels[barrel_id].software_timer) { + return 0; // у этого барабана больше время ожидания (число меньше), значит приоритет 0 } else { return 1; // поскольку у нашего барабана максимальное время ожидания } } } - // барабан не найден, приоритет ему 1 - return 1; } - return 0; + // барабан не найден, приоритет ему 1 + return 1; } // task->priority = 0; @@ -276,8 +264,10 @@ short scheduler_find_task(struct scheduler_task* tasks, const short curr_pos) { // для начала надо найти максимальный приоритет у операций short max_priority = -1; for (short i = 0; i < BARRELS_COUNT; i++) { - if (tasks[i].priority > max_priority) { - max_priority = tasks[i].priority; + if (tasks[i].dest_zone >= 0) { + if (tasks[i].priority > max_priority) { + max_priority = tasks[i].priority; + } } } @@ -363,11 +353,11 @@ void debug_print_robot1_code() { break; case ROBOT_CMD_MOVE_OFF_code: - if (cmd_arg) { - printf(" move to offset pos\n"); - } else { - printf(" move to accurate pos\n"); - } + printf(" move to offset pos\n"); + break; + + case ROBOT_CMD_MOVE_ACCURATE_code: + printf(" move to accurate pos\n"); break; case ROBOT_CMD_UP_code: @@ -594,8 +584,6 @@ void schedule_robot_1() { } } - // TODO добавить вставку lock-point'ов на задачах на несколько роботов - // найти подходящую задачу if (_scheduler_one_robot_mode) { short target_task = scheduler_find_task(tasks, robot1.dx.current_zone);