Rev 1564 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1564 | Rev 1568 | ||
---|---|---|---|
1 | package dongfang.mkt.main; |
1 | package dongfang.mkt.main; |
2 | 2 | ||
3 | import java.io.BufferedReader; |
3 | import java.io.BufferedReader; |
4 | import java.io.FileOutputStream; |
4 | import java.io.FileOutputStream; |
5 | import java.io.IOException; |
5 | import java.io.IOException; |
6 | import java.io.InputStreamReader; |
6 | import java.io.InputStreamReader; |
7 | import java.io.OutputStream; |
7 | import java.io.OutputStream; |
8 | import java.io.OutputStreamWriter; |
8 | import java.io.OutputStreamWriter; |
9 | import java.io.PrintStream; |
9 | import java.io.PrintStream; |
10 | import java.io.Writer; |
10 | import java.io.Writer; |
11 | import java.util.ArrayList; |
11 | import java.util.ArrayList; |
12 | import java.util.Date; |
12 | import java.util.Date; |
13 | import java.util.List; |
13 | import java.util.List; |
14 | 14 | ||
15 | import dongfang.mkt.comm.FrameQueue; |
15 | import dongfang.mkt.comm.FrameQueue; |
16 | import dongfang.mkt.comm.MKConnection; |
16 | import dongfang.mkt.comm.MKConnection; |
17 | import dongfang.mkt.comm.serial.RXTXSerialPort; |
17 | import dongfang.mkt.comm.serial.RXTXSerialPort; |
- | 18 | import dongfang.mkt.comm.tcp.MKTCPConnection; |
|
18 | import dongfang.mkt.frames.OSDDataRequestFrame; |
19 | import dongfang.mkt.frames.OSDDataRequestFrame; |
19 | import dongfang.mkt.frames.OSDDataResponseFrame; |
20 | import dongfang.mkt.frames.OSDDataResponseFrame; |
20 | 21 | ||
21 | public class OSDLogger { |
22 | public class OSDLogger { |
22 | private static final PrintStream STDERR = System.out; |
23 | private static final PrintStream STDERR = System.out; |
23 | // private static final FrameFactory ff = MKVersion.getFrameFactory(null); |
24 | // private static final FrameFactory ff = MKVersion.getFrameFactory(null); |
24 | 25 | ||
25 | interface Logger { |
26 | interface Logger { |
26 | void start(String timestamp) throws IOException; |
27 | void start(String timestamp) throws IOException; |
27 | void log(OSDDataResponseFrame f, long timestamp) throws IOException; |
28 | void log(OSDDataResponseFrame f, long timestamp) throws IOException; |
28 | void end() throws IOException; |
29 | void end() throws IOException; |
29 | } |
30 | } |
30 | 31 | ||
31 | static class ConsoleOSDLogger implements Logger { |
32 | static class ConsoleOSDLogger implements Logger { |
32 | public void start(String logId) {} |
33 | public void start(String logId) {} |
33 | 34 | ||
34 | public void log(OSDDataResponseFrame f, long timestamp) { |
35 | public void log(OSDDataResponseFrame f, long timestamp) { |
35 | if (f == null) { |
36 | if (f == null) { |
36 | System.out.println("Oops, null response frame."); |
37 | System.out.println("Oops, null response frame."); |
37 | return; |
38 | return; |
38 | } |
39 | } |
39 | System.out.println(f); |
40 | System.out.println(f); |
40 | } |
41 | } |
41 | 42 | ||
42 | public void end() {} |
43 | public void end() {} |
43 | } |
44 | } |
44 | 45 | ||
45 | static class XMLOSDLogger implements Logger { |
46 | static class XMLOSDLogger implements Logger { |
46 | Writer w; |
47 | Writer w; |
47 | String encoding; |
48 | String encoding; |
48 | 49 | ||
49 | XMLOSDLogger(OutputStream out, String encoding) throws IOException { |
50 | XMLOSDLogger(OutputStream out, String encoding) throws IOException { |
50 | w = new OutputStreamWriter(out, encoding); |
51 | w = new OutputStreamWriter(out, encoding); |
51 | this.encoding = encoding; |
52 | this.encoding = encoding; |
52 | } |
53 | } |
53 | 54 | ||
54 | public void start(String logId) throws IOException { |
55 | public void start(String logId) throws IOException { |
55 | w.write("<?xml version=\"1.0\" encoding=\"" + encoding + "\"?>\n"); |
56 | w.write("<?xml version=\"1.0\" encoding=\"" + encoding + "\"?>\n"); |
56 | w.write("<mk-osddata time=\"" + logId + "\">\n"); |
57 | w.write("<mk-osddata time=\"" + logId + "\">\n"); |
57 | } |
58 | } |
58 | 59 | ||
59 | public void log(OSDDataResponseFrame f, long timestamp) |
60 | public void log(OSDDataResponseFrame f, long timestamp) |
60 | throws IOException { |
61 | throws IOException { |
61 | if (f==null) |
62 | if (f==null) |
62 | return; |
63 | return; |
63 | w.write(" <dataset timestamp=\"" + timestamp + "\" version=\"" + f.getVersion() + "\">\n"); |
64 | w.write(" <dataset timestamp=\"" + timestamp + "\" version=\"" + f.getVersion() + "\">\n"); |
64 | w.write(" <currentPosition " + f.getCurrentPosition().toXML() + "/>\n"); |
65 | w.write(" <currentPosition " + f.getCurrentPosition().toXML() + "/>\n"); |
65 | w.write(" <targetPosition " + f.getTargetPosition().toXML() + " " + f.getCurrentToTarget().toXML() + "/>\n"); |
66 | w.write(" <targetPosition " + f.getTargetPosition().toXML() + " " + f.getCurrentToTarget().toXML() + "/>\n"); |
66 | w.write(" <homePosition " + f.getHomePosition().toXML() + " " + f.getCurrentToHome().toXML() + "/>\n"); |
67 | w.write(" <homePosition " + f.getHomePosition().toXML() + " " + f.getCurrentToHome().toXML() + "/>\n"); |
67 | w.write(" <heading compass=\"" + f.getCompassHeading() + "\" flight=\"" + f.getDirectionOfFlight() + "\" groundSpeed=\"" + ((double)f.getGroundSpeed())/100 + "\"/>\n"); |
68 | w.write(" <heading compass=\"" + f.getCompassHeading() + "\" flight=\"" + f.getDirectionOfFlight() + "\" groundSpeed=\"" + f.getGroundSpeed() + "\"/>\n"); |
68 | 69 | ||
- | 70 | w.write(" <waypoints index=\"" + f.getWaypointIndex() + "\" count=\"" + f.getWaypointCount() + "\"/>\n"); |
|
- | 71 | ||
69 | w.write(" <waypoints index=\"" + f.getWaypointIndex() + "\" count=\"" + f.getWaypointCount() + "\"/>\n"); |
72 | double gpsHeight = f.getCurrentPosition().getAltitude() - f.getHomePosition().getAltitude(); |
70 | w.write(" <height barometric=\"" + f.getHeightByPressure() + "\" barometricVerticalVelocity=\"" + f.getVerticalVelocityByPressure() + "\" gpsVerticalVelocity=\"" + f.getVerticalVelocityByGPS() + "\"/>\n"); |
73 | w.write(" <height barometric=\"" + f.getHeightByPressure() + "\" gps=\"" + gpsHeight + "\" barometricVerticalVelocity=\"" + f.getVerticalVelocityByPressure() + "\" gpsVerticalVelocity=\"" + f.getVerticalVelocityByGPS() + "\"/>\n"); |
71 | 74 | ||
72 | w.write(" <status rcQuality=\"" + f.getRcQuality() + "\" fcflags=\"" + f.getFcFlags() + "\" fcflags2=\"" + f.getFcFlags2() + "\" ncflags=\"" + f.getNcFlags() + "\" errorCode=\"" + f.getErrorCode() + "\" numberOfSatellites=\"" + f.getNumberOfSatellites() + "\"/>\n"); |
75 | w.write(" <status rcQuality=\"" + f.getRcQuality() + "\" fcflags=\"" + f.getFcFlags() + "\" fcflags2=\"" + f.getFcFlags2() + "\" ncflags=\"" + f.getNcFlags() + "\" errorCode=\"" + f.getErrorCode() + "\" numberOfSatellites=\"" + f.getNumberOfSatellites() + "\"/>\n"); |
73 | w.write(" <flight time=\"" + f.getFlightTime() + "\" batteryVoltage=\"" + f.getBatteryVoltage() + "\" throttle=\"" + f.getThrottle() + "\" current=\"" + f.getCurrent() + "\" capacityUsed=\"" + f.getCapacityUsed() + "\"/>\n"); |
76 | w.write(" <flight time=\"" + f.getFlightTime() + "\" batteryVoltage=\"" + f.getBatteryVoltage() + "\" throttle=\"" + f.getThrottle() + "\" current=\"" + f.getCurrent() + "\" capacityUsed=\"" + f.getCapacityUsed() + "\"/>\n"); |
74 | 77 | ||
75 | w.write(" <attitude pitch=\"" + f.getPitchAngle() + "\" roll=\"" + f.getRollAngle() + "\"/>\n"); |
78 | w.write(" <attitude pitch=\"" + f.getPitchAngle() + "\" roll=\"" + f.getRollAngle() + "\"/>\n"); |
76 | 79 | ||
77 | /* |
80 | /* |
78 | private int operatingRadius; |
81 | private int operatingRadius; |
79 | private int targetLoiterTime; |
82 | private int targetLoiterTime; |
80 | private int setpointForAltitude; // 16 bit signed. |
83 | private int setpointForAltitude; // 16 bit signed. |
81 | */ |
84 | */ |
82 | 85 | ||
83 | w.write(" </dataset>\n"); |
86 | w.write(" </dataset>\n"); |
84 | } |
87 | } |
85 | 88 | ||
86 | public void end() throws IOException { |
89 | public void end() throws IOException { |
87 | w.write("</mk-osddata>\n"); |
90 | w.write("</mk-osddata>\n"); |
88 | w.flush(); |
91 | w.flush(); |
89 | w.close(); |
92 | w.close(); |
90 | } |
93 | } |
91 | } |
94 | } |
92 | 95 | ||
93 | static class CompositeOSDLogger implements Logger { |
96 | static class CompositeOSDLogger implements Logger { |
94 | List<Logger> loggers = new ArrayList<Logger>(2); |
97 | List<Logger> loggers = new ArrayList<Logger>(2); |
95 | 98 | ||
96 | public void log(OSDDataResponseFrame f, long timestamp) throws IOException { |
99 | public void log(OSDDataResponseFrame f, long timestamp) throws IOException { |
97 | for (Logger l : loggers) |
100 | for (Logger l : loggers) |
98 | l.log(f, timestamp); |
101 | l.log(f, timestamp); |
99 | } |
102 | } |
100 | 103 | ||
101 | public void start(String logId) throws IOException { |
104 | public void start(String logId) throws IOException { |
102 | for (Logger l : loggers) |
105 | for (Logger l : loggers) |
103 | l.start(logId); |
106 | l.start(logId); |
104 | } |
107 | } |
105 | 108 | ||
106 | public void end() throws IOException { |
109 | public void end() throws IOException { |
107 | for (Logger l : loggers) |
110 | for (Logger l : loggers) |
108 | l.end(); |
111 | l.end(); |
109 | } |
112 | } |
110 | 113 | ||
111 | void add(Logger l) { |
114 | void add(Logger l) { |
112 | loggers.add(l); |
115 | loggers.add(l); |
113 | } |
116 | } |
114 | } |
117 | } |
115 | 118 | ||
116 | private static Logger createLogger(OutputStream out, String encoding) throws IOException { |
119 | private static Logger createLogger(OutputStream out, String encoding) throws IOException { |
117 | Logger consoleLogger = new ConsoleOSDLogger(); |
120 | Logger consoleLogger = new ConsoleOSDLogger(); |
118 | XMLOSDLogger xmlLogger = new XMLOSDLogger(out, encoding); |
121 | XMLOSDLogger xmlLogger = new XMLOSDLogger(out, encoding); |
119 | CompositeOSDLogger logger = new CompositeOSDLogger(); |
122 | CompositeOSDLogger logger = new CompositeOSDLogger(); |
120 | logger.add(consoleLogger); |
123 | logger.add(consoleLogger); |
121 | logger.add(xmlLogger); |
124 | logger.add(xmlLogger); |
122 | return logger; |
125 | return logger; |
123 | } |
126 | } |
124 | 127 | ||
125 | private void prepareLoggers(final FrameQueue q, final Logger logger) |
128 | private void prepareLoggers(final FrameQueue q, final Logger logger) |
126 | throws IOException { |
129 | throws IOException { |
127 | new Thread() { |
130 | new Thread() { |
128 | public void run() { |
131 | public void run() { |
129 | } |
132 | } |
130 | }.start(); |
133 | }.start(); |
131 | } |
134 | } |
132 | 135 | ||
133 | private void osd(final FrameQueue q, final Logger logger, final int interval) throws IOException { |
136 | private void osd(final FrameQueue q, final Logger logger, final int interval) throws IOException { |
134 | long timer = 0; |
137 | long timer = 0; |
135 | OSDDataRequestFrame f = new OSDDataRequestFrame(); |
138 | OSDDataRequestFrame f = new OSDDataRequestFrame(); |
136 | f.setAutoSendInterval(interval); |
139 | f.setAutoSendInterval(interval); |
137 | BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); |
140 | BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); |
138 | Long firsttimestamp = null; |
141 | Long firsttimestamp = null; |
139 | while (!in.ready()) |
142 | while (!in.ready()) |
140 | try { |
143 | try { |
141 | long now = System.currentTimeMillis(); |
144 | long now = System.currentTimeMillis(); |
142 | if (now - timer > 3000) { |
145 | if (now - timer > 3000) { |
143 | timer = now; |
146 | timer = now; |
144 | q.sendRequest(f); |
147 | q.sendRequest(f); |
145 | } |
148 | } |
146 | OSDDataResponseFrame rf = (OSDDataResponseFrame) q.getResponseFor(f, 5000); |
149 | OSDDataResponseFrame rf = (OSDDataResponseFrame) q.getResponseFor(f, 5000); |
147 | long timestamp = System.currentTimeMillis(); |
150 | long timestamp = System.currentTimeMillis(); |
148 | if (firsttimestamp == null) { |
151 | if (firsttimestamp == null) { |
149 | firsttimestamp = timestamp; |
152 | firsttimestamp = timestamp; |
150 | timestamp = 0; |
153 | timestamp = 0; |
151 | } else { |
154 | } else { |
152 | timestamp -= firsttimestamp; |
155 | timestamp -= firsttimestamp; |
153 | } |
156 | } |
154 | logger.log(rf, timestamp); |
157 | logger.log(rf, timestamp); |
155 | } catch (IOException ex) { |
158 | } catch (IOException ex) { |
156 | STDERR.println(ex); |
159 | STDERR.println(ex); |
157 | } |
160 | } |
158 | } |
161 | } |
159 | 162 | ||
160 | public static void main(String[] args) throws IOException { |
163 | public static void main(String[] args) throws IOException { |
161 | OSDLogger test = new OSDLogger(); |
164 | OSDLogger test = new OSDLogger(); |
162 | 165 | ||
163 | MKConnection _port = new RXTXSerialPort(); |
166 | MKConnection _port = new MKTCPConnection(); //RXTXSerialPort(); |
164 | _port.init(null); |
167 | _port.init("8080"); |
165 | 168 | ||
166 | FrameQueue q = new FrameQueue(_port); |
169 | FrameQueue q = new FrameQueue(_port); |
167 | String encoding = "iso-8859-1"; |
170 | String encoding = "iso-8859-1"; |
168 | 171 | ||
169 | OutputStream fout = new FileOutputStream("osd.xml"); |
172 | OutputStream fout = new FileOutputStream("osd.xml"); |
170 | 173 | ||
171 | Logger logger = createLogger(fout, encoding); |
174 | Logger logger = createLogger(fout, encoding); |
172 | logger.start(new Date().toGMTString()); |
175 | logger.start(new Date().toGMTString()); |
173 | test.osd(q, logger, 20); |
176 | test.osd(q, logger, 20); |
174 | logger.end(); |
177 | logger.end(); |
175 | fout.close(); |
178 | fout.close(); |
176 | } |
179 | } |
177 | } |
180 | } |
178 | 181 |