2015-07-10 06:01:56 -07:00
|
|
|
package com.rusefi;
|
|
|
|
|
2015-08-29 13:01:22 -07:00
|
|
|
import com.rusefi.trigger.WaveState;
|
2015-07-10 06:01:56 -07:00
|
|
|
import com.rusefi.ui.engine.UpDownImage;
|
|
|
|
import com.rusefi.ui.util.FrameHelper;
|
|
|
|
import com.rusefi.ui.util.UiUtils;
|
|
|
|
import com.rusefi.waves.EngineReport;
|
2015-08-29 12:02:36 -07:00
|
|
|
import org.jetbrains.annotations.NotNull;
|
2015-07-10 06:01:56 -07:00
|
|
|
|
|
|
|
import javax.swing.*;
|
|
|
|
import java.awt.*;
|
|
|
|
import java.io.*;
|
|
|
|
import java.lang.reflect.InvocationTargetException;
|
|
|
|
import java.util.ArrayList;
|
2015-08-29 13:01:22 -07:00
|
|
|
import java.util.Date;
|
2015-07-10 06:01:56 -07:00
|
|
|
import java.util.List;
|
|
|
|
|
|
|
|
/**
|
2015-08-30 09:01:18 -07:00
|
|
|
* This utility produces images of trigger signals supported by rusEfi
|
|
|
|
*
|
2016-04-09 10:02:13 -07:00
|
|
|
* 06/23/15
|
2017-01-04 15:02:35 -08:00
|
|
|
* (c) Andrey Belomutskiy 2013-2017
|
2015-07-10 06:01:56 -07:00
|
|
|
*/
|
|
|
|
public class TriggerImage {
|
2016-04-09 10:02:13 -07:00
|
|
|
private static final String TRIGGERTYPE = "TRIGGERTYPE";
|
|
|
|
private static final String OUTPUT_FOLDER = "triggers";
|
|
|
|
private static final String INPUT_FILE_NAME = "triggers.txt";
|
|
|
|
private static final String TOP_MESSAGE = "(c) rusEfi 2016";
|
|
|
|
private static final String DEFAULT_WORK_FOLDER = ".." + File.separator + "unit_tests";
|
2015-07-10 06:01:56 -07:00
|
|
|
private static int WIDTH = 320;
|
|
|
|
/**
|
|
|
|
* number of extra frames
|
|
|
|
*/
|
2015-08-29 13:01:22 -07:00
|
|
|
public static int EXTRA_COUNT = 1;
|
2015-07-10 06:01:56 -07:00
|
|
|
|
|
|
|
public static void main(String[] args) throws IOException, InvocationTargetException, InterruptedException {
|
2016-04-09 10:02:13 -07:00
|
|
|
final String workingFolder;
|
2015-07-10 06:01:56 -07:00
|
|
|
if (args.length != 1) {
|
2016-04-09 10:02:13 -07:00
|
|
|
workingFolder = DEFAULT_WORK_FOLDER;
|
2015-08-29 12:02:36 -07:00
|
|
|
} else {
|
2016-04-09 10:02:13 -07:00
|
|
|
workingFolder = args[0];
|
2015-07-10 06:01:56 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
FrameHelper f = new FrameHelper();
|
|
|
|
|
2015-08-29 13:01:22 -07:00
|
|
|
final TriggerPanel triggerPanel = new TriggerPanel() {
|
2015-07-10 06:01:56 -07:00
|
|
|
@Override
|
|
|
|
public Dimension getPreferredSize() {
|
|
|
|
return new Dimension((1 + EXTRA_COUNT) * WIDTH, 480);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2015-08-29 12:02:36 -07:00
|
|
|
f.showFrame(triggerPanel);
|
2015-07-10 06:01:56 -07:00
|
|
|
|
|
|
|
SwingUtilities.invokeAndWait(new Runnable() {
|
|
|
|
@Override
|
|
|
|
public void run() {
|
|
|
|
try {
|
2016-04-09 10:02:13 -07:00
|
|
|
generateImages(workingFolder, triggerPanel);
|
2015-07-10 06:01:56 -07:00
|
|
|
} catch (IOException e) {
|
|
|
|
throw new IllegalStateException(e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
System.exit(-1);
|
|
|
|
}
|
|
|
|
|
2016-04-09 10:02:13 -07:00
|
|
|
private static void generateImages(String workingFolder, TriggerPanel trigger) throws IOException {
|
|
|
|
BufferedReader br = new BufferedReader(new FileReader(workingFolder + File.separator + INPUT_FILE_NAME));
|
2015-07-10 06:01:56 -07:00
|
|
|
|
|
|
|
String line;
|
|
|
|
while ((line = br.readLine()) != null) {
|
2015-08-29 12:02:36 -07:00
|
|
|
if (line.trim().startsWith("#")) {
|
|
|
|
// skipping a comment
|
|
|
|
continue;
|
|
|
|
}
|
2015-07-10 06:01:56 -07:00
|
|
|
|
|
|
|
if (line.startsWith(TRIGGERTYPE)) {
|
|
|
|
readTrigger(br, line, trigger);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-08-29 12:02:36 -07:00
|
|
|
private static void readTrigger(BufferedReader reader, String line, TriggerPanel triggerPanel) throws IOException {
|
2015-07-10 06:01:56 -07:00
|
|
|
String[] tokens = line.split(" ");
|
|
|
|
String idStr = tokens[1];
|
2015-08-29 12:02:36 -07:00
|
|
|
String eventCountStr = tokens[2];
|
|
|
|
String triggerName = tokens[3];
|
|
|
|
int eventCount = Integer.parseInt(eventCountStr);
|
2015-07-10 06:01:56 -07:00
|
|
|
int id = Integer.parseInt(idStr);
|
|
|
|
|
2015-12-15 19:01:31 -08:00
|
|
|
// if (id != 20)
|
2015-07-10 06:01:56 -07:00
|
|
|
// return;
|
|
|
|
|
2015-08-29 12:02:36 -07:00
|
|
|
System.out.println("id=" + id + ", count=" + eventCount + ", name=" + triggerName);
|
|
|
|
|
|
|
|
List<WaveState> waves = readTrigger(reader, eventCount);
|
|
|
|
|
|
|
|
EngineReport re0 = new EngineReport(waves.get(0).list, 720, 720 * (1 + EXTRA_COUNT));
|
2015-12-15 19:01:31 -08:00
|
|
|
System.out.println(re0);
|
2015-08-29 12:02:36 -07:00
|
|
|
EngineReport re1 = new EngineReport(waves.get(1).list, 720, 720 * (1 + EXTRA_COUNT));
|
|
|
|
|
|
|
|
triggerPanel.removeAll();
|
|
|
|
UpDownImage upDownImage0 = new UpDownImage(re0, "trigger");
|
2016-06-04 14:01:42 -07:00
|
|
|
upDownImage0.showMouseOverText = false;
|
2015-08-29 12:02:36 -07:00
|
|
|
triggerPanel.add(upDownImage0);
|
|
|
|
|
|
|
|
UpDownImage upDownImage1 = new UpDownImage(re1, "trigger");
|
2016-06-04 14:01:42 -07:00
|
|
|
upDownImage1.showMouseOverText = false;
|
2015-08-29 13:01:22 -07:00
|
|
|
boolean isSingleSenssor = re1.getList().isEmpty();
|
|
|
|
|
|
|
|
triggerPanel.setLayout(new GridLayout(isSingleSenssor ? 1 : 2, 1));
|
|
|
|
|
|
|
|
if (!isSingleSenssor)
|
2015-08-29 12:02:36 -07:00
|
|
|
triggerPanel.add(upDownImage1);
|
|
|
|
|
|
|
|
triggerPanel.name = triggerName;
|
|
|
|
triggerPanel.id = id;
|
|
|
|
|
|
|
|
UiUtils.trueLayout(triggerPanel);
|
|
|
|
UiUtils.trueRepaint(triggerPanel);
|
2016-04-09 10:02:13 -07:00
|
|
|
new File(OUTPUT_FOLDER).mkdir();
|
|
|
|
UiUtils.saveImage(OUTPUT_FOLDER + File.separator + "trigger_" + id + ".png", triggerPanel);
|
2015-08-29 12:02:36 -07:00
|
|
|
}
|
2015-07-10 06:01:56 -07:00
|
|
|
|
2015-08-29 12:02:36 -07:00
|
|
|
@NotNull
|
|
|
|
private static List<WaveState> readTrigger(BufferedReader reader, int count) throws IOException {
|
|
|
|
String line;
|
|
|
|
String[] tokens;
|
2015-07-10 06:01:56 -07:00
|
|
|
List<Signal> signals = new ArrayList<>();
|
|
|
|
|
2015-08-30 09:01:18 -07:00
|
|
|
int index = 0;
|
|
|
|
while (index < count) {
|
2015-08-29 12:02:36 -07:00
|
|
|
line = reader.readLine();
|
2015-08-30 09:01:18 -07:00
|
|
|
if (line.trim().startsWith("#"))
|
|
|
|
continue;
|
2015-07-10 06:01:56 -07:00
|
|
|
tokens = line.split(" ");
|
|
|
|
String signalStr = tokens[2];
|
|
|
|
int signal = Integer.parseInt(signalStr);
|
|
|
|
String angleStr = tokens[3];
|
|
|
|
double angle = Double.parseDouble(angleStr);
|
|
|
|
|
2015-12-15 19:01:31 -08:00
|
|
|
Signal s = new Signal(signal, angle);
|
|
|
|
// System.out.println(s);
|
|
|
|
signals.add(s);
|
2015-08-30 09:01:18 -07:00
|
|
|
index++;
|
2015-07-10 06:01:56 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
List<Signal> toShow = new ArrayList<>(signals);
|
|
|
|
for (int i = 1; i <= 2 + EXTRA_COUNT; i++) {
|
|
|
|
for (Signal s : signals)
|
|
|
|
toShow.add(new Signal(s.signal, s.angle + i * 720));
|
|
|
|
}
|
|
|
|
|
|
|
|
List<WaveState> waves = new ArrayList<>();
|
|
|
|
waves.add(new WaveState());
|
|
|
|
waves.add(new WaveState());
|
|
|
|
|
|
|
|
for (Signal s : toShow) {
|
|
|
|
int waveIndex = s.signal / 1000;
|
2015-08-30 11:01:28 -07:00
|
|
|
WaveState.trigger_value_e signal = (s.signal % 1000 == 0) ?WaveState.trigger_value_e.TV_LOW : WaveState.trigger_value_e.TV_HIGH;
|
2015-07-10 06:01:56 -07:00
|
|
|
|
|
|
|
if (waveIndex > 1) {
|
|
|
|
// TT_HONDA_ACCORD_CD
|
|
|
|
continue;
|
|
|
|
// throw new IllegalStateException(s.signal + " in " + name);
|
|
|
|
}
|
|
|
|
|
|
|
|
WaveState waveState = waves.get(waveIndex);
|
|
|
|
waveState.handle(signal, s.angle);
|
|
|
|
}
|
|
|
|
for (WaveState wave : waves)
|
|
|
|
wave.wrap();
|
|
|
|
|
2015-08-29 12:02:36 -07:00
|
|
|
return waves;
|
2015-07-10 06:01:56 -07:00
|
|
|
}
|
|
|
|
|
2015-08-29 13:01:22 -07:00
|
|
|
public static int angleToTime(double prevUp) {
|
2015-07-10 06:01:56 -07:00
|
|
|
return (int) (prevUp);
|
|
|
|
}
|
|
|
|
|
|
|
|
private static class Signal {
|
|
|
|
private final int signal;
|
|
|
|
private final double angle;
|
|
|
|
|
|
|
|
public Signal(int signal, double angle) {
|
|
|
|
this.signal = signal;
|
|
|
|
this.angle = angle;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public String toString() {
|
|
|
|
return "Signal{" +
|
|
|
|
"signal=" + signal +
|
|
|
|
", angle=" + angle +
|
|
|
|
'}';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private static class TriggerPanel extends JPanel {
|
|
|
|
public String name = "";
|
|
|
|
public int id;
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void paint(Graphics g) {
|
|
|
|
super.paint(g);
|
|
|
|
|
|
|
|
g.setColor(Color.black);
|
2015-08-29 13:01:22 -07:00
|
|
|
|
|
|
|
int w = getWidth();
|
|
|
|
|
2016-04-09 10:02:13 -07:00
|
|
|
int off = g.getFontMetrics().stringWidth(TOP_MESSAGE);
|
|
|
|
g.drawString(TOP_MESSAGE, w - off, g.getFont().getSize());
|
2015-08-29 13:01:22 -07:00
|
|
|
|
2016-04-09 10:02:13 -07:00
|
|
|
String line = new Date().toString();
|
2015-08-29 13:01:22 -07:00
|
|
|
off = g.getFontMetrics().stringWidth(line);
|
|
|
|
g.drawString(line, w - off, 2 * g.getFont().getSize());
|
|
|
|
|
2015-07-10 06:01:56 -07:00
|
|
|
Font f = g.getFont();
|
|
|
|
g.setFont(new Font(f.getName(), Font.BOLD, f.getSize() * 3));
|
|
|
|
|
|
|
|
int h = getHeight();
|
|
|
|
|
|
|
|
g.drawString(name, 0, (int) (h * 0.75));
|
|
|
|
g.drawString("#" + id, 0, (int) (h * 0.9));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|