diff --git a/scheduler.c b/scheduler.c index c46afd9..8a802a0 100644 --- a/scheduler.c +++ b/scheduler.c @@ -22,7 +22,7 @@ static short get_robot_barrel(char robot_id) { return -1; } -// TODO обновить метод +// TODO обновить метод для работы с двумя роботами // вернет можно ли ехать и главное куда ехать, если можно (нельзя если вернулось значение < 0) // -1 вернет что перемещать нельзя // -2 вернет если требуется атомарная операция пассивации @@ -347,6 +347,9 @@ void schedule_robot_1() { 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); + } } // TODO добавить вставку lock-point'ов на задачах на несколько роботов @@ -362,9 +365,31 @@ void schedule_robot_1() { // первым делом добавляем команду опустить траверсу robot1_code.code[cmd_index++] = ROBOT_CMD_DOWN; - if (tasks[target_task].start_zone != ZONE_WASHING_3B) { + if (tasks[target_task].dest_zone == ZONE_PASSIVATION) { + // пассивация, тут все просто if (robot1.dx.current_zone != tasks[target_task].start_zone) { - if (tasks[target_task].start_zone == 22) { + robot1_code.code[cmd_index++] = ROBOT_CMD_MOVE_TO_ZONE | ZONE_WASHING_3B; + } + + robot1_code.code[cmd_index++] = ROBOT_CMD_UP_WITH_BARREL; + robot1_code.code[cmd_index++] = ROBOT_CMD_MOVE_TO_ZONE_WITH_BARREL | ZONE_PASSIVATION; + robot1_code.code[cmd_index++] = ROBOT_CMD_DOWN_WITH_BARREL; + + robot1_code.code[cmd_index++] = ROBOT_CMD_TMR_SET; + robot1_code.code[cmd_index++] = barrels[target_task].time_passivation; + + robot1_code.code[cmd_index++] = ROBOT_CMD_UP_WITH_BARREL; + robot1_code.code[cmd_index++] = ROBOT_CMD_MOVE_TO_ZONE_WITH_BARREL | ZONE_WASHING_4A; + robot1_code.code[cmd_index++] = ROBOT_CMD_DOWN_WITH_BARREL; + + robot1_code.code[cmd_index++] = ROBOT_CMD_TMR_SET; + robot1_code.code[cmd_index++] = barrels[target_task].time_washing_4a; + } else { + // любой другой случай + if (robot1.dx.current_zone != tasks[target_task].start_zone) { + if (tasks[target_task].start_zone != 22) { + robot1_code.code[cmd_index++] = ROBOT_CMD_MOVE_TO_ZONE | tasks[target_task].start_zone; + } else { robot1_code.code[cmd_index++] = ROBOT_CMD_MOVE_OFF; robot1_code.code[cmd_index++] = ROBOT_CMD_UP; if (robot1.dx.current_zone != 21) { @@ -373,13 +398,11 @@ void schedule_robot_1() { } robot1_code.code[cmd_index++] = ROBOT_CMD_DOWN_2; robot1_code.code[cmd_index++] = ROBOT_CMD_MOVE_TO_ZONE | 22; - } else { - robot1_code.code[cmd_index++] = ROBOT_CMD_MOVE_TO_ZONE | tasks[target_task].start_zone; } } - + robot1_code.code[cmd_index++] = ROBOT_CMD_UP_WITH_BARREL; - + // теперь надо определиться с тем, сколько ждать скапывания switch (tasks[target_task].start_zone) { case ZONE_DEGREASING: @@ -430,11 +453,13 @@ void schedule_robot_1() { short tmp = -1; switch (tasks[target_task].dest_zone) { case ZONE_DEGREASING: - tmp = barrels[target_task].time_degreasing; break; + tmp = barrels[target_task].time_degreasing; + break; case ZONE_ETCHING_1: case ZONE_ETCHING_2: - tmp = barrels[target_task].time_etching; break; + tmp = barrels[target_task].time_etching; + break; case ZONE_GALVANIZING_1: case ZONE_GALVANIZING_2: @@ -444,25 +469,34 @@ void schedule_robot_1() { case ZONE_GALVANIZING_6: case ZONE_GALVANIZING_7: case ZONE_GALVANIZING_8: - tmp = barrels[target_task].time_galvanizing; break; + tmp = barrels[target_task].time_galvanizing; + break; case ZONE_WASHING_1A: - tmp = barrels[target_task].time_washing_1a; break; + tmp = barrels[target_task].time_washing_1a; + break; case ZONE_WASHING_2A: - tmp = barrels[target_task].time_washing_2a; break; + tmp = barrels[target_task].time_washing_2a; + break; case ZONE_WASHING_3A: - tmp = barrels[target_task].time_washing_3a; break; + tmp = barrels[target_task].time_washing_3a; + break; case ZONE_WASHING_4A: - tmp = barrels[target_task].time_washing_4a; break; + tmp = barrels[target_task].time_washing_4a; + break; case ZONE_WASHING_1B: - tmp = barrels[target_task].time_washing_1b; break; + tmp = barrels[target_task].time_washing_1b; + break; case ZONE_WASHING_2B: - tmp = barrels[target_task].time_washing_2b; break; + tmp = barrels[target_task].time_washing_2b; + break; case ZONE_WASHING_3B: - tmp = barrels[target_task].time_washing_3b; break; + tmp = barrels[target_task].time_washing_3b; + break; case ZONE_WASHING_4B: - tmp = barrels[target_task].time_washing_4b; break; + tmp = barrels[target_task].time_washing_4b; + break; } if (tmp != -1) { @@ -471,30 +505,11 @@ void schedule_robot_1() { } } } - } else { - // пассивация, тут все просто - if (robot1.dx.current_zone != tasks[target_task].start_zone) { - robot1_code.code[cmd_index++] = ROBOT_CMD_MOVE_TO_ZONE | ZONE_WASHING_3B; - } - - robot1_code.code[cmd_index++] = ROBOT_CMD_UP_WITH_BARREL; - robot1_code.code[cmd_index++] = ROBOT_CMD_MOVE_TO_ZONE_WITH_BARREL | ZONE_PASSIVATION; - robot1_code.code[cmd_index++] = ROBOT_CMD_DOWN_WITH_BARREL; - - robot1_code.code[cmd_index++] = ROBOT_CMD_TMR_SET; - robot1_code.code[cmd_index++] = barrels[target_task].time_passivation; - - robot1_code.code[cmd_index++] = ROBOT_CMD_UP_WITH_BARREL; - robot1_code.code[cmd_index++] = ROBOT_CMD_MOVE_TO_ZONE_WITH_BARREL | ZONE_WASHING_4A; - robot1_code.code[cmd_index++] = ROBOT_CMD_DOWN_WITH_BARREL; - - robot1_code.code[cmd_index++] = ROBOT_CMD_TMR_SET; - robot1_code.code[cmd_index++] = barrels[target_task].time_washing_4a; } robot1_code.code[cmd_index++] = ROBOT_CMD_END; robot1_code.PC = 0; - + printf("INFO: code length is %d\n", cmd_index); debug_print_robot1_code(); }