// FGFSDemo.java - Simple demo application. import java.io.IOException; import java.util.HashMap; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import org.flightgear.fgfsclient.FGFSConnection; import org.flightgear.fgfsclient.PropertyPage; /** * Simple GUI demo. * * <p>This demo connects to a running FlightGear process and displays * the current altitude, longitude, and latitude in a GUI window, with * updates every second.</p> * * <p>Usage:</p> * * <blockquote><pre> * fgfs --telnet=9000 * java FGFSDemo localhost 9000 * </pre></blockquote> */ public class FGFSDemo extends JFrame { public FGFSDemo (String host, int port) throws IOException { super("FlightGear Client Console"); fgfs = new FGFSConnection(host, port); tabs = new JTabbedPane(); pages = new HashMap(); PropertyPage page = new PropertyPage(fgfs, "Simulation"); page.addField("/sim/aircraft", "Aircraft:"); page.addField("/sim/startup/airport-id", "Airport ID:"); page.addField("/sim/time/gmt", "Current time (GMT):"); page.addField("/sim/startup/trim", "Trim on ground (true/false):"); page.addField("/sim/sound/audible", "Sound enabled (true/false):"); page.addField("/sim/startup/browser-app", "Web browser:"); addPage(page); page = new PropertyPage(fgfs, "View"); page.addField("/sim/view-mode", "View mode:"); page.addField("/sim/current-view/field-of-view", "Field of view (deg):"); page.addField("/sim/current-view/pitch-offset-deg", "View pitch offset (deg):"); page.addField("/sim/current-view/heading-offset-deg", "View heading offset (deg):"); addPage(page); page = new PropertyPage(fgfs, "Location"); page.addField("/position/altitude-ft", "Altitude (ft):"); page.addField("/position/longitude-deg", "Longitude (deg):"); page.addField("/position/latitude-deg", "Latitude (deg):"); page.addField("/orientation/roll-deg", "Roll (deg):"); page.addField("/orientation/pitch-deg", "Pitch (deg):"); page.addField("/orientation/heading-deg", "Heading (deg):"); addPage(page); page = new PropertyPage(fgfs, "Weather"); page.addField("/environment/wind-from-heading-deg", "Wind direction (deg FROM):"); page.addField("/environment/params/base-wind-speed-kt", "Wind speed (kt):"); page.addField("/environment/params/gust-wind-speed-kt", "Maximum gust (kt):"); page.addField("/environment/wind-from-down-fps", "Updraft (fps):"); page.addField("/environment/temperature-degc", "Temperature (degC):"); page.addField("/environment/dewpoint-degc", "Dewpoint (degC):"); page.addField("/environment/pressure-sea-level-inhg", "Altimeter setting (inHG):"); addPage(page); page = new PropertyPage(fgfs, "Clouds"); page.addField("/environment/clouds/layer[0]/type", "Layer 0 type:"); page.addField("/environment/clouds/layer[0]/elevation-ft", "Layer 0 height (ft):"); page.addField("/environment/clouds/layer[0]/thickness-ft", "Layer 0 thickness (ft):"); page.addField("/environment/clouds/layer[1]/type", "Layer 1 type:"); page.addField("/environment/clouds/layer[1]/elevation-ft", "Layer 1 height (ft):"); page.addField("/environment/clouds/layer[1]/thickness-ft", "Layer 1 thickness (ft):"); page.addField("/environment/clouds/layer[2]/type", "Layer 2 type:"); page.addField("/environment/clouds/layer[2]/elevation-ft", "Layer 2 height (ft):"); page.addField("/environment/clouds/layer[2]/thickness-ft", "Layer 2 thickness (ft):"); page.addField("/environment/clouds/layer[3]/type", "Layer 3 type:"); page.addField("/environment/clouds/layer[3]/elevation-ft", "Layer 3 height (ft):"); page.addField("/environment/clouds/layer[3]/thickness-ft", "Layer 3 thickness (ft):"); page.addField("/environment/clouds/layer[4]/type", "Layer 4 type:"); page.addField("/environment/clouds/layer[4]/elevation-ft", "Layer 4 height (ft):"); page.addField("/environment/clouds/layer[4]/thickness-ft", "Layer 4 thickness (ft):"); addPage(page); page = new PropertyPage(fgfs, "Velocities"); page.addField("/velocities/airspeed-kt", "Airspeed (kt):"); page.addField("/velocities/speed-down-fps", "Descent speed (fps):"); addPage(page); getContentPane().add(tabs); new Thread(new Updater()).start(); } private void addPage (PropertyPage page) { tabs.add(page.getName(), new JScrollPane(page)); pages.put(page.getName(), page); } private FGFSConnection fgfs; private JTabbedPane tabs; private HashMap pages; public static void main (String args[]) throws Exception { if (args.length != 2) { System.err.println("Usage: FGFSDemo <host> <port>"); System.exit(2); } FGFSDemo gui = new FGFSDemo(args[0], Integer.parseInt(args[1])); gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); gui.pack(); gui.show(); } class Updater implements Runnable { public void run () { while (true) { int index = tabs.getSelectedIndex(); if (index > -1) { String name = tabs.getTitleAt(index); PropertyPage page = (PropertyPage)pages.get(name); try { page.update(); } catch (IOException e) { } } try { Thread.sleep(1000); } catch (InterruptedException e) { } } } } } // end of FGFSDemo.java