/dongfang_FC_rewrite_tool/src/dongfang/mkt/RequestFrameVisitor.java |
---|
13,6 → 13,8 |
import dongfang.mkt.frames.LoopbackTestRequestFrame; |
import dongfang.mkt.frames.MotorTestRequestFrame; |
import dongfang.mkt.frames.OSDDataRequestFrame; |
import dongfang.mkt.frames.ProfilerLabelRequestFrame; |
import dongfang.mkt.frames.ProfilerRequestFrame; |
import dongfang.mkt.frames.ReadExternalControlRequestFrame; |
import dongfang.mkt.frames.ReadIMUConfigurationRequestFrame; |
import dongfang.mkt.frames.ReadMotorMixerRequestFrame; |
30,7 → 32,9 |
public interface RequestFrameVisitor { |
// void visit(RequestFrame f) throws IOException; |
void visit(AnalogDebugLabelRequestFrame f) throws IOException; |
void visit(ProfilerLabelRequestFrame f) throws IOException; |
void visit(DebugRequestFrame f) throws IOException; |
void visit(ProfilerRequestFrame f) throws IOException; |
void visit(LoopbackTestRequestFrame f) throws IOException; |
void visit(MotorTestRequestFrame f) throws IOException; |
void visit(VersionRequestFrame f) throws IOException; |
/dongfang_FC_rewrite_tool/src/dongfang/mkt/comm/MKInputStream.java |
---|
9,7 → 9,6 |
import dongfang.mkt.frames.AllDisplaysResponseFrame; |
import dongfang.mkt.frames.AnalogDebugLabelResponseFrame; |
import dongfang.mkt.frames.AttitudeDataResponseFrame; |
import dongfang.mkt.frames.ChangeParameterSetResponseFrame; |
import dongfang.mkt.frames.CompassHeadingResponseFrame; |
import dongfang.mkt.frames.ConfirmFrame; |
import dongfang.mkt.frames.DCMMatrixResponseFrame; |
16,6 → 15,8 |
import dongfang.mkt.frames.DebugResponseFrame; |
import dongfang.mkt.frames.MotorTestResponseFrame; |
import dongfang.mkt.frames.OSDDataResponseFrame; |
import dongfang.mkt.frames.ProfilerLabelResponseFrame; |
import dongfang.mkt.frames.ProfilerResponseFrame; |
import dongfang.mkt.frames.ReadExternalControlResponseFrame; |
import dongfang.mkt.frames.ReadIMUConfigurationResponseFrame; |
import dongfang.mkt.frames.ReadMotorMixerResponseFrame; |
225,6 → 226,7 |
result = f; |
break; |
} |
/* |
case 'F': { |
ChangeParameterSetResponseFrame f = new ChangeParameterSetResponseFrame(address); |
f.setParameterSetNumber(base64InputStream.readByte()); |
231,6 → 233,15 |
result = f; |
break; |
} |
*/ |
case 'F': { |
ProfilerLabelResponseFrame f = new ProfilerLabelResponseFrame(address); |
f.setChannel(base64InputStream.readByte()); |
f.setLabel(base64InputStream.readChars(16)); |
result = f; |
break; |
} |
case 'G': { |
ReadExternalControlResponseFrame f = new ReadExternalControlResponseFrame(address); |
f.setDigital(base64InputStream.readBytes(2)); |
424,6 → 435,14 |
break; |
} |
*/ |
case 'U': { |
ProfilerResponseFrame f = new ProfilerResponseFrame(address); |
f.setTotalHits(base64InputStream.readSignedDWord()); |
for (int i=0; i<16; i++) |
f.setActivity(i, base64InputStream.readWord()); |
result = f; |
break; |
} |
case 'V': { |
VersionResponseFrame f = new VersionResponseFrame(address); |
f.setSWMajor(base64InputStream.readByte()); |
/dongfang_FC_rewrite_tool/src/dongfang/mkt/comm/MKOutputStream.java |
---|
15,6 → 15,8 |
import dongfang.mkt.frames.LoopbackTestRequestFrame; |
import dongfang.mkt.frames.MotorTestRequestFrame; |
import dongfang.mkt.frames.OSDDataRequestFrame; |
import dongfang.mkt.frames.ProfilerLabelRequestFrame; |
import dongfang.mkt.frames.ProfilerRequestFrame; |
import dongfang.mkt.frames.ReadExternalControlRequestFrame; |
import dongfang.mkt.frames.ReadIMUConfigurationRequestFrame; |
import dongfang.mkt.frames.ReadMotorMixerRequestFrame; |
133,6 → 135,11 |
base64OutputStream.writeByte(f.getChannel()); |
} |
public void visit(ProfilerLabelRequestFrame f) throws IOException { |
writeByte('f'); |
base64OutputStream.writeByte(f.getChannel()); |
} |
public void visit(AttitudeDataRequestFrame f) throws IOException { |
writeByte('c'); |
base64OutputStream.writeByte(f.getAutoSendInterval()); |
143,6 → 150,11 |
base64OutputStream.writeByte(f.getAutoSendInterval()); |
} |
public void visit(ProfilerRequestFrame f) throws IOException { |
writeByte('u'); |
base64OutputStream.writeByte(f.getAutoSendInterval()); |
} |
public void visit(DCMMatrixRequestFrame f) throws IOException { |
writeByte('e'); |
} |
/dongfang_FC_rewrite_tool/src/dongfang/mkt/frames/RequestFrameVisitor.java |
---|
File deleted |
\ No newline at end of file |
/dongfang_FC_rewrite_tool/src/dongfang/mkt/frames/ProfilerLabelRequestFrame.java |
---|
0,0 → 1,21 |
package dongfang.mkt.frames; |
import java.io.IOException; |
import dongfang.mkt.RequestFrameVisitor; |
public class ProfilerLabelRequestFrame extends RequestFrame { |
int channel; |
public ProfilerLabelRequestFrame(int address, int channel) { |
super(address); |
this.channel = channel; |
} |
public int getChannel() { |
return channel; |
} |
public void accept(RequestFrameVisitor o) throws IOException { |
o.visit(this); |
} |
} |
/dongfang_FC_rewrite_tool/src/dongfang/mkt/frames/ProfilerLabelResponseFrame.java |
---|
0,0 → 1,42 |
package dongfang.mkt.frames; |
public class ProfilerLabelResponseFrame extends ResponseFrame { |
private int channel; |
private char[] label; |
public ProfilerLabelResponseFrame(int address) { |
super(address); |
} |
@Override |
public boolean isResponseTo(RequestFrame r) { |
return r instanceof ProfilerLabelRequestFrame |
&& ((ProfilerLabelRequestFrame)r).getChannel() == channel; |
} |
public int getChannel() { |
return channel; |
} |
public void setChannel(int channel) { |
this.channel = channel; |
} |
public char[] getLabel() { |
return label; |
} |
public String getLabelAsString() { |
return new String(label); |
} |
public void setLabel(char[] label) { |
this.label = label; |
} |
public String toString() { |
return getClass().getSimpleName() + ": label=" + getLabelAsString(); |
} |
} |
/dongfang_FC_rewrite_tool/src/dongfang/mkt/frames/ProfilerRequestFrame.java |
---|
0,0 → 1,26 |
package dongfang.mkt.frames; |
import java.io.IOException; |
import dongfang.mkt.RequestFrameVisitor; |
public class ProfilerRequestFrame extends RequestFrame { |
private int autoSendInterval; |
public ProfilerRequestFrame(int address) { |
super(address); |
} |
public int getAutoSendInterval() { |
return autoSendInterval; |
} |
public void setAutoSendInterval(int autoSendInterval) { |
this.autoSendInterval = autoSendInterval; |
} |
public void accept(RequestFrameVisitor o) throws IOException { |
o.visit(this); |
} |
} |
/dongfang_FC_rewrite_tool/src/dongfang/mkt/frames/ProfilerResponseFrame.java |
---|
0,0 → 1,51 |
package dongfang.mkt.frames; |
public class ProfilerResponseFrame extends ResponseFrame { |
private final static int NUM_ENTRIES = 16; |
private int[] activities= new int[NUM_ENTRIES]; |
private int totalHits; |
public ProfilerResponseFrame(int address) { |
super(address); |
} |
public int[] getActivities() { |
return activities; |
} |
public void setActivity(int index, int value) { |
this.activities[index ]= value; |
} |
@Override |
public boolean isResponseTo(RequestFrame r) { |
return r instanceof ProfilerRequestFrame; |
} |
public int getTotalHits() { |
return totalHits; |
} |
public void setTotalHits(int totalHits) { |
this.totalHits = totalHits; |
} |
public double asFraction(int activity) { |
return (double)activities[activity] / (double)totalHits; |
} |
public String toString() { |
StringBuilder result = new StringBuilder(); |
result.append(getClass().getSimpleName()+"\r"); |
result.append("activities\r"); |
for (int i=0; i<activities.length; i++) { |
result.append(i); |
result.append(':'); |
result.append(activities[i]); |
result.append('\r'); |
} |
return result.toString(); |
} |
} |
/dongfang_FC_rewrite_tool/src/dongfang/mkt/main/MKProfiler.java |
---|
0,0 → 1,216 |
package dongfang.mkt.main; |
import java.io.BufferedReader; |
import java.io.FileOutputStream; |
import java.io.IOException; |
import java.io.InputStreamReader; |
import java.io.OutputStream; |
import java.io.OutputStreamWriter; |
import java.io.PrintStream; |
import java.io.Writer; |
import java.util.ArrayList; |
import java.util.Date; |
import java.util.LinkedList; |
import java.util.List; |
import dongfang.mkt.comm.FrameQueue; |
import dongfang.mkt.comm.MKConnection; |
import dongfang.mkt.comm.serial.RXTXSerialPort; |
import dongfang.mkt.frames.Frame; |
import dongfang.mkt.frames.ProfilerLabelRequestFrame; |
import dongfang.mkt.frames.ProfilerLabelResponseFrame; |
import dongfang.mkt.frames.ProfilerRequestFrame; |
import dongfang.mkt.frames.ProfilerResponseFrame; |
public class MKProfiler { |
private final static int NUM_ENTRIES = 16; |
private static final PrintStream STDERR = System.out; |
// private static final FrameFactory ff = MKVersion.getFrameFactory(null); |
interface ProfilerLogger { |
void setLabel(int index, String label); |
void start(String timestamp) throws IOException; |
void log(ProfilerResponseFrame f, long timestamp) throws IOException; |
void end() throws IOException; |
} |
static class ConsoleProfilerLogger implements ProfilerLogger { |
String[] labels = new String[NUM_ENTRIES]; |
public void setLabel(int channel, String label) { |
labels[channel] = label; |
} |
public void start(String logId) {} |
public void log(ProfilerResponseFrame f, long timestamp) { |
if (f == null) { |
System.out.println("Oops, null response frame."); |
return; |
} |
int l = f.getActivities()==null ? 0 : f.getActivities().length; |
for (int i = 0; i < l; i++) { |
String label = labels[i] == null ? ("Activity " + i) : labels[i]; |
System.out.println(label + ":\t" + f.asFraction(i) * 100.0); |
} |
} |
public void end() {} |
} |
static class XMLProfilerLogger implements ProfilerLogger { |
String[] labels = new String[NUM_ENTRIES]; |
Writer w; |
String encoding; |
XMLProfilerLogger(OutputStream out, String encoding) throws IOException { |
w = new OutputStreamWriter(out, encoding); |
this.encoding = encoding; |
} |
public void setLabel(int channel, String label) { |
labels[channel] = label.trim(); |
} |
public void start(String logId) throws IOException { |
w.write("<?xml version=\"1.0\" encoding=\"" + encoding + "\"?>\n"); |
w.write("<mk-profilerdata time=\"" + logId + "\">\n"); |
} |
public void log(ProfilerResponseFrame f, long timestamp) |
throws IOException { |
if (f==null) return; |
w.write(" <dataset timestamp=\"" + timestamp + "\">\n"); |
for (int i = 0; i < NUM_ENTRIES; i++) { |
w.write(" <data offset=\"" + i + "\" label=\"" + labels[i] |
+ "\" value=\"" + f.asFraction(i)*100.0 + "\"/>\n"); |
} |
w.write(" </dataset>\n"); |
} |
public void end() throws IOException { |
w.write("</mk-profilerdata>\n"); |
w.flush(); |
w.close(); |
} |
} |
static class CompositeProfilerLogger implements ProfilerLogger { |
List<ProfilerLogger> loggers = new ArrayList<ProfilerLogger>(2); |
public void setLabel(int index, String label) { |
for (ProfilerLogger l : loggers) |
l.setLabel(index, label); |
} |
public void log(ProfilerResponseFrame f, long timestamp) throws IOException { |
for (ProfilerLogger l : loggers) |
l.log(f, timestamp); |
} |
public void start(String logId) throws IOException { |
for (ProfilerLogger l : loggers) |
l.start(logId); |
} |
public void end() throws IOException { |
for (ProfilerLogger l : loggers) |
l.end(); |
} |
void add(ProfilerLogger l) { |
loggers.add(l); |
} |
} |
private static ProfilerLogger createLogger(OutputStream out, String encoding) |
throws IOException { |
ProfilerLogger consoleLogger = new ConsoleProfilerLogger(); |
XMLProfilerLogger xmlLogger = new XMLProfilerLogger(out, encoding); |
CompositeProfilerLogger logger = new CompositeProfilerLogger(); |
logger.add(consoleLogger); |
logger.add(xmlLogger); |
return logger; |
} |
private void prepareLoggers(final FrameQueue q, final ProfilerLogger logger) |
throws IOException { |
new Thread() { |
public void run() { |
} |
}.start(); |
} |
private void profile(final FrameQueue q, final ProfilerLogger logger, final int interval) throws IOException { |
LinkedList<Integer> missing = new LinkedList<Integer>(); |
for (int i = 0; i < NUM_ENTRIES; i++) { |
missing.add(i); |
} |
int tries = 0; |
while (!missing.isEmpty() && tries < 300) { |
int i = missing.get(0); |
tries++; |
ProfilerLabelRequestFrame f2 = //ff.createAnalogDebugLabelRequestFrame(Frame.FC_ADDRESS, i); |
new ProfilerLabelRequestFrame(Frame.FC_ADDRESS, i); |
try { |
q.sendRequest(f2); |
ProfilerLabelResponseFrame rf = (ProfilerLabelResponseFrame) q.getResponseFor(f2, 5000); |
if (rf != null) { |
logger.setLabel(i, rf.getLabelAsString()); |
missing.remove(0); |
} else { |
String unknown = "activity " + i; |
logger.setLabel(i, unknown); |
missing.add(i); |
} |
} catch (IOException ex) { |
} |
} |
ProfilerRequestFrame f = // ff.createDebugRequestFrame(Frame.FC_ADDRESS); |
new ProfilerRequestFrame(Frame.FC_ADDRESS); |
f.setAutoSendInterval(interval); |
BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); |
q.sendRequest(f); |
Long firsttimestamp = null; |
while (!in.ready()) |
try { |
// q.output(f); |
ProfilerResponseFrame rf = (ProfilerResponseFrame) q.getResponseFor(f, 1000); |
// System.out.println(rf); |
long timestamp = System.currentTimeMillis(); |
if (firsttimestamp == null) { |
firsttimestamp = timestamp; |
timestamp = 0; |
} else { |
timestamp -= firsttimestamp; |
} |
logger.log(rf, timestamp); |
} catch (IOException ex) { |
STDERR.println(ex); |
} |
} |
public static void main(String[] args) throws IOException { |
MKProfiler test = new MKProfiler(); |
MKConnection port = new RXTXSerialPort(); |
port.init(null); |
FrameQueue q = new FrameQueue(port); |
String encoding = "iso-8859-1"; |
OutputStream fout = new FileOutputStream("profile.xml"); |
ProfilerLogger logger = createLogger(fout, encoding); |
logger.start(new Date().toGMTString()); |
test.profile(q, logger, 10); |
logger.end(); |
fout.close(); |
} |
} |