Набор мелких исправлений и подготовка к реализации режима двух роботов
This commit is contained in:
parent
e114ea0cf4
commit
6195891e57
19
emulator.cpp
19
emulator.cpp
@ -166,14 +166,19 @@ static void showAll() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// рисуем роботов
|
// рисуем роботов
|
||||||
sprintf(tmp, "R1");
|
if (hla_robot1_en) {
|
||||||
// image_insert_sprite(2 + (robot1.mz.is_up ? 0 : 2), (robot1.curr_zone * 5) + 2, tmp);
|
sprintf(tmp, "R1");
|
||||||
image_insert_sprite(2 + (robot1.mz.is_up ? 0 : 2),
|
image_insert_sprite(2 + (robot1.mz.is_up ? 0 : 2),
|
||||||
(robot1.dx.current_zone * 5) + 2 + (robot1_offset_pos * 2),
|
(robot1.dx.current_zone * 5) + 2 + (robot1_offset_pos * 2),
|
||||||
tmp);
|
tmp);
|
||||||
|
}
|
||||||
|
|
||||||
// sprintf(tmp, "R2");
|
if (hla_robot2_en) {
|
||||||
// image_insert_sprite(3 + (robot2.mz.is_up ? 0 : 2), (robot2.curr_zone * 5) + 2, tmp);
|
sprintf(tmp, "R2");
|
||||||
|
image_insert_sprite(2 + (robot2.mz.is_up ? 0 : 2),
|
||||||
|
(robot2.dx.current_zone * 5) + 2 + (robot2_offset_pos * 2),
|
||||||
|
tmp);
|
||||||
|
}
|
||||||
|
|
||||||
for (const auto & r : buffer) {
|
for (const auto & r : buffer) {
|
||||||
write(sock_fd, r, COLS);
|
write(sock_fd, r, COLS);
|
||||||
|
20
emulator.h
20
emulator.h
@ -44,26 +44,6 @@ extern char button_unload_remove;
|
|||||||
|
|
||||||
// Переменные, которые надо добавить в C Global variables
|
// Переменные, которые надо добавить в C Global variables
|
||||||
|
|
||||||
// времена для барабанов, нужно копировать их только при создании барабанов
|
|
||||||
extern short hla_time_degreasing;
|
|
||||||
extern short hla_time_washing_1a;
|
|
||||||
extern short hla_time_washing_1b;
|
|
||||||
extern short hla_time_etching;
|
|
||||||
extern short hla_time_washing_2a;
|
|
||||||
extern short hla_time_washing_2b;
|
|
||||||
extern short hla_time_galvanizing;
|
|
||||||
extern short hla_time_washing_3a;
|
|
||||||
extern short hla_time_washing_3b;
|
|
||||||
extern short hla_time_passivation;
|
|
||||||
extern short hla_time_washing_4a;
|
|
||||||
extern short hla_time_washing_4b;
|
|
||||||
|
|
||||||
// времена скапывания, одинаковые для всех барабанов
|
|
||||||
extern short hla_time_digging;
|
|
||||||
extern short hla_time_reagent;
|
|
||||||
extern short hla_time_washing_1;
|
|
||||||
extern short hla_time_washing_2;
|
|
||||||
|
|
||||||
|
|
||||||
// lock-зоны, нельзя двигаться за них и за робота
|
// lock-зоны, нельзя двигаться за них и за робота
|
||||||
extern short robot1_lock_zone;
|
extern short robot1_lock_zone;
|
||||||
|
469
scheduler.c
469
scheduler.c
@ -64,8 +64,8 @@ short can_move(struct barrel* bar) {
|
|||||||
|
|
||||||
case ZONE_WASHING_1B:
|
case ZONE_WASHING_1B:
|
||||||
// промывка 1Б, нужно травление (зоны 5-6)
|
// промывка 1Б, нужно травление (зоны 5-6)
|
||||||
if (!zone_is_busy(ZONE_ETCHING_1 + etching_zone)) {
|
if (!zone_is_busy((short)(ZONE_ETCHING_1 + etching_zone))) {
|
||||||
return ZONE_ETCHING_1 + etching_zone;
|
return (short)(ZONE_ETCHING_1 + etching_zone);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -86,8 +86,8 @@ short can_move(struct barrel* bar) {
|
|||||||
|
|
||||||
case ZONE_WASHING_2B:
|
case ZONE_WASHING_2B:
|
||||||
// промывка 2Б, нужно цинкование (зоны 9-16)
|
// промывка 2Б, нужно цинкование (зоны 9-16)
|
||||||
if (!zone_is_busy(ZONE_GALVANIZING_1 + galvanizing_zone)) {
|
if (!zone_is_busy((short)(ZONE_GALVANIZING_1 + galvanizing_zone))) {
|
||||||
return ZONE_GALVANIZING_1 + galvanizing_zone;
|
return (short)(ZONE_GALVANIZING_1 + galvanizing_zone);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -103,7 +103,7 @@ short can_move(struct barrel* bar) {
|
|||||||
if (!zone_is_busy(ZONE_WASHING_3A)) {
|
if (!zone_is_busy(ZONE_WASHING_3A)) {
|
||||||
short count = 0;
|
short count = 0;
|
||||||
// если зона 17 свободна, то диапазон начнется с 3Б
|
// если зона 17 свободна, то диапазон начнется с 3Б
|
||||||
for (short i = ZONE_WASHING_3B; i <= ZONE_UNLOAD; i++) {
|
for (short i = ZONE_WASHING_3B; i <= (short)ZONE_UNLOAD; i++) {
|
||||||
if (zone_is_busy(i)) {
|
if (zone_is_busy(i)) {
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
@ -209,6 +209,11 @@ short get_operation_priority(short barrel_id) {
|
|||||||
// теперь то же самое, только для травления (только тут задача проще потому что травления всего 2 зоны, и надо только один барабан если он есть)
|
// теперь то же самое, только для травления (только тут задача проще потому что травления всего 2 зоны, и надо только один барабан если он есть)
|
||||||
if (barrels[barrel_id].zone >= ZONE_ETCHING_1 && barrels[barrel_id].zone <= ZONE_ETCHING_2) {
|
if (barrels[barrel_id].zone >= ZONE_ETCHING_1 && barrels[barrel_id].zone <= ZONE_ETCHING_2) {
|
||||||
|
|
||||||
|
// если в травлении барабан лежит больше 40 минут, ему присвоить высокий приоритет
|
||||||
|
if (barrels[barrel_id].software_timer < (-1 * 60 * 40)) {
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
for (short i = 0; i < BARRELS_COUNT; i++) {
|
for (short i = 0; i < BARRELS_COUNT; i++) {
|
||||||
if (i == barrel_id) {
|
if (i == barrel_id) {
|
||||||
continue;
|
continue;
|
||||||
@ -253,7 +258,7 @@ struct barrel makeBarrel(short flags, short zone, short timer) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
short scheduler_find_task(struct scheduler_task* tasks, const short curr_pos) {
|
short scheduler_find_task(const struct scheduler_task* tasks, const short curr_pos) {
|
||||||
// TODO добавить поддержку ночного режима и режима двух роботов
|
// TODO добавить поддержку ночного режима и режима двух роботов
|
||||||
// для начала надо найти максимальный приоритет у операций
|
// для начала надо найти максимальный приоритет у операций
|
||||||
short max_priority = -1;
|
short max_priority = -1;
|
||||||
@ -328,7 +333,7 @@ short scheduler_find_task(struct scheduler_task* tasks, const short curr_pos) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef EMULATOR
|
#ifdef EMULATOR
|
||||||
void debug_print_robot1_code(const struct robot_code* code, const short robot_id) {
|
void debug_print_robot_code(const struct robot_code* code, const short robot_id) {
|
||||||
// printf("INFO: code length is %d\n", cmd_index);
|
// printf("INFO: code length is %d\n", cmd_index);
|
||||||
printf("Code for R%d, B%d:\n", robot_id, code->barrel_id);
|
printf("Code for R%d, B%d:\n", robot_id, code->barrel_id);
|
||||||
for (int i = 0; i < 16; i++) {
|
for (int i = 0; i < 16; i++) {
|
||||||
@ -399,220 +404,12 @@ void debug_print_robot1_code(const struct robot_code* code, const short robot_id
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
void create_operation(const short target_task, const struct scheduler_task* tasks, struct robot_code* code, const short current_zone) {
|
|
||||||
// создаем код транзакции, пока обычный
|
|
||||||
code->barrel_id = target_task;
|
|
||||||
short cmd_index = 0;
|
|
||||||
|
|
||||||
// первым делом добавляем команду опустить траверсу
|
|
||||||
code->code[cmd_index++] = ROBOT_CMD_DOWN();
|
|
||||||
|
|
||||||
if (tasks[target_task].dest_zone == ZONE_PASSIVATION) {
|
|
||||||
// пассивация, тут все просто
|
|
||||||
if (current_zone != tasks[target_task].start_zone) {
|
|
||||||
code->code[cmd_index++] = ROBOT_CMD_MOVE_TO_ZONE(ZONE_WASHING_3B);
|
|
||||||
}
|
|
||||||
|
|
||||||
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();
|
|
||||||
|
|
||||||
code->code[cmd_index++] = ROBOT_CMD_TMR_SET(barrels[target_task].time_passivation);
|
|
||||||
|
|
||||||
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_MOVE_TO_ZONE_WITH_BARREL(ZONE_WASHING_4A);
|
|
||||||
code->code[cmd_index++] = ROBOT_CMD_DOWN_WITH_BARREL();
|
|
||||||
|
|
||||||
code->code[cmd_index++] = ROBOT_CMD_TMR_SET(barrels[target_task].time_washing_4a);
|
|
||||||
} else {
|
|
||||||
// любой другой случай
|
|
||||||
if (current_zone != tasks[target_task].start_zone) {
|
|
||||||
if (tasks[target_task].start_zone != 22) {
|
|
||||||
code->code[cmd_index++] = ROBOT_CMD_MOVE_TO_ZONE(tasks[target_task].start_zone);
|
|
||||||
} else {
|
|
||||||
code->code[cmd_index++] = ROBOT_CMD_MOVE_OFF();
|
|
||||||
code->code[cmd_index++] = ROBOT_CMD_UP();
|
|
||||||
code->code[cmd_index++] = ROBOT_CMD_MOVE_TO_ZONE(22);
|
|
||||||
code->code[cmd_index++] = ROBOT_CMD_MOVE_OFF();
|
|
||||||
code->code[cmd_index++] = ROBOT_CMD_DOWN();
|
|
||||||
code->code[cmd_index++] = ROBOT_CMD_MOVE_ACCURATE();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
code->code[cmd_index++] = ROBOT_CMD_UP_WITH_BARREL();
|
|
||||||
|
|
||||||
// теперь надо определиться с тем, сколько ждать скапывания
|
|
||||||
switch (tasks[target_task].start_zone) {
|
|
||||||
case ZONE_DEGREASING:
|
|
||||||
case ZONE_ETCHING_1:
|
|
||||||
case ZONE_ETCHING_2:
|
|
||||||
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:
|
|
||||||
// время скапывания реактивов
|
|
||||||
code->code[cmd_index++] = ROBOT_CMD_WAIT(hla_time_reagent);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ZONE_WASHING_1A:
|
|
||||||
case ZONE_WASHING_2A:
|
|
||||||
case ZONE_WASHING_3A:
|
|
||||||
case ZONE_WASHING_4A:
|
|
||||||
// время скапывания 1-го каскада промывок
|
|
||||||
code->code[cmd_index++] = ROBOT_CMD_WAIT(hla_time_washing_1);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ZONE_WASHING_1B:
|
|
||||||
case ZONE_WASHING_2B:
|
|
||||||
case ZONE_WASHING_3B:
|
|
||||||
case ZONE_WASHING_4B:
|
|
||||||
// время скапывания 2-го каскада промывок
|
|
||||||
code->code[cmd_index++] = ROBOT_CMD_WAIT(hla_time_washing_2);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
code->code[cmd_index++] = ROBOT_CMD_MOVE_TO_ZONE_WITH_BARREL(tasks[target_task].dest_zone);
|
|
||||||
|
|
||||||
// инкремент зоны (если травление или цинкование)
|
|
||||||
if (tasks[target_task].dest_zone == ZONE_ETCHING_1 || tasks[target_task].dest_zone == ZONE_ETCHING_2) {
|
|
||||||
code->code[cmd_index++] = ROBOT_CMD_INC_ZONE(ROBOT_ZONE_ETCH);
|
|
||||||
} else if (tasks[target_task].dest_zone >= ZONE_GALVANIZING_1 && tasks[target_task].dest_zone <= ZONE_GALVANIZING_8) {
|
|
||||||
code->code[cmd_index++] = ROBOT_CMD_INC_ZONE(ROBOT_ZONE_GAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
code->code[cmd_index++] = ROBOT_CMD_DOWN_WITH_BARREL();
|
|
||||||
|
|
||||||
if (tasks[target_task].dest_zone == 22) {
|
|
||||||
code->code[cmd_index++] = ROBOT_CMD_MOVE_TO_ZONE(21);
|
|
||||||
// NOTE старая механика не позволяет просто опустить траверсу до конца, для новой изменить поведение
|
|
||||||
code->code[cmd_index++] = ROBOT_CMD_UP();
|
|
||||||
code->code[cmd_index++] = ROBOT_CMD_DOWN();
|
|
||||||
} else {
|
|
||||||
|
|
||||||
if (tasks[target_task].dest_zone != 0) {
|
|
||||||
|
|
||||||
// установка времени ожидания барабана
|
|
||||||
short tmp = -1;
|
|
||||||
switch (tasks[target_task].dest_zone) {
|
|
||||||
case ZONE_DEGREASING:
|
|
||||||
tmp = barrels[target_task].time_degreasing;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ZONE_ETCHING_1:
|
|
||||||
case ZONE_ETCHING_2:
|
|
||||||
tmp = barrels[target_task].time_etching;
|
|
||||||
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:
|
|
||||||
tmp = barrels[target_task].time_galvanizing;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ZONE_WASHING_1A:
|
|
||||||
tmp = barrels[target_task].time_washing_1a;
|
|
||||||
break;
|
|
||||||
case ZONE_WASHING_2A:
|
|
||||||
tmp = barrels[target_task].time_washing_2a;
|
|
||||||
break;
|
|
||||||
case ZONE_WASHING_3A:
|
|
||||||
tmp = barrels[target_task].time_washing_3a;
|
|
||||||
break;
|
|
||||||
case ZONE_WASHING_4A:
|
|
||||||
tmp = barrels[target_task].time_washing_4a;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ZONE_WASHING_1B:
|
|
||||||
tmp = barrels[target_task].time_washing_1b;
|
|
||||||
break;
|
|
||||||
case ZONE_WASHING_2B:
|
|
||||||
tmp = barrels[target_task].time_washing_2b;
|
|
||||||
break;
|
|
||||||
case ZONE_WASHING_3B:
|
|
||||||
tmp = barrels[target_task].time_washing_3b;
|
|
||||||
break;
|
|
||||||
case ZONE_WASHING_4B:
|
|
||||||
tmp = barrels[target_task].time_washing_4b;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tmp > 0) {
|
|
||||||
if (tmp > 8000) {
|
|
||||||
tmp = 8000;
|
|
||||||
}
|
|
||||||
code->code[cmd_index++] = ROBOT_CMD_TMR_SET(tmp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
code->code[cmd_index++] = ROBOT_CMD_END();
|
|
||||||
code->PC = 0;
|
|
||||||
|
|
||||||
#ifdef EMULATOR
|
|
||||||
printf("INFO: code length is %d\n", cmd_index);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void schedule_robot_1() {
|
|
||||||
// формируем список задач
|
|
||||||
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);
|
|
||||||
if (tasks[i].dest_zone >= 0) {
|
|
||||||
tasks[i].priority = get_operation_priority(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// найти подходящую задачу
|
|
||||||
if (_scheduler_one_robot_mode) {
|
|
||||||
short target_task = scheduler_find_task(tasks, robot1.dx.current_zone);
|
|
||||||
|
|
||||||
if (target_task >= 0) {
|
|
||||||
create_operation(target_task, tasks, &robot1_code, robot1.dx.current_zone);
|
|
||||||
|
|
||||||
#ifdef EMULATOR
|
|
||||||
debug_print_robot1_code(&robot1_code, 1);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
#ifdef EMULATOR
|
|
||||||
printf("WARMING: support only one robot mode\n");
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
char scheduler_remove_barrel_from_zone(short zone) {
|
|
||||||
for (short i = 0; i < 10; i++) {
|
|
||||||
if (barrels[i].flags.is_exist && barrels[i].flags.robot == 0 && barrels[i].zone == zone) {
|
|
||||||
barrels[i].flags.is_exist = 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
=== ЦИКЛОГРАММА ПЕРЕТАСКИВАНИЯ БАРАБАНА ===
|
=== ЦИКЛОГРАММА ПЕРЕТАСКИВАНИЯ БАРАБАНА ===
|
||||||
// NOTE первой командой на любую транзакцию должна стоять команда опустить траверсу (в 22 зоне мы никогда не закончим, за нее не беспокоится)
|
// NOTE первой командой на любую транзакцию должна стоять команда опустить траверсу (в 22 зоне мы никогда не закончим, за нее не беспокоится)
|
||||||
* опустить траверсу
|
* опустить траверсу
|
||||||
если зона изъятия != промывка 3б
|
если зона изъятия != промывка 3б
|
||||||
если текущая зона != зона иъятия
|
если текущая зона != зона изъятия
|
||||||
если зона изъятия == 22
|
если зона изъятия == 22
|
||||||
* встать на смещенную
|
* встать на смещенную
|
||||||
* поднять траверсу
|
* поднять траверсу
|
||||||
@ -648,6 +445,213 @@ char scheduler_remove_barrel_from_zone(short zone) {
|
|||||||
* опустить траверсу с барабаном
|
* опустить траверсу с барабаном
|
||||||
* установить время ожидания барабана (для промывки 4а)
|
* установить время ожидания барабана (для промывки 4а)
|
||||||
*/
|
*/
|
||||||
|
void create_operation(struct robot_code *code, const short barrel_id, const short start_zone, const short dest_zone,
|
||||||
|
const short current_zone, const short robot_id) {
|
||||||
|
// создаем код транзакции, пока обычный
|
||||||
|
code->barrel_id = barrel_id;
|
||||||
|
short cmd_index = 0;
|
||||||
|
|
||||||
|
// первым делом добавляем команду опустить траверсу
|
||||||
|
code->code[cmd_index++] = ROBOT_CMD_DOWN();
|
||||||
|
|
||||||
|
if (dest_zone == ZONE_PASSIVATION) {
|
||||||
|
// пассивация, тут все просто
|
||||||
|
if (current_zone != start_zone) {
|
||||||
|
code->code[cmd_index++] = ROBOT_CMD_MOVE_TO_ZONE(ZONE_WASHING_3B);
|
||||||
|
}
|
||||||
|
|
||||||
|
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();
|
||||||
|
|
||||||
|
code->code[cmd_index++] = ROBOT_CMD_TMR_SET(barrels[barrel_id].time_passivation);
|
||||||
|
|
||||||
|
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_MOVE_TO_ZONE_WITH_BARREL(ZONE_WASHING_4A);
|
||||||
|
code->code[cmd_index++] = ROBOT_CMD_DOWN_WITH_BARREL();
|
||||||
|
|
||||||
|
code->code[cmd_index++] = ROBOT_CMD_TMR_SET(barrels[barrel_id].time_washing_4a);
|
||||||
|
} else {
|
||||||
|
// любой другой случай
|
||||||
|
if (current_zone != start_zone) {
|
||||||
|
if (start_zone != 22) {
|
||||||
|
code->code[cmd_index++] = ROBOT_CMD_MOVE_TO_ZONE(start_zone);
|
||||||
|
} else {
|
||||||
|
code->code[cmd_index++] = ROBOT_CMD_MOVE_OFF();
|
||||||
|
code->code[cmd_index++] = ROBOT_CMD_UP();
|
||||||
|
code->code[cmd_index++] = ROBOT_CMD_MOVE_TO_ZONE(22);
|
||||||
|
code->code[cmd_index++] = ROBOT_CMD_MOVE_OFF();
|
||||||
|
code->code[cmd_index++] = ROBOT_CMD_DOWN();
|
||||||
|
code->code[cmd_index++] = ROBOT_CMD_MOVE_ACCURATE();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
code->code[cmd_index++] = ROBOT_CMD_UP_WITH_BARREL();
|
||||||
|
|
||||||
|
// теперь надо определиться с тем, сколько ждать скапывания
|
||||||
|
switch (start_zone) {
|
||||||
|
case ZONE_DEGREASING:
|
||||||
|
case ZONE_ETCHING_1:
|
||||||
|
case ZONE_ETCHING_2:
|
||||||
|
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:
|
||||||
|
// время скапывания реактивов
|
||||||
|
code->code[cmd_index++] = ROBOT_CMD_WAIT(hla_time_reagent);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ZONE_WASHING_1A:
|
||||||
|
case ZONE_WASHING_2A:
|
||||||
|
case ZONE_WASHING_3A:
|
||||||
|
case ZONE_WASHING_4A:
|
||||||
|
// время скапывания 1-го каскада промывок
|
||||||
|
code->code[cmd_index++] = ROBOT_CMD_WAIT(hla_time_washing_1);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ZONE_WASHING_1B:
|
||||||
|
case ZONE_WASHING_2B:
|
||||||
|
case ZONE_WASHING_3B:
|
||||||
|
case ZONE_WASHING_4B:
|
||||||
|
// время скапывания 2-го каскада промывок
|
||||||
|
code->code[cmd_index++] = ROBOT_CMD_WAIT(hla_time_washing_2);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
code->code[cmd_index++] = ROBOT_CMD_MOVE_TO_ZONE_WITH_BARREL(dest_zone);
|
||||||
|
|
||||||
|
// инкремент зоны (если травление или цинкование)
|
||||||
|
if (dest_zone == ZONE_ETCHING_1 || dest_zone == ZONE_ETCHING_2) {
|
||||||
|
code->code[cmd_index++] = ROBOT_CMD_INC_ZONE(ROBOT_ZONE_ETCH);
|
||||||
|
} else if (dest_zone >= ZONE_GALVANIZING_1 && dest_zone <= ZONE_GALVANIZING_8) {
|
||||||
|
code->code[cmd_index++] = ROBOT_CMD_INC_ZONE(ROBOT_ZONE_GAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
code->code[cmd_index++] = ROBOT_CMD_DOWN_WITH_BARREL();
|
||||||
|
|
||||||
|
if (dest_zone == 22) {
|
||||||
|
code->code[cmd_index++] = ROBOT_CMD_MOVE_TO_ZONE(21);
|
||||||
|
// NOTE старая механика не позволяет просто опустить траверсу до конца, для новой изменить поведение
|
||||||
|
code->code[cmd_index++] = ROBOT_CMD_UP();
|
||||||
|
code->code[cmd_index++] = ROBOT_CMD_DOWN();
|
||||||
|
} else {
|
||||||
|
|
||||||
|
if (dest_zone != 0) {
|
||||||
|
|
||||||
|
// установка времени ожидания барабана
|
||||||
|
short tmp = -1;
|
||||||
|
switch (dest_zone) {
|
||||||
|
case ZONE_DEGREASING:
|
||||||
|
tmp = barrels[barrel_id].time_degreasing;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ZONE_ETCHING_1:
|
||||||
|
case ZONE_ETCHING_2:
|
||||||
|
tmp = barrels[barrel_id].time_etching;
|
||||||
|
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:
|
||||||
|
tmp = barrels[barrel_id].time_galvanizing;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ZONE_WASHING_1A:
|
||||||
|
tmp = barrels[barrel_id].time_washing_1a;
|
||||||
|
break;
|
||||||
|
case ZONE_WASHING_2A:
|
||||||
|
tmp = barrels[barrel_id].time_washing_2a;
|
||||||
|
break;
|
||||||
|
case ZONE_WASHING_3A:
|
||||||
|
tmp = barrels[barrel_id].time_washing_3a;
|
||||||
|
break;
|
||||||
|
case ZONE_WASHING_4A:
|
||||||
|
tmp = barrels[barrel_id].time_washing_4a;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ZONE_WASHING_1B:
|
||||||
|
tmp = barrels[barrel_id].time_washing_1b;
|
||||||
|
break;
|
||||||
|
case ZONE_WASHING_2B:
|
||||||
|
tmp = barrels[barrel_id].time_washing_2b;
|
||||||
|
break;
|
||||||
|
case ZONE_WASHING_3B:
|
||||||
|
tmp = barrels[barrel_id].time_washing_3b;
|
||||||
|
break;
|
||||||
|
case ZONE_WASHING_4B:
|
||||||
|
tmp = barrels[barrel_id].time_washing_4b;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tmp > 0) {
|
||||||
|
if (tmp > 8000) {
|
||||||
|
tmp = 8000;
|
||||||
|
}
|
||||||
|
code->code[cmd_index++] = ROBOT_CMD_TMR_SET(tmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!_scheduler_one_robot_mode) {
|
||||||
|
if (robot_id == 1) {
|
||||||
|
if (dest_zone >= ZONE_GALVANIZING_1) {
|
||||||
|
// из промывки 2б он перекладывал, пусть едет в промывку 2а
|
||||||
|
code->code[cmd_index++] = ROBOT_CMD_MOVE_TO_ZONE(ZONE_WASHING_2A);
|
||||||
|
} else if (dest_zone < ZONE_DEGREASING) {
|
||||||
|
code->code[cmd_index++] = ROBOT_CMD_MOVE_TO_ZONE(ZONE_DEGREASING);
|
||||||
|
}
|
||||||
|
} else if (robot_id == 2) {
|
||||||
|
if (dest_zone <= ZONE_WASHING_3A) {
|
||||||
|
// чтобы из этой зоны можно было переложить барабан первому роботу
|
||||||
|
code->code[cmd_index++] = ROBOT_CMD_MOVE_TO_ZONE(ZONE_WASHING_4A);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
code->code[cmd_index++] = ROBOT_CMD_END();
|
||||||
|
code->PC = 0;
|
||||||
|
|
||||||
|
#ifdef EMULATOR
|
||||||
|
printf("INFO: code length is %d\n", cmd_index);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void schedule_one_robot(const struct scheduler_task* tasks, const struct robot_regs* r, struct robot_code* code, const short robot_id) {
|
||||||
|
// формируем список задач
|
||||||
|
short target_task = scheduler_find_task(tasks, r->dx.current_zone);
|
||||||
|
|
||||||
|
if (target_task >= 0) {
|
||||||
|
create_operation(code, target_task, tasks[target_task].start_zone, tasks[target_task].dest_zone,
|
||||||
|
r->dx.current_zone, robot_id);
|
||||||
|
|
||||||
|
#ifdef EMULATOR
|
||||||
|
debug_print_robot_code(code, robot_id);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
char scheduler_remove_barrel_from_zone(short zone) {
|
||||||
|
for (short i = 0; i < 10; i++) {
|
||||||
|
if (barrels[i].flags.is_exist && barrels[i].flags.robot == 0 && barrels[i].zone == zone) {
|
||||||
|
barrels[i].flags.is_exist = 0;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef EMULATOR
|
#ifdef EMULATOR
|
||||||
void scheduler_main()
|
void scheduler_main()
|
||||||
@ -655,7 +659,7 @@ void scheduler_main()
|
|||||||
{
|
{
|
||||||
_scheduler_one_robot_mode = (char)(hla_robot1_en ^ hla_robot2_en);
|
_scheduler_one_robot_mode = (char)(hla_robot1_en ^ hla_robot2_en);
|
||||||
|
|
||||||
if (_scheduler_en) {
|
if (_scheduler_en && (hla_robot1_en || hla_robot2_en)) {
|
||||||
// тут возможна только вставка барабанов
|
// тут возможна только вставка барабанов
|
||||||
if (button_load) {
|
if (button_load) {
|
||||||
if (!zone_is_busy(1)) {
|
if (!zone_is_busy(1)) {
|
||||||
@ -669,26 +673,49 @@ void scheduler_main()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// кнопка выгрузки
|
||||||
if (button_unload_end) {
|
if (button_unload_end) {
|
||||||
button_unload_end = (char)(scheduler_remove_barrel_from_zone(0) != 0);
|
button_unload_end = (char)(scheduler_remove_barrel_from_zone(0) != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// кнопка удаления барабана из 22 зоны
|
||||||
if (button_unload_remove) {
|
if (button_unload_remove) {
|
||||||
button_unload_remove = (char)(scheduler_remove_barrel_from_zone(22) != 0);
|
button_unload_remove = (char)(scheduler_remove_barrel_from_zone(22) != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// таймер, применяется ко всем существующим барабанам
|
||||||
if (_scheduler_software_timer) {
|
if (_scheduler_software_timer) {
|
||||||
_scheduler_software_timer = 0;
|
_scheduler_software_timer = 0;
|
||||||
for (int i = 0; i < 10; i++) {
|
for (int i = 0; i < 10; i++) {
|
||||||
if (barrels[i].software_timer > -9999) {
|
if (barrels[i].flags.is_exist && barrels[i].software_timer > -9999) {
|
||||||
barrels[i].software_timer--;
|
barrels[i].software_timer--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (robot1_code.PC < 0) {
|
// выбор режима исполнения
|
||||||
schedule_robot_1();
|
if (robot1_code.PC < 0 || robot2_code.PC < 0) {
|
||||||
|
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);
|
||||||
|
if (tasks[i].dest_zone >= 0) {
|
||||||
|
tasks[i].priority = get_operation_priority(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_scheduler_one_robot_mode) {
|
||||||
|
// режим одного робота
|
||||||
|
if (hla_robot1_en && robot1_code.PC < 0) {
|
||||||
|
schedule_one_robot(tasks, &robot1, &robot1_code, 1);
|
||||||
|
} else if (robot2_code.PC < 0) {
|
||||||
|
schedule_one_robot(tasks, &robot2, &robot2_code, 2);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
42
utils.h
42
utils.h
@ -161,12 +161,52 @@ extern struct robot_regs robot1;
|
|||||||
extern struct robot_regs robot2;
|
extern struct robot_regs robot2;
|
||||||
extern struct robot_code robot1_code;
|
extern struct robot_code robot1_code;
|
||||||
extern struct robot_code robot2_code;
|
extern struct robot_code robot2_code;
|
||||||
|
|
||||||
|
// времена для барабанов, нужно копировать их только при создании барабанов
|
||||||
|
extern short hla_time_degreasing;
|
||||||
|
extern short hla_time_washing_1a;
|
||||||
|
extern short hla_time_washing_1b;
|
||||||
|
extern short hla_time_etching;
|
||||||
|
extern short hla_time_washing_2a;
|
||||||
|
extern short hla_time_washing_2b;
|
||||||
|
extern short hla_time_galvanizing;
|
||||||
|
extern short hla_time_washing_3a;
|
||||||
|
extern short hla_time_washing_3b;
|
||||||
|
extern short hla_time_passivation;
|
||||||
|
extern short hla_time_washing_4a;
|
||||||
|
extern short hla_time_washing_4b;
|
||||||
|
|
||||||
|
// времена скапывания, одинаковые для всех барабанов
|
||||||
|
extern short hla_time_digging;
|
||||||
|
extern short hla_time_reagent;
|
||||||
|
extern short hla_time_washing_1;
|
||||||
|
extern short hla_time_washing_2;
|
||||||
#else
|
#else
|
||||||
#define barrels ((struct barrel*)&barrels_array)
|
#define barrels ((struct barrel*)barrels_array)
|
||||||
#define robot1 (*((struct robot_regs*)&robot1_reg_mx))
|
#define robot1 (*((struct robot_regs*)&robot1_reg_mx))
|
||||||
#define robot2 (*((struct robot_regs*)&robot2_reg_mx))
|
#define robot2 (*((struct robot_regs*)&robot2_reg_mx))
|
||||||
#define robot1_code (*((struct robot_code*)_robot1_code_struct))
|
#define robot1_code (*((struct robot_code*)_robot1_code_struct))
|
||||||
#define robot2_code (*((struct robot_code*)_robot2_code_struct))
|
#define robot2_code (*((struct robot_code*)_robot2_code_struct))
|
||||||
|
|
||||||
|
// времена для барабанов, нужно копировать их только при создании барабанов
|
||||||
|
#define hla_time_degreasing _c_hla_time_degreasing
|
||||||
|
#define hla_time_washing_1a _c_hla_time_washing_1a
|
||||||
|
#define hla_time_washing_1b _c_hla_time_washing_1b
|
||||||
|
#define hla_time_etching _c_hla_time_etching
|
||||||
|
#define hla_time_washing_2a _c_hla_time_washing_2a
|
||||||
|
#define hla_time_washing_2b _c_hla_time_washing_2b
|
||||||
|
#define hla_time_galvanizing _c_hla_time_galvanizing
|
||||||
|
#define hla_time_washing_3a _c_hla_time_washing_3a
|
||||||
|
#define hla_time_washing_3b _c_hla_time_washing_3b
|
||||||
|
#define hla_time_passivation _c_hla_time_passivation
|
||||||
|
#define hla_time_washing_4a _c_hla_time_washing_4a
|
||||||
|
#define hla_time_washing_4b _c_hla_time_washing_4b
|
||||||
|
|
||||||
|
// времена скапывания, одинаковые для всех барабанов
|
||||||
|
#define hla_time_digging _c_hla_time_digging
|
||||||
|
#define hla_time_reagent _c_hla_time_reagent
|
||||||
|
#define hla_time_washing_1 _c_hla_time_washing_1
|
||||||
|
#define hla_time_washing_2 _c_hla_time_washing_2
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user