mirror of
https://github.com/nasa/trick.git
synced 2024-12-24 07:16:41 +00:00
parent
e58ba61d8e
commit
c11f04644c
@ -1,262 +0,0 @@
|
||||
/*
|
||||
* VarClient.java: A generic variable server client
|
||||
* Developed for use by MTV, currently only handles a subset of Trick types in binary mode
|
||||
* @author dstrauss
|
||||
*/
|
||||
|
||||
package trick.utils;
|
||||
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.net.Socket;
|
||||
import java.net.UnknownHostException;
|
||||
|
||||
public class VarClient
|
||||
{
|
||||
protected Socket socket = null;
|
||||
protected boolean ascii = true;
|
||||
protected boolean binary = false;
|
||||
protected boolean binary_nonames = false;
|
||||
protected boolean sync = false;
|
||||
protected BufferedReader vs_in = null;
|
||||
protected DataOutputStream vs_out = null;
|
||||
protected byte[] buf = new byte[8192]; // maximum binary packet size sent by var server
|
||||
|
||||
public String results; // tabbed string returned by get()
|
||||
public boolean paused = false;
|
||||
|
||||
// Connect to variable server on host:port
|
||||
public VarClient(String host, int port) throws IOException {
|
||||
//String clientTag = "var_client";
|
||||
try {
|
||||
socket = new Socket(host, port);
|
||||
} catch (UnknownHostException e1) {
|
||||
throw new IOException("VarClient could not connect to " + host + ":" + port);
|
||||
}
|
||||
try {
|
||||
vs_out = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
|
||||
vs_in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
|
||||
} finally {
|
||||
}
|
||||
}
|
||||
|
||||
// Send command to variable server
|
||||
public void put(String command) throws IOException {
|
||||
vs_out.writeBytes(command + "\n");
|
||||
vs_out.flush();
|
||||
}
|
||||
|
||||
// Set var_ascii mode
|
||||
public void setAscii() throws IOException {
|
||||
if (!ascii) {
|
||||
put("trick.sim_services.var_ascii()");
|
||||
ascii = true;
|
||||
binary = false;
|
||||
binary_nonames = false;
|
||||
}
|
||||
}
|
||||
|
||||
// Set var_binary mode
|
||||
public void setBinary() throws IOException {
|
||||
if (!binary) {
|
||||
put("trick.sim_services.var_binary()");
|
||||
binary = true;
|
||||
binary_nonames = false;
|
||||
ascii = false;
|
||||
}
|
||||
}
|
||||
|
||||
// Set var_binary_nonames mode
|
||||
public void setBinaryNoNames() throws IOException {
|
||||
if (!binary_nonames) {
|
||||
put("trick.sim_services.var_binary_nonames()");
|
||||
binary_nonames = true;
|
||||
binary = false;
|
||||
ascii = false;
|
||||
}
|
||||
}
|
||||
|
||||
// Set var_sync mode
|
||||
public void setSync() throws IOException {
|
||||
if (!sync) {
|
||||
put("trick.sim_services.var_sync(1)");
|
||||
sync = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Set var_pause
|
||||
public void pause() throws IOException {
|
||||
if (!paused) {
|
||||
put("trick.sim_services.var_pause()");
|
||||
paused = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Set var_unpause
|
||||
public void unpause() throws IOException {
|
||||
if (paused) {
|
||||
put("trick.sim_services.var_unpause()");
|
||||
paused = false;
|
||||
}
|
||||
}
|
||||
|
||||
// in binary mode, must convert C types (little endian) to java types (big endian)
|
||||
// return a java long (64bits) for bytes in buffer starting at i, size = 4 or 8
|
||||
private long convert_binary_data(byte[] buf, int i, int size) {
|
||||
long byte1, byte2, byte3, byte4, byte5, byte6, byte7, byte8;
|
||||
// int is size 4, longlong and double are size 8
|
||||
byte1 = (0xFF & ((int)buf[i]));
|
||||
byte2 = (0xFF & ((int)buf[i+1]));
|
||||
byte3 = (0xFF & ((int)buf[i+2]));
|
||||
byte4 = (0xFF & ((int)buf[i+3]));
|
||||
if (size==8) {
|
||||
byte5 = (0xFF & ((int)buf[i+4]));
|
||||
byte6 = (0xFF & ((int)buf[i+5]));
|
||||
byte7 = (0xFF & ((int)buf[i+6]));
|
||||
byte8 = (0xFF & ((int)buf[i+7]));
|
||||
// little -> big endian
|
||||
return (long) (byte8<<56 | byte7<<48 | byte6<<40 | byte5<<32 | byte4<<24 | byte3<<16 | byte2<<8 | byte1);
|
||||
} else {
|
||||
// little -> big endian
|
||||
return (long) (byte4<<24 | byte3<<16 | byte2<<8 | byte1);
|
||||
}
|
||||
}
|
||||
|
||||
/***
|
||||
public enum TrickType { VOID, CHAR, UCHAR, CHARSTRING, SHORT, USHORT, INT, UINT, LONG, ULONG, FLOAT, DOUBLE,
|
||||
BITFIELD, UBITFIELD, LONGLONG, ULONGLONG, FILEPTR, BOOLEAN, WCHAR, WCHARSTRING, VOIDPTR, ENUM, STRUCT }
|
||||
***/
|
||||
|
||||
// Read ascii or binary data from variable server, return as tab delimited string for either mode
|
||||
public String get() throws IOException {
|
||||
return get(1);
|
||||
}
|
||||
public String get(int num_variables) throws IOException {
|
||||
// num_variables (optional) is number of variables you expect to get (needed for binary multiple packet support)
|
||||
|
||||
int bytes_read, index, msg_size, len, type, size;
|
||||
int num_vars_processed, num_vars_in_msg;
|
||||
int ival;
|
||||
double dval;
|
||||
String name, typename, val;
|
||||
|
||||
if (ascii) {
|
||||
results = vs_in.readLine();
|
||||
|
||||
} else { // binary
|
||||
// handle multiple packets (continue reading if more variables and not eof of socket)
|
||||
num_vars_processed = 0;
|
||||
bytes_read = 0;
|
||||
results = "";
|
||||
while ((num_vars_processed < num_variables) && (bytes_read != -1)) {
|
||||
// read binary header
|
||||
bytes_read = socket.getInputStream().read(buf, 0, 12);
|
||||
if (bytes_read == -1) { // eof
|
||||
throw new IOException("Connection closed");
|
||||
}
|
||||
if ((int)buf[0] != 0) {
|
||||
System.out.println("VarClient: Bad binary message indicator.");
|
||||
return "";
|
||||
}
|
||||
msg_size = (int)convert_binary_data(buf, 4, 4);
|
||||
//System.out.println("msg size=" + msg_size);
|
||||
num_vars_in_msg = (int)convert_binary_data(buf, 8, 4);
|
||||
//System.out.println("numvars=" + num_vars_in_msg);
|
||||
|
||||
// read binary data
|
||||
bytes_read = socket.getInputStream().read(buf, 0, msg_size-8);
|
||||
//System.out.println("bytes_read=" + bytes_read);
|
||||
index = 0;
|
||||
while (index < bytes_read) {
|
||||
if (num_vars_processed > 0) {
|
||||
results += "\t";
|
||||
}
|
||||
if (!binary_nonames) {
|
||||
len = (int)convert_binary_data(buf, index, 4);
|
||||
index += 4;
|
||||
name = new String(buf, index, len);
|
||||
index += len;
|
||||
}
|
||||
type = (int)convert_binary_data(buf, index, 4);
|
||||
index += 4;
|
||||
size = (int)convert_binary_data(buf, index, 4);
|
||||
val = "";
|
||||
//System.out.println("type=" + type + " size=" +size);
|
||||
|
||||
index += 4;
|
||||
switch (type) {
|
||||
case 1 : // CHAR
|
||||
typename = "CHAR";
|
||||
ival = (char)buf[index];
|
||||
val += ival;
|
||||
break;
|
||||
case 3 : // CHARSTRING
|
||||
typename = "CHARSTRING";
|
||||
val = new String(buf, index, size);
|
||||
break;
|
||||
case 6 : // INT
|
||||
typename = "INT";
|
||||
ival = (int)convert_binary_data(buf, index, 4);
|
||||
val += ival;
|
||||
break;
|
||||
case 11 : // DOUBLE
|
||||
typename = "DOUBLE";
|
||||
dval = Double.longBitsToDouble(convert_binary_data(buf, index, 8));
|
||||
val += dval;
|
||||
break;
|
||||
case 14 : // LONGLONG
|
||||
typename = "LONGLONG";
|
||||
dval = (double)convert_binary_data(buf, index, 8);
|
||||
val += dval;
|
||||
break;
|
||||
default :
|
||||
typename = "???";
|
||||
System.out.println("VarClient: Unknown type " +type+ " in get().");
|
||||
break;
|
||||
}
|
||||
results += val;
|
||||
index += size;
|
||||
//System.out.println("name=" +name+ " " +typename+ " size=" +size+ " val=" +val+ " index=" +index);
|
||||
num_vars_processed++;
|
||||
} // while message data being parsed
|
||||
} // end while num_vars_processed < num_variables
|
||||
} // end binary
|
||||
return results;
|
||||
}
|
||||
|
||||
// Flush any data remaining already sent by variable server
|
||||
public void flush() {
|
||||
int bytes_avail, bytes_read;
|
||||
try {
|
||||
bytes_avail = socket.getInputStream().available();
|
||||
if (bytes_avail > 0) {
|
||||
bytes_read = socket.getInputStream().read(buf, 0, bytes_avail);
|
||||
System.out.println("flushed " +bytes_read+ " of " +bytes_avail+ " bytes");
|
||||
}
|
||||
} catch (IOException ioe) {
|
||||
System.out.println("VarClient flush() " +ioe.toString() +".");
|
||||
}
|
||||
}
|
||||
|
||||
// Close the variable server connection
|
||||
public void close() {
|
||||
try {
|
||||
if (vs_out != null) {
|
||||
vs_out.close();
|
||||
}
|
||||
if (vs_in != null) {
|
||||
vs_in.close();
|
||||
}
|
||||
if (socket != null) {
|
||||
socket.close();
|
||||
socket = null;
|
||||
}
|
||||
} catch (IOException ioe) {
|
||||
System.out.println("VarClient close() " +ioe.toString() +".");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user