From 29fb20c2eb66220eb5bd171451f3a749af8a4610 Mon Sep 17 00:00:00 2001 From: Mrockwell2 <120338765+Mrockwell2@users.noreply.github.com> Date: Tue, 21 Feb 2023 10:49:00 -0600 Subject: [PATCH] SIM_aircraft Graphics Client View Menu (#1457) * Set up a waypoint system that reads waypoints from an input file. On branch aircraftUpdate Changes to be committed: new file: trick_sims/SIM_aircraft/Modified_data/default.waypoints modified: trick_sims/SIM_aircraft/RUN_test/input.py modified: trick_sims/SIM_aircraft/models/Aircraft/include/Aircraft.hh modified: trick_sims/SIM_aircraft/models/Aircraft/src/Aircraft.cpp modified: trick_sims/SIM_aircraft/models/graphics/src/trick/AircraftDisplay.java * Fixed the Segmentation Fault and completed the waypoint configuration. On branch aircraftUpdate Changes to be committed: modified: trick_sims/SIM_aircraft/RUN_test/input.py modified: trick_sims/SIM_aircraft/models/Aircraft/include/Aircraft.hh modified: trick_sims/SIM_aircraft/models/Aircraft/src/Aircraft.cpp * Created README.md to document recent changes * Adding in ability to set icons for waypoints. On branch aircraftUpdate_WaypointIcons Changes to be committed: modified: trick_sims/SIM_aircraft/Modified_data/default.waypoints new file: trick_sims/SIM_aircraft/images/CompassRose.png new file: trick_sims/SIM_aircraft/images/Figure1.png new file: trick_sims/SIM_aircraft/images/Figure2.png new file: trick_sims/SIM_aircraft/images/cheese_64x64.png new file: trick_sims/SIM_aircraft/images/mouse_128x128.png new file: trick_sims/SIM_aircraft/images/strawberry_64x64.png new file: trick_sims/SIM_aircraft/images/twoWheelRover.png new file: trick_sims/SIM_aircraft/images/wp0.png new file: trick_sims/SIM_aircraft/images/wp1.png new file: trick_sims/SIM_aircraft/images/wp10.png new file: trick_sims/SIM_aircraft/images/wp11.png new file: trick_sims/SIM_aircraft/images/wp2.png new file: trick_sims/SIM_aircraft/images/wp3.png new file: trick_sims/SIM_aircraft/images/wp4.png new file: trick_sims/SIM_aircraft/images/wp5.png new file: trick_sims/SIM_aircraft/images/wp6.png new file: trick_sims/SIM_aircraft/images/wp7.png new file: trick_sims/SIM_aircraft/images/wp8.png new file: trick_sims/SIM_aircraft/images/wp9.png modified: trick_sims/SIM_aircraft/models/graphics/src/trick/AircraftDisplay.java * Reformatted the README file * Updating the build process to use Maven * Updating the README file * Finalized the implementation for adding icons for each waypoint. * Removed commented code that will not be used. * Updated the SIM_aircraft documentation to include the waypoint icon implementation. * Created a menu bar for the GUI * Minor README fix and file cleanup * Implemented a view menu to hide and show the info on the map * Cleared out commented code. * Last minute code cleanup and update of the documentation. * Updated the View menu with more options and updated documentation. --- trick_sims/SIM_aircraft/README.md | 25 +++ .../GraphicsClient_ControlsDisabled.png | Bin 0 -> 27271 bytes .../images/GraphicsClient_ViewOptions.png | Bin 0 -> 26765 bytes .../aircraftDisplay/AircraftDisplay.java | 185 +++++++++++++++++- 4 files changed, 200 insertions(+), 10 deletions(-) create mode 100644 trick_sims/SIM_aircraft/images/GraphicsClient_ControlsDisabled.png create mode 100644 trick_sims/SIM_aircraft/images/GraphicsClient_ViewOptions.png diff --git a/trick_sims/SIM_aircraft/README.md b/trick_sims/SIM_aircraft/README.md index b05ea61b..878811a0 100644 --- a/trick_sims/SIM_aircraft/README.md +++ b/trick_sims/SIM_aircraft/README.md @@ -62,6 +62,31 @@ When the simulation starts they are read into the simulation from the specified -21650.0, 12500.0,images/wp5.png Each line should have three pieces of data, separated by commas. The first two are the coordinates. They are formatted like GPS coordinates, with the first number being the vertical distance, or 'North', and the second being the horizontal, or 'West', distance. The third part of the line is the path to the image that will be used as the waypoint marker. +### Graphics Client Menu + +#### View + +The `View` menu on the menu bar allows the user to choose the information displayed by the client. + +![](images/GraphicsClient_ViewOptions.png) + +##### Aircraft Position +This checkbox toggles the visibility of the `Aircraft Pos:` field in the top left corner of the map. + +##### Aircraft Velocity +This checkbox toggles the visibility of the `Aircraft Vel:` field in the top left corner of the map. + +##### Map Scale +This checkbox toggles the visibility of the `Scale:` field in the top left corner of the map. + +##### Control Mode +This checkbox toggles the visibility of the `Control Mode:` field in the top left corner of the map. + +##### Disabled Controls' Data +This checkbox is disabled unless Autopilot is engaged. When used, it toggles the visibility of the data from the disabled controls in the top right corner of the map. + +![](images/GraphicsClient_ControlsDisabled.png) + ## Dynamics Model ### General Strategy for Motion diff --git a/trick_sims/SIM_aircraft/images/GraphicsClient_ControlsDisabled.png b/trick_sims/SIM_aircraft/images/GraphicsClient_ControlsDisabled.png new file mode 100644 index 0000000000000000000000000000000000000000..bedfc70c38f9c0c7d741f86f447c68ffdf489763 GIT binary patch literal 27271 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 X>O0H9x3z!6wY*QA`&Zo$mu~(Ce-8=B literal 0 HcmV?d00001 diff --git a/trick_sims/SIM_aircraft/images/GraphicsClient_ViewOptions.png b/trick_sims/SIM_aircraft/images/GraphicsClient_ViewOptions.png new file mode 100644 index 0000000000000000000000000000000000000000..22b9a18ba964301ac64eb1d5570a9dd90d553bb7 GIT binary patch literal 26765 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 ZdLVC~tUeE%vQkrnU2^&d>Ea&`{tJ75>U{tJ literal 0 HcmV?d00001 diff --git a/trick_sims/SIM_aircraft/models/graphics/src/main/java/trick/aircraftDisplay/AircraftDisplay.java b/trick_sims/SIM_aircraft/models/graphics/src/main/java/trick/aircraftDisplay/AircraftDisplay.java index 1d2e6822..daecd7b4 100644 --- a/trick_sims/SIM_aircraft/models/graphics/src/main/java/trick/aircraftDisplay/AircraftDisplay.java +++ b/trick_sims/SIM_aircraft/models/graphics/src/main/java/trick/aircraftDisplay/AircraftDisplay.java @@ -35,11 +35,17 @@ import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JSlider; import javax.swing.JLabel; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; import javax.swing.JButton; +import javax.swing.JCheckBoxMenuItem; import javax.swing.JToggleButton; import javax.swing.BorderFactory; import javax.swing.border.EtchedBorder; import javax.swing.BoxLayout; +import javax.swing.Icon; + import java.awt.Color; import javax.imageio.ImageIO; @@ -68,6 +74,113 @@ class ScenePoly { public double[] y; } +class SimulationMenuBar extends JMenuBar { + private JMenu _file; + private JMenu _edit; + private JMenu _tools; + private JMenu _help; + private ViewMenu _view; + + private SkyView skyView; + + public SimulationMenuBar(SkyView sv) { + skyView = sv; + _view = new ViewMenu("View"); + + add(_view); + } + + public void setEnabled_DisabledViewCB(boolean s) { + _view.disabledView.setEnabled(s); + } + private void initHelpMenu() { + _help = new JMenu("Help"); + add(_help); + } + + private void initToolsMenu() { + _tools = new JMenu("Tools"); + add(_tools); + } + + private void initEditMenu() { + _edit = new JMenu("Edit"); // Undo, Redo, Cut, Copy, Paste + JMenuItem mi; + mi = new JMenuItem("Undo"); + _edit.add(mi); + mi = new JMenuItem("Redo"); + _edit.add(mi); + mi = new JMenuItem("Cut"); + _edit.add(mi); + mi = new JMenuItem("Copy"); + _edit.add(mi); + mi = new JMenuItem("Paste"); + _edit.add(mi); + add(_edit); + } + + private void initFileMenu() { + _file = new JMenu("File"); // New, Open, Save, Save As, Exit + JMenuItem mi; + mi = new JMenuItem("New"); + _file.add(mi); + mi = new JMenuItem("Open"); + _file.add(mi); + mi = new JMenuItem("Save"); + _file.add(mi); + mi = new JMenuItem("Save As"); + _file.add(mi); + mi = new JMenuItem("Exit"); + _file.add(mi); + + add(_file); + } + + private class ViewMenu extends JMenu { + public JCheckBoxMenuItem posView, velView, scaleView, controlView, disabledView; + ViewMenu(String name) { + super(name); + + initPosViewCB(); + initVelViewCB(); + initScaleViewCB(); + initControlViewCB(); + initDisabledViewCB(); + + add(posView); + add(velView); + add(scaleView); + add(controlView); + add(disabledView); + } + + private void initPosViewCB() { + posView = new JCheckBoxMenuItem("Aircraft Position", skyView.getPosView()); + posView.addItemListener(e -> skyView.setPosView(((JCheckBoxMenuItem) e.getItem()).isSelected())); + } + + private void initVelViewCB() { + velView = new JCheckBoxMenuItem("Aircraft Velocity", skyView.getVelView()); + velView.addItemListener(e -> skyView.setVelView(((JCheckBoxMenuItem) e.getItem()).isSelected())); + } + + private void initScaleViewCB() { + scaleView = new JCheckBoxMenuItem("Map Scale", skyView.getScaleView()); + scaleView.addItemListener(e -> skyView.setScaleView(((JCheckBoxMenuItem) e.getItem()).isSelected())); + } + + private void initControlViewCB() { + controlView = new JCheckBoxMenuItem("Control Mode", skyView.getCtrlView()); + controlView.addItemListener(e -> skyView.setCtrlView(((JCheckBoxMenuItem) e.getItem()).isSelected())); + } + + private void initDisabledViewCB() { + disabledView = new JCheckBoxMenuItem("Disabled Controls' Data", skyView.getDisabledView()); + disabledView.addItemListener(e -> skyView.setDisabledView(((JCheckBoxMenuItem) e.getItem()).isSelected())); + } + } +} + class SkyView extends JPanel { private double scale; // Pixels per meter @@ -92,6 +205,9 @@ class SkyView extends JPanel { private int worldOriginX; private int worldOriginY; + // The data that is or isn't displayed on the map + private boolean posView, velView, scaleView, ctrlView, disabledView; + public SkyView( double mapScale ) { scale = mapScale; setScale(mapScale); @@ -117,6 +233,8 @@ class SkyView extends JPanel { workPolyY = new int[30]; waypoints = new ArrayList(); + + setAllView(true); } public void addWaypoint( double n, double w, String fp) { @@ -185,6 +303,30 @@ class SkyView extends JPanel { desired_heading = n; } + // Getters and setters for all the 'View' variables + public boolean getPosView() { return posView; } + public void setPosView(boolean v) { posView = v; } + + public boolean getVelView() { return velView; } + public void setVelView(boolean v) { velView = v; } + + public boolean getScaleView() { return scaleView; } + public void setScaleView(boolean v) { scaleView = v; } + + public boolean getCtrlView() { return ctrlView; } + public void setCtrlView(boolean v) { ctrlView = v; } + + public boolean getDisabledView() { return disabledView; } + public void setDisabledView(boolean v) { disabledView = v; } + + public void setAllView(boolean v) { + setPosView(v); + setVelView(v); + setScaleView(v); + setCtrlView(v); + setDisabledView(v); + } + public void drawCenteredOval(Graphics2D g, int x, int y, int rh, int rv) { x = x-(rh/2); y = y-(rv/2); @@ -244,26 +386,44 @@ class SkyView extends JPanel { // Display State Data g2d.setPaint(Color.BLACK); - g2d.drawString ( String.format("Aircraft Pos: [%.2f, %.2f]", aircraftPos[0], aircraftPos[1]), 20,40); - g2d.drawString ( String.format("Aircraft Vel: [%.2f, %.2f]", aircraftVel[0], aircraftVel[1]), 20,60); - - g2d.drawString ( String.format("SCALE: %f pixels/meter",scale), 20,80); - - g2d.drawString ( String.format("Autopilot Mode: [%B]", autopilot), 20,100); + int textCursor = 40; + + if(posView) { + g2d.drawString ( String.format("Aircraft Pos: [%.2f, %.2f]", aircraftPos[0], aircraftPos[1]), 20,textCursor); + textCursor += 20; + } + if(velView) { + g2d.drawString ( String.format("Aircraft Vel: [%.2f, %.2f]", aircraftVel[0], aircraftVel[1]), 20,textCursor); + textCursor += 20; + } + + if(scaleView){ + g2d.drawString ( String.format("SCALE: %f pixels/meter",scale), 20,textCursor); + textCursor += 20; + } + + if(ctrlView){ + g2d.drawString ( String.format("Control Mode: [%s]", autopilot ? "Auto-Pilot" : "Manual"), 20,textCursor); + textCursor += 20; + } + if (autopilot == true) { g2d.drawString ( String.format("Aircraft Actual Heading: [%.2f]", heading),(width - 240) ,40); g2d.drawString ( String.format("Aircraft Actual Speed: [%.2f m/s]", actual_speed), (width - 240),60); - g2d.drawString ( "-------Controls disabled-------", (width - 240),80); - g2d.drawString ( String.format("Aircraft Desired Heading: [%.2f]", desired_heading), (width - 240),100); - g2d.drawString ( String.format("Aircraft Desired Speed: [%.2f m/s]", desired_speed), (width - 240),120); + if (disabledView) { + g2d.setPaint(Color.GRAY); + g2d.drawString ( "-------Controls disabled-------", (width - 240),80); + g2d.drawString ( String.format("Aircraft Desired Heading: [%.2f]", desired_heading), (width - 240),100); + g2d.drawString ( String.format("Aircraft Desired Speed: [%.2f m/s]", desired_speed), (width - 240),120); + g2d.setPaint(Color.BLACK); + } } else { g2d.drawString ( String.format("Aircraft Actual Heading: [%.2f]", heading),(width - 240) ,100); g2d.drawString ( String.format("Aircraft Desired Heading: [%.2f]", desired_heading), (width - 240),80); g2d.drawString ( String.format("Aircraft Actual Speed: [%.2f m/s]", actual_speed), (width - 240),60); g2d.drawString ( String.format("Aircraft Desired Speed: [%.2f m/s]", desired_speed), (width - 240),40); } - } @Override @@ -428,6 +588,7 @@ class AutoPilotCtrlPanel extends JPanel implements ItemListener { public class AircraftDisplay extends JFrame { private SkyView skyView; + private SimulationMenuBar simMenu; private BufferedReader in; private DataOutputStream out; private JPanel panelGroup0, panelGroup1; @@ -435,6 +596,8 @@ public class AircraftDisplay extends JFrame { public AircraftDisplay(SkyView sky) { skyView = sky; + simMenu = new SimulationMenuBar(skyView); + setJMenuBar(simMenu); add( skyView); setTitle("Aircraft Display"); setSize(800, 800); @@ -585,6 +748,8 @@ public class AircraftDisplay extends JFrame { sd.out.writeBytes("dyn.aircraft.autoPilot = False ;\n"); } + ((SimulationMenuBar) sd.getJMenuBar()).setEnabled_DisabledViewCB(autopilot); + } catch (IOException | NullPointerException e ) { go = false; }