Airfest 2013: Bdale's new airframe on Loki M with TMv1 and Tmega
[fw/tmflights] / dump-to-eeprom
1 #!/usr/bin/env nickle
2
3 typedef struct {
4         int    addr;
5         int[8] data;
6 } dumpline_t;
7
8 dumpline_t
9 read_dumpline(file f)
10 {
11         dumpline_t      d;
12         string          l;
13
14         l = fgets(f);
15         if (File::sscanf(l, "%x %x %x %x %x %x %x %x %x",
16                    &d.addr,
17                    &d.data[0],
18                    &d.data[1],
19                    &d.data[2],
20                    &d.data[3],
21                    &d.data[4],
22                    &d.data[5],
23                    &d.data[6],
24                    &d.data[7]) != 9)
25                 d.addr = -1;
26         return d;
27 }
28
29 dumpline_t[...]
30 read_dumplines(file f)
31 {
32         dumpline_t[...] lines;
33
34         setdim(lines, 0);
35         while (!File::end(f)) {
36                 dumpline_t      line;
37
38                 line = read_dumpline(f);
39                 if (line.addr == -1)
40                         continue;
41                 lines[dim(lines)] = line;
42         }
43         return lines;
44 }
45
46 int
47 read_byte(file f)
48 {
49         static int              off = 8;
50         static dumpline_t       d;
51
52
53         if (off == 8) {
54                 if (File::end(f))
55                         return -1;
56                 d = read_dumpline(f);
57                 off = 0;
58         }
59         return d.data[off++];
60 }
61
62 int[...]
63 read_bytes(file f, int len)
64 {
65         int             i;
66         int[len]        a;
67         for (i = 0; i < len; i++) {
68                 int     b = read_byte(f);
69                 if (b < 0)
70                         return (int[0]) {};
71                 a[i] = b;
72         }
73         return a;
74 }
75
76 void
77 dump_line(file f, int len)
78 {
79         int[...]        line = read_bytes(f, len);
80
81         if (dim(line) == 0)
82                 return;
83
84         bool valid_block() {
85                 int     sum = 0x5a;
86                 static string   packet_types = "FATDSGNWHV";
87
88                 if (line[0] == 0)
89                         return false;
90                 if (String::index(packet_types, String::new(line[0])) < 0)
91                         return false;
92                 for (int i = 0; i < len; i++)
93                         sum += line[i];
94                 return (sum & 0xff) == 0;
95         }
96
97         int one_byte(int i) = line[i];
98
99         int two_bytes(int i) = line[i] + (line[i+1] << 8);
100        
101         if (valid_block()) {
102                 printf("%c %04x %04x %04x\n",
103                        one_byte(0),
104                        two_bytes(2),
105                        two_bytes(4),
106                        two_bytes(6));
107         }
108 }
109
110 void
111 dump_file(file f, int len)
112 {
113         while (!File::end(f))
114                 dump_line(f, len);
115 }
116
117 void
118 doit (string name)
119 {
120         twixt (file f = File::open(name, "r"); File::close(f))
121                 dump_file(f, 8);
122 }
123
124 void
125 main()
126 {
127         if (dim(argv) > 1) {
128                 for (int i = 1; i < dim(argv); i++)
129                         doit(argv[i]);
130         } else {
131                 dump_file(stdin, 8);
132         }
133 }
134
135 main();