Add new tools to .gitignore
[fw/altos] / altoslib / AltosEepromIterable.java
index 470a7a8adf98f5c65b6f347f7b714c2a4e6aaa59..fc793579f41837469a54c8924a6b85025d9c23e9 100644 (file)
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altoslib_1;
+package org.altusmetrum.altoslib_2;
 
 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));
+                       first = false;
+               }
+
+               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 +100,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 +114,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