| 
									
										
										
										
											2009-05-31 17:23:49 +00:00
										 |  |  | package altimeter;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import gnu.io.CommPortIdentifier;
 | 
					
						
							|  |  |  | import gnu.io.PortInUseException;
 | 
					
						
							|  |  |  | import gnu.io.SerialPort;
 | 
					
						
							|  |  |  | import gnu.io.UnsupportedCommOperationException;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import java.io.IOException;
 | 
					
						
							|  |  |  | import java.io.InputStream;
 | 
					
						
							|  |  |  | import java.util.ArrayList;
 | 
					
						
							|  |  |  | import java.util.Enumeration;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * Class to interface the PerfectFlite Alt15K/WD altimeter.
 | 
					
						
							|  |  |  |  * 
 | 
					
						
							|  |  |  |  * Also includes a main method that retrieves all flight profiles and saves them to files.
 | 
					
						
							|  |  |  |  * 
 | 
					
						
							|  |  |  |  * @author Sampo Niskanen <sampo.niskanen@iki.fi>
 | 
					
						
							|  |  |  |  */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public class SerialDownload {
 | 
					
						
							|  |  |  | 	private static final boolean DEBUG = false;
 | 
					
						
							|  |  |  | 	
 | 
					
						
							|  |  |  | 	private static final int MAGIC = 666;
 | 
					
						
							|  |  |  | 	
 | 
					
						
							|  |  |  | 	private final CommPortIdentifier portID;
 | 
					
						
							|  |  |  | 	private SerialPort port = null;
 | 
					
						
							|  |  |  | 	private InputStream is = null;
 | 
					
						
							|  |  |  | 	
 | 
					
						
							|  |  |  | 	
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static String[] getNames() {
 | 
					
						
							|  |  |  | 		ArrayList<String> list = new ArrayList<String>();;
 | 
					
						
							|  |  |  | 		
 | 
					
						
							| 
									
										
										
										
											2012-12-15 20:38:47 -08:00
										 |  |  | 		Enumeration<?> pids = CommPortIdentifier.getPortIdentifiers();
 | 
					
						
							| 
									
										
										
										
											2009-05-31 17:23:49 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		while (pids.hasMoreElements()) {
 | 
					
						
							|  |  |  | 		    CommPortIdentifier pid = (CommPortIdentifier) pids.nextElement();
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		    if (pid.getPortType() == CommPortIdentifier.PORT_SERIAL)
 | 
					
						
							|  |  |  | 		    	list.add(pid.getName());
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 		return list.toArray(new String[0]);
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	
 | 
					
						
							|  |  |  | 	
 | 
					
						
							|  |  |  | 	
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public SerialDownload(String name) throws IOException {
 | 
					
						
							| 
									
										
										
										
											2012-12-15 20:38:47 -08:00
										 |  |  | 		CommPortIdentifier myPortID  = null;
 | 
					
						
							| 
									
										
										
										
											2009-05-31 17:23:49 +00:00
										 |  |  | 		
 | 
					
						
							| 
									
										
										
										
											2012-12-15 20:38:47 -08:00
										 |  |  | 		Enumeration<?> portIdentifiers = CommPortIdentifier.getPortIdentifiers();
 | 
					
						
							| 
									
										
										
										
											2009-05-31 17:23:49 +00:00
										 |  |  | 		while (portIdentifiers.hasMoreElements()) {
 | 
					
						
							|  |  |  | 		    CommPortIdentifier pid = (CommPortIdentifier) portIdentifiers.nextElement();
 | 
					
						
							|  |  |  | 		    
 | 
					
						
							|  |  |  | 		    if(pid.getPortType() == CommPortIdentifier.PORT_SERIAL &&
 | 
					
						
							|  |  |  | 		       pid.getName().equals(name)) {
 | 
					
						
							| 
									
										
										
										
											2012-12-15 20:38:47 -08:00
										 |  |  | 		        myPortID  = pid;
 | 
					
						
							| 
									
										
										
										
											2009-05-31 17:23:49 +00:00
										 |  |  | 		        break;
 | 
					
						
							|  |  |  | 		    }
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 		
 | 
					
						
							| 
									
										
										
										
											2012-12-15 20:38:47 -08:00
										 |  |  | 		if (myPortID == null) {
 | 
					
						
							| 
									
										
										
										
											2009-05-31 17:23:49 +00:00
										 |  |  | 			throw new IOException("Port '"+name+"' not found.");
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							| 
									
										
										
										
											2012-12-15 20:38:47 -08:00
										 |  |  | 		this.portID = myPortID ;
 | 
					
						
							| 
									
										
										
										
											2009-05-31 17:23:49 +00:00
										 |  |  | 	}
 | 
					
						
							|  |  |  | 	
 | 
					
						
							|  |  |  | 	
 | 
					
						
							|  |  |  | 	
 | 
					
						
							|  |  |  | 	
 | 
					
						
							|  |  |  | 	
 | 
					
						
							|  |  |  | 	
 | 
					
						
							|  |  |  | 	public void readData() throws IOException, PortInUseException {
 | 
					
						
							|  |  |  | 		long t0 = -1;
 | 
					
						
							|  |  |  | 		long t;
 | 
					
						
							|  |  |  | 		
 | 
					
						
							|  |  |  | 		int previous = MAGIC;
 | 
					
						
							|  |  |  | 		
 | 
					
						
							|  |  |  | 		
 | 
					
						
							|  |  |  | 		try {
 | 
					
						
							|  |  |  | 			open();
 | 
					
						
							|  |  |  | 			
 | 
					
						
							|  |  |  | 			System.err.println("Ready to read...");
 | 
					
						
							|  |  |  | 			while (true) {
 | 
					
						
							|  |  |  | 				int c = is.read();
 | 
					
						
							|  |  |  | 				t = System.nanoTime();
 | 
					
						
							|  |  |  | 				if (t0 < 0)
 | 
					
						
							|  |  |  | 					t0 = t;
 | 
					
						
							|  |  |  | 				
 | 
					
						
							|  |  |  | 				System.out.printf("%10.6f %d\n", ((double)t-t0)/1000000000.0, c);
 | 
					
						
							|  |  |  | 				
 | 
					
						
							|  |  |  | 				if (previous == MAGIC) {
 | 
					
						
							|  |  |  | 					previous = c;
 | 
					
						
							|  |  |  | 				} else {
 | 
					
						
							|  |  |  | 					System.out.printf("# Altitude: %5d\n", previous*256 + c);
 | 
					
						
							|  |  |  | 					previous = MAGIC;
 | 
					
						
							|  |  |  | 				}
 | 
					
						
							|  |  |  | 				
 | 
					
						
							|  |  |  | 				if (c < 0)
 | 
					
						
							|  |  |  | 					break;
 | 
					
						
							|  |  |  | 			}
 | 
					
						
							|  |  |  | 			
 | 
					
						
							|  |  |  | 			
 | 
					
						
							|  |  |  | 		} catch (UnsupportedCommOperationException e) {
 | 
					
						
							|  |  |  | 			// TODO Auto-generated catch block
 | 
					
						
							|  |  |  | 			e.printStackTrace();
 | 
					
						
							|  |  |  | 		} finally {
 | 
					
						
							|  |  |  | 			close();
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	
 | 
					
						
							|  |  |  | 	
 | 
					
						
							|  |  |  | 	private void open() throws PortInUseException, IOException, 
 | 
					
						
							|  |  |  | 			UnsupportedCommOperationException {
 | 
					
						
							|  |  |  | 		
 | 
					
						
							|  |  |  | 		if (port != null) {
 | 
					
						
							|  |  |  | 			System.err.println("ERROR: open() called with port="+port);
 | 
					
						
							|  |  |  | 			Thread.dumpStack();
 | 
					
						
							|  |  |  | 			close();
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 		
 | 
					
						
							|  |  |  | 		if (DEBUG) {
 | 
					
						
							|  |  |  | 			System.err.println("  Opening port...");
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		port = (SerialPort)portID.open("OpenRocket",1000);
 | 
					
						
							|  |  |  | 		
 | 
					
						
							|  |  |  | 		port.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, 
 | 
					
						
							|  |  |  | 				SerialPort.PARITY_NONE);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		port.setInputBufferSize(1);
 | 
					
						
							|  |  |  | 		port.setOutputBufferSize(1);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		is = port.getInputStream();
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 	
 | 
					
						
							|  |  |  | 	
 | 
					
						
							|  |  |  | 	private void close() {
 | 
					
						
							|  |  |  | 		if (DEBUG)
 | 
					
						
							|  |  |  | 			System.err.println("  Closing port");
 | 
					
						
							|  |  |  | 		
 | 
					
						
							|  |  |  | 		SerialPort p = port;
 | 
					
						
							|  |  |  | 		port = null;
 | 
					
						
							|  |  |  | 		is = null;
 | 
					
						
							|  |  |  | 		if (p != null)
 | 
					
						
							|  |  |  | 			p.close();
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 	
 | 
					
						
							|  |  |  | 	
 | 
					
						
							|  |  |  | 	
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	
 | 
					
						
							|  |  |  | 	public static void main(String[] arg) throws Exception {
 | 
					
						
							|  |  |  | 		
 | 
					
						
							|  |  |  | 		String device = null;
 | 
					
						
							|  |  |  | 		String[] devices = SerialDownload.getNames();
 | 
					
						
							|  |  |  | 		for (int i=0; i<devices.length; i++) {
 | 
					
						
							|  |  |  | 			if (devices[i].matches(".*USB.*")) {
 | 
					
						
							|  |  |  | 				device = devices[i];
 | 
					
						
							|  |  |  | 				break;
 | 
					
						
							|  |  |  | 			}
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 		if (device == null) {
 | 
					
						
							|  |  |  | 			System.err.println("Device not found.");
 | 
					
						
							|  |  |  | 			return;
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 		
 | 
					
						
							|  |  |  | 		
 | 
					
						
							|  |  |  | 		System.err.println("Selected device "+device);
 | 
					
						
							|  |  |  | 		
 | 
					
						
							|  |  |  | 		
 | 
					
						
							|  |  |  | 		SerialDownload p = new SerialDownload(device);
 | 
					
						
							|  |  |  | 		
 | 
					
						
							|  |  |  | 		p.readData();
 | 
					
						
							|  |  |  | 		
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 	
 | 
					
						
							|  |  |  | 	
 | 
					
						
							|  |  |  | }
 |