diff --git a/pom.xml b/pom.xml
index 2807bf2..20049da 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
com.pesterenan
MechPeste
- 0.7.0
+ 0.7.1
diff --git a/src/main/java/com/pesterenan/controllers/DockingController.java b/src/main/java/com/pesterenan/controllers/DockingController.java
index eaea4b7..93e3872 100644
--- a/src/main/java/com/pesterenan/controllers/DockingController.java
+++ b/src/main/java/com/pesterenan/controllers/DockingController.java
@@ -5,9 +5,11 @@
import java.util.Map;
+import com.pesterenan.resources.Bundle;
import com.pesterenan.utils.Modulos;
import com.pesterenan.utils.Utilities;
import com.pesterenan.utils.Vector;
+import com.pesterenan.views.DockingJPanel;
import com.pesterenan.views.StatusJPanel;
import krpc.client.RPCException;
@@ -27,7 +29,6 @@ public class DockingController extends Controller {
private ReferenceFrame orbitalRefVessel;
private ReferenceFrame vesselRefFrame;
- private ReferenceFrame orbitalRefBody;
private Line distanceLine;
private Line distLineXAxis;
private Line distLineYAxis;
@@ -37,8 +38,8 @@ public class DockingController extends Controller {
private Vector positionMyDockingPort;
private Vector positionTargetDockingPort;
- private final double DISTANCE_LIMIT = 25.0;
- private double SPEED_LIMIT = 3.0;
+ private double DOCKING_MAX_SPEED = 3.0;
+ private double SAFE_DISTANCE = 25.0;
private double currentXAxisSpeed = 0.0;
private double currentYAxisSpeed = 0.0;
private double currentZAxisSpeed = 0.0;
@@ -56,16 +57,17 @@ public DockingController(Map commands) {
private void initializeParameters() {
try {
- SPEED_LIMIT = Double.parseDouble(commands.get(Modulos.VELOCIDADE_MAX.get()));
+ DOCKING_MAX_SPEED = Double.parseDouble(commands.get(Modulos.VELOCIDADE_MAX.get()));
+ SAFE_DISTANCE = Double.parseDouble(commands.get(Modulos.DISTANCIA_SEGURA.get()));
drawing = Drawing.newInstance(getConnection());
targetVessel = getSpaceCenter().getTargetVessel();
control = getNaveAtual().getControl();
vesselRefFrame = getNaveAtual().getReferenceFrame();
orbitalRefVessel = getNaveAtual().getOrbitalReferenceFrame();
- orbitalRefBody = getNaveAtual().getOrbit().getBody().getReferenceFrame();
myDockingPort = getNaveAtual().getParts().getDockingPorts().get(0);
targetDockingPort = targetVessel.getParts().getDockingPorts().get(0);
+ dockingStep = DOCKING_STEPS.STOP_RELATIVE_SPEED;
positionMyDockingPort = new Vector(myDockingPort.position(orbitalRefVessel));
positionTargetDockingPort = new Vector(targetDockingPort.position(orbitalRefVessel));
@@ -103,12 +105,12 @@ private void getCloserToTarget(Vector targetPosition) throws InterruptedExceptio
lastYTargetPos = targetPosition.y;
lastZTargetPos = targetPosition.z;
- while (Math.abs(lastYTargetPos) >= DISTANCE_LIMIT) {
+ while (Math.abs(lastYTargetPos) >= SAFE_DISTANCE) {
if (Thread.interrupted()) {
throw new InterruptedException();
}
targetPosition = new Vector(targetVessel.position(vesselRefFrame));
- controlShipRCS(targetPosition, DISTANCE_LIMIT);
+ controlShipRCS(targetPosition, SAFE_DISTANCE);
Thread.sleep(sleepTime);
}
@@ -124,7 +126,7 @@ public void startDocking() {
// PRIMEIRA PARTE DO DOCKING: APROXIMAÇÃO
Vector targetPosition = new Vector(targetVessel.position(vesselRefFrame));
- if (targetPosition.magnitude() > DISTANCE_LIMIT) {
+ if (targetPosition.magnitude() > SAFE_DISTANCE) {
// Apontar para o alvo:
Vector targetDirection = new Vector(getNaveAtual().position(orbitalRefVessel))
.subtract(new Vector(targetVessel.position(orbitalRefVessel))).multiply(-1);
@@ -159,7 +161,7 @@ public void startDocking() {
Thread.sleep(sleepTime);
}
} catch (RPCException | InterruptedException | IllegalArgumentException e) {
- StatusJPanel.setStatusMessage("Docking aborted.");
+ StatusJPanel.setStatusMessage("Docking interrupted.");
}
}
@@ -176,22 +178,7 @@ public void startDocking() {
*/
private enum DOCKING_STEPS {
- APPROACH, LINE_UP_WITH_TARGET, GO_IN_FRONT_OF_TARGET
- }
-
- private DOCKING_STEPS checkDockingStep(Vector targetPosition, double forwardsDistanceLimit) {
- double sidewaysDistance = Math.abs(targetPosition.x);
- double upwardsDistance = Math.abs(targetPosition.z);
- boolean isInFrontOfTarget = Math.signum(targetPosition.y) == 1;
- boolean isOnTheBackOfTarget = Math.signum(targetPosition.y) == -1 && targetPosition.y < forwardsDistanceLimit;
-
- if (isOnTheBackOfTarget) {
- return DOCKING_STEPS.GO_IN_FRONT_OF_TARGET;
- }
- if (isInFrontOfTarget && (sidewaysDistance > 5 || upwardsDistance > 5)) {
- return DOCKING_STEPS.LINE_UP_WITH_TARGET;
- }
- return DOCKING_STEPS.APPROACH;
+ APPROACH, STOP_RELATIVE_SPEED, LINE_UP_WITH_TARGET, GO_IN_FRONT_OF_TARGET
}
private void controlShipRCS(Vector targetPosition, double forwardsDistanceLimit) {
@@ -205,36 +192,61 @@ private void controlShipRCS(Vector targetPosition, double forwardsDistanceLimit)
currentYAxisSpeed = (targetPosition.y - lastYTargetPos) * sleepTime;
currentZAxisSpeed = (targetPosition.z - lastZTargetPos) * sleepTime;
- dockingStep = checkDockingStep(targetPosition, forwardsDistanceLimit);
+ double sidewaysDistance = Math.abs(targetPosition.x);
+ double upwardsDistance = Math.abs(targetPosition.z);
+ boolean isInFrontOfTarget = Math.signum(targetPosition.y) == 1;
+ boolean isOnTheBackOfTarget = Math.signum(targetPosition.y) == -1 && targetPosition.y < forwardsDistanceLimit;
float forwardsError, upwardsError, sidewaysError = 0;
+
switch (dockingStep) {
case APPROACH:
// Calcular a aceleração para cada eixo no RCS:
forwardsError = calculateThrottle(forwardsDistanceLimit, forwardsDistanceLimit * 3, currentYAxisSpeed,
- targetPosition.y, SPEED_LIMIT);
- sidewaysError = calculateThrottle(0, 5, currentXAxisSpeed, targetPosition.x, SPEED_LIMIT);
- upwardsError = calculateThrottle(0, 5, currentZAxisSpeed, targetPosition.z, SPEED_LIMIT);
+ targetPosition.y, DOCKING_MAX_SPEED);
+ sidewaysError = calculateThrottle(0, 5, currentXAxisSpeed, targetPosition.x, DOCKING_MAX_SPEED);
+ upwardsError = calculateThrottle(0, 5, currentZAxisSpeed, targetPosition.z, DOCKING_MAX_SPEED);
control.setForward(forwardsError);
control.setRight(sidewaysError);
control.setUp(-upwardsError);
+ DockingJPanel.setDockingStep(Bundle.getString("pnl_docking_step_approach"));
break;
case LINE_UP_WITH_TARGET:
forwardsError = calculateThrottle(forwardsDistanceLimit, forwardsDistanceLimit * 3, currentYAxisSpeed,
targetPosition.y, 0);
- sidewaysError = calculateThrottle(0, 10, currentXAxisSpeed, targetPosition.x, SPEED_LIMIT);
- upwardsError = calculateThrottle(0, 10, currentZAxisSpeed, targetPosition.z, SPEED_LIMIT);
+ sidewaysError = calculateThrottle(0, 10, currentXAxisSpeed, targetPosition.x, DOCKING_MAX_SPEED);
+ upwardsError = calculateThrottle(0, 10, currentZAxisSpeed, targetPosition.z, DOCKING_MAX_SPEED);
control.setForward(forwardsError);
control.setRight(sidewaysError);
control.setUp(-upwardsError);
+ DockingJPanel.setDockingStep(Bundle.getString("pnl_docking_step_line_up_with_target"));
break;
case GO_IN_FRONT_OF_TARGET:
forwardsError = calculateThrottle(-20, -10, currentYAxisSpeed,
- targetPosition.y, SPEED_LIMIT);
+ targetPosition.y, DOCKING_MAX_SPEED);
+ sidewaysError = calculateThrottle(0, 5, currentXAxisSpeed, targetPosition.x, 0);
+ upwardsError = calculateThrottle(0, 5, currentZAxisSpeed, targetPosition.z, 0);
+ control.setForward(forwardsError);
+ control.setRight(sidewaysError);
+ control.setUp(-upwardsError);
+ if (isInFrontOfTarget) {
+ dockingStep = DOCKING_STEPS.STOP_RELATIVE_SPEED;
+ break;
+ }
+ DockingJPanel.setDockingStep(Bundle.getString("pnl_docking_step_go_in_front_of_target"));
+ break;
+ case STOP_RELATIVE_SPEED:
+ forwardsError = calculateThrottle(0, 5, currentYAxisSpeed, targetPosition.y, 0);
sidewaysError = calculateThrottle(0, 5, currentXAxisSpeed, targetPosition.x, 0);
upwardsError = calculateThrottle(0, 5, currentZAxisSpeed, targetPosition.z, 0);
control.setForward(forwardsError);
control.setRight(sidewaysError);
control.setUp(-upwardsError);
+ if ((Math.abs(currentXAxisSpeed) < 1) && (Math.abs(currentYAxisSpeed) < 1)
+ && (Math.abs(currentZAxisSpeed) < 1)) {
+ dockingStep = DOCKING_STEPS.APPROACH;
+ break;
+ }
+ DockingJPanel.setDockingStep(Bundle.getString("pnl_docking_step_stop_relative_speed"));
break;
}
System.out.println(dockingStep);
diff --git a/src/main/java/com/pesterenan/utils/Modulos.java b/src/main/java/com/pesterenan/utils/Modulos.java
index f31f409..d583171 100644
--- a/src/main/java/com/pesterenan/utils/Modulos.java
+++ b/src/main/java/com/pesterenan/utils/Modulos.java
@@ -10,21 +10,22 @@ public enum Modulos {
CIRCULAR("Circular"),
CUBICA("Cúbica"),
DIRECAO("Direção"),
+ DISTANCIA_SEGURA("Distância Segura"),
EXECUTAR("Executar"),
EXPONENCIAL("Exponencial"),
FUNCAO("Função"),
INCLINACAO("Inclinação"),
MARCADOR_MAPA("Marcador no mapa"),
MAX_TWR("Max_TWR"),
+ MODULE_MANEUVER("MANEUVER"),
+ MODULO("Módulo"),
MODULO_CRIAR_MANOBRAS("CRIAR_MANOBRAS"),
MODULO_DECOLAGEM("LIFTOFF"),
- MODULE_MANEUVER("MANEUVER"),
- MODULO_POUSO_SOBREVOAR("HOVER"),
+ MODULO_DOCKING("DOCKING"),
MODULO_POUSO("LANDING"),
+ MODULO_POUSO_SOBREVOAR("HOVER"),
MODULO_ROVER("ROVER"),
- MODULO_DOCKING("DOCKING"),
MODULO_TELEMETRIA("TELEMETRY"),
- MODULO("Módulo"),
NAVE_ALVO("Nave alvo"),
NOME_MARCADOR("Nome do marcador"),
ORBITA_BAIXA("ÓRBITA BAIXA"),
diff --git a/src/main/java/com/pesterenan/views/DockingJPanel.java b/src/main/java/com/pesterenan/views/DockingJPanel.java
index 26edbb3..84fa835 100644
--- a/src/main/java/com/pesterenan/views/DockingJPanel.java
+++ b/src/main/java/com/pesterenan/views/DockingJPanel.java
@@ -19,8 +19,10 @@ public class DockingJPanel extends JPanel implements UIMethods {
private static final long serialVersionUID = 0L;
- private JLabel lblMaxSpeed;
- private JTextField txfMaxSpeed;
+ private JLabel lblMaxSpeed, lblSafeDistance, lblCurrentDockingStepText;
+ private static JLabel lblDockingStep;
+
+ private JTextField txfMaxSpeed, txfSafeDistance;
private JButton btnBack, btnStartDocking;
public DockingJPanel() {
@@ -32,10 +34,13 @@ public DockingJPanel() {
@Override
public void initComponents() {
// Labels:
- lblMaxSpeed = new JLabel(Bundle.getString("pnl_rover_lbl_max_speed"));
-
+ lblMaxSpeed = new JLabel(Bundle.getString("pnl_docking_max_speed"));
+ lblSafeDistance = new JLabel(Bundle.getString("pnl_docking_safe_distance"));
+ lblDockingStep = new JLabel(Bundle.getString("pnl_docking_step_ready"));
+ lblCurrentDockingStepText = new JLabel(Bundle.getString("pnl_docking_current_step"));
// Textfields:
txfMaxSpeed = new JTextField("3");
+ txfSafeDistance = new JTextField("50");
// Buttons:
btnBack = new JButton(Bundle.getString("pnl_rover_btn_back"));
@@ -51,6 +56,9 @@ public void setupComponents() {
txfMaxSpeed.setHorizontalAlignment(SwingConstants.RIGHT);
txfMaxSpeed.setMaximumSize(BTN_DIMENSION);
txfMaxSpeed.setPreferredSize(BTN_DIMENSION);
+ txfSafeDistance.setHorizontalAlignment(SwingConstants.RIGHT);
+ txfSafeDistance.setMaximumSize(BTN_DIMENSION);
+ txfSafeDistance.setPreferredSize(BTN_DIMENSION);
btnBack.addActionListener(MainGui::backToTelemetry);
btnBack.setMaximumSize(BTN_DIMENSION);
@@ -74,12 +82,27 @@ public void layoutComponents() {
pnlMaxSpeed.add(Box.createHorizontalGlue());
pnlMaxSpeed.add(txfMaxSpeed);
- JPanel pnlRoverControls = new JPanel();
- pnlRoverControls.setLayout(new BoxLayout(pnlRoverControls, BoxLayout.Y_AXIS));
- pnlRoverControls.setBorder(MARGIN_BORDER_10_PX_LR);
- pnlRoverControls.add(MainGui.createMarginComponent(0, 6));
- pnlRoverControls.add(pnlMaxSpeed);
- pnlRoverControls.add(Box.createVerticalGlue());
+ JPanel pnlSafeDistance = new JPanel();
+ pnlSafeDistance.setLayout(new BoxLayout(pnlSafeDistance, BoxLayout.X_AXIS));
+ pnlSafeDistance.add(lblSafeDistance);
+ pnlSafeDistance.add(Box.createHorizontalGlue());
+ pnlSafeDistance.add(txfSafeDistance);
+
+ JPanel pnlDockingStep = new JPanel();
+ pnlDockingStep.setLayout(new BoxLayout(pnlDockingStep, BoxLayout.X_AXIS));
+ pnlDockingStep.add(lblCurrentDockingStepText);
+ pnlDockingStep.add(Box.createHorizontalGlue());
+ pnlDockingStep.add(lblDockingStep);
+
+ JPanel pnlDockingControls = new JPanel();
+ pnlDockingControls.setLayout(new BoxLayout(pnlDockingControls, BoxLayout.Y_AXIS));
+ pnlDockingControls.setBorder(MARGIN_BORDER_10_PX_LR);
+ pnlDockingControls.add(MainGui.createMarginComponent(0, 6));
+ pnlDockingControls.add(pnlMaxSpeed);
+ pnlDockingControls.add(pnlSafeDistance);
+ pnlDockingControls.add(Box.createVerticalGlue());
+ pnlDockingControls.add(pnlDockingStep);
+ pnlDockingControls.add(Box.createVerticalGlue());
JPanel pnlButtons = new JPanel();
pnlButtons.setLayout(new BoxLayout(pnlButtons, BoxLayout.X_AXIS));
@@ -89,29 +112,40 @@ public void layoutComponents() {
JPanel pnlMain = new JPanel();
pnlMain.setLayout(new BoxLayout(pnlMain, BoxLayout.X_AXIS));
- pnlRoverControls.setAlignmentY(TOP_ALIGNMENT);
- pnlMain.add(pnlRoverControls);
+ pnlDockingControls.setAlignmentY(TOP_ALIGNMENT);
+ pnlMain.add(pnlDockingControls);
setLayout(new BorderLayout());
add(pnlMain, BorderLayout.CENTER);
add(pnlButtons, BorderLayout.SOUTH);
}
+ public static void setDockingStep(String step) {
+ lblDockingStep.setText(step);
+ }
+
private void handleStartDocking(ActionEvent e) {
- System.out.println("chamou startdocking");
- Map commands = new HashMap<>();
- commands.put(Modulos.MODULO.get(), Modulos.MODULO_DOCKING.get());
- commands.put(Modulos.VELOCIDADE_MAX.get(), txfMaxSpeed.getText());
- MechPeste.newInstance().startModule(commands);
+ if (validateTextFields()) {
+ Map commands = new HashMap<>();
+ commands.put(Modulos.MODULO.get(), Modulos.MODULO_DOCKING.get());
+ commands.put(Modulos.DISTANCIA_SEGURA.get(), txfSafeDistance.getText());
+ commands.put(Modulos.VELOCIDADE_MAX.get(), txfMaxSpeed.getText());
+ MechPeste.newInstance().startModule(commands);
+ }
}
private boolean validateTextFields() {
try {
if (Float.parseFloat(txfMaxSpeed.getText()) > 10) {
- throw new NumberFormatException();
+ StatusJPanel.setStatusMessage("Velocidade de acoplagem muito alta. Tem que ser menor que 10m/s.");
+ return false;
+ }
+ if (Float.parseFloat(txfSafeDistance.getText()) > 200) {
+ StatusJPanel.setStatusMessage("Distância segura muito alta. Tem que ser menor que 200m.");
+ return false;
}
} catch (NumberFormatException e) {
- StatusJPanel.setStatusMessage(Bundle.getString("pnl_rover_max_speed_above_3"));
+ StatusJPanel.setStatusMessage(Bundle.getString("pnl_lift_stat_only_numbers"));
return false;
} catch (IllegalArgumentException e) {
StatusJPanel.setStatusMessage(Bundle.getString("pnl_rover_waypoint_name_not_empty"));
diff --git a/src/main/resources/MechPesteBundle.properties b/src/main/resources/MechPesteBundle.properties
index 03fcb5a..26d39fc 100644
--- a/src/main/resources/MechPesteBundle.properties
+++ b/src/main/resources/MechPesteBundle.properties
@@ -1,9 +1,9 @@
+btn_func_create_maneuver = Create Maneuvers
+btn_func_docking = Docking
btn_func_landing = Auto Landing
btn_func_liftoff = Orbital Liftoff
-btn_func_create_maneuver = Create Maneuvers
btn_func_maneuver = Maneuvers
btn_func_rover = Drive Rover
-btn_func_docking = Docking
btn_stat_connect = Connect
installer_dialog_btn_browse = Browse...
installer_dialog_btn_cancel = Cancel
@@ -19,8 +19,16 @@ main_mntm_about = About
main_mntm_change_vessels = Change vessels
main_mntm_exit = Exit
main_mntm_install_krpc = Install KRPC
-pnl_func_title = Functions
pnl_common_lbl_limit_twr = Maximum TWR\:
+pnl_docking_current_step = Current docking step:
+pnl_docking_step_approach = Approaching...
+pnl_docking_step_go_in_front_of_target = Going in front of target...
+pnl_docking_step_line_up_with_target = Lining up with target...
+pnl_docking_step_stop_relative_speed = Stopping relative speed...
+pnl_docking_step_ready = Ready.
+pnl_docking_max_speed = Max. Docking Speed:
+pnl_docking_safe_distance = Safe Distance to approach:
+pnl_func_title = Functions
pnl_land_border = Automatic Landing
pnl_land_btn_back = Back
pnl_land_btn_hover = Hover
@@ -62,8 +70,8 @@ pnl_mnv_lbl_adj_inc = Adjust inclination\:
pnl_mnv_lbl_exec_mnv = Execute next maneuver\:
pnl_rover_border = Drive Rover\:
pnl_rover_btn_back = Back
-pnl_rover_btn_drive = Drive
pnl_rover_btn_docking = Start Docking
+pnl_rover_btn_drive = Drive
pnl_rover_default_name = Target
pnl_rover_lbl_max_speed = Max Speed\:
pnl_rover_max_speed_above_3 = Max speed must be over 3m/s\u00B2
diff --git a/src/main/resources/MechPesteBundle_pt.properties b/src/main/resources/MechPesteBundle_pt.properties
index 36cb87a..0975975 100644
--- a/src/main/resources/MechPesteBundle_pt.properties
+++ b/src/main/resources/MechPesteBundle_pt.properties
@@ -1,9 +1,9 @@
+btn_func_create_maneuver = Criar Manobras
+btn_func_docking = Acoplagem
btn_func_landing = Pouso Autom\u00E1tico
btn_func_liftoff = Decolagem Orbital
-btn_func_create_maneuver = Criar Manobras
btn_func_maneuver = Manobras
btn_func_rover = Pilotar Rover
-btn_func_docking = Acoplagem
btn_stat_connect = Conectar
installer_dialog_btn_browse = Escolher...
installer_dialog_btn_cancel = Cancelar
@@ -19,8 +19,16 @@ main_mntm_about = Sobre
main_mntm_change_vessels = Troca de naves
main_mntm_exit = Sair
main_mntm_install_krpc = Instalar KRPC
-pnl_func_title = Fun\u00E7\u00F5es
pnl_common_lbl_limit_twr = TEP m\u00E1ximo\:
+pnl_docking_current_step = Etapa de acoplagem atual:
+pnl_docking_step_approach = Aproximando...
+pnl_docking_step_go_in_front_of_target = Indo na frente do alvo...
+pnl_docking_step_line_up_with_target = Alinhando-se com o alvo...
+pnl_docking_step_stop_relative_speed = Parando velocidade relativa...
+pnl_docking_step_ready = Pronto.
+pnl_docking_max_speed = Velocidade M\u00E1x. de Acoplagem\:
+pnl_docking_safe_distance = Dist\u00E2ncia segura de aprox.\:
+pnl_func_title = Fun\u00E7\u00F5es
pnl_land_border = Pouso Autom\u00E1tico
pnl_land_btn_back = Voltar
pnl_land_btn_hover = Sobrevoar
@@ -61,8 +69,8 @@ pnl_mnv_lbl_adj_inc = Ajustar inclina\u00E7\u00E3o\:
pnl_mnv_lbl_exec_mnv = Executar pr\u00F3xima
manobra\:
pnl_rover_border = Pilotar Rover\:
pnl_rover_btn_back = Voltar
+pnl_rover_btn_docking = Acoplar
pnl_rover_btn_drive = Pilotar
-pnl_rover_btn_docking = Iniciar Acoplagem
pnl_rover_default_name = Alvo
pnl_rover_lbl_max_speed = Velocidade m\u00E1xima:
pnl_rover_max_speed_above_3 = A velocidade m\u00E1xima tem que ser acima de 3m/s\u00b2