Files
XPlaneConnectCSP/Java/Examples/Playback/src/gov/nasa/xpc/Main.java
2018-10-20 13:52:44 -07:00

148 lines
4.9 KiB
Java

package gov.nasa.xpc;
import com.sun.javafx.scene.EnteredExitedHandler;
import java.io.*;
import java.util.Scanner;
public class Main
{
public static void main(String[] args) throws IOException
{
String[] mainOpts = new String[] { "Record X-Plane", "Playback File", "Exit" };
System.out.println("X-Plane Connect Playback Example [Version 1.3-rc.1]");
System.out.println("(c) 2013-2015 United States Government as represented by the Administrator");
System.out.println("of the National Aeronautics and Space Administration. All Rights Reserved.");
while(true)
{
int result = displayMenu("What would you like to do?", mainOpts);
switch(result)
{
case 1:
{
String path = getString("Enter a save file path: ");
int interval = getInt("Enter interval between frames (milliseconds): ");
int duration = getInt("Enter duration to record for (seconds): ");
record(path, interval, duration);
break;
}
case 2:
{
String path = getString("Enter path to saved playback file: ");
int interval = getInt("Enter interval between frames (milliseconds): ");
playback(path, interval);
break;
}
case 3:
{
System.out.println("Exiting.");
return;
}
default:
{
System.out.println("Unrecognized menu option.");
break;
}
}
}
}
private static int displayMenu(String title, String[] opts) throws IOException
{
System.out.println();
System.out.println("+---------------------------------------------- +");
System.out.println(String.format("| %1$-42s |", title));
System.out.println("+---------------------------------------------- +");
for(int i = 0; i < opts.length; ++i)
{
System.out.println(String.format("| %1$2d. %2$-40s |", i + 1, opts[i]));
}
System.out.println("+---------------------------------------------- +");
return getInt("Please select an option: ");
}
private static String getString(String prompt) throws IOException
{
System.out.print(prompt);
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
return reader.readLine();
}
private static int getInt(String prompt) throws IOException
{
System.out.print(prompt);
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String result = reader.readLine();
return Integer.parseInt(result);
}
public static void record(String path, int interval, int duration) throws IOException
{
int count = duration * 1000 / interval;
if (count < 1)
{
throw new IllegalArgumentException("duration is less than one interval.");
}
try (BufferedWriter writer = new BufferedWriter(new FileWriter(path)))
{
System.out.println("Recording...");
try (XPlaneConnect xpc = new XPlaneConnect())
{
for (int i = 0; i < count; ++i)
{
float[] posi = xpc.getPOSI(0); // FIXME: change this to 64-bit double
writer.write(String.format("%1$f, %2$f, %3$f, %4$f, %5$f, %6$f, %7$f\n",
posi[0], posi[1], posi[2], posi[3], posi[4], posi[5], posi[6]));
try
{
Thread.sleep(interval);
}
catch (InterruptedException ex)
{
}
}
}
System.out.println("Recording Complete");
}
}
public static void playback(String path, int interval) throws IOException
{
try(Scanner reader = new Scanner(new FileReader(path)))
{
reader.useDelimiter("[\\s\\r\\n,]+");
System.out.println("Starting playback...");
try (XPlaneConnect xpc = new XPlaneConnect())
{
while(reader.hasNextLine())
{
double[] posi = new double[7];
for (int i = 0; i < 7; ++i)
{
String s = reader.next();
posi[i] = Double.parseDouble(s);
}
reader.nextLine();
xpc.sendPOSI(posi);
try
{
Thread.sleep(interval);
}
catch (InterruptedException ex)
{
}
}
}
}
}
}