Merge branch 'master' of https://github.com/rusefi/rusefi
This commit is contained in:
commit
744c6ef82f
|
@ -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();
|
||||||
|
|
Loading…
Reference in New Issue