This repository has been archived on 2024-09-18. You can view files and clone it, but cannot push or open issues or pull requests.
sdp-scheduler/robot.cpp

155 lines
4.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// Created by Владислав Остапов on 05.11.2022.
//
#include "robot.h"
#include <iostream>
bool robot1_offset_pos = false;
bool robot2_offset_pos = false;
// true означает что движение закончено
static bool robot_move(robot_regs& r, short target, char robot_id) {
// после перемещения мы явно в точной позиции
if (robot_id == 1) {
robot1_offset_pos = false;
} else {
robot2_offset_pos = false;
}
if (r.dx.current_zone == target) {
return true;
}
if (r.dx.current_zone < target) {
r.dx.current_zone++;
} else {
r.dx.current_zone--;
}
return false;
}
static void emulate_robot(robot_code &code, robot_regs& r, char robot_id) {
if (code.PC < 0) {
return;
}
// приватизируем бочку
if (code.barrel_id >= 0) {
barrels[code.barrel_id].flags.robot = robot_id;
}
const short cmd_arg = code.code[code.PC] & (~ROBOT_CMD_MASK);
switch (code.code[code.PC] & ROBOT_CMD_MASK) {
case ROBOT_CMD_MOVE_TO_ZONE:
// двигаемся в сторону цели
if (robot_move(r, cmd_arg & (~ROBOT_WITH_BARREL), robot_id)) {
code.PC++;
}
if (cmd_arg & ROBOT_WITH_BARREL && code.barrel_id >= 0) {
barrels[code.barrel_id].zone = r.dx.current_zone;
}
break;
case ROBOT_CMD_MOVE_OFF:
if (robot_id == 1) {
robot1_offset_pos = true;
} else {
robot2_offset_pos = true;
}
code.PC++;
break;
case ROBOT_CMD_UP:
if (code.barrel_id >= 0 && cmd_arg) {
// не давать ехать перед тем как истечет таймер
if (barrels[code.barrel_id].software_timer > 0) {
break;
}
barrels[code.barrel_id].flags.is_up = true;
r.mz.is_up = 1;
}
code.PC++;
break;
// в эмуляторе не важно где я, поэтому тут обе команды вниз обрабатываются одинаково
case ROBOT_CMD_DOWN:
case ROBOT_CMD_DOWN_2:
if (code.barrel_id >= 0 && cmd_arg) {
barrels[code.barrel_id].flags.is_up = false;
r.mz.is_up = 0;
}
code.PC++;
break;
case ROBOT_CMD_WAIT:
std::cout << "robot " << robot_id << " wait " << cmd_arg << " secs..." << std::endl;
code.PC++;
break;
case ROBOT_CMD_TMR_SET:
if (code.barrel_id >= 0) {
barrels[code.barrel_id].software_timer = code.code[code.PC + 1];
r.mz.is_up = 0;
}
code.PC += 2;
break;
case ROBOT_CMD_SET_LOCK_ZONE:
if (robot_id == 1) {
robot1_lock_zone = cmd_arg;
} else {
robot2_lock_zone = cmd_arg;
}
code.PC += 2;
break;
case ROBOT_CMD_CORRECT_AXIS:
if (cmd_arg == ROBOT_AXIS_X) {
std::cout << "robot " << robot_id << " correct axis X..." << std::endl;
r.dz.current_zone = 0;
r.mx.correct_status = true;
} else if (cmd_arg == ROBOT_AXIS_Z) {
std::cout << "robot " << robot_id << " correct axis Z..." << std::endl;
r.mz.is_up = true;
r.mz.correct_status = true;
} else {
std::cout << "ERROR: R" << robot_id << " AXIS CORRECT - INCORRECT ARGUMENT VALUE " << cmd_arg << std::endl;
}
code.PC++;
break;
case ROBOT_CMD_INC_ZONE:
// TODO сделать так, чтобы зоны переключались с учетом отключенных зон
if (cmd_arg == ROBOT_ZONE_ETCH) {
std::cout << "robot " << robot_id << " increment etching..." << std::endl;
etching_zone = (etching_zone + 1) & 1;
} else if (cmd_arg == ROBOT_ZONE_GAL) {
std::cout << "robot " << robot_id << " increment galvanic..." << std::endl;
galvanizing_zone = (galvanizing_zone + 1) & 0x07;
} else {
std::cout << "ERROR: R" << robot_id << " INCREMENT ZONE - INCORRECT ARGUMENT VALUE " << cmd_arg << std::endl;
}
code.PC++;
break;
case ROBOT_CMD_END:
default:
code.PC = -1;
// де-приватизируем бочку
if (code.barrel_id >= 0) {
barrels[code.barrel_id].flags.robot = 0;
}
}
}
void robot_main() {
emulate_robot(robot1_code, robot1, 1);
emulate_robot(robot2_code, robot2, 2);
}