blob: 22cb8f894b2f7d73ac5078032b09026304d01b06 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
/*
* Copyright © 2017 Keith Packard <keithp@keithp.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*/
package org.altusmetrum.altoslib_13;
public abstract class AltosEepromRecord implements Comparable<AltosEepromRecord> {
AltosEeprom eeprom;
int wide_tick;
final int start;
final int length;
public final static int header_length = 4;
public int cmd() {
return eeprom.data8(start);
}
public int tick() {
return eeprom.data16(start+2);
}
public int data8(int i) {
i += start + header_length;
return eeprom.data8(i);
}
public int data16(int i) {
return ((data8(i) | (data8(i+1) << 8)) << 16) >> 16;
}
public int data24(int i) {
return data8(i) | (data8(i+1) << 8) | (data8(i+2) << 16);
}
public int data32(int i) {
return data8(i) | (data8(i+1) << 8) | (data8(i+2) << 16) | (data8(i+3) << 24);
}
public boolean empty(int s) {
for (int i = 0; i < length; i++)
if (eeprom.data8(s + i) != 0xff)
return false;
return true;
}
public boolean valid(int s) {
int ck = AltosConvert.checksum(eeprom.data, s, length);
if (ck != 0) {
++eeprom.errors;
System.out.printf("invalid checksum 0x%x at 0x%x\n", ck, s);
return false;
}
return true;
}
public boolean valid() {
return valid(start);
}
private int cmdi() {
if (cmd() == AltosLib.AO_LOG_FLIGHT)
return 0;
return 1;
}
public AltosConfigData config_data() {
return eeprom.config_data();
}
public int compareTo(AltosEepromRecord o) {
int cmd_diff = cmdi() - o.cmdi();
if (cmd_diff != 0)
return cmd_diff;
int tick_diff = wide_tick - o.wide_tick;
if (tick_diff != 0)
return tick_diff;
return start - o.start;
}
/* AltosDataProvider */
public void provide_data(AltosDataListener listener, AltosCalData cal_data) {
listener.set_tick(tick());
if (cmd() == AltosLib.AO_LOG_FLIGHT)
cal_data.set_boost_tick();
listener.set_time(cal_data.time());
/* Flush any pending GPS changes */
if (!AltosLib.is_gps_cmd(cmd())) {
AltosGPS gps = listener.temp_gps();
if (gps != null)
listener.set_gps(gps);
}
}
public int next_start() {
int s = start + length;
while (s + length <= eeprom.data.size()) {
if (!empty(s) && valid(s))
return s;
s += length;
}
return -1;
}
public abstract AltosEepromRecord next();
public AltosEepromRecord(AltosEeprom eeprom, int start, int length) {
this.eeprom = eeprom;
this.start = start;
this.length = length;
}
}
|