From: Keith Packard Date: Tue, 9 May 2017 09:11:25 +0000 (-0700) Subject: altoslib: Save eeprom data in new .eeprom format X-Git-Tag: 1.8~128 X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=commitdiff_plain;h=17e20a6d2dab1f4bd1375bfd9e1c5230ee2c1119;hp=e311cefae19d7dc71fb10e9a943daa8e2313c8f8 altoslib: Save eeprom data in new .eeprom format A chunk of json for the config values followed by hex numbers for the data. Signed-off-by: Keith Packard --- diff --git a/altoslib/AltosEepromChunk.java b/altoslib/AltosEepromChunk.java index 32d9f8ea..1deb0ded 100644 --- a/altoslib/AltosEepromChunk.java +++ b/altoslib/AltosEepromChunk.java @@ -63,40 +63,8 @@ public class AltosEepromChunk { return true; } - public AltosEeprom eeprom(int offset, int log_format, AltosState state) throws ParseException { - AltosEeprom eeprom = null; - switch (log_format) { - case AltosLib.AO_LOG_FORMAT_FULL: - eeprom = new AltosEepromTM(this, offset); - break; - case AltosLib.AO_LOG_FORMAT_TINY: - eeprom = new AltosEepromTMini(this, offset, state); - break; - case AltosLib.AO_LOG_FORMAT_TELEMETRY: - case AltosLib.AO_LOG_FORMAT_TELESCIENCE: - break; - case AltosLib.AO_LOG_FORMAT_TELEMEGA: - case AltosLib.AO_LOG_FORMAT_TELEMEGA_OLD: - eeprom = new AltosEepromMega(this, offset, log_format); - break; - case AltosLib.AO_LOG_FORMAT_TELEMETRUM: - eeprom = new AltosEepromMetrum2(this, offset); - break; - case AltosLib.AO_LOG_FORMAT_TELEMINI2: - case AltosLib.AO_LOG_FORMAT_TELEMINI3: - case AltosLib.AO_LOG_FORMAT_EASYMINI: - eeprom = new AltosEepromMini(this, offset); - break; - case AltosLib.AO_LOG_FORMAT_TELEGPS: - eeprom = new AltosEepromGPS(this, offset); - break; - case AltosLib.AO_LOG_FORMAT_TELEFIRETWO: - eeprom = new AltosEepromFireTwo(this, offset); - break; - default: - throw new ParseException("unknown eeprom format " + log_format, 0); - } - return eeprom; + public boolean erased() { + return erased(0, chunk_size); } public AltosEepromChunk(AltosLink link, int block, boolean flush) diff --git a/altoslib/AltosEepromDownload.java b/altoslib/AltosEepromDownload.java index c38fcfdf..74912ed4 100644 --- a/altoslib/AltosEepromDownload.java +++ b/altoslib/AltosEepromDownload.java @@ -30,65 +30,38 @@ public class AltosEepromDownload implements Runnable { Thread eeprom_thread; AltosEepromMonitor monitor; - boolean want_file; - FileWriter eeprom_file; - LinkedList eeprom_pending; - AltosEepromList flights; - boolean success; String parse_errors; - AltosState state; - private void FlushPending() throws IOException { - for (String s : flights.config_data) { - eeprom_file.write(s); - eeprom_file.write('\n'); - } + private boolean has_gps_date(AltosState state) { + if (state == null) + return false; + + AltosGPS gps = state.gps; - for (String s : eeprom_pending) - eeprom_file.write(s); + return gps != null && + gps.year != AltosLib.MISSING && + gps.month != AltosLib.MISSING && + gps.day != AltosLib.MISSING; } - private void CheckFile(boolean force) throws IOException { - if (eeprom_file != null) - return; - if (force || (state.flight != 0 && want_file)) { - AltosFile eeprom_name; + private AltosFile MakeFile(int serial, int flight, AltosState state) throws IOException { + AltosFile eeprom_name; + + if (has_gps_date(state)) { AltosGPS gps = state.gps; + eeprom_name = new AltosFile(gps.year, gps.month, gps.day, + serial, flight, "eeprom"); + } else + eeprom_name = new AltosFile(serial, flight, "eeprom"); - if (gps != null && - gps.year != AltosLib.MISSING && - gps.month != AltosLib.MISSING && - gps.day != AltosLib.MISSING) - { - eeprom_name = new AltosFile(gps.year, gps.month, gps.day, - state.serial, state.flight, "eeprom"); - } else - eeprom_name = new AltosFile(state.serial, state.flight, "eeprom"); - - eeprom_file = new FileWriter(eeprom_name); - if (eeprom_file != null) { - monitor.set_filename(eeprom_name.getName()); - FlushPending(); - eeprom_pending = null; - } - } + return eeprom_name; } boolean done; int prev_state; int state_block; - void LogEeprom(AltosEeprom r) throws IOException { - if (r.cmd != AltosLib.AO_LOG_INVALID) { - String line = r.string(); - if (eeprom_file != null) - eeprom_file.write(line); - else - eeprom_pending.add(line); - } - } - void LogError(String error) { if (parse_errors != null) parse_errors.concat(error.concat("\n")); @@ -96,112 +69,101 @@ public class AltosEepromDownload implements Runnable { parse_errors = error; } - void CaptureEeprom(AltosEepromChunk eechunk, int log_format) throws IOException, ParseException { - boolean any_valid = false; - boolean got_flight = false; - - int record_length = 8; - - state.set_serial(flights.config_data.serial); - monitor.set_serial(flights.config_data.serial); + class BlockCache extends Hashtable { + AltosEepromLog log; - for (int i = 0; i < AltosEepromChunk.chunk_size && !done; i += record_length) { - AltosEeprom r = null; - - try { - r = eechunk.eeprom(i, log_format, state); - } catch (ParseException pe) { - LogError(pe.getMessage()); - r = null; - } - - if (r == null) - continue; - - record_length = r.record_length(); - - r.update_state(state); + AltosEepromChunk get(int start, boolean add) throws TimeoutException, InterruptedException { + if (contains(start)) + return super.get(start); + AltosEepromChunk eechunk = new AltosEepromChunk(link, start, start == log.start_block); + if (add) + put(start, eechunk); + return eechunk; + } - if (!got_flight && state.flight != AltosLib.MISSING) - monitor.set_flight(state.flight); + public BlockCache(AltosEepromLog log) { + this.log = log; + } + } - /* Monitor state transitions to update display */ - if (state.state() != AltosLib.ao_flight_invalid && - state.state() <= AltosLib.ao_flight_landed) - { - if (state.state() > AltosLib.ao_flight_pad) - want_file = true; - if (state.state() == AltosLib.ao_flight_landed) - done = true; - } + int FindLastLog(AltosEepromLog log, BlockCache cache) throws TimeoutException, InterruptedException { + int low = log.start_block; + int high = log.end_block - 1; - if (state.gps != null) - want_file = true; + while (low <= high) { + int mid = (high + low) / 2; - if (r.valid) { - any_valid = true; - LogEeprom(r); - } + if (!cache.get(mid, true).erased()) + low = mid + 1; + else + high = mid - 1; } - if (!any_valid) - done = true; - - CheckFile(false); + return low; } void CaptureLog(AltosEepromLog log) throws IOException, InterruptedException, TimeoutException, ParseException { int block, state_block = 0; int log_format = flights.config_data.log_format; - - state = new AltosState(); + BlockCache cache = new BlockCache(log); done = false; if (flights.config_data.serial < 0) throw new IOException("no serial number found"); - /* Reset per-capture variables */ - want_file = false; - eeprom_pending = new LinkedList(); - /* Set serial number in the monitor dialog window */ - /* Now scan the eeprom, reading blocks of data and converting to .eeprom file form */ - - state_block = log.start_block; - prev_state = AltosLib.ao_flight_startup; - for (block = log.start_block; !done && block < log.end_block; block++) { - AltosEepromChunk eechunk = new AltosEepromChunk(link, block, block == log.start_block); - - /* - * Guess what kind of data is there if the device - * didn't tell us - */ - - if (log_format == AltosLib.AO_LOG_FORMAT_UNKNOWN) { - if (block == log.start_block) { - if (eechunk.data(0) == AltosLib.AO_LOG_FLIGHT) - log_format = AltosLib.AO_LOG_FORMAT_FULL; - else - log_format = AltosLib.AO_LOG_FORMAT_TINY; - } - } + monitor.set_serial(log.serial); + monitor.set_flight(log.flight); - CaptureEeprom (eechunk, log_format); + int start_block = log.start_block; + int end_block = FindLastLog(log, cache); - if (state.state() != prev_state && state.state() != AltosLib.ao_flight_invalid) { - state_block = block; - prev_state = state.state(); - } + monitor.set_max(end_block - start_block - 1); + + ArrayList data = new ArrayList(); + + /* Now scan the eeprom, reading blocks of data to create a byte array of data */ + + for (block = start_block; block < end_block; block++) { + monitor.set_block(block - start_block); + + AltosEepromChunk eechunk = cache.get(block, false); + + for (int i = 0; i < eechunk.data.length; i++) + data.add((byte) eechunk.data[i]); + } - monitor.set_value(state.state_name(), - state.state(), - block - state_block, - block - log.start_block); + /* Construct our internal representation of the eeprom data */ + AltosEepromNew eeprom = new AltosEepromNew(flights.config_data, data); + + /* Now see if we can't actually parse the resulting + * file to generate a better filename. Note that this + * doesn't need to work; we'll still save the data using + * a less accurate name. + */ + AltosEepromRecordSet set = new AltosEepromRecordSet(eeprom); + + AltosState state = new AltosState(); + + for (AltosState s : set) { + state = s; + if (state.gps != null) + break; } - CheckFile(true); + + AltosFile f = MakeFile(flights.config_data.serial, log.flight, state); + + monitor.set_filename(f.toString()); + + FileWriter w = new FileWriter(f); + + eeprom.write(w); + w.close(); } public void run () { + boolean success = false; + try { boolean failed = false; if (remote) @@ -211,16 +173,11 @@ public class AltosEepromDownload implements Runnable { parse_errors = null; if (log.selected) { monitor.reset(); - eeprom_file = null; try { CaptureLog(log); } catch (ParseException e) { LogError(e.getMessage()); } - if (eeprom_file != null) { - eeprom_file.flush(); - eeprom_file.close(); - } } if (parse_errors != null) { failed = true; @@ -273,12 +230,6 @@ public class AltosEepromDownload implements Runnable { link = given_link; remote = given_remote; flights = given_flights; - success = false; - - if (flights.config_data.log_has_state()) - monitor.set_states(AltosLib.ao_flight_boost, AltosLib.ao_flight_landed); - else - monitor.set_states(AltosLib.ao_flight_invalid, AltosLib.ao_flight_invalid); monitor.start(); } diff --git a/altoslib/AltosEepromMonitor.java b/altoslib/AltosEepromMonitor.java index 792fde27..250568ac 100644 --- a/altoslib/AltosEepromMonitor.java +++ b/altoslib/AltosEepromMonitor.java @@ -20,9 +20,9 @@ package org.altusmetrum.altoslib_11; public interface AltosEepromMonitor { - public void set_states(int min_state, int max_state); + public void set_block(int in_block); - public void set_value(String in_state_name, int in_state, int in_state_block, int in_block); + public void set_max(int in_max); public void set_serial(int in_serial); diff --git a/altoslib/AltosEepromNew.java b/altoslib/AltosEepromNew.java index c8f44509..b76e3e19 100644 --- a/altoslib/AltosEepromNew.java +++ b/altoslib/AltosEepromNew.java @@ -103,29 +103,22 @@ public class AltosEepromNew { return true; } - static private byte[] byte_list_to_array(List bytes) { - byte[] data = new byte[bytes.size()]; - int i = 0; - - for (Byte b : bytes) { - data[i++] = b; - } - return data; - } - private boolean read_data(Reader r) throws IOException { BufferedReader br = new BufferedReader(r); String s; data = new ArrayList(); while ((s = br.readLine()) != null) { + String[] tokens = s.split("\\s+"); for (int i = 0; i < tokens.length; i++) { - try { - data.add((byte) AltosLib.fromhex(tokens[i])); - } catch (NumberFormatException e) { - throw new IOException(e.toString()); + if (tokens[i].length() > 0) { + try { + data.add((byte) AltosLib.fromhex(tokens[i])); + } catch (NumberFormatException e) { + throw new IOException(e.toString()); + } } } } @@ -270,6 +263,16 @@ public class AltosEepromNew { read(new StringReader(s)); } + public AltosEepromNew(AltosJson config, ArrayList data) { + this.config = config; + this.data = data; + } + + public AltosEepromNew(AltosConfigData config_data, ArrayList data) { + this.config = new AltosJson(config_data); + this.data = data; + } + public AltosEepromNew() { } } diff --git a/altoslib/AltosEepromRecord.java b/altoslib/AltosEepromRecord.java index efcca857..c0edb952 100644 --- a/altoslib/AltosEepromRecord.java +++ b/altoslib/AltosEepromRecord.java @@ -51,8 +51,12 @@ public abstract class AltosEepromRecord implements Comparable return data8(i) | (data8(i+1) << 8) | (data8(i+2) << 16) | (data8(i+3) << 24); } + public boolean valid(int s) { + return AltosConvert.checksum(eeprom.data, s, length) == 0; + } + public boolean valid() { - return AltosConvert.checksum(eeprom.data, start, length) == 0; + return valid(start); } private int cmdi() { @@ -81,8 +85,19 @@ public abstract class AltosEepromRecord implements Comparable state.set_tick(tick()); } + public int next_start() { + int s = start + length; + + while (s + length < eeprom.data.size()) { + if (valid(s)) + return s; + s += length; + } + return -1; + } + public boolean hasNext() { - return start + length * 2 < eeprom.data.size(); + return next_start() >= 0; } public abstract AltosEepromRecord next(); @@ -91,5 +106,8 @@ public abstract class AltosEepromRecord implements Comparable this.eeprom = eeprom; this.start = start; this.length = length; + + while (start + length < eeprom.data.size() && !valid()) + start += length; } } diff --git a/altoslib/AltosEepromRecordFireTwo.java b/altoslib/AltosEepromRecordFireTwo.java index 9b92f111..dd9e34e1 100644 --- a/altoslib/AltosEepromRecordFireTwo.java +++ b/altoslib/AltosEepromRecordFireTwo.java @@ -90,9 +90,10 @@ public class AltosEepromRecordFireTwo extends AltosEepromRecord { } public AltosEepromRecord next() { - if (start + length + length < eeprom.data.size()) - return new AltosEepromRecordFireTwo(eeprom, start + length); - return null; + int s = next_start(); + if (s < 0) + return null; + return new AltosEepromRecordFireTwo(eeprom, s); } public AltosEepromRecordFireTwo(AltosEepromNew eeprom, int start) { diff --git a/altoslib/AltosEepromRecordFull.java b/altoslib/AltosEepromRecordFull.java index d240da28..4b1a460f 100644 --- a/altoslib/AltosEepromRecordFull.java +++ b/altoslib/AltosEepromRecordFull.java @@ -108,9 +108,10 @@ public class AltosEepromRecordFull extends AltosEepromRecord { } public AltosEepromRecord next() { - if (start + length + length < eeprom.data.size()) - return new AltosEepromRecordFull(eeprom, start + length); - return null; + int s = next_start(); + if (s < 0) + return null; + return new AltosEepromRecordFull(eeprom, s); } public AltosEepromRecordFull(AltosEepromNew eeprom, int start) { diff --git a/altoslib/AltosEepromRecordGps.java b/altoslib/AltosEepromRecordGps.java index d547ef02..1312d3ec 100644 --- a/altoslib/AltosEepromRecordGps.java +++ b/altoslib/AltosEepromRecordGps.java @@ -145,9 +145,10 @@ public class AltosEepromRecordGps extends AltosEepromRecord { } public AltosEepromRecord next() { - if (start + length + length < eeprom.data.size()) - return new AltosEepromRecordGps(eeprom, start + length); - return null; + int s = next_start(); + if (s < 0) + return null; + return new AltosEepromRecordGps(eeprom, s); } public AltosEepromRecordGps(AltosEepromNew eeprom, int start) { diff --git a/altoslib/AltosEepromRecordMega.java b/altoslib/AltosEepromRecordMega.java index 167f666b..1c6d1aee 100644 --- a/altoslib/AltosEepromRecordMega.java +++ b/altoslib/AltosEepromRecordMega.java @@ -237,9 +237,10 @@ public class AltosEepromRecordMega extends AltosEepromRecord { } public AltosEepromRecord next() { - if (start + length + length < eeprom.data.size()) - return new AltosEepromRecordMega(eeprom, start + length); - return null; + int s = next_start(); + if (s < 0) + return null; + return new AltosEepromRecordMega(eeprom, s); } public AltosEepromRecordMega(AltosEepromNew eeprom, int start) { diff --git a/altoslib/AltosEepromRecordMetrum.java b/altoslib/AltosEepromRecordMetrum.java index df4d23a2..c11b6aac 100644 --- a/altoslib/AltosEepromRecordMetrum.java +++ b/altoslib/AltosEepromRecordMetrum.java @@ -146,9 +146,10 @@ public class AltosEepromRecordMetrum extends AltosEepromRecord { } public AltosEepromRecord next() { - if (start + length + length < eeprom.data.size()) - return new AltosEepromRecordMetrum(eeprom, start + length); - return null; + int s = next_start(); + if (s < 0) + return null; + return new AltosEepromRecordMetrum(eeprom, s); } public AltosEepromRecordMetrum(AltosEepromNew eeprom, int start) { diff --git a/altoslib/AltosEepromRecordMini.java b/altoslib/AltosEepromRecordMini.java index 4c5a88bf..f0fc61ad 100644 --- a/altoslib/AltosEepromRecordMini.java +++ b/altoslib/AltosEepromRecordMini.java @@ -83,9 +83,10 @@ public class AltosEepromRecordMini extends AltosEepromRecord { } public AltosEepromRecord next() { - if (start + length + length < eeprom.data.size()) - return new AltosEepromRecordMini(eeprom, start + length); - return null; + int s = next_start(); + if (s < 0) + return null; + return new AltosEepromRecordMini(eeprom, s); } public AltosEepromRecordMini(AltosEepromNew eeprom, int start) { diff --git a/altoslib/AltosEepromRecordTiny.java b/altoslib/AltosEepromRecordTiny.java index 6c04bfee..fda6ddff 100644 --- a/altoslib/AltosEepromRecordTiny.java +++ b/altoslib/AltosEepromRecordTiny.java @@ -21,6 +21,10 @@ public class AltosEepromRecordTiny extends AltosEepromRecord { return eeprom.data16(start); } + public boolean valid(int s) { + return eeprom.data16(s) != 0xffff; + } + public int cmd() { if (start == 0) return AltosLib.AO_LOG_FLIGHT; @@ -66,9 +70,10 @@ public class AltosEepromRecordTiny extends AltosEepromRecord { } public AltosEepromRecord next() { - if (start + record_length * 2 < eeprom.data.size()) - return new AltosEepromRecordTiny(eeprom, start + record_length); - return null; + int s = next_start(); + if (s < 0) + return null; + return new AltosEepromRecordTiny(eeprom, s); } public AltosEepromRecordTiny(AltosEepromNew eeprom, int start) { diff --git a/altoslib/AltosJson.java b/altoslib/AltosJson.java index 94ec2aee..9191be68 100644 --- a/altoslib/AltosJson.java +++ b/altoslib/AltosJson.java @@ -185,6 +185,7 @@ class JsonToken { static final int _colon = 9; static final int _end = 10; static final int _error = 11; + static final int _none = 12; static String token_name(int token) { switch (token) { @@ -254,11 +255,11 @@ class JsonToken { * Lexer for json */ class JsonLexer extends JsonUtil { - Reader f; - int line; - int ungot = -2; - StringBuffer pending_token; - JsonToken token; + Reader f; + int line; + int ungot = -2; + StringBuffer pending_token; + private JsonToken token; static class keyword { String word; @@ -424,11 +425,17 @@ class JsonLexer extends JsonUtil { } void next() { - token = lex(); + token = null; + } + + JsonToken token() { + if (token == null) + token = lex(); + return token; } JsonToken expect(int e) { - JsonToken t = token; + JsonToken t = token(); if (t.token != e) throw new IllegalArgumentException(String.format("got \"%s\" while expecting \"%s\"", token.token_name(), @@ -470,7 +477,7 @@ class JsonParse { lexer.next(); for (;;) { /* Allow for empty hashes */ - if (lexer.token.token == JsonToken._cc) { + if (lexer.token().token == JsonToken._cc) { lexer.next(); return hash; } @@ -481,7 +488,7 @@ class JsonParse { AltosJson value = value(); hash.put(key, value); - switch (lexer.token.token) { + switch (lexer.token().token) { case JsonToken._comma: lexer.next(); break; @@ -489,7 +496,7 @@ class JsonParse { lexer.next(); return hash; default: - parse_error("got %s expect \",\" or \"}\"", lexer.token.token_name()); + parse_error("got %s expect \",\" or \"}\"", lexer.token().token_name()); return null; } } @@ -502,14 +509,14 @@ class JsonParse { lexer.next(); for (int i = 0;; i++) { /* Allow for empty arrays */ - if (lexer.token.token == JsonToken._cs) { + if (lexer.token().token == JsonToken._cs) { lexer.next(); return array; } AltosJson value = value(); array.put(i, value); - switch (lexer.token.token) { + switch (lexer.token().token) { case JsonToken._comma: lexer.next(); break; @@ -517,7 +524,7 @@ class JsonParse { lexer.next(); return array; default: - parse_error("got %s expect \",\" or \"]\"", lexer.token.token_name()); + parse_error("got %s expect \",\" or \"]\"", lexer.token().token_name()); return null; } } @@ -527,29 +534,29 @@ class JsonParse { * identify the next object in the input */ AltosJson value() { - switch (lexer.token.token) { + switch (lexer.token().token) { case JsonToken._oc: return new AltosJson(hash()); case JsonToken._os: return new AltosJson(array()); case JsonToken._double: - double dval = lexer.token.dval; + double dval = lexer.token().dval; lexer.next(); return new AltosJson(dval); case JsonToken._long: - long lval = lexer.token.lval; + long lval = lexer.token().lval; lexer.next(); return new AltosJson(lval); case JsonToken._string: - String sval = lexer.token.sval; + String sval = lexer.token().sval; lexer.next(); return new AltosJson(sval); case JsonToken._boolean: - boolean bval = lexer.token.bval; + boolean bval = lexer.token().bval; lexer.next(); return new AltosJson(bval); default: - parse_error("Unexpected token \"%s\"", lexer.token.token_name()); + parse_error("Unexpected token \"%s\"", lexer.token().token_name()); } return null; } diff --git a/altosuilib/AltosEepromMonitorUI.java b/altosuilib/AltosEepromMonitorUI.java index d708ae96..03661662 100644 --- a/altosuilib/AltosEepromMonitorUI.java +++ b/altosuilib/AltosEepromMonitorUI.java @@ -35,7 +35,6 @@ public class AltosEepromMonitorUI extends AltosUIDialog implements AltosEepromMo JLabel file_value; JButton cancel; JProgressBar pbar; - int min_state, max_state; ActionListener listener; static final int progress_max = 10000; @@ -138,11 +137,6 @@ public class AltosEepromMonitorUI extends AltosUIDialog implements AltosEepromMo listener = l; } - public void set_states(int min_state, int max_state) { - this.min_state = min_state; - this.max_state = max_state; - } - public void set_thread(Thread in_eeprom_thread) { final Thread eeprom_thread = in_eeprom_thread; cancel.addActionListener(new ActionListener() { @@ -157,52 +151,30 @@ public class AltosEepromMonitorUI extends AltosUIDialog implements AltosEepromMo setVisible(true); } - private void set_value_internal(String state_name, int state, int state_block, int block) { + int max_block = 1; + + public void set_block_internal(int block) { double pos; String s; - if (min_state == AltosLib.ao_flight_invalid) { - int lblock = block; - if (lblock > 1000) - lblock = 1000; - pos = lblock / 1000.0; - s = String.format("block %d", block); - } else { - if (state == AltosLib.ao_flight_invalid) - state = 0; - if (state_block > 100) - state_block = 100; - if (state < min_state) state = min_state; - if (state > max_state) state = max_state; - - if (state == max_state) - state_block = 0; - - state -= min_state; - - int nstate = max_state - min_state; + pos = (double) block / (double) max_block; - double spos = (double) state / (double) nstate; - double bpos = state_block / 100.0; - - pos = spos + bpos / nstate; - - s = String.format("block %d state %s", block, state_name); - } + s = String.format("block %d of %d", block, max_block); pbar.setString(s); pbar.setValue((int) (pos * progress_max)); } - public void set_value(String in_state_name, int in_state, int in_state_block, int in_block) { - final String state_name = in_state_name; - final int state = in_state; - final int state_block = in_state_block; + public void set_max(int max_block) { + this.max_block = max_block; + } + + public void set_block(int in_block) { final int block = in_block; Runnable r = new Runnable() { public void run() { try { - set_value_internal(state_name, state, state_block, block); + set_block_internal(block); } catch (Exception ex) { } } @@ -283,7 +255,8 @@ public class AltosEepromMonitorUI extends AltosUIDialog implements AltosEepromMo } private void reset_internal() { - set_value_internal("startup",min_state,0, 0); + set_max(1); + set_block_internal(0); set_flight_internal(0); set_filename_internal(""); }