+ void Log(AltosEepromRecord r) throws IOException {
+ if (r.cmd != Altos.AO_LOG_INVALID) {
+ String log_line = String.format("%c %4x %4x %4x\n",
+ r.cmd, r.tick, r.a, r.b);
+ if (eeprom_file != null)
+ eeprom_file.write(log_line);
+ else
+ eeprom_pending.add(log_line);
+ }
+ }
+
+ void set_serial(int in_serial) {
+ serial = in_serial;
+ monitor.set_serial(serial);
+ }
+
+ void set_flight(int in_flight) {
+ flight = in_flight;
+ monitor.set_flight(flight);
+ }
+
+ boolean done;
+ int state;
+
+ void CaptureFull(AltosEepromChunk eechunk) throws IOException {
+ boolean any_valid = false;
+
+ extension = "eeprom";
+ set_serial(flights.config_data.serial);
+ for (int i = 0; i < eechunk.chunk_size && !done; i += AltosEepromRecord.record_length) {
+ try {
+ AltosEepromRecord r = new AltosEepromRecord(eechunk, i);
+ if (r.cmd == Altos.AO_LOG_FLIGHT)
+ set_flight(r.b);
+
+ /* Monitor state transitions to update display */
+ if (r.cmd == Altos.AO_LOG_STATE && r.a <= Altos.ao_flight_landed) {
+ state = r.a;
+ if (state > Altos.ao_flight_pad)
+ want_file = true;
+ }
+
+ if (r.cmd == Altos.AO_LOG_GPS_DATE) {
+ year = 2000 + (r.a & 0xff);
+ month = (r.a >> 8) & 0xff;
+ day = (r.b & 0xff);
+ want_file = true;
+ }
+ if (r.cmd == Altos.AO_LOG_STATE && r.a == Altos.ao_flight_landed)
+ done = true;
+ any_valid = true;
+ Log(r);
+ } catch (ParseException pe) {
+ if (parse_exception == null)
+ parse_exception = pe;
+ }
+ }
+
+ if (!any_valid)
+ done = true;
+
+ CheckFile(false);
+ }
+
+ boolean start;
+ int tiny_tick;
+
+ void CaptureTiny (AltosEepromChunk eechunk) throws IOException {
+ boolean any_valid = false;
+
+ extension = "eeprom";
+ set_serial(flights.config_data.serial);
+ for (int i = 0; i < eechunk.data.length && !done; i += 2) {
+ int v = eechunk.data16(i);
+ AltosEepromRecord r;
+
+ if (i == 0 && start) {
+ tiny_tick = 0;
+ start = false;
+ set_flight(v);
+ r = new AltosEepromRecord(Altos.AO_LOG_FLIGHT, tiny_tick, 0, v);
+ any_valid = true;
+ } else {
+ int s = v ^ 0x8000;
+
+ if (Altos.ao_flight_startup <= s && s <= Altos.ao_flight_invalid) {
+ state = s;
+ r = new AltosEepromRecord(Altos.AO_LOG_STATE, tiny_tick, state, 0);
+ if (state == Altos.ao_flight_landed)
+ done = true;
+ state = s;
+ any_valid = true;
+ } else {
+ if (v != 0xffff)
+ any_valid = true;
+
+ r = new AltosEepromRecord(Altos.AO_LOG_PRESSURE, tiny_tick, 0, v);
+
+ /*
+ * The flight software records ascent data every 100ms, and descent
+ * data every 1s.
+ */
+ if (state < Altos.ao_flight_drogue)
+ tiny_tick += 10;
+ else
+ tiny_tick += 100;
+ }
+ }
+ Log(r);
+ }
+ CheckFile(false);
+ if (!any_valid)
+ done = true;
+ }
+
+ void LogTeleScience(AltosEepromTeleScience r) throws IOException {
+ if (r.type != Altos.AO_LOG_INVALID) {
+ String log_line = String.format("%c %4x %4x %d %5d %5d %5d %5d %5d %5d %5d %5d %5d %5d %5d %5d\n",
+ r.type, r.tick, r.tm_tick, r.tm_state,
+ r.data[0], r.data[1], r.data[2], r.data[3],
+ r.data[4], r.data[5], r.data[6], r.data[7],
+ r.data[8], r.data[9], r.data[10], r.data[11]);
+ if (eeprom_file != null)
+ eeprom_file.write(log_line);
+ else
+ eeprom_pending.add(log_line);
+ }
+ }
+
+ boolean telescience_start;
+
+ void CaptureTeleScience (AltosEepromChunk eechunk) throws IOException {
+ boolean any_valid = false;
+
+ extension = "science";
+ for (int i = 0; i < eechunk.chunk_size && !done; i += AltosEepromTeleScience.record_length) {
+ try {
+ AltosEepromTeleScience r = new AltosEepromTeleScience(eechunk, i);
+ if (r.type == AltosEepromTeleScience.AO_LOG_TELESCIENCE_START) {
+ if (telescience_start) {
+ done = true;
+ break;
+ }
+ set_serial(r.data[0]);
+ set_flight(r.data[1]);
+ telescience_start = true;
+ } else {
+ if (!telescience_start)
+ break;
+ }
+ state = r.tm_state;
+ want_file =true;
+ any_valid = true;
+ LogTeleScience(r);
+ } catch (ParseException pe) {
+ if (parse_exception == null)
+ parse_exception = pe;
+ }
+ }
+
+ CheckFile(false);
+ if (!any_valid)
+ done = true;
+ }
+