From 8d0f47b940c32d7c7bddf0878c6328123828ae57 Mon Sep 17 00:00:00 2001 From: rusefi Date: Fri, 7 Aug 2020 00:59:00 -0400 Subject: [PATCH] TS SD integration #1653 --- firmware/hw_layer/mmc_card_access.cpp | 91 +++++++- firmware/util/loggingcentral.cpp | 4 +- .../com/rusefi/ts_plugin/ConnectPanel.java | 201 ++++++++++-------- simulator/file3.mlg | Bin 1 -> 19129 bytes simulator/main.c | 2 + 5 files changed, 196 insertions(+), 102 deletions(-) diff --git a/firmware/hw_layer/mmc_card_access.cpp b/firmware/hw_layer/mmc_card_access.cpp index 2ab605cbea..1eb39b6056 100644 --- a/firmware/hw_layer/mmc_card_access.cpp +++ b/firmware/hw_layer/mmc_card_access.cpp @@ -8,6 +8,9 @@ #if EFI_SIMULATOR #include #include +#include +#include +#include #endif #define DIR_RESPONSE_SIZE 512 @@ -37,7 +40,6 @@ bool isLogFile(const char *fileName) { #endif - #if EFI_FILE_LOGGING || EFI_SIMULATOR #include "mmc_card.h" @@ -60,10 +62,18 @@ static void setFileEntry(uint8_t *buffer, int index, const char *fileName, int f buffer[offset + 11] = 1; + for (int i = 0; i < 4; i++) { + buffer[offset + 18 + i] = fileName[dotIndex + i - 4]; + } + *(uint32_t *) (&buffer[offset + 28]) = fileSize; } void handleTsR(ts_channel_s *tsChannel, char *input) { +#if EFI_SIMULATOR + printf("TS_SD r %d\n", input[1]); +#endif // EFI_SIMULATOR + const uint16_t* data16 = reinterpret_cast(input); if (input[0] == 0 && input[1] == TS_SD_PROTOCOL_RTC) { @@ -72,7 +82,7 @@ void handleTsR(ts_channel_s *tsChannel, char *input) { sr5SendResponse(tsChannel, TS_CRC, buffer, 9); } else if (input[0] == 0 && input[1] == TS_SD_PROTOCOL_FETCH_INFO) { - int length = data16[2]; + uint16_t length = SWAP_UINT16(data16[2]); scheduleMsg(&sharedLogger, "TS_SD: fetch buffer command, length=%d", length); @@ -109,21 +119,28 @@ void handleTsR(ts_channel_s *tsChannel, char *input) { int index = 0; struct dirent *de; // Pointer for directory entry while ((de = readdir(dr)) != NULL) { - printf("%s\n", de->d_name); + const char * fileName = de->d_name; + printf("%s\n", fileName); if (index >= DIR_RESPONSE_SIZE / 32) { break; } - if (isLogFile(de->d_name)) { - setFileEntry(buffer, index, de->d_name, 239); + if (isLogFile(fileName)) { + struct stat statBuffer; + int status; + + int fileSize = 0; + status = stat(fileName, &statBuffer); + if (status == 0) { + fileSize = statBuffer.st_size; + } + + setFileEntry(buffer, index, fileName, fileSize); index++; } } closedir(dr); -// setFileEntry(buffer, 0, "hello123.msq", 123123); -// setFileEntry(buffer, 1, "hello222.msq", 123123); - #endif // EFI_SIMULATOR sr5SendResponse(tsChannel, TS_CRC, buffer, 0x202); } @@ -141,20 +158,74 @@ void handleTsR(ts_channel_s *tsChannel, char *input) { void handleTsW(ts_channel_s *tsChannel, char *input) { const uint16_t* data16 = reinterpret_cast(input); +#if EFI_SIMULATOR + printf("TS_SD w %d\n", input[1]); +#endif // EFI_SIMULATOR + if (input[0] == 0 && input[1] == TS_SD_PROTOCOL_FETCH_INFO) { int code = data16[2]; scheduleMsg(&sharedLogger, "TS_SD: w, code=%d", code); if (input[5] == TS_SD_PROTOCOL_DO) { + scheduleMsg(&sharedLogger, "TS_SD_PROTOCOL_DO"); sendOkResponse(tsChannel, TS_CRC); } else if (input[5] == TS_SD_PROTOCOL_READ_DIR) { + scheduleMsg(&sharedLogger, "TS_SD_PROTOCOL_READ_DIR"); sendOkResponse(tsChannel, TS_CRC); } else if (input[5] == TS_SD_PROTOCOL_REMOVE_FILE) { - // todo +#if EFI_SIMULATOR + DIR *dr = opendir("."); + + if (dr == NULL) { + // opendir returns NULL if couldn't open directory + printf("Could not open current directory" ); + return; + } + + struct dirent *de; // Pointer for directory entry + while ((de = readdir(dr)) != NULL) { + const char * fileName = de->d_name; + printf("%s\n", fileName); + if (isLogFile(fileName)) { + int dotIndex = indexOf(fileName, DOT); + if (0 == strncmp(input + 6, &fileName[dotIndex - 4], 4)) { + printf("Removing %s\n", fileName); + remove(fileName); + break; + } + } + } + closedir(dr); + +#endif // EFI_SIMULATOR + sendOkResponse(tsChannel, TS_CRC); } else if (input[5] == TS_SD_PROTOCOL_FETCH_COMPRESSED) { - } +#if EFI_SIMULATOR + DIR *dr = opendir("."); + + if (dr == NULL) { + // opendir returns NULL if couldn't open directory + printf("Could not open current directory" ); + return; + } + + struct dirent *de; // Pointer for directory entry + while ((de = readdir(dr)) != NULL) { + const char * fileName = de->d_name; + printf("%s\n", fileName); + if (isLogFile(fileName)) { + int dotIndex = indexOf(fileName, DOT); + if (0 == strncmp(input + 6, &fileName[dotIndex - 4], 4)) { + printf("Will be uploading %s\n", fileName); + break; + } + } + } + closedir(dr); +#endif // EFI_SIMULATOR + } } else { diff --git a/firmware/util/loggingcentral.cpp b/firmware/util/loggingcentral.cpp index f475cbb2c2..5c27ceb78a 100644 --- a/firmware/util/loggingcentral.cpp +++ b/firmware/util/loggingcentral.cpp @@ -12,7 +12,7 @@ #include "global.h" #include "efilib.h" -#if EFI_UNIT_TEST +#if EFI_UNIT_TEST || EFI_SIMULATOR extern bool verboseMode; #endif /* EFI_UNIT_TEST */ @@ -148,7 +148,7 @@ char * swapOutputBuffers(int *actualOutputBufferSize) { * this is really 'global lock + printf + scheduleLogging + unlock' a bit more clear */ void scheduleMsg(Logging *logging, const char *format, ...) { -#if EFI_UNIT_TEST +#if EFI_UNIT_TEST || EFI_SIMULATOR if (verboseMode) { va_list ap; va_start(ap, format); diff --git a/java_tools/ts_plugin/src/main/java/com/rusefi/ts_plugin/ConnectPanel.java b/java_tools/ts_plugin/src/main/java/com/rusefi/ts_plugin/ConnectPanel.java index 0eb0714e02..1de28de072 100644 --- a/java_tools/ts_plugin/src/main/java/com/rusefi/ts_plugin/ConnectPanel.java +++ b/java_tools/ts_plugin/src/main/java/com/rusefi/ts_plugin/ConnectPanel.java @@ -20,6 +20,7 @@ import static com.rusefi.config.generated.Fields.TS_SD_PROTOCOL_FETCH_INFO; public class ConnectPanel { private final JPanel content = new JPanel(new BorderLayout()); private final JPanel fileList = new JPanel(new VerticalFlowLayout()); + private final JLabel status = new JLabel(); private LinkManager controllerConnector; @@ -31,117 +32,129 @@ public class ConnectPanel { connect.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { + connect.setEnabled(false); controllerConnector = new LinkManager() .setCompositeLogicEnabled(false) .setNeedPullData(false); //controllerConnector.startAndConnect(":2390", ConnectionStateListener.VOID); - controllerConnector.startAndConnect(":29001", ConnectionStateListener.VOID); + controllerConnector.startAndConnect(":29001", new ConnectionStateListener() { + public void onConnectionEstablished() { + status.setText("Connected to rusEFI"); + requestFileList(); + } + + public void onConnectionFailed() { + } + }); } }); - JButton poke = new JButton("poke"); poke.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - try { - byte[] packet; - byte[] response; - IoStream stream = controllerConnector.getConnector().getBinaryProtocol().getStream(); - - packet = new byte[3]; - packet[0] = Fields.TS_SD_R_COMMAND; - packet[2] = Fields.TS_SD_PROTOCOL_RTC; - stream.sendPacket(packet); - response = stream.getDataBuffer().getPacket("RTC status"); - System.out.println("RTC response " + IoStream.printHexBinary(response)); - if (response == null) - throw new IOException("RTC No packet"); - - packet = new byte[17]; - packet[0] = Fields.TS_SD_W_COMMAND; - packet[2] = TS_SD_PROTOCOL_FETCH_INFO; - packet[6] = Fields.TS_SD_PROTOCOL_READ_DIR; - stream.sendPacket(packet); - response = stream.getDataBuffer().getPacket("read dir command"); - if (response == null) - throw new IOException("Read Dir No packet"); - System.out.println("read dir command " + IoStream.printHexBinary(response)); - - packet = new byte[8]; - packet[0] = Fields.TS_SD_R_COMMAND; - packet[1] = 0; - packet[2] = TS_SD_PROTOCOL_FETCH_INFO; - packet[5] = 0x02; - packet[6] = 0x02; - stream.sendPacket(packet); - response = stream.getDataBuffer().getPacket("read command", true); - if (response == null) - throw new IOException("No packet"); - System.out.println("read command " + IoStream.printHexBinary(response)); - - fileList.removeAll(); - - for (int fileIndex = 0; fileIndex < 512 / 32; fileIndex++) { - int offset = 32 * fileIndex; - String fileNamePart = new String(response, 1 + offset, 8).trim(); - if (fileNamePart.trim().isEmpty()) - break; - String fileExt = new String(response, 1 + offset + 8, 3).trim(); - String fileName = fileNamePart + "." + fileExt; - - ByteBuffer bb = ByteBuffer.wrap(response, 1 + offset + 28, 4); - bb.order(ByteOrder.LITTLE_ENDIAN); - int size = bb.getInt(); - - JPanel filePanel = new JPanel(new FlowLayout()); - - - filePanel.add(new JLabel(fileName + " " + size + " byte(s)")); - - JButton download = new JButton("Download"); - download.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - - } - }); - - filePanel.add(download); - JButton delete = new JButton("Delete"); - delete.addActionListener(e1 -> { - int result = JOptionPane.showConfirmDialog(null, "Are you sure you want to remove " + fileName, - "rusEfi", JOptionPane.YES_NO_OPTION); - if (result == JOptionPane.YES_OPTION) { - deleteFile(fileName); - - } - }); - filePanel.add(delete); - - fileList.add(filePanel); - - System.out.println("Filename " + fileName + " size " + size); - - - AutoupdateUtil.trueLayout(content.getParent()); - } - - } catch (IOException ioException) { - ioException.printStackTrace(); - } + requestFileList(); } }); - flow.add(connect); flow.add(poke); content.add(flow, BorderLayout.NORTH); content.add(fileList, BorderLayout.CENTER); + content.add(status, BorderLayout.SOUTH); + } + + private void requestFileList() { + try { + byte[] packet; + byte[] response; + IoStream stream = controllerConnector.getConnector().getBinaryProtocol().getStream(); + + packet = new byte[3]; + packet[0] = Fields.TS_SD_R_COMMAND; + packet[2] = Fields.TS_SD_PROTOCOL_RTC; + stream.sendPacket(packet); + response = stream.getDataBuffer().getPacket("RTC status"); + System.out.println("RTC response " + IoStream.printHexBinary(response)); + if (response == null) + throw new IOException("RTC No packet"); + + packet = new byte[17]; + packet[0] = Fields.TS_SD_W_COMMAND; + packet[2] = TS_SD_PROTOCOL_FETCH_INFO; + packet[6] = Fields.TS_SD_PROTOCOL_READ_DIR; + stream.sendPacket(packet); + response = stream.getDataBuffer().getPacket("read dir command"); + if (response == null) + throw new IOException("Read Dir No packet"); + System.out.println("read dir command " + IoStream.printHexBinary(response)); + + packet = new byte[8]; + packet[0] = Fields.TS_SD_R_COMMAND; + packet[1] = 0; + packet[2] = TS_SD_PROTOCOL_FETCH_INFO; + packet[5] = 0x02; + packet[6] = 0x02; + stream.sendPacket(packet); + response = stream.getDataBuffer().getPacket("read command", true); + if (response == null) + throw new IOException("No packet"); + System.out.println("read command " + IoStream.printHexBinary(response)); + + fileList.removeAll(); + + for (int fileIndex = 0; fileIndex < 512 / 32; fileIndex++) { + int offset = 32 * fileIndex; + String fileNamePart = new String(response, 1 + offset, 8).trim(); + if (fileNamePart.trim().isEmpty()) + break; + String fileExt = new String(response, 1 + offset + 8, 3).trim(); + String fileName = fileNamePart + "." + fileExt; + + ByteBuffer bb = ByteBuffer.wrap(response, 1 + offset + 28, 4); + bb.order(ByteOrder.LITTLE_ENDIAN); + int size = bb.getInt(); + + JPanel filePanel = new JPanel(new FlowLayout()); + + filePanel.add(new JLabel(fileName + " " + size + " byte(s)")); + + JButton download = new JButton("Download"); + download.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + downloadFile(fileName); + + + } + }); + + filePanel.add(download); + JButton delete = new JButton("Delete"); + delete.addActionListener(e1 -> { + int result = JOptionPane.showConfirmDialog(null, "Are you sure you want to remove " + fileName, + "rusEfi", JOptionPane.YES_NO_OPTION); + if (result == JOptionPane.YES_OPTION) { + deleteFile(fileName); + requestFileList(); + } + }); + filePanel.add(delete); + + fileList.add(filePanel); + + System.out.println("Filename " + fileName + " size " + size); + + AutoupdateUtil.trueLayout(content.getParent()); + } + + } catch (IOException ioException) { + ioException.printStackTrace(); + } } public static String getLastFour(String fileName) { @@ -152,13 +165,21 @@ public class ConnectPanel { return fileName.substring(fileName.length() - 4); } + private void downloadFile(String fileName) { + fileName = ConnectPanel.getLastFour(fileName); + + } + private void deleteFile(String fileName) { fileName = ConnectPanel.getLastFour(fileName); byte[] packet = new byte[17]; packet[0] = Fields.TS_SD_W_COMMAND; packet[2] = TS_SD_PROTOCOL_FETCH_INFO; - packet[6] = Fields.TS_SD_PROTOCOL_READ_DIR; + packet[6] = Fields.TS_SD_PROTOCOL_REMOVE_FILE; + for (int i = 0; i < 4; i++) + packet[7 + i] = (byte) fileName.charAt(i); + IoStream stream = controllerConnector.getConnector().getBinaryProtocol().getStream(); try { diff --git a/simulator/file3.mlg b/simulator/file3.mlg index 8b137891791fe96927ad78e64b0aad7bded08bdc..2e4d899e9ced969089a44b7c1cc9f1d9aa74c3f5 100644 GIT binary patch literal 19129 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 ikNWX+yJqa)P#{Z0p911;yhZnG literal 1 Icmd-A000XB3jhEB diff --git a/simulator/main.c b/simulator/main.c index 8a0a3be676..c2f24101bb 100644 --- a/simulator/main.c +++ b/simulator/main.c @@ -130,6 +130,8 @@ static void sd2_handler(eventid_t id) { static evhandler_t fhandlers[] = { termination_handler, sd1_handler, sd2_handler }; +bool verboseMode = true; + /*------------------------------------------------------------------------* * Simulator main. * *------------------------------------------------------------------------*/