auto-sync
This commit is contained in:
parent
b76a8ac551
commit
215bfb64e2
|
@ -0,0 +1,30 @@
|
||||||
|
package com.rusefi;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* (c) Andrey Belomutskiy
|
||||||
|
* 3/7/2015
|
||||||
|
*/
|
||||||
|
public interface Logger {
|
||||||
|
Logger STDOUT = new Logger() {
|
||||||
|
@Override
|
||||||
|
public void trace(String msg) {
|
||||||
|
System.out.println(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void info(String msg) {
|
||||||
|
System.out.println(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void error(String msg) {
|
||||||
|
System.err.println(msg);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
void trace(String msg);
|
||||||
|
|
||||||
|
void info(String msg);
|
||||||
|
|
||||||
|
void error(String msg);
|
||||||
|
}
|
|
@ -1,6 +1,7 @@
|
||||||
package com.rusefi.binaryprotocol;
|
package com.rusefi.binaryprotocol;
|
||||||
|
|
||||||
import com.rusefi.ConfigurationImage;
|
import com.rusefi.ConfigurationImage;
|
||||||
|
import com.rusefi.Logger;
|
||||||
import com.rusefi.io.DataListener;
|
import com.rusefi.io.DataListener;
|
||||||
import com.rusefi.io.serial.SerialPortReader;
|
import com.rusefi.io.serial.SerialPortReader;
|
||||||
import etch.util.CircularByteBuffer;
|
import etch.util.CircularByteBuffer;
|
||||||
|
@ -17,21 +18,23 @@ import java.util.Arrays;
|
||||||
public class BinaryProtocol {
|
public class BinaryProtocol {
|
||||||
private static final int BLOCKING_FACTOR = 256;
|
private static final int BLOCKING_FACTOR = 256;
|
||||||
private static final byte RESPONSE_OK = 0;
|
private static final byte RESPONSE_OK = 0;
|
||||||
|
private final Logger logger;
|
||||||
private final SerialPort serialPort;
|
private final SerialPort serialPort;
|
||||||
private static final int BUFFER_SIZE = 10000;
|
private static final int BUFFER_SIZE = 10000;
|
||||||
final CircularByteBuffer cbb;
|
final CircularByteBuffer cbb;
|
||||||
|
|
||||||
public BinaryProtocol(SerialPort serialPort) throws SerialPortException {
|
public BinaryProtocol(final Logger logger, SerialPort serialPort) throws SerialPortException {
|
||||||
|
this.logger = logger;
|
||||||
this.serialPort = serialPort;
|
this.serialPort = serialPort;
|
||||||
|
|
||||||
cbb = new CircularByteBuffer(BUFFER_SIZE);
|
cbb = new CircularByteBuffer(BUFFER_SIZE);
|
||||||
DataListener listener = new DataListener() {
|
DataListener listener = new DataListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onDataArrived(byte[] freshData) {
|
public void onDataArrived(byte[] freshData) {
|
||||||
System.out.println(freshData.length + " byte(s) arrived");
|
logger.trace(freshData.length + " byte(s) arrived");
|
||||||
synchronized (cbb) {
|
synchronized (cbb) {
|
||||||
if (cbb.size() - cbb.length() < freshData.length) {
|
if (cbb.size() - cbb.length() < freshData.length) {
|
||||||
System.out.println("buffer overflow not expected");
|
logger.error("buffer overflow not expected");
|
||||||
cbb.clear();
|
cbb.clear();
|
||||||
}
|
}
|
||||||
cbb.put(freshData);
|
cbb.put(freshData);
|
||||||
|
@ -43,7 +46,7 @@ public class BinaryProtocol {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void waitForBytes(int count) throws InterruptedException {
|
private void waitForBytes(int count) throws InterruptedException {
|
||||||
System.out.println("Waiting for " + count + " byte(s)");
|
logger.info("Waiting for " + count + " byte(s)");
|
||||||
synchronized (cbb) {
|
synchronized (cbb) {
|
||||||
while (cbb.length() < count)
|
while (cbb.length() < count)
|
||||||
cbb.wait();
|
cbb.wait();
|
||||||
|
@ -90,7 +93,7 @@ public class BinaryProtocol {
|
||||||
public void sendCrcPacket(byte[] command) throws SerialPortException {
|
public void sendCrcPacket(byte[] command) throws SerialPortException {
|
||||||
byte[] packet = makePacket(command);
|
byte[] packet = makePacket(command);
|
||||||
|
|
||||||
System.out.println("Sending " + Arrays.toString(packet));
|
logger.info("Sending " + Arrays.toString(packet));
|
||||||
serialPort.writeBytes(packet);
|
serialPort.writeBytes(packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -107,7 +110,7 @@ public class BinaryProtocol {
|
||||||
waitForBytes(2);
|
waitForBytes(2);
|
||||||
|
|
||||||
int packetSize = BinaryProtocol.swap16(cbb.getShort());
|
int packetSize = BinaryProtocol.swap16(cbb.getShort());
|
||||||
System.out.println("Got packet size " + packetSize);
|
logger.trace("Got packet size " + packetSize);
|
||||||
if (packetSize < 0 || packetSize > 300) {
|
if (packetSize < 0 || packetSize > 300) {
|
||||||
// invalid packet size
|
// invalid packet size
|
||||||
return null;
|
return null;
|
||||||
|
@ -124,10 +127,10 @@ public class BinaryProtocol {
|
||||||
|
|
||||||
boolean isCrcOk = actualCrc == packetCrc;
|
boolean isCrcOk = actualCrc == packetCrc;
|
||||||
if (!isCrcOk) {
|
if (!isCrcOk) {
|
||||||
System.out.println(String.format("%x", actualCrc) + " vs " + String.format("%x", packetCrc));
|
logger.trace(String.format("%x", actualCrc) + " vs " + String.format("%x", packetCrc));
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
System.out.println("packet " + Arrays.toString(packet) + ": crc OK");
|
logger.trace("packet " + Arrays.toString(packet) + ": crc OK");
|
||||||
|
|
||||||
return packet;
|
return packet;
|
||||||
}
|
}
|
||||||
|
@ -150,7 +153,7 @@ public class BinaryProtocol {
|
||||||
|
|
||||||
byte[] response = receivePacket();
|
byte[] response = receivePacket();
|
||||||
if (response == null || response.length == 0 || response[0] != RESPONSE_OK || response.length != requestSize + 1) {
|
if (response == null || response.length == 0 || response[0] != RESPONSE_OK || response.length != requestSize + 1) {
|
||||||
System.out.println("Something is wrong, retrying...");
|
logger.error("Something is wrong, retrying...");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -159,6 +162,6 @@ public class BinaryProtocol {
|
||||||
|
|
||||||
offset += requestSize;
|
offset += requestSize;
|
||||||
}
|
}
|
||||||
System.out.println("Got image!");
|
logger.info("Got image!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package com.rusefi.binaryprotocol;
|
package com.rusefi.binaryprotocol;
|
||||||
|
|
||||||
import com.rusefi.ConfigurationImage;
|
import com.rusefi.ConfigurationImage;
|
||||||
|
import com.rusefi.Logger;
|
||||||
import com.rusefi.io.DataListener;
|
import com.rusefi.io.DataListener;
|
||||||
import com.rusefi.io.serial.PortHolder;
|
import com.rusefi.io.serial.PortHolder;
|
||||||
import com.rusefi.io.serial.SerialPortReader;
|
import com.rusefi.io.serial.SerialPortReader;
|
||||||
|
@ -27,17 +28,18 @@ public class BinaryProtocolCmd {
|
||||||
|
|
||||||
String port = args[0];
|
String port = args[0];
|
||||||
|
|
||||||
|
Logger logger = Logger.STDOUT;
|
||||||
|
|
||||||
serialPort = new SerialPort(port);
|
serialPort = new SerialPort(port);
|
||||||
boolean opened = serialPort.openPort();
|
boolean opened = serialPort.openPort();
|
||||||
if (!opened) {
|
if (!opened) {
|
||||||
System.out.println("failed to open " + port);
|
logger.error("failed to open " + port);
|
||||||
}
|
}
|
||||||
BinaryProtocol bp = new BinaryProtocol(serialPort);
|
BinaryProtocol bp = new BinaryProtocol(logger, serialPort);
|
||||||
|
|
||||||
|
|
||||||
PortHolder.setupPort(serialPort, 38400);
|
PortHolder.setupPort(serialPort, 38400);
|
||||||
System.out.println("Looks good");
|
logger.info("Looks good");
|
||||||
bp.sendQueryCommand();
|
bp.sendQueryCommand();
|
||||||
bp.receivePacket();
|
bp.receivePacket();
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@ public class EraseChip extends ProcessStatusWindow {
|
||||||
"Are you sure?", JOptionPane.YES_NO_OPTION);
|
"Are you sure?", JOptionPane.YES_NO_OPTION);
|
||||||
if (dialogResult != JOptionPane.YES_OPTION)
|
if (dialogResult != JOptionPane.YES_OPTION)
|
||||||
return;
|
return;
|
||||||
showFrame();
|
wnd.showFrame("rusEfi Firmware Flasher");
|
||||||
submitAction(new Runnable() {
|
submitAction(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package com.rusefi.maintenance;
|
package com.rusefi.maintenance;
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
import java.awt.*;
|
|
||||||
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionEvent;
|
||||||
import java.awt.event.ActionListener;
|
import java.awt.event.ActionListener;
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
|
@ -25,7 +24,7 @@ public class FirmwareFlasher extends ProcessStatusWindow {
|
||||||
button.addActionListener(new ActionListener() {
|
button.addActionListener(new ActionListener() {
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent event) {
|
public void actionPerformed(ActionEvent event) {
|
||||||
showFrame();
|
wnd.showFrame("rusEfi Firmware Flasher");
|
||||||
|
|
||||||
Runnable runnable = new Runnable() {
|
Runnable runnable = new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
|
@ -40,14 +39,14 @@ public class FirmwareFlasher extends ProcessStatusWindow {
|
||||||
|
|
||||||
private void doFlashFirmware() {
|
private void doFlashFirmware() {
|
||||||
if (!new File(IMAGE_FILE).exists()) {
|
if (!new File(IMAGE_FILE).exists()) {
|
||||||
appendMsg(IMAGE_FILE + " not found, cannot proceed !!!");
|
wnd.appendMsg(IMAGE_FILE + " not found, cannot proceed !!!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
StringBuffer error = executeCommand(OPEN_OCD_COMMAND);
|
StringBuffer error = executeCommand(OPEN_OCD_COMMAND);
|
||||||
if (error.toString().contains(SUCCESS_MESSAGE_TAG) && !error.toString().contains(FAILED_MESSAGE_TAG)) {
|
if (error.toString().contains(SUCCESS_MESSAGE_TAG) && !error.toString().contains(FAILED_MESSAGE_TAG)) {
|
||||||
appendMsg("!!! Looks good!!!");
|
wnd.appendMsg("!!! Looks good!!!");
|
||||||
} else {
|
} else {
|
||||||
appendMsg("!!! FIRMWARE FLASH: DOES NOT LOOK RIGHT !!!");
|
wnd.appendMsg("!!! FIRMWARE FLASH: DOES NOT LOOK RIGHT !!!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,32 +1,19 @@
|
||||||
package com.rusefi.maintenance;
|
package com.rusefi.maintenance;
|
||||||
|
|
||||||
import com.rusefi.ui.util.FrameHelper;
|
import com.rusefi.ui.StatusWindow;
|
||||||
import com.rusefi.ui.util.UiUtils;
|
|
||||||
|
|
||||||
import javax.swing.*;
|
|
||||||
import java.awt.*;
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
|
|
||||||
public class ProcessStatusWindow {
|
public class ProcessStatusWindow {
|
||||||
protected final JTextArea log = new JTextArea();
|
|
||||||
private final JScrollPane messagesScroll = new JScrollPane(log, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED) {
|
|
||||||
@Override
|
|
||||||
public Dimension getPreferredSize() {
|
|
||||||
return new Dimension(400, 400);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
public ProcessStatusWindow() {
|
|
||||||
log.setLineWrap(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isWindows() {
|
public static boolean isWindows() {
|
||||||
return System.getProperty("os.name").toLowerCase().contains("win");
|
return System.getProperty("os.name").toLowerCase().contains("win");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected final StatusWindow wnd = new StatusWindow();
|
||||||
|
|
||||||
protected static boolean isRunning(Process p) {
|
protected static boolean isRunning(Process p) {
|
||||||
try {
|
try {
|
||||||
p.exitValue();
|
p.exitValue();
|
||||||
|
@ -36,24 +23,6 @@ public class ProcessStatusWindow {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void showFrame() {
|
|
||||||
FrameHelper f = new FrameHelper();
|
|
||||||
f.getFrame().setTitle("rusEfi Firmware Flasher");
|
|
||||||
f.showFrame(messagesScroll, false);
|
|
||||||
UiUtils.centerWindow(f.getFrame());
|
|
||||||
log.setText(""); // let's remove stuff from previous invocation
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void appendMsg(final String s) {
|
|
||||||
SwingUtilities.invokeLater(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
log.append(s + "\r\n");
|
|
||||||
UiUtils.trueLayout(log);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method listens to a data stream from the process, appends messages to UI
|
* This method listens to a data stream from the process, appends messages to UI
|
||||||
* and accumulates output in a buffer
|
* and accumulates output in a buffer
|
||||||
|
@ -68,11 +37,11 @@ public class ProcessStatusWindow {
|
||||||
String line = bis.readLine();
|
String line = bis.readLine();
|
||||||
if (line == null)
|
if (line == null)
|
||||||
break;
|
break;
|
||||||
appendMsg(line);
|
wnd.appendMsg(line);
|
||||||
buffer.append(line);
|
buffer.append(line);
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
appendMsg("Stream " + e);
|
wnd.appendMsg("Stream " + e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -81,7 +50,7 @@ public class ProcessStatusWindow {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected StringBuffer executeCommand(String command) {
|
protected StringBuffer executeCommand(String command) {
|
||||||
appendMsg("Executing " + command);
|
wnd.appendMsg("Executing " + command);
|
||||||
StringBuffer output = new StringBuffer();
|
StringBuffer output = new StringBuffer();
|
||||||
StringBuffer error = new StringBuffer();
|
StringBuffer error = new StringBuffer();
|
||||||
try {
|
try {
|
||||||
|
@ -90,9 +59,9 @@ public class ProcessStatusWindow {
|
||||||
startStreamThread(p, p.getErrorStream(), error);
|
startStreamThread(p, p.getErrorStream(), error);
|
||||||
p.waitFor();
|
p.waitFor();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
appendMsg("IOError: " + e);
|
wnd.appendMsg("IOError: " + e);
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
appendMsg("WaitError: " + e);
|
wnd.appendMsg("WaitError: " + e);
|
||||||
}
|
}
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
package com.rusefi.ui;
|
||||||
|
|
||||||
|
import com.rusefi.ui.util.FrameHelper;
|
||||||
|
import com.rusefi.ui.util.UiUtils;
|
||||||
|
|
||||||
|
import javax.swing.*;
|
||||||
|
import java.awt.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create(c) Andrey Belomutskiy 2013-2015
|
||||||
|
* 3/7/2015
|
||||||
|
*/
|
||||||
|
public class StatusWindow {
|
||||||
|
private final JTextArea log = new JTextArea();
|
||||||
|
private final JScrollPane messagesScroll = new JScrollPane(log, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED) {
|
||||||
|
@Override
|
||||||
|
public Dimension getPreferredSize() {
|
||||||
|
return new Dimension(400, 400);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
public StatusWindow() {
|
||||||
|
log.setLineWrap(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void showFrame(String title) {
|
||||||
|
FrameHelper f = new FrameHelper();
|
||||||
|
f.getFrame().setTitle(title);
|
||||||
|
f.showFrame(messagesScroll, false);
|
||||||
|
UiUtils.centerWindow(f.getFrame());
|
||||||
|
log.setText(""); // let's remove stuff from previous invocation
|
||||||
|
}
|
||||||
|
|
||||||
|
public void appendMsg(final String s) {
|
||||||
|
SwingUtilities.invokeLater(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
log.append(s + "\r\n");
|
||||||
|
UiUtils.trueLayout(log);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue