restructure files into directories by year and "Misc" to ease testing with current...
[fw/tmflights] / Misc / dump-to-eeprom
diff --git a/Misc/dump-to-eeprom b/Misc/dump-to-eeprom
new file mode 100755 (executable)
index 0000000..e62c730
--- /dev/null
@@ -0,0 +1,135 @@
+#!/usr/bin/env nickle
+
+typedef struct {
+       int    addr;
+       int[8] data;
+} dumpline_t;
+
+dumpline_t
+read_dumpline(file f)
+{
+       dumpline_t      d;
+       string          l;
+
+       l = fgets(f);
+       if (File::sscanf(l, "%x %x %x %x %x %x %x %x %x",
+                  &d.addr,
+                  &d.data[0],
+                  &d.data[1],
+                  &d.data[2],
+                  &d.data[3],
+                  &d.data[4],
+                  &d.data[5],
+                  &d.data[6],
+                  &d.data[7]) != 9)
+               d.addr = -1;
+       return d;
+}
+
+dumpline_t[...]
+read_dumplines(file f)
+{
+       dumpline_t[...] lines;
+
+       setdim(lines, 0);
+       while (!File::end(f)) {
+               dumpline_t      line;
+
+               line = read_dumpline(f);
+               if (line.addr == -1)
+                       continue;
+               lines[dim(lines)] = line;
+       }
+       return lines;
+}
+
+int
+read_byte(file f)
+{
+       static int              off = 8;
+       static dumpline_t       d;
+
+
+       if (off == 8) {
+               if (File::end(f))
+                       return -1;
+               d = read_dumpline(f);
+               off = 0;
+       }
+       return d.data[off++];
+}
+
+int[...]
+read_bytes(file f, int len)
+{
+       int             i;
+       int[len]        a;
+       for (i = 0; i < len; i++) {
+               int     b = read_byte(f);
+               if (b < 0)
+                       return (int[0]) {};
+               a[i] = b;
+       }
+       return a;
+}
+
+void
+dump_line(file f, int len)
+{
+       int[...]        line = read_bytes(f, len);
+
+       if (dim(line) == 0)
+               return;
+
+       bool valid_block() {
+               int     sum = 0x5a;
+               static string   packet_types = "FATDSGNWHV";
+
+               if (line[0] == 0)
+                       return false;
+               if (String::index(packet_types, String::new(line[0])) < 0)
+                       return false;
+               for (int i = 0; i < len; i++)
+                       sum += line[i];
+               return (sum & 0xff) == 0;
+       }
+
+       int one_byte(int i) = line[i];
+
+       int two_bytes(int i) = line[i] + (line[i+1] << 8);
+       
+       if (valid_block()) {
+               printf("%c %04x %04x %04x\n",
+                      one_byte(0),
+                      two_bytes(2),
+                      two_bytes(4),
+                      two_bytes(6));
+       }
+}
+
+void
+dump_file(file f, int len)
+{
+       while (!File::end(f))
+               dump_line(f, len);
+}
+
+void
+doit (string name)
+{
+       twixt (file f = File::open(name, "r"); File::close(f))
+               dump_file(f, 8);
+}
+
+void
+main()
+{
+       if (dim(argv) > 1) {
+               for (int i = 1; i < dim(argv); i++)
+                       doit(argv[i]);
+       } else {
+               dump_file(stdin, 8);
+       }
+}
+
+main();