Compare commits

...

2 Commits

3 changed files with 35 additions and 12 deletions

View File

@@ -10,6 +10,6 @@
## Известные баги
* ночных барабанов на линии не может быть больше 8, если барабанов больше то они останутся в цинковании, поэтому следует
* ночные барабаны в конце складываются в промывки через зону обмена, таким образом можно загрузить на линию все 10 ночных барабанов
* не работают регистры добавления/удаления барабанов с панели

View File

@@ -336,21 +336,29 @@ void scheduler_main()
// сначала выдаем команды первому роботу
if (robot1_code.PC < 0) {
schedule_one_robot(ROBOT_1);
if (robot1.dx.current_zone < ZONE_PASSIVATION) {
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;
} else {
schedule_one_robot(ROBOT_1);
}
}
// потом второму
if (robot2_code.PC < 0) {
if (robot2.dx.current_zone < ZONE_WASHING_1A) {
if (robot2.dx.current_zone < ZONE_WASHING_1A || robot2.dx.current_zone > ZONE_ETCHING_2) {
// то же самое что и во второй стадии, только без инкремента стадии
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;
}
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;
} else {
schedule_one_robot(ROBOT_2);
}

17
utils.c
View File

@@ -33,6 +33,17 @@ char zone_is_busy(short zone) {
short get_first_night_zone() {
short min_normal_barrel = -1;
for (short i = 0; i < BARRELS_COUNT; i++) {
// ищем все не ночные, не пустые, и которые внизу барабаны
if (barrels[i].flags.is_exist && !barrels[i].flags.is_empty && !barrels[i].flags.is_night && !barrels[i].flags.is_up) {
// нужен барабан, у которого нет
if (min_normal_barrel < 0 || barrels[i].zone < min_normal_barrel) {
min_normal_barrel = barrels[i].zone;
}
}
}
// всего зон, куда можно сныкать барабаны (всего 9 мест: загрузка 1 и 8 промывок)
for (short nz = 0; nz < 9; nz++) {
char found = 0;
@@ -46,7 +57,11 @@ short get_first_night_zone() {
}
if (found == 0) {
return NIGHT_ZONES[nz];
if (min_normal_barrel < 0 || NIGHT_ZONES[nz] < min_normal_barrel) {
return NIGHT_ZONES[nz];
} else {
break;
}
}
}