diff --git a/java_console/autotest/src/com/rusefi/IoUtil.java b/java_console/autotest/src/com/rusefi/IoUtil.java index d73dd98d19..e9f6c98463 100644 --- a/java_console/autotest/src/com/rusefi/IoUtil.java +++ b/java_console/autotest/src/com/rusefi/IoUtil.java @@ -169,6 +169,10 @@ public class IoUtil { System.out.println("CONNECTION FAILED, did you specify the right port name?"); System.exit(-1); } + + @Override + public void onConnectionEstablished() { + } }); LinkManager.engineState.registerStringValueAction(EngineState.RUS_EFI_VERSION_TAG, (EngineState.ValueCallback) EngineState.ValueCallback.VOID); LinkManager.engineState.registerStringValueAction(EngineState.OUTPIN_TAG, (EngineState.ValueCallback) EngineState.ValueCallback.VOID); diff --git a/java_console/io/src/com/rusefi/binaryprotocol/BinaryProtocol.java b/java_console/io/src/com/rusefi/binaryprotocol/BinaryProtocol.java index 2f3975486f..3d0b0ee391 100644 --- a/java_console/io/src/com/rusefi/binaryprotocol/BinaryProtocol.java +++ b/java_console/io/src/com/rusefi/binaryprotocol/BinaryProtocol.java @@ -35,10 +35,16 @@ public class BinaryProtocol { private final Object lock = new Object(); private ConfigurationImage controller; + // todo: fix this, this is HORRIBLE! + @Deprecated + public static BinaryProtocol instance; + public BinaryProtocol(final Logger logger, SerialPort serialPort) { this.logger = logger; this.serialPort = serialPort; + instance = this; + cbb = new CircularByteBuffer(BUFFER_SIZE); DataListener listener = new DataListener() { @Override @@ -108,7 +114,7 @@ public class BinaryProtocol { offset = range.second; } - burn(); + burn(logger); setController(newVersion); } @@ -238,9 +244,10 @@ public class BinaryProtocol { } } - private void burn() throws InterruptedException, EOFException, SerialPortException { + private void burn(Logger logger) throws InterruptedException, EOFException, SerialPortException { if (!isBurnPending) return; + logger.info("Need to burn"); while (true) { byte[] response = exchange(new byte[]{'B'}); @@ -249,6 +256,7 @@ public class BinaryProtocol { } break; } + logger.info("DONE"); isBurnPending = false; } diff --git a/java_console/io/src/com/rusefi/io/LinkManager.java b/java_console/io/src/com/rusefi/io/LinkManager.java index f8a2b4567b..d8d0bd9332 100644 --- a/java_console/io/src/com/rusefi/io/LinkManager.java +++ b/java_console/io/src/com/rusefi/io/LinkManager.java @@ -6,9 +6,7 @@ import com.rusefi.io.serial.SerialConnector; import com.rusefi.io.tcp.TcpConnector; import org.jetbrains.annotations.NotNull; -import java.util.concurrent.Executor; -import java.util.concurrent.Executors; -import java.util.concurrent.ThreadFactory; +import java.util.concurrent.*; /** * @author Andrey Belomutskiy @@ -53,6 +51,10 @@ public class LinkManager { return TcpConnector.doUnpackConfirmation(message); } }; + public static final LinkedBlockingQueue COMMUNICATION_QUEUE = new LinkedBlockingQueue<>(); + public static final ExecutorService COMMUNICATION_EXECUTOR = new ThreadPoolExecutor(1, 1, + 0L, TimeUnit.MILLISECONDS, + COMMUNICATION_QUEUE); public static EngineState engineState = new EngineState(new EngineState.EngineStateListenerImpl() { @Override public void beforeLine(String fullLine) { @@ -131,8 +133,15 @@ public class LinkManager { @Override public void onConnectionFailed() { } + + @Override + public void onConnectionEstablished() { + + } }; void onConnectionFailed(); + + void onConnectionEstablished(); } } diff --git a/java_console/io/src/com/rusefi/io/serial/PortHolder.java b/java_console/io/src/com/rusefi/io/serial/PortHolder.java index b3d9b1c9b6..c7ec1d5b6f 100644 --- a/java_console/io/src/com/rusefi/io/serial/PortHolder.java +++ b/java_console/io/src/com/rusefi/io/serial/PortHolder.java @@ -29,14 +29,7 @@ public class PortHolder { private static PortHolder instance = new PortHolder(); private final Object portLock = new Object(); - private final LinkedBlockingQueue EXE_Q = new LinkedBlockingQueue<>(); - - private final ExecutorService PORT_QUEUE = new ThreadPoolExecutor(1, 1, - 0L, TimeUnit.MILLISECONDS, - EXE_Q); - public PortHolderListener portHolderListener = PortHolderListener.VOID; - private DataListener listener; private BinaryProtocol bp; private PortHolder() { @@ -50,13 +43,15 @@ public class PortHolder { if (port == null) return false; boolean result = open(port, dataListener); - if (!result) + if (result) { + listener.onConnectionEstablished(); + } else { listener.onConnectionFailed(); + } return result; } public boolean open(String port, final DataListener listener) { - this.listener = listener; SerialPort serialPort = new SerialPort(port); try { FileLog.MAIN.logLine("Opening " + port + " @ " + BAUD_RATE); @@ -85,14 +80,14 @@ public class PortHolder { bp = new BinaryProtocol(Logger.STDOUT, serialPort); bp.switchToBinaryProtocol(); -// bp.readImage(BinaryProtocol.IMAGE_SIZE); + bp.readImage(BinaryProtocol.IMAGE_SIZE); Runnable textPull = new Runnable() { @Override public void run() { while (true) { - if (EXE_Q.isEmpty()) { - PORT_QUEUE.submit(new Runnable() { + if (LinkManager.COMMUNICATION_QUEUE.isEmpty()) { + LinkManager.COMMUNICATION_EXECUTOR.submit(new Runnable() { @Override public void run() { String text = bp.requestText(); @@ -159,7 +154,7 @@ public class PortHolder { FileLog.MAIN.logLine("Sending [" + command + "]"); portHolderListener.onPortHolderMessage(PortHolder.class, "Sending [" + command + "]"); - Future f = PORT_QUEUE.submit(new Runnable() { + Future f = LinkManager.COMMUNICATION_EXECUTOR.submit(new Runnable() { @Override public void run() { bp.sendTextCommand(command); @@ -168,9 +163,7 @@ public class PortHolder { try { f.get(30, TimeUnit.SECONDS); - } catch (ExecutionException e) { - throw new IllegalStateException(e); - } catch (TimeoutException e) { + } catch (ExecutionException | TimeoutException e) { throw new IllegalStateException(e); } /** diff --git a/java_console/ui/src/com/rusefi/Launcher.java b/java_console/ui/src/com/rusefi/Launcher.java index 89d9f3a813..1f32ff3519 100644 --- a/java_console/ui/src/com/rusefi/Launcher.java +++ b/java_console/ui/src/com/rusefi/Launcher.java @@ -1,5 +1,7 @@ package com.rusefi; +import com.rusefi.binaryprotocol.BinaryProtocol; +import com.rusefi.binaryprotocol.BinaryProtocolCmd; import com.rusefi.core.EngineState; import com.rusefi.core.MessagesCentral; import com.rusefi.io.LinkManager; @@ -83,7 +85,20 @@ public class Launcher extends FrameHelper { super.onWindowOpened(); setTitle("N/A"); - LinkManager.open(LinkManager.LinkStateListener.VOID); + LinkManager.open(new LinkManager.LinkStateListener() { + @Override + public void onConnectionFailed() { + } + + @Override + public void onConnectionEstablished() { + try { + BinaryProtocolCmd.doShowImage(BinaryProtocol.instance.getController()); + } catch (Exception e) { + throw new IllegalStateException(e); + } + } + }); LinkManager.engineState.registerStringValueAction(EngineState.RUS_EFI_VERSION_TAG, new EngineState.ValueCallback() { @Override diff --git a/java_console/ui/src/com/rusefi/UploadChanges.java b/java_console/ui/src/com/rusefi/UploadChanges.java index e96184df3c..f6cccbd5ad 100644 --- a/java_console/ui/src/com/rusefi/UploadChanges.java +++ b/java_console/ui/src/com/rusefi/UploadChanges.java @@ -1,6 +1,7 @@ package com.rusefi; import com.rusefi.binaryprotocol.BinaryProtocol; +import com.rusefi.io.LinkManager; import com.rusefi.io.serial.PortHolder; import com.rusefi.ui.StatusWindow; import jssc.SerialPort; @@ -10,8 +11,6 @@ import javax.swing.*; import java.io.EOFException; import java.io.IOException; import java.lang.reflect.InvocationTargetException; -import java.util.concurrent.Executor; -import java.util.concurrent.Executors; /** * (c) Andrey Belomutskiy 2013-2015 @@ -19,8 +18,6 @@ import java.util.concurrent.Executors; */ public class UploadChanges { public static final Logger logger = createUiLogger(); - private static final Executor EXEC = Executors.newSingleThreadExecutor(); - public static void main(String[] args) throws SerialPortException, InvocationTargetException, InterruptedException { if (args.length != 1) { System.out.println("Exactly one parameter expected"); @@ -62,11 +59,11 @@ public class UploadChanges { } public static void scheduleBurn(final ConfigurationImage newVersion, final BinaryProtocol bp) { - EXEC.execute(new Runnable() { + LinkManager.COMMUNICATION_EXECUTOR.execute(new Runnable() { @Override public void run() { try { - bp.burnChanges(newVersion, logger); + BinaryProtocol.instance.burnChanges(newVersion, logger); } catch (InterruptedException | EOFException | SerialPortException e) { logger.error("Error: " + e); throw new IllegalStateException(e); diff --git a/java_console/ui/src/com/rusefi/binaryprotocol/BinaryProtocolCmd.java b/java_console/ui/src/com/rusefi/binaryprotocol/BinaryProtocolCmd.java index 8c27a460aa..f46c6ddc51 100644 --- a/java_console/ui/src/com/rusefi/binaryprotocol/BinaryProtocolCmd.java +++ b/java_console/ui/src/com/rusefi/binaryprotocol/BinaryProtocolCmd.java @@ -39,10 +39,13 @@ public class BinaryProtocolCmd { bp.switchToBinaryProtocol(); bp.readImage(BinaryProtocol.IMAGE_SIZE); - ConfigurationImage image = bp.getController(); -// + // // image.saveToFile("rusefi_configuration.bin"); // + doShowImage(bp.getController()); + } + + public static void doShowImage(ConfigurationImage image) throws Exception { RomRaiderWrapper.startRomRaider(); ECUEditor.openImage(image.getFileContent(), SettingsManager.getSettings().getEcuDefinitionFiles().elementAt(0), "rusEfi");