File: AltosTelemetryMegaSensor.java

package info (click to toggle)
altos 1.9.22-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 83,712 kB
  • sloc: ansic: 120,853; java: 42,921; makefile: 8,573; sh: 4,995; xml: 2,154; pascal: 2,008
file content (197 lines) | stat: -rw-r--r-- 5,421 bytes parent folder | download | duplicates (3)
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
/*
 * Copyright © 2011 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.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
 */

package org.altusmetrum.altoslib_14;

public class AltosTelemetryMegaSensor extends AltosTelemetryStandard {
	int	orient() { return int8(5); }

	int	accel() { return int16(6); }
	int	pres() { return int32(8); }
	int	temp() { return int16(12); }

	int	accel_x() { return int16(14); }
	int	accel_y() { return int16(16); }
	int	accel_z() { return int16(18); }

	int	gyro_x() { return int16(20); }
	int	gyro_y() { return int16(22); }
	int	gyro_z() { return int16(24); }

	int	mag_x() { return int16(26); }
	int	mag_z() { return int16(28); }
	int	mag_y() { return int16(30); }

	int imu_type;

	private int accel_across(int imu_type) {
		switch (imu_type) {
		case AltosIMU.imu_type_telemega_v1_v2:
		case AltosIMU.imu_type_telemega_v3:
		case AltosIMU.imu_type_easymega_v1:
			return accel_x();
		case AltosIMU.imu_type_easymega_v2:
			return -accel_y();
		case  AltosIMU.imu_type_telemega_v4:
			return -accel_y();
		default:
			return AltosLib.MISSING;
		}
	}

	private int accel_along(int imu_type) {
		switch (imu_type) {
		case AltosIMU.imu_type_telemega_v1_v2:
		case AltosIMU.imu_type_telemega_v3:
		case AltosIMU.imu_type_easymega_v1:
			return accel_y();
		case AltosIMU.imu_type_easymega_v2:
		case AltosIMU.imu_type_telemega_v4:
			return accel_x();
		default:
			return AltosLib.MISSING;
		}
	}

	private int accel_through(int imu_type) {
		return accel_z();
	}

	private int gyro_roll(int imu_type) {
		switch (imu_type) {
		case AltosIMU.imu_type_telemega_v1_v2:
		case AltosIMU.imu_type_telemega_v3:
		case AltosIMU.imu_type_easymega_v1:
			return gyro_y();
		case AltosIMU.imu_type_easymega_v2:
		case AltosIMU.imu_type_telemega_v4:
			return gyro_x();
		default:
			return AltosLib.MISSING;
		}
	}

	private int gyro_pitch(int imu_type) {
		switch (imu_type) {
		case AltosIMU.imu_type_telemega_v1_v2:
		case AltosIMU.imu_type_telemega_v3:
		case AltosIMU.imu_type_easymega_v1:
			return gyro_x();
		case AltosIMU.imu_type_easymega_v2:
			return -gyro_y();
		case AltosIMU.imu_type_telemega_v4:
			return gyro_y();
		default:
			return AltosLib.MISSING;
		}
	}

	private int gyro_yaw(int imu_type) {
		return gyro_z();
	}

	private int mag_across(int imu_type) {
		switch (imu_type) {
		case AltosIMU.imu_type_telemega_v1_v2:
		case AltosIMU.imu_type_telemega_v3:
		case AltosIMU.imu_type_easymega_v1:
			return mag_x();
		case AltosIMU.imu_type_telemega_v4:
		case AltosIMU.imu_type_easymega_v2:
			return -mag_y();
		default:
			return AltosLib.MISSING;
		}
	}

	private int mag_along(int imu_type) {
		switch (imu_type) {
		case AltosIMU.imu_type_telemega_v1_v2:
		case AltosIMU.imu_type_telemega_v3:
		case AltosIMU.imu_type_easymega_v1:
			return mag_y();
		case AltosIMU.imu_type_easymega_v2:
		case AltosIMU.imu_type_telemega_v4:
			return mag_x();
		default:
			return AltosLib.MISSING;
		}
	}

	private int mag_through(int imu_type) {
		return mag_z();
	}

	public AltosTelemetryMegaSensor(int[] bytes, int imu_type) throws AltosCRCException {
		super(bytes);
		switch (imu_type) {
		case AltosIMU.imu_type_telemega_v1_v2:
		case AltosIMU.imu_type_telemega_v3:
			if (serial() < 3000)
				imu_type = AltosIMU.imu_type_telemega_v1_v2;
			else
				imu_type = AltosIMU.imu_type_telemega_v3;
			break;
		default:
			break;
		}
		this.imu_type = imu_type;
	}

	public void provide_data(AltosDataListener listener) {
		super.provide_data(listener);

		AltosCalData cal_data = listener.cal_data();

		listener.set_acceleration(cal_data.acceleration(accel()));
		listener.set_pressure(pres());
		listener.set_temperature(temp() / 100.0);

		listener.set_orient(orient());
		cal_data.set_imu_type(imu_type);

		/* XXX we have no calibration data for these values */

		if (cal_data.accel_zero_along == AltosLib.MISSING)
			cal_data.set_accel_zero(0, 0, 0);
		if (cal_data.gyro_zero_roll == AltosLib.MISSING)
			cal_data.set_gyro_zero(0, 0, 0);

		int	accel_along = accel_along(imu_type);
		int	accel_across = accel_across(imu_type);
		int	accel_through = accel_through(imu_type);

		int	gyro_roll = gyro_roll(imu_type);
		int	gyro_pitch = gyro_pitch(imu_type);
		int	gyro_yaw = gyro_yaw(imu_type);

		int	mag_along = mag_along(imu_type);
		int	mag_across = mag_across(imu_type);
		int	mag_through = mag_through(imu_type);

		listener.set_accel(cal_data.accel_along(accel_along),
				   cal_data.accel_across(accel_across),
				   cal_data.accel_through(accel_through));
		listener.set_gyro(cal_data.gyro_roll(gyro_roll),
				  cal_data.gyro_pitch(gyro_pitch),
				  cal_data.gyro_yaw(gyro_yaw));
		listener.set_mag(cal_data.mag_along(mag_along),
				 cal_data.mag_across(mag_across),
				 cal_data.mag_through(mag_through));
	}
}