SD File copy to TunerStudio working

This commit is contained in:
Josh Stewart 2021-11-25 13:19:54 +11:00
parent 2841a9f648
commit c3805456b2
5 changed files with 120 additions and 55 deletions

View File

@ -223,6 +223,7 @@
pageActivationDelay = 10
restrictSquirtRelationship = false ;This requires TS 3.1 or above
;messageEnvelopeFormat = msEnvelope_1.0 ;New and testing only
readSdCompressed = false
;New for TS 3.0.08ish upwards, define lists of standard I/O options
@ -1589,7 +1590,7 @@ page = 14
;pinLayout = bits, U08, 15, [0:7], "Speeduino v0.1", "Speeduino v0.2", "Speeduino v0.3", "Speeduino v0.4", "INVALID", "INVALID", "01-05 MX5 PNP", "INVALID", "96-97 MX5 PNP", "NA6 MX5 PNP", "Turtana PCB", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "Plazomat I/O 0.1", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "Daz V6 Shield 0.1", "BMW PnP", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "NO2C", "UA4C", "INVALID", "INVALID", "INVALID", "DIY-EFI CORE4 v1.0", "INVALID", "INVALID", "INVALID", "INVALID", "dvjcodec Teensy RevA", "dvjcodec Teensy RevB", "INVALID", "INVALID", "INVALID", "DropBear", "INVALID", "INVALID", "INVALID", "INVALID", "Black STM32F407VET6 V0.1", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"
defaultValue = boardFuelOutputs, 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 6 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 8 4 4 4 4 8 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
defaultValue = boardIgnOutputs, 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 6 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 8 4 4 4 4 8 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
defaultValue = boardHasRTC, 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
defaultValue = boardHasRTC, 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
controllerPriority = bootloaderCaps
@ -1772,7 +1773,7 @@ menuDialog = main
menu = "Data Logging"
;subMenu = sdcard_datalog, "SD Card Datalogging"
subMenu = std_ms3SdConsole, "Browse / Import SD Card", { boardHasRTC > 0 }
subMenu = std_ms3SdConsole, "Browse / Import SD Card", { arrayValue( array.boardHasRTC, pinLayout ) > 0 }
subMenu = rtc_settings, "Setup realtime clock"
subMenu = onboard_log_setup, "Setup onboard logger"

View File

@ -69,6 +69,7 @@ bool createLogFile();
void dateTime(uint16_t*, uint16_t*, uint8_t*); //Used for timestamping with RTC
uint16_t getNextSDLogFileNumber();
bool getSDLogFileDetails(uint8_t* , uint16_t);
void readSDSectors(uint8_t*, uint32_t, uint16_t);

View File

