altoslib, altosui: Restructured state management now does TM eeprom files
[fw/altos] / altoslib / AltosEepromIterable.java
index 470a7a8adf98f5c65b6f347f7b714c2a4e6aaa59..8e6a23139d4d5a5a000e0c6978f0b55054880276 100644 (file)
@@ -21,6 +21,74 @@ import java.io.*;
 import java.util.*;
 import java.text.*;
 
+class AltosEepromOrdered implements Comparable<AltosEepromOrdered> {
+       AltosEeprom     eeprom;
+       int             index;
+       int             tick;
+
+       int cmdi() {
+               if (eeprom.cmd == AltosLib.AO_LOG_FLIGHT)
+                       return 0;
+               return 1;
+       }
+
+       public int compareTo(AltosEepromOrdered o) {
+               int     cmd_diff = cmdi() - o.cmdi();
+
+               if (cmd_diff != 0)
+                       return cmd_diff;
+
+               int     tick_diff = tick - o.tick;
+
+               if (tick_diff != 0)
+                       return tick_diff;
+               return index - o.index;
+       }
+
+       AltosEepromOrdered (AltosEeprom eeprom, int index, int tick) {
+               this.eeprom = eeprom;
+               this.index = index;
+               this.tick = tick;
+       }
+}
+
+class AltosEepromOrderedIterator implements Iterator<AltosEeprom> {
+       TreeSet<AltosEepromOrdered>     olist;
+       Iterator<AltosEepromOrdered>    oiterator;
+
+       public AltosEepromOrderedIterator(Iterable<AltosEeprom> eeproms) {
+               olist = new TreeSet<AltosEepromOrdered>();
+
+               int     tick = 0;
+               int     index = 0;
+               boolean first = true;
+
+               for (AltosEeprom e : eeproms) {
+                       int     t = e.tick;
+                       if (first)
+                               tick = t;
+                       else {
+                               while (t < tick - 32767)
+                                       t += 65536;
+                               tick = t;
+                       }
+                       olist.add(new AltosEepromOrdered(e, index++, tick));
+               }
+               oiterator = olist.iterator();
+       }
+
+       public boolean hasNext() {
+               return oiterator.hasNext();
+       }
+
+       public AltosEeprom next() {
+               return oiterator.next().eeprom;
+       }
+
+       public void remove () {
+       }
+}
+
 public class AltosEepromIterable implements Iterable<AltosEeprom> {
        public LinkedList<AltosEeprom> eeproms;
 
@@ -30,7 +98,7 @@ public class AltosEepromIterable implements Iterable<AltosEeprom> {
        }
 
        public AltosState state() {
-               AltosState      state = new AltosState(null);
+               AltosState      state = new AltosState();
 
                for (AltosEeprom header : eeproms)
                        header.update_state(state);
@@ -44,6 +112,6 @@ public class AltosEepromIterable implements Iterable<AltosEeprom> {
        public Iterator<AltosEeprom> iterator() {
                if (eeproms == null)
                        eeproms = new LinkedList<AltosEeprom>();
-               return eeproms.iterator();
+               return new AltosEepromOrderedIterator(eeproms);
        }
 }
\ No newline at end of file