json writer for PTrace
This commit is contained in:
parent
dbde7119c4
commit
10f447eb12
|
@ -1,9 +1,16 @@
|
||||||
package com.rusefi.tracing;
|
package com.rusefi.tracing;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.DataInputStream;
|
||||||
|
import java.io.EOFException;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class Entry {
|
public class Entry {
|
||||||
private final String name;
|
private final String name;
|
||||||
private final Phase phase;
|
private final Phase phase;
|
||||||
private final double timestampSeconds;
|
private double timestampSeconds;
|
||||||
|
|
||||||
public Entry(String name, Phase phase, double timestampSeconds) {
|
public Entry(String name, Phase phase, double timestampSeconds) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
|
@ -33,6 +40,52 @@ public class Entry {
|
||||||
sb.append(y);
|
sb.append(y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int readInt(DataInputStream in) throws IOException {
|
||||||
|
int ch1 = in.read();
|
||||||
|
int ch2 = in.read();
|
||||||
|
int ch3 = in.read();
|
||||||
|
int ch4 = in.read();
|
||||||
|
if ((ch1 | ch2 | ch3 | ch4) < 0)
|
||||||
|
throw new EOFException();
|
||||||
|
return ((ch4 << 24) + (ch3 << 16) + (ch2 << 8) + (ch1 << 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static List<Entry> parseBuffer(byte[] packet) {
|
||||||
|
List<Entry> result = new ArrayList<>();
|
||||||
|
double minValue = Double.MAX_VALUE;
|
||||||
|
try {
|
||||||
|
DataInputStream is = new DataInputStream(new ByteArrayInputStream(packet));
|
||||||
|
is.readByte(); // skip TS result code
|
||||||
|
for (int i = 0; i < packet.length - 1; i += 8) {
|
||||||
|
byte type = is.readByte();
|
||||||
|
byte phase = is.readByte();
|
||||||
|
byte data = is.readByte();
|
||||||
|
byte thread = is.readByte();
|
||||||
|
|
||||||
|
int timestampNt = readInt(is);
|
||||||
|
|
||||||
|
|
||||||
|
double timestampSeconds = timestampNt / 1000000.0;
|
||||||
|
minValue = Math.min(minValue, timestampNt);
|
||||||
|
Entry e = new Entry("t" + type, Phase.decode(phase), timestampSeconds);
|
||||||
|
result.add(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Entry e : result)
|
||||||
|
e.adjustTimestamp(minValue);
|
||||||
|
|
||||||
|
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new IllegalStateException(e);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void adjustTimestamp(double minValue) {
|
||||||
|
timestampSeconds -= minValue;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
|
|
|
@ -22,7 +22,7 @@ public class JsonOutput {
|
||||||
writeToStream(testEntries, new FileOutputStream("hello_trace.json"));
|
writeToStream(testEntries, new FileOutputStream("hello_trace.json"));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void writeToStream(List<Entry> testEntries, OutputStream outputStream) throws IOException {
|
public static void writeToStream(List<Entry> testEntries, OutputStream outputStream) throws IOException {
|
||||||
|
|
||||||
Writer out = new OutputStreamWriter(outputStream);
|
Writer out = new OutputStreamWriter(outputStream);
|
||||||
out.write("{\"traceEvents\": [\n");
|
out.write("{\"traceEvents\": [\n");
|
||||||
|
|
|
@ -6,4 +6,19 @@ public enum Phase {
|
||||||
// End
|
// End
|
||||||
E,
|
E,
|
||||||
i,
|
i,
|
||||||
|
;
|
||||||
|
|
||||||
|
public static Phase decode(byte phase) {
|
||||||
|
switch (phase) {
|
||||||
|
case 0:
|
||||||
|
return B;
|
||||||
|
case 1:
|
||||||
|
return E;
|
||||||
|
case 2:
|
||||||
|
case 3:
|
||||||
|
return i;
|
||||||
|
default:
|
||||||
|
throw new IllegalStateException("Unexpected " + phase);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,25 @@
|
||||||
package com.rusefi;
|
package com.rusefi;
|
||||||
|
|
||||||
|
import com.rusefi.binaryprotocol.BinaryProtocol;
|
||||||
|
import com.rusefi.binaryprotocol.BinaryProtocolHolder;
|
||||||
import com.rusefi.config.generated.Fields;
|
import com.rusefi.config.generated.Fields;
|
||||||
|
import com.rusefi.tracing.Entry;
|
||||||
|
import com.rusefi.tracing.JsonOutput;
|
||||||
import com.rusefi.ui.MessagesView;
|
import com.rusefi.ui.MessagesView;
|
||||||
|
import com.rusefi.ui.util.UiUtils;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import static com.rusefi.CommandControl.TEST;
|
import static com.rusefi.CommandControl.TEST;
|
||||||
|
import static com.rusefi.binaryprotocol.BinaryProtocolCommands.RESPONSE_OK;
|
||||||
|
import static com.rusefi.binaryprotocol.IoHelper.checkResponseCode;
|
||||||
|
|
||||||
public class BenchTestPane {
|
public class BenchTestPane {
|
||||||
private final JPanel content = new JPanel(new GridLayout(2, 5));
|
private final JPanel content = new JPanel(new GridLayout(2, 5));
|
||||||
|
@ -15,6 +27,7 @@ public class BenchTestPane {
|
||||||
public BenchTestPane() {
|
public BenchTestPane() {
|
||||||
content.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
|
content.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
|
||||||
|
|
||||||
|
content.add(grabPerformanceTrace());
|
||||||
content.add(createFanTest());
|
content.add(createFanTest());
|
||||||
content.add(createAcRelayTest());
|
content.add(createAcRelayTest());
|
||||||
content.add(createFuelPumpTest());
|
content.add(createFuelPumpTest());
|
||||||
|
@ -38,6 +51,31 @@ public class BenchTestPane {
|
||||||
content.add(new MessagesView().messagesScroll);
|
content.add(new MessagesView().messagesScroll);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Component grabPerformanceTrace() {
|
||||||
|
JButton button = new JButton("Grab PTrace");
|
||||||
|
button.addActionListener(new ActionListener() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
BinaryProtocol bp = BinaryProtocolHolder.INSTANCE.get();
|
||||||
|
bp.executeCommand(new byte[]{'r'}, "begin trace", false);
|
||||||
|
|
||||||
|
try {
|
||||||
|
Thread.sleep(500);
|
||||||
|
|
||||||
|
byte[] packet = bp.executeCommand(new byte[]{'b'}, "get trace", true);
|
||||||
|
if (!checkResponseCode(packet, RESPONSE_OK) || ((packet.length - 1) % 8) != 0)
|
||||||
|
throw new IllegalStateException("Unexpected packet");
|
||||||
|
|
||||||
|
List<Entry> data = Entry.parseBuffer(packet);
|
||||||
|
JsonOutput.writeToStream(data, new FileOutputStream("hello_trace.json"));
|
||||||
|
} catch (IOException | InterruptedException e1) {
|
||||||
|
throw new IllegalStateException(e1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return UiUtils.wrap(button);
|
||||||
|
}
|
||||||
|
|
||||||
private Component createMILTest() {
|
private Component createMILTest() {
|
||||||
CommandControl panel = new CommandControl("MIL", "check_engine.jpg", TEST) {
|
CommandControl panel = new CommandControl("MIL", "check_engine.jpg", TEST) {
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|
Loading…
Reference in New Issue