@ -159,6 +159,11 @@ bool getSDLogFileDetails(uint8_t* buffer, uint16_t logNumber)
return fileFound;
}
void readSDSectors(uint8_t* buffer, uint32_t sectorNumber, uint16_t sectorCount)
{
sd.card()->readSectors(sectorNumber, buffer, sectorCount);
}
void beginSDLogging()
{
if(SD_status == SD_STATUS_READY)

View File

@ -31,8 +31,14 @@ uint16_t serialPayloadLength = 0;
bool serialReceivePending = false; /**< Whether or not a serial request has only been partially received. This occurs when a the length has been received in the serial buffer, but not all of the payload or CRC has yet been received. */
uint16_t serialBytesReceived = 0;
uint32_t serialCRC = 0;
uint16_t SDcurrentDirChunk;
uint8_t serialPayload[SERIAL_BUFFER_SIZE]; /**< Pointer to the serial payload buffer. */
#ifdef RTC_ENABLED
uint8_t serialSDTransmitPayload[SD_FILE_TRANSMIT_BUFFER_SIZE];
uint16_t SDcurrentDirChunk;
uint32_t SDreadStartSector;
uint32_t SDreadNumSectors;
uint32_t SDreadCompletedSectors = 0;
#endif
/** Processes the incoming data on the serial buffer based on the command sent.
Can be either data for a new command or a continuation of data for command that is already in progress:
@ -360,14 +366,11 @@ void processSerialCommand()
case 'r': //New format for the optimised OutputChannels
{
uint8_t cmd = serialPayload[2];
uint8_t offset1 = serialPayload[3];
uint8_t offset2 = serialPayload[4];
uint16_t offset = word(offset2, offset1);
uint8_t length1 = serialPayload[5];
uint8_t length2 = serialPayload[6];
uint16_t length = word(length2, length1);
uint16_t offset = word(serialPayload[4], serialPayload[3]);
uint16_t length = word(serialPayload[6], serialPayload[5]);
uint16_t SD_arg1 = word(serialPayload[3], serialPayload[4]);
uint16_t SD_arg2 = word(serialPayload[5], serialPayload[6]);
if(cmd == 0x30) //Send output channels command 0x30 is 48dec
{
@ -392,7 +395,7 @@ void processSerialCommand()
else if(cmd == SD_READWRITE_PAGE) //Request SD card extended parameters
{
//SD read commands use the offset and length fields to indicate the request type
if((offset == SD_READ_STAT_OFFSET) && (length == SD_READ_STAT_LENGTH))
if((SD_arg1 == SD_READ_STAT_ARG1) && (SD_arg2 == SD_READ_STAT_ARG2))
{
//Read the status of the SD card
@ -430,7 +433,7 @@ void processSerialCommand()
sendSerialPayload(&serialPayload, 17);
}
else if((offset == SD_READ_DIR_OFFSET) && (length == SD_READ_DIR_LENGTH))
else if((SD_arg1 == SD_READ_DIR_ARG1) && (SD_arg2 == SD_READ_DIR_ARG2))
{
//Send file details
serialPayload[0] = SERIAL_RC_OK;
@ -452,15 +455,38 @@ void processSerialCommand()
sendSerialPayload(&serialPayload, (payloadIndex + 2));
}
else if((offset == SD_READ_STAT_OFFSET) && (length == SD_READ_STAT_LENGTH))
{
//File info
}
}
else if(cmd == 0x14)
else if(cmd == SD_READFILE_PAGE)
{
//Fetch data from file
if(SD_arg2 == SD_READ_COMP_ARG2)
{
//arg1 is the block number to return
serialSDTransmitPayload[0] = SERIAL_RC_OK;
serialSDTransmitPayload[1] = highByte(SD_arg1);
serialSDTransmitPayload[2] = lowByte(SD_arg1);
uint32_t currentSector = SDreadStartSector + (SD_arg1 * 4);
int32_t numSectorsToSend = 0;
if(SDreadNumSectors > SDreadCompletedSectors)
{
numSectorsToSend = SDreadNumSectors - SDreadCompletedSectors;
if(numSectorsToSend > 4) //Maximum of 4 sectors at a time
{
numSectorsToSend = 4;
}
}
SDreadCompletedSectors += numSectorsToSend;
if(numSectorsToSend <= 0) { sendSerialReturnCode(SERIAL_RC_OK); }
else
{
readSDSectors(&serialSDTransmitPayload[3], currentSector, numSectorsToSend);
sendSerialPayload(&serialSDTransmitPayload, (numSectorsToSend * SD_SECTOR_SIZE + 3));
}
}
}
#endif
else
@ -571,20 +597,14 @@ void processSerialCommand()
case 'w':
{
byte offset1, offset2, length1, length2;
uint8_t cmd = serialPayload[2];
offset1 = serialPayload[3];
offset2 = serialPayload[4];
uint16_t valueOffset = word(offset2, offset1);
length1 = serialPayload[5];
length2 = serialPayload[6];
uint16_t chunkSize = word(length2, length1);
uint16_t SD_arg1 = word(serialPayload[3], serialPayload[4]);
uint16_t SD_arg2 = word(serialPayload[5], serialPayload[6]);
#ifdef RTC_ENABLED
if(cmd == SD_READWRITE_PAGE)
{
if((valueOffset == SD_WRITE_DO_OFFSET) && (chunkSize == SD_WRITE_DO_LENGTH))
if((SD_arg1 == SD_WRITE_DO_ARG1) && (SD_arg2 == SD_WRITE_DO_ARG2))
{
/*
SD DO command. Single byte of data where the commands are:
@ -603,18 +623,18 @@ void processSerialCommand()
sendSerialReturnCode(SERIAL_RC_OK);
}
else if((valueOffset == SD_WRITE_DIR_OFFSET) && (chunkSize == SD_WRITE_DIR_LENGTH))
else if((SD_arg1 == SD_WRITE_DIR_ARG1) && (SD_arg2 == SD_WRITE_DIR_ARG2))
{
//Begin SD directory read. Value in payload represents the directory chunk to read
//Directory chunks are each 16 files long
SDcurrentDirChunk = word(serialPayload[7], serialPayload[8]);
sendSerialReturnCode(SERIAL_RC_OK);
}
else if((valueOffset == SD_WRITE_SEC_OFFSET) && (chunkSize == SD_WRITE_SEC_LENGTH))
else if((SD_arg1 == SD_WRITE_SEC_ARG1) && (SD_arg2 == SD_WRITE_SEC_ARG2))
{
//SD write sector command
}
else if((valueOffset == SD_ERASEFILE_OFFSET) && (chunkSize == SD_ERASEFILE_LENGTH))
else if((SD_arg1 == SD_ERASEFILE_ARG1) && (SD_arg2 == SD_ERASEFILE_ARG2))
{
//Erase file command
//First 4 bytes are the log number in ASCII
@ -629,7 +649,7 @@ void processSerialCommand()
Serial.read();
Serial.read();
}
else if((valueOffset == SD_SPD_TEST_OFFSET) && (chunkSize == SD_SPD_TEST_LENGTH))
else if((SD_arg1 == SD_SPD_TEST_ARG1) && (SD_arg2 == SD_SPD_TEST_ARG2))
{
//Perform a speed test on the SD card
//First 4 bytes are the sector number to write to
@ -652,12 +672,35 @@ void processSerialCommand()
sendSerialReturnCode(SERIAL_RC_OK);
}
else if((SD_arg1 == SD_WRITE_COMP_ARG1) && (SD_arg2 == SD_WRITE_COMP_ARG2))
{
//Prepare to read a 2024 byte chunk of data from the SD card
uint8_t sector1 = serialPayload[7];
uint8_t sector2 = serialPayload[8];
uint8_t sector3 = serialPayload[9];
uint8_t sector4 = serialPayload[10];
//SDreadStartSector = (sector1 << 24) | (sector2 << 16) | (sector3 << 8) | sector4;
SDreadStartSector = (sector4 << 24) | (sector3 << 16) | (sector2 << 8) | sector1;
//SDreadStartSector = sector4 | (sector3 << 8) | (sector2 << 16) | (sector1 << 24);
//Next 4 bytes are the number of sectors to write
uint8_t sectorCount1 = serialPayload[11];
uint8_t sectorCount2 = serialPayload[12];
uint8_t sectorCount3 = serialPayload[13];
uint8_t sectorCount4 = serialPayload[14];
SDreadNumSectors = (sectorCount1 << 24) | (sectorCount2 << 16) | (sectorCount3 << 8) | sectorCount4;
//Reset the sector counter
SDreadCompletedSectors = 0;
sendSerialReturnCode(SERIAL_RC_OK);
}
}
else if(cmd == SD_RTC_PAGE)
{
cmdPending = false;
//Used for setting RTC settings
if((valueOffset == SD_RTC_WRITE_OFFSET) && (chunkSize == SD_RTC_WRITE_LENGTH))
if((SD_arg1 == SD_RTC_WRITE_ARG1) && (SD_arg2 == SD_RTC_WRITE_ARG2))
{
//Set the RTC date/time
byte second = serialPayload[7];

View File

@ -12,35 +12,51 @@
//Hardcoded TunerStudio addresses/commands for various SD/RTC commands
#define SD_READWRITE_PAGE 0x11
#define SD_READFILE_PAGE 0x14
#define SD_RTC_PAGE 0x07
#define SD_READ_STAT_OFFSET 0x0000
#define SD_READ_STAT_LENGTH 0x1000
#define SD_READ_DIR_OFFSET 0x0000
#define SD_READ_DIR_LENGTH 0x0202
#define SD_READ_SEC_OFFSET 0x0200
#define SD_READ_SEC_LENGTH 0x0400
#define SD_READ_STRM_OFFSET 0x0400
#define SD_READ_STRM_LENGTH 0x0100
#define SD_WRITE_DO_OFFSET 0x0000
//#define SD_WRITE_DO_LENGTH 0x0001
#define SD_WRITE_DO_LENGTH 0x0100
#define SD_WRITE_DIR_OFFSET 0x0100
#define SD_WRITE_DIR_LENGTH 0x0200
#define SD_WRITE_SEC_OFFSET 0x0300
#define SD_WRITE_SEC_LENGTH 0x0402
#define SD_ERASEFILE_OFFSET 0x0600
#define SD_ERASEFILE_LENGTH 0x0600
#define SD_SPD_TEST_OFFSET 0x0700
#define SD_SPD_TEST_LENGTH 0x0400
#define SD_RTC_WRITE_OFFSET 0x7E02
#define SD_RTC_WRITE_LENGTH 0x0900
#define SD_RTC_READ_OFFSET 0x4D02
#define SD_RTC_READ_LENGTH 0x0800
#define SD_READ_STAT_ARG1 0x0000
#define SD_READ_STAT_ARG2 0x0010
#define SD_READ_DIR_ARG1 0x0000
#define SD_READ_DIR_ARG2 0x0202
#define SD_READ_SEC_ARG1 0x0002
#define SD_READ_SEC_ARG2 0x0004
#define SD_READ_STRM_ARG1 0x0004
#define SD_READ_STRM_ARG2 0x0001
#define SD_READ_COMP_ARG1 0x0000 //Not used for anything
#define SD_READ_COMP_ARG2 0x0800
#define SD_RTC_READ_ARG1 0x024D
#define SD_RTC_READ_ARG2 0x0008
#define SD_WRITE_DO_ARG1 0x0000
#define SD_WRITE_DO_ARG2 0x0001
#define SD_WRITE_DIR_ARG1 0x0001
#define SD_WRITE_DIR_ARG2 0x0002
#define SD_WRITE_SEC_ARG1 0x0003
#define SD_WRITE_SEC_ARG2 0x0204
#define SD_WRITE_COMP_ARG1 0x0005
#define SD_WRITE_COMP_ARG2 0x0008
#define SD_ERASEFILE_ARG1 0x0006
#define SD_ERASEFILE_ARG2 0x0006
#define SD_SPD_TEST_ARG1 0x0007
#define SD_SPD_TEST_ARG2 0x0004
#define SD_RTC_WRITE_ARG1 0x027E
#define SD_RTC_WRITE_ARG2 0x0009
#define SERIAL_CRC_LENGTH 4
#define SERIAL_LEN_SIZE 2
#define SERIAL_OVERHEAD_SIZE (SERIAL_LEN_SIZE + SERIAL_CRC_LENGTH) //The overhead for each serial command is 6 bytes. 2 bytes for the length and 4 bytes for the CRC
#ifdef RTC_ENABLED
#define SD_FILE_TRANSMIT_BUFFER_SIZE 2048 + 3
extern uint8_t serialSDTransmitPayload[SD_FILE_TRANSMIT_BUFFER_SIZE];
extern uint16_t SDcurrentDirChunk;
extern uint32_t SDreadStartSector;
extern uint32_t SDreadNumSectors; //Number of sectors to read
extern uint32_t SDreadCompletedSectors; //Number of sectors that have been read
#endif
//Serial return codes
#define SERIAL_RC_OK 0x00
#define SERIAL_RC_REALTIME 0x01
@ -57,7 +73,6 @@ extern bool serialReceivePending; /**< Whether or not a serial request has only
extern uint8_t serialPayload[SERIAL_BUFFER_SIZE]; /**< Pointer to the serial payload buffer. */
extern uint16_t serialBytesReceived; /**< The number of bytes received in the serial buffer during the current command. */
extern bool serialWriteInProgress;
extern uint16_t SDcurrentDirChunk;
void parseSerial();//This is the heart of the Command Line Interpeter. All that needed to be done was to make it human readable.
void processSerialCommand();