diff --git a/emulator.cpp b/emulator.cpp index 44646f0..54c1d7b 100644 --- a/emulator.cpp +++ b/emulator.cpp @@ -166,14 +166,19 @@ static void showAll() { } // рисуем роботов - sprintf(tmp, "R1"); -// image_insert_sprite(2 + (robot1.mz.is_up ? 0 : 2), (robot1.curr_zone * 5) + 2, tmp); - image_insert_sprite(2 + (robot1.mz.is_up ? 0 : 2), - (robot1.dx.current_zone * 5) + 2 + (robot1_offset_pos * 2), - tmp); + if (hla_robot1_en) { + sprintf(tmp, "R1"); + image_insert_sprite(2 + (robot1.mz.is_up ? 0 : 2), + (robot1.dx.current_zone * 5) + 2 + (robot1_offset_pos * 2), + tmp); + } -// sprintf(tmp, "R2"); -// image_insert_sprite(3 + (robot2.mz.is_up ? 0 : 2), (robot2.curr_zone * 5) + 2, tmp); + if (hla_robot2_en) { + 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) { write(sock_fd, r, COLS); diff --git a/emulator.h b/emulator.h index 8eaee39..ad72f8e 100644 --- a/emulator.h +++ b/emulator.h @@ -44,26 +44,6 @@ extern char button_unload_remove; // Переменные, которые надо добавить в 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-зоны, нельзя двигаться за них и за робота extern short robot1_lock_zone; diff --git a/scheduler.c b/scheduler.c index ed89cb3..bb46c97 100644 --- a/scheduler.c +++ b/scheduler.c @@ -64,8 +64,8 @@ short can_move(struct barrel* bar) { case ZONE_WASHING_1B: // промывка 1Б, нужно травление (зоны 5-6) - if (!zone_is_busy(ZONE_ETCHING_1 + etching_zone)) { - return ZONE_ETCHING_1 + etching_zone; + if (!zone_is_busy((short)(ZONE_ETCHING_1 + etching_zone))) { + return (short)(ZONE_ETCHING_1 + etching_zone); } break; @@ -86,8 +86,8 @@ short can_move(struct barrel* bar) { case ZONE_WASHING_2B: // промывка 2Б, нужно цинкование (зоны 9-16) - if (!zone_is_busy(ZONE_GALVANIZING_1 + galvanizing_zone)) { - return ZONE_GALVANIZING_1 + galvanizing_zone; + if (!zone_is_busy((short)(ZONE_GALVANIZING_1 + galvanizing_zone))) { + return (short)(ZONE_GALVANIZING_1 + galvanizing_zone); } break; @@ -103,7 +103,7 @@ short can_move(struct barrel* bar) { if (!zone_is_busy(ZONE_WASHING_3A)) { short count = 0; // если зона 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)) { count++; } @@ -209,6 +209,11 @@ short get_operation_priority(short barrel_id) { // теперь то же самое, только для травления (только тут задача проще потому что травления всего 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++) { if (i == barrel_id) { 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 добавить поддержку ночного режима и режима двух роботов // для начала надо найти максимальный приоритет у операций short max_priority = -1; @@ -328,7 +333,7 @@ short scheduler_find_task(struct scheduler_task* tasks, const short curr_pos) { } #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("Code for R%d, B%d:\n", robot_id, code->barrel_id); 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 -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 зоне мы никогда не закончим, за нее не беспокоится) * опустить траверсу если зона изъятия != промывка 3б - если текущая зона != зона иъятия + если текущая зона != зона изъятия если зона изъятия == 22 * встать на смещенную * поднять траверсу @@ -648,6 +445,213 @@ char scheduler_remove_barrel_from_zone(short zone) { * опустить траверсу с барабаном * установить время ожидания барабана (для промывки 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 void scheduler_main() @@ -655,7 +659,7 @@ void scheduler_main() { _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 (!zone_is_busy(1)) { @@ -669,26 +673,49 @@ void scheduler_main() } } + // кнопка выгрузки if (button_unload_end) { button_unload_end = (char)(scheduler_remove_barrel_from_zone(0) != 0); } + // кнопка удаления барабана из 22 зоны if (button_unload_remove) { button_unload_remove = (char)(scheduler_remove_barrel_from_zone(22) != 0); } - + // таймер, применяется ко всем существующим барабанам if (_scheduler_software_timer) { _scheduler_software_timer = 0; 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--; } } } - 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 { + + } } } } diff --git a/utils.h b/utils.h index 41630cd..507e165 100644 --- a/utils.h +++ b/utils.h @@ -161,12 +161,52 @@ extern struct robot_regs robot1; extern struct robot_regs robot2; extern struct robot_code robot1_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 -#define barrels ((struct barrel*)&barrels_array) +#define barrels ((struct barrel*)barrels_array) #define robot1 (*((struct robot_regs*)&robot1_reg_mx)) #define robot2 (*((struct robot_regs*)&robot2_reg_mx)) #define robot1_code (*((struct robot_code*)_robot1_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