Исправления работы алгоритма приоритетов, теперь он отлажен для зон травления и цинкования
This commit is contained in:
parent
f6d6840f96
commit
9624d91725
@ -192,6 +192,10 @@ int main() {
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
barrels[5] = makeBarrel(1, 21, 3);
|
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;
|
current_tic = 0;
|
||||||
const char* message = nullptr;
|
const char* message = nullptr;
|
||||||
|
54
scheduler.c
54
scheduler.c
@ -1,6 +1,5 @@
|
|||||||
#ifdef EMULATOR
|
#ifdef EMULATOR
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
|
||||||
#include "emulator.h"
|
#include "emulator.h"
|
||||||
short etching_zone = 0, galvanizing_zone = 0;
|
short etching_zone = 0, galvanizing_zone = 0;
|
||||||
#endif
|
#endif
|
||||||
@ -15,15 +14,6 @@ char zone_is_busy(short zone) {
|
|||||||
return 0;
|
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 обновить метод для работы с двумя роботами
|
// TODO обновить метод для работы с двумя роботами
|
||||||
// вернет можно ли ехать и главное куда ехать, если можно (нельзя если вернулось значение < 0)
|
// вернет можно ли ехать и главное куда ехать, если можно (нельзя если вернулось значение < 0)
|
||||||
// -1 вернет что перемещать нельзя
|
// -1 вернет что перемещать нельзя
|
||||||
@ -188,8 +178,7 @@ short get_operation_priority(short barrel_id) {
|
|||||||
// теперь надо выяснить, есть ли барабаны с большим временем ожидания
|
// теперь надо выяснить, есть ли барабаны с большим временем ожидания
|
||||||
// тут возможны несколько случаев:
|
// тут возможны несколько случаев:
|
||||||
// 1) когда барабан один такой (больше в цинковании нет барабанов чтобы их изъять),
|
// 1) когда барабан один такой (больше в цинковании нет барабанов чтобы их изъять),
|
||||||
// 2) когда барабанов несколько, соотвественно если есть барабан с наибольшим временем, то надо ему дать приоритет 1, а остальным 0,
|
// 2) когда барабанов несколько, соответственно если есть барабан с наибольшим временем, то надо ему дать приоритет 1, а остальным 0,
|
||||||
//
|
|
||||||
|
|
||||||
char is_not_one = 0;
|
char is_not_one = 0;
|
||||||
char is_with_max_time = 1;
|
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 (barrels[i].flags.is_exist && barrels[i].zone >= ZONE_GALVANIZING_1 && barrels[i].zone <= ZONE_GALVANIZING_8) {
|
||||||
if (can_move(barrels + i) >= 0) {
|
if (can_move(barrels + i) >= 0) {
|
||||||
is_not_one = 1;
|
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;
|
is_with_max_time = 0;
|
||||||
break;
|
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 (barrels[i].flags.is_exist && barrels[i].zone >= ZONE_ETCHING_1 && barrels[i].zone <= ZONE_ETCHING_2) {
|
||||||
if (can_move(barrels + i) >= 0) {
|
if (can_move(barrels + i) >= 0) {
|
||||||
if (barrels[i].software_timer > barrels[barrel_id].software_timer) {
|
if (barrels[i].software_timer < barrels[barrel_id].software_timer) {
|
||||||
return 0; // у этого барабана меньше время операции, так что приоритет ему 0
|
return 0; // у этого барабана больше время ожидания (число меньше), значит приоритет 0
|
||||||
} else {
|
} else {
|
||||||
return 1; // поскольку у нашего барабана максимальное время ожидания
|
return 1; // поскольку у нашего барабана максимальное время ожидания
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// барабан не найден, приоритет ему 1
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
return 0;
|
// барабан не найден, приоритет ему 1
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// task->priority = 0;
|
// task->priority = 0;
|
||||||
@ -276,8 +264,10 @@ short scheduler_find_task(struct scheduler_task* tasks, const short curr_pos) {
|
|||||||
// для начала надо найти максимальный приоритет у операций
|
// для начала надо найти максимальный приоритет у операций
|
||||||
short max_priority = -1;
|
short max_priority = -1;
|
||||||
for (short i = 0; i < BARRELS_COUNT; i++) {
|
for (short i = 0; i < BARRELS_COUNT; i++) {
|
||||||
if (tasks[i].priority > max_priority) {
|
if (tasks[i].dest_zone >= 0) {
|
||||||
max_priority = tasks[i].priority;
|
if (tasks[i].priority > max_priority) {
|
||||||
|
max_priority = tasks[i].priority;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -363,11 +353,11 @@ void debug_print_robot1_code() {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case ROBOT_CMD_MOVE_OFF_code:
|
case ROBOT_CMD_MOVE_OFF_code:
|
||||||
if (cmd_arg) {
|
printf(" move to offset pos\n");
|
||||||
printf(" move to offset pos\n");
|
break;
|
||||||
} else {
|
|
||||||
printf(" move to accurate pos\n");
|
case ROBOT_CMD_MOVE_ACCURATE_code:
|
||||||
}
|
printf(" move to accurate pos\n");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ROBOT_CMD_UP_code:
|
case ROBOT_CMD_UP_code:
|
||||||
@ -594,8 +584,6 @@ void schedule_robot_1() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO добавить вставку lock-point'ов на задачах на несколько роботов
|
|
||||||
|
|
||||||
// найти подходящую задачу
|
// найти подходящую задачу
|
||||||
if (_scheduler_one_robot_mode) {
|
if (_scheduler_one_robot_mode) {
|
||||||
short target_task = scheduler_find_task(tasks, robot1.dx.current_zone);
|
short target_task = scheduler_find_task(tasks, robot1.dx.current_zone);
|
||||||
|
Reference in New Issue
Block a user