This commit is contained in:
rusefi 2019-07-05 19:04:37 -04:00
commit 744c6ef82f
1 changed files with 71 additions and 99 deletions

View File

@ -193,49 +193,18 @@ void tunerStudioDebug(const char *msg) {
char *getWorkingPageAddr(int pageIndex) { char *getWorkingPageAddr(int pageIndex) {
switch (pageIndex) { switch (pageIndex) {
case 0: case 0:
#if !defined(EFI_NO_CONFIG_WORKING_COPY) #ifndef EFI_NO_CONFIG_WORKING_COPY
return (char*) &configWorkingCopy.engineConfiguration; return (char*) &configWorkingCopy.engineConfiguration;
#else #else
return (char*) engineConfiguration; return (char*) engineConfiguration;
#endif /* EFI_NO_CONFIG_WORKING_COPY */ #endif /* EFI_NO_CONFIG_WORKING_COPY */
// case 1: default:
// return (char*) &configWorkingCopy.ve2Table; return nullptr;
// case 2:
// return (char*) &configWorkingCopy.fuelTable;
// case 3:
// return (char*) &configWorkingCopy.ignitionTable;
// case 4:
// return (char*) &configWorkingCopy.veTable;
// case 5:
// return (char*) &configWorkingCopy.afrTable;
// case 6:
// return (char*) &configWorkingCopy.injectionPhase;
// case 2: // fuelTable
// case 3: // ignitionTable
// case 4: // veTable
// case 5: // afrTable
// return (char*) &configWorkingCopy.engineConfiguration + PAGE_0_SIZE + (pageIndex - 2) * 1024;
} }
return NULL;
} }
int getTunerStudioPageSize(int pageIndex) { int getTunerStudioPageSize(int pageIndex) {
switch (pageIndex) { return pageIndex ? 0 : TOTAL_CONFIG_SIZE;
case 0:
return TOTAL_CONFIG_SIZE;
// case 1:
// case 2:
// case 3:
// case 4:
// case 5:
// case 6:
// return PAGE_1_SIZE;
// case 2:
// case 3:
// case 4:
// return 1024;
}
return 0;
} }
static void sendOkResponse(ts_channel_s *tsChannel, ts_response_format_e mode) { static void sendOkResponse(ts_channel_s *tsChannel, ts_response_format_e mode) {
@ -264,7 +233,7 @@ void handlePageSelectCommand(ts_channel_s *tsChannel, ts_response_format_e mode,
*/ */
static void onlineApplyWorkingCopyBytes(int currentPageId, uint32_t offset, int count) { static void onlineApplyWorkingCopyBytes(int currentPageId, uint32_t offset, int count) {
UNUSED(currentPageId); UNUSED(currentPageId);
if (offset > sizeof(engine_configuration_s)) { if (offset >= sizeof(engine_configuration_s)) {
int maxSize = sizeof(persistent_config_s) - offset; int maxSize = sizeof(persistent_config_s) - offset;
if (count > maxSize) { if (count > maxSize) {
warning(CUSTOM_TS_OVERFLOW, "TS overflow %d %d", offset, count); warning(CUSTOM_TS_OVERFLOW, "TS overflow %d %d", offset, count);
@ -752,85 +721,88 @@ int tunerStudioHandleCrcCommand(ts_channel_s *tsChannel, char *data, int incomin
char command = data[0]; char command = data[0];
data++; data++;
// Output command first since it's popular const uint16_t* data16 = reinterpret_cast<uint16_t*>(data);
if (command == TS_OUTPUT_COMMAND) {
uint16_t offset = *(uint16_t *) (data); switch(command)
uint16_t count = *(uint16_t *) (data + 2); {
handleOutputChannelsCommand(tsChannel, TS_CRC, offset, count); case TS_OUTPUT_COMMAND:
} else if (command == TS_HELLO_COMMAND) { handleOutputChannelsCommand(tsChannel, TS_CRC, data16[0], data16[1]);
break;
case TS_HELLO_COMMAND:
tunerStudioDebug("got Query command"); tunerStudioDebug("got Query command");
handleQueryCommand(tsChannel, TS_CRC); handleQueryCommand(tsChannel, TS_CRC);
} else if (command == TS_GET_FIRMWARE_VERSION) { break;
case TS_GET_FIRMWARE_VERSION:
handleGetVersion(tsChannel, TS_CRC); handleGetVersion(tsChannel, TS_CRC);
} else if (command == TS_GET_TEXT) { break;
case TS_GET_TEXT:
handleGetText(tsChannel); handleGetText(tsChannel);
} else if (command == TS_EXECUTE) { break;
case TS_EXECUTE:
handleExecuteCommand(tsChannel, data, incomingPacketSize - 1); handleExecuteCommand(tsChannel, data, incomingPacketSize - 1);
} else if (command == TS_PAGE_COMMAND) { break;
uint16_t page = *(uint16_t *) data; case TS_PAGE_COMMAND:
handlePageSelectCommand(tsChannel, TS_CRC, page); handlePageSelectCommand(tsChannel, TS_CRC, data16[0]);
} else if (command == TS_GET_STRUCT) { break;
short structId = *(uint16_t *) data; case TS_GET_STRUCT:
uint16_t length = *(uint16_t *) (data + 2); handleGetStructContent(tsChannel, data16[0], data16[1]);
handleGetStructContent(tsChannel, structId, length); break;
} else if (command == TS_GET_FILE_RANGE) { case TS_GET_FILE_RANGE:
short fileId = *(uint16_t *) data; handleReadFileContent(tsChannel, data16[0], data16[1], data16[2]);
uint16_t offset = *(uint16_t *) (data + 2); break;
uint16_t length = *(uint16_t *) (data + 4); case TS_CHUNK_WRITE_COMMAND:
handleReadFileContent(tsChannel, fileId, offset, length); currentPageId = data16[0];
} else if (command == TS_CHUNK_WRITE_COMMAND) { handleWriteChunkCommand(tsChannel, TS_CRC, data16[1], data16[2], data + sizeof(TunerStudioWriteChunkRequest));
currentPageId = *(uint16_t *) data; break;
uint16_t offset = *(uint16_t *) (data + 2); case TS_SINGLE_WRITE_COMMAND:
uint16_t count = *(uint16_t *) (data + 4); {
handleWriteChunkCommand(tsChannel, TS_CRC, offset, count, data + sizeof(TunerStudioWriteChunkRequest)); uint8_t value = data[4];
} else if (command == TS_SINGLE_WRITE_COMMAND) { handleWriteValueCommand(tsChannel, TS_CRC, data16[0], data16[1], value);
uint16_t page = *(uint16_t *) data;
uint16_t offset = *(uint16_t *) (data + 2);
uint8_t value = data[4];
handleWriteValueCommand(tsChannel, TS_CRC, page, offset, value);
} else if (command == TS_CRC_CHECK_COMMAND) {
uint16_t page = *(uint16_t *) data;
uint16_t offset = *(uint16_t *) (data + 2);
uint16_t count = *(uint16_t *) (data + 4);
handleCrc32Check(tsChannel, TS_CRC, page, offset, count);
} else if (command == TS_BURN_COMMAND) {
uint16_t page = *(uint16_t *) data;
handleBurnCommand(tsChannel, TS_CRC, page);
} else if (command == TS_READ_COMMAND) {
uint16_t page = *(uint16_t *) data;
uint16_t offset = *(uint16_t *) (data + 2);
uint16_t count = *(uint16_t *) (data + 4);
handlePageReadCommand(tsChannel, TS_CRC, page, offset, count);
} else if (command == 't' || command == 'T') {
handleTestCommand(tsChannel);
} else if (command == TS_IO_TEST_COMMAND) {
uint16_t subsystem = SWAP_UINT16(*(uint16_t*)&data[0]);
uint16_t index = SWAP_UINT16(*(uint16_t*)&data[2]);
if (engineConfiguration->debugMode == DBG_BENCH_TEST) {
tsOutputChannels.debugIntField1++;
tsOutputChannels.debugIntField2 = subsystem;
tsOutputChannels.debugIntField3 = index;
} }
break;
case TS_CRC_CHECK_COMMAND:
handleCrc32Check(tsChannel, TS_CRC, data16[0], data16[1], data16[2]);
break;
case TS_BURN_COMMAND:
handleBurnCommand(tsChannel, TS_CRC, data16[0]);
break;
case TS_READ_COMMAND:
handlePageReadCommand(tsChannel, TS_CRC, data16[0], data16[1], data16[2]);
break;
case TS_TEST_COMMAND:
[[fallthrough]];
case 'T':
handleTestCommand(tsChannel);
break;
case TS_IO_TEST_COMMAND:
{
uint16_t subsystem = SWAP_UINT16(data16[0]);
uint16_t index = SWAP_UINT16(data16[1]);
if (engineConfiguration->debugMode == DBG_BENCH_TEST) {
tsOutputChannels.debugIntField1++;
tsOutputChannels.debugIntField2 = subsystem;
tsOutputChannels.debugIntField3 = index;
}
#if EFI_PROD_CODE #if EFI_PROD_CODE
executeTSCommand(subsystem, index); executeTSCommand(subsystem, index);
#endif /* EFI_PROD_CODE */ #endif /* EFI_PROD_CODE */
sendOkResponse(tsChannel, TS_CRC); sendOkResponse(tsChannel, TS_CRC);
} else { }
break;
default:
tunerStudioError("ERROR: ignoring unexpected command"); tunerStudioError("ERROR: ignoring unexpected command");
return false; return false;
} }
return true; return true;
} }
void startTunerStudioConnectivity(void) { void startTunerStudioConnectivity(void) {
if (sizeof(persistent_config_s) != getTunerStudioPageSize(0)) // Assert tune & output channel struct sizes
firmwareError(CUSTOM_OBD_TS_PAGE_MISMATCH, "TS page size mismatch: %d/%d", sizeof(persistent_config_s), getTunerStudioPageSize(0)); static_assert(sizeof(persistent_config_s) == TOTAL_CONFIG_SIZE, "TS datapage size mismatch");
static_assert(sizeof(TunerStudioOutputChannels) == TS_OUTPUT_SIZE, "TS output channels size mismatch");
if (sizeof(TunerStudioOutputChannels) != TS_OUTPUT_SIZE)
firmwareError(CUSTOM_OBD_TS_OUTPUT_MISMATCH, "TS outputs size mismatch: %d/%d", sizeof(TunerStudioOutputChannels), TS_OUTPUT_SIZE);
memset(&tsState, 0, sizeof(tsState)); memset(&tsState, 0, sizeof(tsState));
syncTunerStudioCopy(); syncTunerStudioCopy();