diff --git a/firmware/console/binary/tunerstudio.cpp b/firmware/console/binary/tunerstudio.cpp index 7b4628a3a2..22bcc7f4b0 100644 --- a/firmware/console/binary/tunerstudio.cpp +++ b/firmware/console/binary/tunerstudio.cpp @@ -632,7 +632,7 @@ int tunerStudioHandleCrcCommand(ts_channel_s *tsChannel, char *data, int incomin } else if (command == TS_GET_TEXT) { handleGetText(tsChannel); } else if (command == TS_EXECUTE) { - handleExecuteCommand(tsChannel, data, incomingPacketSize); + handleExecuteCommand(tsChannel, data, incomingPacketSize - 1); } else if (command == TS_OUTPUT_COMMAND) { handleOutputChannelsCommand(tsChannel, TS_CRC); } else if (command == TS_PAGE_COMMAND) { diff --git a/java_console/io/src/com/rusefi/io/CommandQueue.java b/java_console/io/src/com/rusefi/io/CommandQueue.java index 33e3cd9e8d..6ffcac5a70 100644 --- a/java_console/io/src/com/rusefi/io/CommandQueue.java +++ b/java_console/io/src/com/rusefi/io/CommandQueue.java @@ -17,7 +17,7 @@ import java.util.concurrent.LinkedBlockingQueue; */ @SuppressWarnings("FieldCanBeLocal") public class CommandQueue { - private static final String CONFIRMATION_PREFIX = "confirmation_"; + public static final String CONFIRMATION_PREFIX = "confirmation_"; public static final int DEFAULT_TIMEOUT = 500; private static final int COMMAND_CONFIRMATION_TIMEOUT = 1000; private static final int SLOW_CONFIRMATION_TIMEOUT = 5000; @@ -113,26 +113,11 @@ public class CommandQueue { * this method handles command confirmations packed as * TODO: add example, todo: refactor method and add unit test */ - private void handleConfirmationMessage(String message, MessagesCentral mc) { - String confirmation = message.substring(CONFIRMATION_PREFIX.length()); - int index = confirmation.indexOf(":"); - if (index < 0) { - mc.postMessage(CommandQueue.class, "Broken confirmation: " + confirmation); - return; - } - String number = confirmation.substring(index + 1); - int length; - try { - length = Integer.parseInt(number); - } catch (NumberFormatException e) { - mc.postMessage(CommandQueue.class, "Broken confirmation length: " + confirmation); - return; - } - if (length != index) { - mc.postMessage(CommandQueue.class, "Broken confirmation length: " + confirmation); - return; - } - latestConfirmation = confirmation.substring(0, length); + private void handleConfirmationMessage(final String message, MessagesCentral mc) { + String confirmation = LinkManager.unpackConfirmation(message); + if (confirmation == null) + mc.postMessage(CommandQueue.class, "Broken confirmation length: " + message); + latestConfirmation = confirmation; mc.postMessage(CommandQueue.class, "got valid conf! " + latestConfirmation); synchronized (lock) { lock.notifyAll(); @@ -154,7 +139,8 @@ public class CommandQueue { /** * Non-blocking command request * Command is placed in the queue where it would be until it is confirmed - * @param command dev console command + * + * @param command dev console command * @param timeoutMs retry timeout */ public void write(String command, int timeoutMs, InvocationConfirmationListener listener) { diff --git a/java_console/io/src/com/rusefi/io/LinkConnector.java b/java_console/io/src/com/rusefi/io/LinkConnector.java index b6c71a9c67..ed2cecaec9 100644 --- a/java_console/io/src/com/rusefi/io/LinkConnector.java +++ b/java_console/io/src/com/rusefi/io/LinkConnector.java @@ -14,4 +14,6 @@ public interface LinkConnector { boolean hasError(); String unpack(String packet); + + String unpackConfirmation(String message); } diff --git a/java_console/io/src/com/rusefi/io/LinkManager.java b/java_console/io/src/com/rusefi/io/LinkManager.java index d4e9a726d2..f8a2b4567b 100644 --- a/java_console/io/src/com/rusefi/io/LinkManager.java +++ b/java_console/io/src/com/rusefi/io/LinkManager.java @@ -47,6 +47,11 @@ public class LinkManager { public String unpack(String packet) { return EngineState.unpackString(packet); } + + @Override + public String unpackConfirmation(String message) { + return TcpConnector.doUnpackConfirmation(message); + } }; public static EngineState engineState = new EngineState(new EngineState.EngineStateListenerImpl() { @Override @@ -98,7 +103,7 @@ public class LinkManager { public static void send(String command) throws InterruptedException { if (connector == null) throw new NullPointerException("connector"); - connector.send(encodeCommand(command)); + connector.send(command); } public static String encodeCommand(String command) { @@ -117,6 +122,10 @@ public class LinkManager { return connector.hasError(); } + public static String unpackConfirmation(String message) { + return connector.unpackConfirmation(message); + } + public static interface LinkStateListener { public static final LinkStateListener VOID = new LinkStateListener() { @Override 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 1376d24c26..44cffd6068 100644 --- a/java_console/io/src/com/rusefi/io/serial/PortHolder.java +++ b/java_console/io/src/com/rusefi/io/serial/PortHolder.java @@ -130,7 +130,7 @@ public class PortHolder { private void doWriteCommand(@NotNull String command) throws SerialPortException { if (serialPort == null) throw new NullPointerException("serialPort"); - serialPort.writeString(command + "\r\n"); + serialPort.writeBytes((command + "\n").getBytes()); } public static PortHolder getInstance() { diff --git a/java_console/io/src/com/rusefi/io/serial/SerialConnector.java b/java_console/io/src/com/rusefi/io/serial/SerialConnector.java index e8a55a62c2..0e636af8e2 100644 --- a/java_console/io/src/com/rusefi/io/serial/SerialConnector.java +++ b/java_console/io/src/com/rusefi/io/serial/SerialConnector.java @@ -4,6 +4,7 @@ import com.rusefi.FileLog; import com.rusefi.core.EngineState; import com.rusefi.io.LinkConnector; import com.rusefi.io.LinkManager; +import com.rusefi.io.tcp.TcpConnector; /** * @author Andrey Belomutskiy @@ -36,7 +37,13 @@ public class SerialConnector implements LinkConnector { } @Override - public void send(String command) throws InterruptedException { + public void send(String text) throws InterruptedException { + String command = LinkManager.encodeCommand(text); PortHolder.getInstance().packAndSend(command); } + + @Override + public String unpackConfirmation(String message) { + return TcpConnector.doUnpackConfirmation(message); + } } diff --git a/java_console/io/src/com/rusefi/io/tcp/TcpConnector.java b/java_console/io/src/com/rusefi/io/tcp/TcpConnector.java index 737cdaa9e0..3a2911bf45 100644 --- a/java_console/io/src/com/rusefi/io/tcp/TcpConnector.java +++ b/java_console/io/src/com/rusefi/io/tcp/TcpConnector.java @@ -2,6 +2,7 @@ package com.rusefi.io.tcp; import com.rusefi.FileLog; import com.rusefi.core.EngineState; +import com.rusefi.io.CommandQueue; import com.rusefi.io.LinkConnector; import com.rusefi.io.LinkManager; @@ -38,6 +39,25 @@ public class TcpConnector implements LinkConnector { } } + public static String doUnpackConfirmation(String message) { + String confirmation = message.substring(CommandQueue.CONFIRMATION_PREFIX.length()); + int index = confirmation.indexOf(":"); + if (index < 0) { + return null; + } + String number = confirmation.substring(index + 1); + int length; + try { + length = Integer.parseInt(number); + } catch (NumberFormatException e) { + return null; + } + if (length != index) { + return null; + } + return confirmation.substring(0, length); + } + static class InvalidTcpPort extends Exception { } @@ -112,7 +132,8 @@ public class TcpConnector implements LinkConnector { } @Override - public void send(String command) throws InterruptedException { + public void send(String text) throws InterruptedException { + String command = LinkManager.encodeCommand(text); FileLog.rlog("Writing " + command); try { writer.write(command + "\r\n"); @@ -124,6 +145,11 @@ public class TcpConnector implements LinkConnector { } } + @Override + public String unpackConfirmation(String message) { + return doUnpackConfirmation(message); + } + public static Collection getAvailablePorts() { return isTcpPortOpened() ? Collections.singletonList("" + DEFAULT_PORT) : Collections.emptyList(); } diff --git a/java_console/ui/src/com/rusefi/Launcher.java b/java_console/ui/src/com/rusefi/Launcher.java index 6d23d94bba..c096df0ee4 100644 --- a/java_console/ui/src/com/rusefi/Launcher.java +++ b/java_console/ui/src/com/rusefi/Launcher.java @@ -29,7 +29,7 @@ import static com.rusefi.ui.storage.PersistentConfiguration.getConfig; * @see com.rusefi.StartupFrame */ public class Launcher extends FrameHelper { - public static final int CONSOLE_VERSION = 20150307; + public static final int CONSOLE_VERSION = 20150308; public static final boolean SHOW_STIMULATOR = true; public static final String TAB_INDEX = "main_tab"; private final String port;