altoslib: Pass InterruptedException up the stack instead of hiding it
[fw/altos] / altoslib / AltosIMU.java
1 /*
2  * Copyright © 2012 Keith Packard <keithp@keithp.com>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; version 2 of the License.
7  *
8  * This program is distributed in the hope that it will be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11  * General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License along
14  * with this program; if not, write to the Free Software Foundation, Inc.,
15  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
16  */
17
18 package org.altusmetrum.altoslib_2;
19
20 import java.util.concurrent.*;
21
22 public class AltosIMU implements Cloneable {
23         public int              accel_x;
24         public int              accel_y;
25         public int              accel_z;
26
27         public int              gyro_x;
28         public int              gyro_y;
29         public int              gyro_z;
30
31         public boolean parse_string(String line) {
32                 if (!line.startsWith("Accel:"))
33                         return false;
34
35                 String[] items = line.split("\\s+");
36
37                 if (items.length >= 8) {
38                         accel_x = Integer.parseInt(items[1]);
39                         accel_y = Integer.parseInt(items[2]);
40                         accel_z = Integer.parseInt(items[3]);
41                         gyro_x = Integer.parseInt(items[5]);
42                         gyro_y = Integer.parseInt(items[6]);
43                         gyro_z = Integer.parseInt(items[7]);
44                 }
45                 return true;
46         }
47
48         public AltosIMU clone() {
49                 AltosIMU        n = new AltosIMU();
50
51                 n.accel_x = accel_x;
52                 n.accel_y = accel_y;
53                 n.accel_z = accel_z;
54
55                 n.gyro_x = gyro_x;
56                 n.gyro_y = gyro_y;
57                 n.gyro_z = gyro_z;
58                 return n;
59         }
60
61         static public void update_state(AltosState state, AltosLink link, AltosConfigData config_data) throws InterruptedException {
62                 try {
63                         AltosIMU        imu = new AltosIMU(link);
64
65                         if (imu != null)
66                                 state.set_imu(imu);
67                 } catch (TimeoutException te) {
68                 }
69         }
70
71         public AltosIMU() {
72                 accel_x = AltosLib.MISSING;
73                 accel_y = AltosLib.MISSING;
74                 accel_z = AltosLib.MISSING;
75
76                 gyro_x = AltosLib.MISSING;
77                 gyro_y = AltosLib.MISSING;
78                 gyro_z = AltosLib.MISSING;
79         }
80
81         public AltosIMU(AltosLink link) throws InterruptedException, TimeoutException {
82                 this();
83                 link.printf("I\n");
84                 for (;;) {
85                         String line = link.get_reply_no_dialog(5000);
86                         if (line == null) {
87                                 throw new TimeoutException();
88                         }
89                         if (parse_string(line))
90                                 break;
91                 }
92         }
93 }