diff options
Diffstat (limited to 'altoslib')
| -rw-r--r-- | altoslib/AltosEeprom.java | 1 | ||||
| -rw-r--r-- | altoslib/AltosEepromDownload.java | 42 | ||||
| -rw-r--r-- | altoslib/AltosEepromList.java | 4 | ||||
| -rw-r--r-- | altoslib/AltosEepromLog.java | 18 | ||||
| -rw-r--r-- | altoslib/AltosEepromMonitor.java | 6 | ||||
| -rw-r--r-- | altoslib/AltosEepromRecord.java | 25 | ||||
| -rw-r--r-- | altoslib/AltosEepromRecordSet.java | 6 | ||||
| -rw-r--r-- | altoslib/AltosFile.java | 17 | 
8 files changed, 87 insertions, 32 deletions
diff --git a/altoslib/AltosEeprom.java b/altoslib/AltosEeprom.java index ad7bf881..124bd478 100644 --- a/altoslib/AltosEeprom.java +++ b/altoslib/AltosEeprom.java @@ -22,6 +22,7 @@ public class AltosEeprom {  	private AltosJson	config;  	ArrayList<Byte>		data;  	private AltosConfigData	config_data; +	int			errors = 0;  	/*  	 * Public accessor APIs diff --git a/altoslib/AltosEepromDownload.java b/altoslib/AltosEepromDownload.java index 3df8a5b4..547b523f 100644 --- a/altoslib/AltosEepromDownload.java +++ b/altoslib/AltosEepromDownload.java @@ -200,25 +200,47 @@ public class AltosEepromDownload implements Runnable {  		AltosFile f = MakeFile(flights.config_data.serial, log.flight, name_data); -		monitor.set_filename(f.toString()); +		log.set_file(f); -		FileWriter w = new FileWriter(f); +		boolean do_write = true; -		eeprom.write(w); -		w.close(); +		if (f.exists()) +			do_write = monitor.check_overwrite(f); + +		if (do_write) { +			FileWriter w = new FileWriter(f); + +			eeprom.write(w); +			w.close(); +		} + +		if (eeprom.errors != 0) +			throw new ParseException(String.format("%d CRC Errors", eeprom.errors), 0); +	} + +	static String label(int flight) { +		if (flight < 0) +			return "Corrupt"; +		else +			return "Flight"; +	} + +	static int flight(int flight) { +		if (flight < 0) +			return -flight; +		return flight;  	}  	public void run () {  		boolean success = false;  		try { -			boolean	failed = false;  			if (remote)  				link.start_remote();  			for (AltosEepromLog log : flights) {  				parse_errors = null; -				if (log.selected) { +				if (log.download_selected) {  					monitor.reset();  					try {  						CaptureLog(log); @@ -226,16 +248,16 @@ public class AltosEepromDownload implements Runnable {  						LogError(e.getMessage());  					}  				} +				success = true;  				if (parse_errors != null) { -					failed = true; -					monitor.show_message(String.format("Flight %d download error. Valid log data saved\n%s", -									   log.flight, +					monitor.show_message(String.format("%s %d download error. Valid log data saved\n%s", +									   label(log.flight), +									   flight(log.flight),  									   parse_errors),  							     link.name,  							     AltosEepromMonitor.WARNING_MESSAGE);  				}  			} -			success = !failed;  		} catch (IOException ee) {  			monitor.show_message(ee.getLocalizedMessage(),  					     link.name, diff --git a/altoslib/AltosEepromList.java b/altoslib/AltosEepromList.java index 55d47e20..c55bcaaa 100644 --- a/altoslib/AltosEepromList.java +++ b/altoslib/AltosEepromList.java @@ -87,7 +87,7 @@ public class AltosEepromList extends ArrayList<AltosEepromLog> {  							start = AltosParse.parse_hex(tokens[3]);  						if (tokens[4].equals("end"))  							end = AltosParse.parse_hex(tokens[5]); -						if (flight > 0 && start >= 0 && end > 0) +						if (flight != 0 && start >= 0 && end > 0)  							flights.add(new AltosEepromFlight(flight, start, end));  					} catch (ParseException pe) { System.out.printf("Parse error %s\n", pe.toString()); }  				} @@ -115,4 +115,4 @@ public class AltosEepromList extends ArrayList<AltosEepromLog> {  			link.flush_output();  		}  	} -}
\ No newline at end of file +} diff --git a/altoslib/AltosEepromLog.java b/altoslib/AltosEepromLog.java index 8d1f3fc4..ba722b89 100644 --- a/altoslib/AltosEepromLog.java +++ b/altoslib/AltosEepromLog.java @@ -18,6 +18,7 @@  package org.altusmetrum.altoslib_12; +import java.io.*;  import java.text.*;  import java.util.concurrent.*; @@ -32,7 +33,15 @@ public class AltosEepromLog {  	public int		start_block;  	public int		end_block; -	public boolean		selected; +	public boolean		download_selected; +	public boolean		delete_selected; +	public boolean		graph_selected; + +	public File		file; + +	public void set_file(File file) { +		this.file = file; +	}  	public AltosEepromLog(AltosConfigData config_data,  			      AltosLink link, @@ -50,8 +59,11 @@ public class AltosEepromLog {  		serial = config_data.serial;  		/* -		 * Select all flights for download +		 * Select all flights for download and graph, but not +		 * for delete  		 */ -		selected = true; +		download_selected = true; +		delete_selected = false; +		graph_selected = true;  	}  } diff --git a/altoslib/AltosEepromMonitor.java b/altoslib/AltosEepromMonitor.java index a99ec687..11144a3a 100644 --- a/altoslib/AltosEepromMonitor.java +++ b/altoslib/AltosEepromMonitor.java @@ -18,6 +18,8 @@  package org.altusmetrum.altoslib_12; +import java.io.*; +  public interface AltosEepromMonitor {  	public void set_block(int in_block); @@ -28,8 +30,6 @@ public interface AltosEepromMonitor {  	public void set_flight(int in_flight); -	public void set_filename(String in_file); -  	public void set_thread(Thread eeprom_thread);  	final static int INFO_MESSAGE = 0; @@ -38,6 +38,8 @@ public interface AltosEepromMonitor {  	public void show_message(String message, String title, int message_type); +	public Boolean check_overwrite(File file); +  	public void start();  	public void done(boolean success); diff --git a/altoslib/AltosEepromRecord.java b/altoslib/AltosEepromRecord.java index 12519e6b..43e8ea4d 100644 --- a/altoslib/AltosEepromRecord.java +++ b/altoslib/AltosEepromRecord.java @@ -50,8 +50,22 @@ public abstract class AltosEepromRecord implements Comparable<AltosEepromRecord>  		return data8(i) | (data8(i+1) << 8) | (data8(i+2) << 16) | (data8(i+3) << 24);  	} +	public boolean empty(int s) { +		for (int i = 0; i < length; i++) +			if (eeprom.data8(s + i) != 0xff) +				return false; +		return true; +	} +  	public boolean valid(int s) { -		return AltosConvert.checksum(eeprom.data, s, length) == 0; +		int	ck = AltosConvert.checksum(eeprom.data, s, length); + +		if (ck != 0) { +			++eeprom.errors; +			System.out.printf("invalid checksum 0x%x at 0x%x\n", ck, s); +			return false; +		} +		return true;  	}  	public boolean valid() { @@ -100,25 +114,18 @@ public abstract class AltosEepromRecord implements Comparable<AltosEepromRecord>  		int	s = start + length;  		while (s + length <= eeprom.data.size()) { -			if (valid(s)) +			if (!empty(s) && valid(s))  				return s;  			s += length;  		}  		return -1;  	} -	public boolean hasNext() { -		return next_start() >= 0; -	} -  	public abstract AltosEepromRecord next();  	public AltosEepromRecord(AltosEeprom eeprom, int start, int length) {  		this.eeprom = eeprom;  		this.start = start;  		this.length = length; - -		while (start + length < eeprom.data.size() && !valid()) -			start += length;  	}  } diff --git a/altoslib/AltosEepromRecordSet.java b/altoslib/AltosEepromRecordSet.java index d91ae3ac..82a5ea2a 100644 --- a/altoslib/AltosEepromRecordSet.java +++ b/altoslib/AltosEepromRecordSet.java @@ -97,7 +97,7 @@ public class AltosEepromRecordSet implements AltosRecordSet {  		int	tick = 0;  		boolean first = true; -		for (;;) { +		do {  			int	t = record.tick();  			if (first) { @@ -110,10 +110,8 @@ public class AltosEepromRecordSet implements AltosRecordSet {  			}  			record.wide_tick = tick;  			ordered.add(record); -			if (!record.hasNext()) -				break;  			record = record.next(); -		} +		} while (record != null);  	}  	public AltosEepromRecordSet(InputStream input) throws IOException { diff --git a/altoslib/AltosFile.java b/altoslib/AltosFile.java index 69f779c1..6f98b87a 100644 --- a/altoslib/AltosFile.java +++ b/altoslib/AltosFile.java @@ -36,10 +36,23 @@ public class AltosFile extends File {  		return String.format("-via-%04d", receiver);  	} +	static private String label(int flight) { +		if (flight < 0) +			return "corrupt"; +		else +			return "flight"; +	} + +	static private int flight(int flight) { +		if (flight < 0) +			return -flight; +		return flight; +	} +  	public AltosFile(int year, int month, int day, int serial, int flight, int receiver, String extension) {  		super (AltosPreferences.logdir(), -		       String.format("%04d-%02d-%02d-serial-%s-flight-%s%s.%s", -				     year, month, day, number(serial), number(flight), receiver(receiver), extension)); +		       String.format("%04d-%02d-%02d-serial-%s-%s-%s%s.%s", +				     year, month, day, number(serial), label(flight), number(flight(flight)), receiver(receiver), extension));  	}  	public AltosFile(int year, int month, int day, int serial, int flight, String extension) {  | 
