From 7942bce89b69b7926918851d3ee8843d3a84d857 Mon Sep 17 00:00:00 2001 From: rusEfi Date: Sun, 8 Mar 2015 22:04:55 -0500 Subject: [PATCH] auto-sync --- firmware/console/console_io.cpp | 21 ++++++++++++++++++- firmware/console/tunerstudio/tunerstudio.cpp | 15 +++++++++++++ firmware/console/tunerstudio/tunerstudio.h | 1 + firmware/console/tunerstudio/tunerstudio_io.h | 2 +- firmware/rusefi.cpp | 2 +- firmware/util/datalogging.cpp | 2 +- firmware/util/loggingcentral.cpp | 4 ++++ .../rusefi/binaryprotocol/BinaryProtocol.java | 16 +++++++++++++- .../rusefi/io/serial/SerialPortReader.java | 2 +- 9 files changed, 59 insertions(+), 6 deletions(-) diff --git a/firmware/console/console_io.cpp b/firmware/console/console_io.cpp index 2e6a81f44b..57f4284b36 100644 --- a/firmware/console/console_io.cpp +++ b/firmware/console/console_io.cpp @@ -21,6 +21,7 @@ #include "main.h" #include "console_io.h" #include "rfiutil.h" +#include "tunerstudio.h" #if HAL_USE_SERIAL_USB || defined(__DOXYGEN__) #include "usbcfg.h" @@ -99,6 +100,11 @@ static bool getConsoleLine(BaseSequentialStream *chp, char *line, unsigned size) *p = 0; return false; } + if (c == '\n') { + consolePutChar('\n'); + *p = 0; + return false; + } if (c < 0x20) { continue; } @@ -151,6 +157,10 @@ bool isConsoleReady(void) { bool_t consoleInBinaryMode = false; +ts_channel_s binaryConsole; + +uint8_t buffer[DL_OUTPUT_BUFFER]; + static THD_WORKING_AREA(consoleThreadStack, 2 * UTILITY_THREAD_STACK_SIZE); static msg_t consoleThreadThreadEntryPoint(void *arg) { (void) arg; @@ -165,6 +175,10 @@ static msg_t consoleThreadThreadEntryPoint(void *arg) { } #endif /* EFI_PROD_CODE */ + binaryConsole.channel = (BaseChannel *) getConsoleChannel(); + // todo: clean this spot! + binaryConsole.writeBuffer = buffer; + while (true) { efiAssert(getRemainingStack(chThdSelf()) > 256, "lowstck#9e", 0); bool end = getConsoleLine((BaseSequentialStream*) getConsoleChannel(), consoleInput, sizeof(consoleInput)); @@ -174,6 +188,11 @@ static msg_t consoleThreadThreadEntryPoint(void *arg) { } (console_line_callback)(consoleInput); + + if (consoleInBinaryMode) { + // switch to binary protocol + runBinaryProtocolLoop(&binaryConsole); + } } #if defined __GNUC__ return false; @@ -233,7 +252,7 @@ void startConsole(Logging *sharedLogger, CommandHandler console_line_callback_p) #endif /* EFI_PROD_CODE */ chThdCreateStatic(consoleThreadStack, sizeof(consoleThreadStack), NORMALPRIO, consoleThreadThreadEntryPoint, NULL); - addConsoleAction("~", switchToBinaryProtocol); + addConsoleAction(BINARY_COMMAND, switchToBinaryProtocol); } /** diff --git a/firmware/console/tunerstudio/tunerstudio.cpp b/firmware/console/tunerstudio/tunerstudio.cpp index 3e9cf64c60..2da8aed0a9 100644 --- a/firmware/console/tunerstudio/tunerstudio.cpp +++ b/firmware/console/tunerstudio/tunerstudio.cpp @@ -79,6 +79,7 @@ #include #include "engine_configuration.h" #include "svnversion.h" +#include "loggingcentral.h" #if EFI_TUNER_STUDIO || defined(__DOXYGEN__) @@ -400,6 +401,11 @@ void runBinaryProtocolLoop(ts_channel_s *tsChannel) { uint32_t incomingPacketSize = firstByte * 256 + secondByte; + if(incomingPacketSize==BINARY_SWITCH_TAG) { + // we are here if we get a binary switch request while already in binary mode. We will just ignore it. + continue; + } + if (incomingPacketSize == 0 || incomingPacketSize > (sizeof(tsChannel->crcReadBuffer) - CRC_WRAPPING_SIZE)) { scheduleMsg(tsLogger, "TunerStudio: invalid size: %d", incomingPacketSize); tunerStudioError("ERROR: CRC header size"); @@ -530,6 +536,13 @@ void handleTestCommand(ts_channel_s *tsChannel) { extern CommandHandler console_line_callback; +static void handleGetText(ts_channel_s *tsChannel) { + int outputSize; + char *output = swapOutputBuffers(&outputSize); + + tunerStudioWriteCrcPacket(tsChannel, TS_RESPONSE_COMMAND_OK, output, outputSize); +} + static void handleExecuteCommand(ts_channel_s *tsChannel, char *data, int incomingPacketSize) { tunerStudioWriteCrcPacket(tsChannel, TS_RESPONSE_COMMAND_OK, NULL, 0); data[incomingPacketSize] = 0; @@ -613,6 +626,8 @@ int tunerStudioHandleCrcCommand(ts_channel_s *tsChannel, char *data, int incomin if (command == TS_HELLO_COMMAND || command == TS_HELLO_COMMAND_DEPRECATED) { tunerStudioDebug("got Query command"); handleQueryCommand(tsChannel, TS_CRC); + } else if (command == TS_GET_TEXT) { + handleGetText(tsChannel); } else if (command == TS_EXECUTE) { handleExecuteCommand(tsChannel, data, incomingPacketSize); } else if (command == TS_OUTPUT_COMMAND) { diff --git a/firmware/console/tunerstudio/tunerstudio.h b/firmware/console/tunerstudio/tunerstudio.h index e0d023dea3..e67d87e827 100644 --- a/firmware/console/tunerstudio/tunerstudio.h +++ b/firmware/console/tunerstudio/tunerstudio.h @@ -53,6 +53,7 @@ void requestBurn(void); void startTunerStudioConnectivity(Logging *sharedLogger); void syncTunerStudioCopy(void); +void runBinaryProtocolLoop(ts_channel_s *tsChannel); #if defined __GNUC__ // GCC diff --git a/firmware/console/tunerstudio/tunerstudio_io.h b/firmware/console/tunerstudio/tunerstudio_io.h index cfbb258eb5..991b34ca9a 100644 --- a/firmware/console/tunerstudio/tunerstudio_io.h +++ b/firmware/console/tunerstudio/tunerstudio_io.h @@ -15,7 +15,7 @@ #endif // that's hex for "~\n", see -#define BINARY_SWITCH_TAG 0x7e0d +#define BINARY_SWITCH_TAG 0x7e0a #define BINARY_COMMAND "~" #define PROTOCOL "001" diff --git a/firmware/rusefi.cpp b/firmware/rusefi.cpp index ac16809ca1..81f9fe2cf9 100644 --- a/firmware/rusefi.cpp +++ b/firmware/rusefi.cpp @@ -267,7 +267,7 @@ void firmwareError(const char *errorMsg, ...) { } } -static char UNUSED_RAM_SIZE[9999]; +static char UNUSED_RAM_SIZE[2999]; static char UNUSED_CCM_SIZE[4900] CCM_OPTIONAL; diff --git a/firmware/util/datalogging.cpp b/firmware/util/datalogging.cpp index d3fee5f074..67a22d7be5 100644 --- a/firmware/util/datalogging.cpp +++ b/firmware/util/datalogging.cpp @@ -33,7 +33,7 @@ #include #include "main.h" -#if ! EFI_UNIT_TEST +#if ! EFI_UNIT_TEST || defined(__DOXYGEN__) #include "chprintf.h" #include "chmtx.h" #include "memstreams.h" diff --git a/firmware/util/loggingcentral.cpp b/firmware/util/loggingcentral.cpp index e1acd5663c..909d2f06e9 100644 --- a/firmware/util/loggingcentral.cpp +++ b/firmware/util/loggingcentral.cpp @@ -92,12 +92,16 @@ char * swapOutputBuffers(int *actualOutputBufferSize) { return outputBuffer; } +extern bool_t consoleInBinaryMode; + /** * This method actually sends all the pending data to the communication layer. * This method is invoked by the main thread - that's the only thread which should be sending * actual data to console in order to avoid concurrent access to serial hardware. */ void printPending(void) { + if (consoleInBinaryMode) + return; int actualOutputBufferSize; char *output = swapOutputBuffers(&actualOutputBufferSize); diff --git a/java_console/io/src/com/rusefi/binaryprotocol/BinaryProtocol.java b/java_console/io/src/com/rusefi/binaryprotocol/BinaryProtocol.java index 73d244e1d9..dd580e77d2 100644 --- a/java_console/io/src/com/rusefi/binaryprotocol/BinaryProtocol.java +++ b/java_console/io/src/com/rusefi/binaryprotocol/BinaryProtocol.java @@ -53,6 +53,11 @@ public class BinaryProtocol { serialPort.addEventListener(new SerialPortReader(serialPort, listener)); } + void switchToBinaryProtocol() throws SerialPortException, EOFException, InterruptedException { +// while (true) + serialPort.writeBytes("~\n".getBytes()); + } + public void burnChanges(ConfigurationImage newVersion, Logger logger) throws InterruptedException, EOFException, SerialPortException { ConfigurationImage current = getController(); // let's have our own copy which no one would be able to change @@ -101,7 +106,9 @@ public class BinaryProtocol { int packetSize = BinaryProtocol.swap16(cbb.getShort()); logger.trace("Got packet size " + packetSize); - if (packetSize < 0 || packetSize > 300) { + if (packetSize < 0 +// || packetSize > 300 + ) { // invalid packet size return null; } @@ -263,4 +270,11 @@ public class BinaryProtocol { break; } } + + public void requestText() throws InterruptedException, EOFException, SerialPortException { + byte[] response = exchange(new byte[]{'G'}); + if (response != null && response.length == 1) + Thread.sleep(100); + System.out.println(new String(response)); + } } diff --git a/java_console/io/src/com/rusefi/io/serial/SerialPortReader.java b/java_console/io/src/com/rusefi/io/serial/SerialPortReader.java index 3d8aec0472..73d5a42cb3 100644 --- a/java_console/io/src/com/rusefi/io/serial/SerialPortReader.java +++ b/java_console/io/src/com/rusefi/io/serial/SerialPortReader.java @@ -28,7 +28,7 @@ public class SerialPortReader implements SerialPortEventListener { e.printStackTrace(System.err); } } else { - FileLog.rlog("SerialPortReader serialEvent " + spe); + FileLog.rlog("less expected SerialPortReader serialEvent " + spe); } }