auto-sync
This commit is contained in:
parent
4ee39f8e0a
commit
7f7bd9b0c0
|
@ -80,6 +80,13 @@ extern persistent_config_container_s persistentState;
|
||||||
|
|
||||||
static efitimems_t previousWriteReportMs = 0;
|
static efitimems_t previousWriteReportMs = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* we use 'blockingFactor = 256' in rusefi.ini
|
||||||
|
* todo: should we just do (256 + CRC_WRAPPING_SIZE) ?
|
||||||
|
*/
|
||||||
|
|
||||||
|
static uint8_t crcIoBuffer[300];
|
||||||
|
|
||||||
static int ts_serial_ready(void) {
|
static int ts_serial_ready(void) {
|
||||||
#if EFI_PROD_CODE
|
#if EFI_PROD_CODE
|
||||||
if (isSerialOverUart()) {
|
if (isSerialOverUart()) {
|
||||||
|
@ -104,7 +111,19 @@ static int tsCounter = 0;
|
||||||
|
|
||||||
extern TunerStudioOutputChannels tsOutputChannels;
|
extern TunerStudioOutputChannels tsOutputChannels;
|
||||||
|
|
||||||
extern TunerStudioState tsState;
|
extern tunerstudio_counters_s tsState;
|
||||||
|
|
||||||
|
static void resetTs(void) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For some reason I could not get the 'pages' feature of Tuner Studio working - as
|
||||||
|
* a workaround the whole configuration is just one page
|
||||||
|
*
|
||||||
|
* this field is in the end to simply aligning situation
|
||||||
|
*/
|
||||||
|
static short currentPageId;
|
||||||
|
|
||||||
void printTsStats(void) {
|
void printTsStats(void) {
|
||||||
#if EFI_PROD_CODE
|
#if EFI_PROD_CODE
|
||||||
|
@ -117,7 +136,7 @@ void printTsStats(void) {
|
||||||
sizeof(tsOutputChannels), tsCounter, tsState.errorCounter, tsState.queryCommandCounter,
|
sizeof(tsOutputChannels), tsCounter, tsState.errorCounter, tsState.queryCommandCounter,
|
||||||
tsState.outputChannelsCommandCounter, tsState.readPageCommandsCounter, tsState.burnCommandCounter);
|
tsState.outputChannelsCommandCounter, tsState.readPageCommandsCounter, tsState.burnCommandCounter);
|
||||||
scheduleMsg(tsLogger, "TunerStudio W=%d / C=%d / P=%d / page=%d", tsState.writeValueCommandCounter,
|
scheduleMsg(tsLogger, "TunerStudio W=%d / C=%d / P=%d / page=%d", tsState.writeValueCommandCounter,
|
||||||
tsState.writeChunkCommandCounter, tsState.pageCommandCounter, tsState.currentPageId);
|
tsState.writeChunkCommandCounter, tsState.pageCommandCounter, currentPageId);
|
||||||
scheduleMsg(tsLogger, "page size=%d", sizeof(engine_configuration_s));
|
scheduleMsg(tsLogger, "page size=%d", sizeof(engine_configuration_s));
|
||||||
|
|
||||||
// scheduleMsg(logger, "analogChartFrequency %d",
|
// scheduleMsg(logger, "analogChartFrequency %d",
|
||||||
|
@ -187,8 +206,8 @@ int getTunerStudioPageSize(int pageIndex) {
|
||||||
void handlePageSelectCommand(ts_response_format_e mode, uint16_t pageId) {
|
void handlePageSelectCommand(ts_response_format_e mode, uint16_t pageId) {
|
||||||
tsState.pageCommandCounter++;
|
tsState.pageCommandCounter++;
|
||||||
|
|
||||||
tsState.currentPageId = pageId;
|
currentPageId = pageId;
|
||||||
scheduleMsg(tsLogger, "page %d selected", tsState.currentPageId);
|
scheduleMsg(tsLogger, "page %d selected", currentPageId);
|
||||||
tsSendResponse(mode, NULL, 0);
|
tsSendResponse(mode, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -199,21 +218,21 @@ void handlePageSelectCommand(ts_response_format_e mode, uint16_t pageId) {
|
||||||
void handleWriteChunkCommand(ts_response_format_e mode, short offset, short count, void *content) {
|
void handleWriteChunkCommand(ts_response_format_e mode, short offset, short count, void *content) {
|
||||||
tsState.writeChunkCommandCounter++;
|
tsState.writeChunkCommandCounter++;
|
||||||
|
|
||||||
scheduleMsg(tsLogger, "%d receiving page %d chunk offset %d size %d", mode, tsState.currentPageId, offset, count);
|
scheduleMsg(tsLogger, "%d receiving page %d chunk offset %d size %d", mode, currentPageId, offset, count);
|
||||||
|
|
||||||
if (offset > getTunerStudioPageSize(tsState.currentPageId)) {
|
if (offset > getTunerStudioPageSize(currentPageId)) {
|
||||||
scheduleMsg(tsLogger, "ERROR offset %d", offset);
|
scheduleMsg(tsLogger, "ERROR offset %d", offset);
|
||||||
tunerStudioError("ERROR: out of range");
|
tunerStudioError("ERROR: out of range");
|
||||||
offset = 0;
|
offset = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (count > getTunerStudioPageSize(tsState.currentPageId)) {
|
if (count > getTunerStudioPageSize(currentPageId)) {
|
||||||
tunerStudioError("ERROR: unexpected count");
|
tunerStudioError("ERROR: unexpected count");
|
||||||
scheduleMsg(tsLogger, "ERROR count %d", count);
|
scheduleMsg(tsLogger, "ERROR count %d", count);
|
||||||
count = 0;
|
count = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t * addr = (uint8_t *) (getWorkingPageAddr(tsState.currentPageId) + offset);
|
uint8_t * addr = (uint8_t *) (getWorkingPageAddr(currentPageId) + offset);
|
||||||
memcpy(addr, content, count);
|
memcpy(addr, content, count);
|
||||||
|
|
||||||
tsSendResponse(mode, NULL, 0);
|
tsSendResponse(mode, NULL, 0);
|
||||||
|
@ -227,7 +246,7 @@ void handleWriteChunkCommand(ts_response_format_e mode, short offset, short coun
|
||||||
void handleWriteValueCommand(ts_response_format_e mode, uint16_t page, uint16_t offset, uint8_t value) {
|
void handleWriteValueCommand(ts_response_format_e mode, uint16_t page, uint16_t offset, uint8_t value) {
|
||||||
tsState.writeValueCommandCounter++;
|
tsState.writeValueCommandCounter++;
|
||||||
|
|
||||||
tsState.currentPageId = page;
|
currentPageId = page;
|
||||||
|
|
||||||
//tunerStudioDebug("got W (Write)"); // we can get a lot of these
|
//tunerStudioDebug("got W (Write)"); // we can get a lot of these
|
||||||
|
|
||||||
|
@ -238,7 +257,7 @@ void handleWriteValueCommand(ts_response_format_e mode, uint16_t page, uint16_t
|
||||||
// int size = sizeof(TunerStudioWriteValueRequest);
|
// int size = sizeof(TunerStudioWriteValueRequest);
|
||||||
// scheduleMsg(logger, "Reading %d\r\n", size);
|
// scheduleMsg(logger, "Reading %d\r\n", size);
|
||||||
|
|
||||||
if (offset > getTunerStudioPageSize(tsState.currentPageId)) {
|
if (offset > getTunerStudioPageSize(currentPageId)) {
|
||||||
tunerStudioError("ERROR: out of range2");
|
tunerStudioError("ERROR: out of range2");
|
||||||
scheduleMsg(tsLogger, "ERROR offset %d", offset);
|
scheduleMsg(tsLogger, "ERROR offset %d", offset);
|
||||||
offset = 0;
|
offset = 0;
|
||||||
|
@ -248,10 +267,10 @@ void handleWriteValueCommand(ts_response_format_e mode, uint16_t page, uint16_t
|
||||||
efitimems_t nowMs = currentTimeMillis();
|
efitimems_t nowMs = currentTimeMillis();
|
||||||
if (nowMs - previousWriteReportMs > 5) {
|
if (nowMs - previousWriteReportMs > 5) {
|
||||||
previousWriteReportMs = nowMs;
|
previousWriteReportMs = nowMs;
|
||||||
scheduleMsg(tsLogger, "page %d offset %d: value=%d", tsState.currentPageId, offset, value);
|
scheduleMsg(tsLogger, "page %d offset %d: value=%d", currentPageId, offset, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
getWorkingPageAddr(tsState.currentPageId)[offset] = value;
|
getWorkingPageAddr(currentPageId)[offset] = value;
|
||||||
|
|
||||||
// scheduleMsg(logger, "va=%d", configWorkingCopy.boardConfiguration.idleValvePin);
|
// scheduleMsg(logger, "va=%d", configWorkingCopy.boardConfiguration.idleValvePin);
|
||||||
}
|
}
|
||||||
|
@ -263,23 +282,23 @@ static void sendErrorCode(void) {
|
||||||
void handlePageReadCommand(ts_response_format_e mode, uint16_t pageId, uint16_t offset, uint16_t count) {
|
void handlePageReadCommand(ts_response_format_e mode, uint16_t pageId, uint16_t offset, uint16_t count) {
|
||||||
tsState.readPageCommandsCounter++;
|
tsState.readPageCommandsCounter++;
|
||||||
tunerStudioDebug("got R (Read page)");
|
tunerStudioDebug("got R (Read page)");
|
||||||
tsState.currentPageId = pageId;
|
currentPageId = pageId;
|
||||||
|
|
||||||
#if EFI_TUNER_STUDIO_VERBOSE
|
#if EFI_TUNER_STUDIO_VERBOSE
|
||||||
scheduleMsg(tsLogger, "%d: Page requested: page %d offset=%d count=%d", mode, (int) tsState.currentPageId, offset,
|
scheduleMsg(tsLogger, "%d: Page requested: page %d offset=%d count=%d", mode, (int) currentPageId, offset,
|
||||||
count);
|
count);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (tsState.currentPageId > MAX_PAGE_ID) {
|
if (currentPageId > MAX_PAGE_ID) {
|
||||||
scheduleMsg(tsLogger, "invalid Page number %x", tsState.currentPageId);
|
scheduleMsg(tsLogger, "invalid Page number %x", currentPageId);
|
||||||
|
|
||||||
// something is not right here
|
// something is not right here
|
||||||
tsState.currentPageId = 0;
|
currentPageId = 0;
|
||||||
tunerStudioError("ERROR: invalid page");
|
tunerStudioError("ERROR: invalid page");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int size = getTunerStudioPageSize(tsState.currentPageId);
|
int size = getTunerStudioPageSize(currentPageId);
|
||||||
|
|
||||||
if (size < offset + count) {
|
if (size < offset + count) {
|
||||||
scheduleMsg(tsLogger, "invalid offset/count %d/%d", offset, count);
|
scheduleMsg(tsLogger, "invalid offset/count %d/%d", offset, count);
|
||||||
|
@ -287,7 +306,7 @@ void handlePageReadCommand(ts_response_format_e mode, uint16_t pageId, uint16_t
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint8_t *addr = (const uint8_t *) (getWorkingPageAddr(tsState.currentPageId) + offset);
|
const uint8_t *addr = (const uint8_t *) (getWorkingPageAddr(currentPageId) + offset);
|
||||||
tsSendResponse(mode, addr, count);
|
tsSendResponse(mode, addr, count);
|
||||||
#if EFI_TUNER_STUDIO_VERBOSE
|
#if EFI_TUNER_STUDIO_VERBOSE
|
||||||
scheduleMsg(tsLogger, "Sending %d done", count);
|
scheduleMsg(tsLogger, "Sending %d done", count);
|
||||||
|
@ -303,11 +322,11 @@ void handleBurnCommand(ts_response_format_e mode, uint16_t page) {
|
||||||
|
|
||||||
tunerStudioDebug("got B (Burn)");
|
tunerStudioDebug("got B (Burn)");
|
||||||
|
|
||||||
tsState.currentPageId = page;
|
currentPageId = page;
|
||||||
|
|
||||||
#if EFI_TUNER_STUDIO_VERBOSE
|
#if EFI_TUNER_STUDIO_VERBOSE
|
||||||
// pointless since we only have one page now
|
// pointless since we only have one page now
|
||||||
// scheduleMsg(logger, "Page number %d", tsState.currentPageId);
|
// scheduleMsg(logger, "Page number %d", currentPageId);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// todo: how about some multi-threading?
|
// todo: how about some multi-threading?
|
||||||
|
@ -322,6 +341,7 @@ void handleBurnCommand(ts_response_format_e mode, uint16_t page) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static TunerStudioReadRequest readRequest;
|
static TunerStudioReadRequest readRequest;
|
||||||
|
static TunerStudioWriteChunkRequest writeChunkRequest;
|
||||||
static short int pageIn;
|
static short int pageIn;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -340,11 +360,40 @@ static bool handlePlainCommand(uint8_t command) {
|
||||||
// todo: validate 'recieved' value
|
// todo: validate 'recieved' value
|
||||||
handlePageSelectCommand(TS_PLAIN, pageIn);
|
handlePageSelectCommand(TS_PLAIN, pageIn);
|
||||||
return true;
|
return true;
|
||||||
|
} else if (command == TS_BURN_COMMAND) {
|
||||||
|
scheduleMsg(tsLogger, "Got naked BURN");
|
||||||
|
uint16_t page;
|
||||||
|
int recieved = chSequentialStreamRead(getTsSerialDevice(), (uint8_t * )&page,
|
||||||
|
sizeof(page));
|
||||||
|
if (recieved != sizeof(page)) {
|
||||||
|
tunerStudioError("ERROR: Not enough for plain burn");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
handleBurnCommand(TS_PLAIN, page);
|
||||||
|
return true;
|
||||||
|
} else if (command == TS_CHUNK_WRITE_COMMAND) {
|
||||||
|
scheduleMsg(tsLogger, "Got naked CHUNK_WRITE");
|
||||||
|
int recieved = chSequentialStreamRead(getTsSerialDevice(), (uint8_t * )&writeChunkRequest,
|
||||||
|
sizeof(writeChunkRequest));
|
||||||
|
if (recieved != sizeof(writeChunkRequest)) {
|
||||||
|
scheduleMsg(tsLogger, "ERROR: Not enough for plain chunk write header: %d", recieved);
|
||||||
|
tsState.errorCounter++;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
recieved = chSequentialStreamRead(getTsSerialDevice(), (uint8_t * )&crcIoBuffer, writeChunkRequest.count);
|
||||||
|
if (recieved != writeChunkRequest.count) {
|
||||||
|
scheduleMsg(tsLogger, "ERROR: Not enough for plain chunk write content: %d while expecting %d", recieved, writeChunkRequest.count);
|
||||||
|
tsState.errorCounter++;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
handleWriteChunkCommand(TS_PLAIN, writeChunkRequest.offset, writeChunkRequest.count, (uint8_t * )&crcIoBuffer);
|
||||||
|
return true;
|
||||||
} else if (command == TS_READ_COMMAND) {
|
} else if (command == TS_READ_COMMAND) {
|
||||||
//scheduleMsg(logger, "Got naked READ PAGE???");
|
//scheduleMsg(logger, "Got naked READ PAGE???");
|
||||||
int recieved = chSequentialStreamRead(getTsSerialDevice(), (uint8_t * )&readRequest, sizeof(readRequest));
|
int recieved = chSequentialStreamRead(getTsSerialDevice(), (uint8_t * )&readRequest, sizeof(readRequest));
|
||||||
if (recieved != sizeof(readRequest)) {
|
if (recieved != sizeof(readRequest)) {
|
||||||
// todo: handler error
|
tunerStudioError("Not enough for plain read header");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
handlePageReadCommand(TS_PLAIN, readRequest.page, readRequest.offset, readRequest.count);
|
handlePageReadCommand(TS_PLAIN, readRequest.page, readRequest.offset, readRequest.count);
|
||||||
|
@ -378,13 +427,6 @@ static uint8_t secondByte;
|
||||||
// todo: double-check this
|
// todo: double-check this
|
||||||
#define CRC_WRAPPING_SIZE 7
|
#define CRC_WRAPPING_SIZE 7
|
||||||
|
|
||||||
/**
|
|
||||||
* we use 'blockingFactor = 256' in rusefi.ini
|
|
||||||
* todo: should we just do (256 + CRC_WRAPPING_SIZE) ?
|
|
||||||
*/
|
|
||||||
|
|
||||||
static uint8_t crcIoBuffer[300];
|
|
||||||
|
|
||||||
static msg_t tsThreadEntryPoint(void *arg) {
|
static msg_t tsThreadEntryPoint(void *arg) {
|
||||||
(void) arg;
|
(void) arg;
|
||||||
chRegSetThreadName("tunerstudio thread");
|
chRegSetThreadName("tunerstudio thread");
|
||||||
|
@ -444,7 +486,7 @@ static msg_t tsThreadEntryPoint(void *arg) {
|
||||||
|
|
||||||
if (incomingPacketSize == 0 || incomingPacketSize > (sizeof(crcIoBuffer) - CRC_WRAPPING_SIZE)) {
|
if (incomingPacketSize == 0 || incomingPacketSize > (sizeof(crcIoBuffer) - CRC_WRAPPING_SIZE)) {
|
||||||
scheduleMsg(tsLogger, "TunerStudio: invalid size: %d", incomingPacketSize);
|
scheduleMsg(tsLogger, "TunerStudio: invalid size: %d", incomingPacketSize);
|
||||||
tunerStudioError("ERROR: size");
|
tunerStudioError("ERROR: CRC header size");
|
||||||
sendErrorCode();
|
sendErrorCode();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -538,6 +580,7 @@ void startTunerStudioConnectivity(Logging *sharedLogger) {
|
||||||
syncTunerStudioCopy();
|
syncTunerStudioCopy();
|
||||||
|
|
||||||
addConsoleAction("tsinfo", printTsStats);
|
addConsoleAction("tsinfo", printTsStats);
|
||||||
|
addConsoleAction("reset_ts", resetTs);
|
||||||
addConsoleActionI("set_ts_speed", setTsSpeed);
|
addConsoleActionI("set_ts_speed", setTsSpeed);
|
||||||
|
|
||||||
chThdCreateStatic(tsThreadStack, sizeof(tsThreadStack), NORMALPRIO, tsThreadEntryPoint, NULL);
|
chThdCreateStatic(tsThreadStack, sizeof(tsThreadStack), NORMALPRIO, tsThreadEntryPoint, NULL);
|
||||||
|
|
|
@ -65,7 +65,7 @@ extern Logging *tsLogger;
|
||||||
#include "tunerstudio.h"
|
#include "tunerstudio.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
TunerStudioState tsState;
|
tunerstudio_counters_s tsState;
|
||||||
TunerStudioOutputChannels tsOutputChannels;
|
TunerStudioOutputChannels tsOutputChannels;
|
||||||
/**
|
/**
|
||||||
* this is a local copy of the configuration. Any changes to this copy
|
* this is a local copy of the configuration. Any changes to this copy
|
||||||
|
|
|
@ -32,14 +32,7 @@ typedef struct {
|
||||||
int writeValueCommandCounter;
|
int writeValueCommandCounter;
|
||||||
int writeChunkCommandCounter;
|
int writeChunkCommandCounter;
|
||||||
int errorCounter;
|
int errorCounter;
|
||||||
/**
|
} tunerstudio_counters_s;
|
||||||
* For some reason I could not get the 'pages' feature of Tuner Studio working - as
|
|
||||||
* a workaround the whole configuration is just one page
|
|
||||||
*
|
|
||||||
* this field is in the end to simply aligning situation
|
|
||||||
*/
|
|
||||||
short currentPageId;
|
|
||||||
} TunerStudioState;
|
|
||||||
|
|
||||||
int tunerStudioHandleCrcCommand(uint8_t *data, int incomingPacketSize);
|
int tunerStudioHandleCrcCommand(uint8_t *data, int incomingPacketSize);
|
||||||
|
|
||||||
|
|
|
@ -160,8 +160,8 @@ void FuelSchedule::addFuelEvents(OutputSignalList *sourceList, injection_mode_e
|
||||||
* injection phase is scheduled by injection end, so we need to step the angle back
|
* injection phase is scheduled by injection end, so we need to step the angle back
|
||||||
* for the duration of the injection
|
* for the duration of the injection
|
||||||
*/
|
*/
|
||||||
float baseAngle = getInjectionAngle(engine->rpmCalculator.rpmValue PASS_ENGINE_PARAMETER) +
|
float baseAngle = getInjectionAngle(engine->rpmCalculator.rpmValue PASS_ENGINE_PARAMETER)
|
||||||
engineConfiguration->injectionAngle - MS2US(engine->fuelMs) / engine->rpmCalculator.oneDegreeUs;
|
+ engineConfiguration->injectionAngle - MS2US(engine->fuelMs) / engine->rpmCalculator.oneDegreeUs;
|
||||||
|
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case IM_SEQUENTIAL:
|
case IM_SEQUENTIAL:
|
||||||
|
@ -276,10 +276,11 @@ void findTriggerPosition(event_trigger_position_s *position, angle_t angleOffset
|
||||||
}
|
}
|
||||||
|
|
||||||
static int order_1_THEN_3_THEN_4_THEN2[] = { 1, 3, 4, 2 };
|
static int order_1_THEN_3_THEN_4_THEN2[] = { 1, 3, 4, 2 };
|
||||||
|
static int order_1_THEN_2_THEN_4_THEN3[] = { 1, 2, 4, 3 };
|
||||||
|
static int order_1_THEN_3_THEN_2_THEN4[] = { 1, 3, 2, 4 };
|
||||||
|
|
||||||
static int order_1_THEN_5_THEN_3_THEN_6_THEN_2_THEN_4[] = { 1, 5, 3, 6, 2, 4 };
|
static int order_1_THEN_5_THEN_3_THEN_6_THEN_2_THEN_4[] = { 1, 5, 3, 6, 2, 4 };
|
||||||
|
static int order_1_THEN_4_THEN_2_THEN_5_THEN_3_THEN_6[] = { 1, 4, 2, 5, 3, 6 };
|
||||||
static int order_1_THEN_4_THEN_2_THEN_5_THEN_3_THEN_6[] = {1, 4, 2, 5, 3, 6};
|
|
||||||
|
|
||||||
static int order_1_8_4_3_6_5_7_2[] = { 1, 8, 4, 3, 6, 5, 7, 2 };
|
static int order_1_8_4_3_6_5_7_2[] = { 1, 8, 4, 3, 6, 5, 7, 2 };
|
||||||
|
|
||||||
|
@ -294,6 +295,10 @@ int getCylinderId(firing_order_e firingOrder, int index) {
|
||||||
return 1;
|
return 1;
|
||||||
case FO_1_THEN_3_THEN_4_THEN2:
|
case FO_1_THEN_3_THEN_4_THEN2:
|
||||||
return order_1_THEN_3_THEN_4_THEN2[index];
|
return order_1_THEN_3_THEN_4_THEN2[index];
|
||||||
|
case FO_1_THEN_2_THEN_4_THEN3:
|
||||||
|
return order_1_THEN_2_THEN_4_THEN3[index];
|
||||||
|
case FO_1_THEN_3_THEN_2_THEN4:
|
||||||
|
return order_1_THEN_3_THEN_2_THEN4[index];
|
||||||
case FO_1_THEN_5_THEN_3_THEN_6_THEN_2_THEN_4:
|
case FO_1_THEN_5_THEN_3_THEN_6_THEN_2_THEN_4:
|
||||||
return order_1_THEN_5_THEN_3_THEN_6_THEN_2_THEN_4[index];
|
return order_1_THEN_5_THEN_3_THEN_6_THEN_2_THEN_4[index];
|
||||||
case FO_1_THEN_4_THEN_2_THEN_5_THEN_3_THEN_6:
|
case FO_1_THEN_4_THEN_2_THEN_5_THEN_3_THEN_6:
|
||||||
|
|
|
@ -136,6 +136,21 @@ char *getFirmwareError(void) {
|
||||||
return (char*) errorMessageBuffer;
|
return (char*) errorMessageBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// todo: move this into a hw-specific file
|
||||||
|
static void rebootNow(void) {
|
||||||
|
NVIC_SystemReset();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Some configuration changes require full firmware reset.
|
||||||
|
* Once day we will write graceful shutdown, but that would be one day.
|
||||||
|
*/
|
||||||
|
static void scheduleReboot(void) {
|
||||||
|
scheduleMsg(&sharedLogger, "Rebooting in 5 seconds...");
|
||||||
|
lockAnyContext();
|
||||||
|
chVTSetI(&resetTimer, 5 * CH_FREQUENCY, (vtfunc_t) rebootNow, NULL);
|
||||||
|
unlockAnyContext();
|
||||||
|
}
|
||||||
|
|
||||||
void swo_init()
|
void swo_init()
|
||||||
{
|
{
|
||||||
|
@ -179,7 +194,7 @@ void runRusEfi(void) {
|
||||||
|
|
||||||
engine->init();
|
engine->init();
|
||||||
|
|
||||||
addConsoleAction("reset", scheduleReset);
|
addConsoleAction("reboot", scheduleReboot);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize hardware drivers
|
* Initialize hardware drivers
|
||||||
|
@ -220,21 +235,6 @@ void runRusEfi(void) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// todo: move this into a hw-specific file
|
|
||||||
static void rebootNow(void) {
|
|
||||||
NVIC_SystemReset();
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Some configuration changes require full firmware reset.
|
|
||||||
* Once day we will write graceful shutdown, but that would be one day.
|
|
||||||
*/
|
|
||||||
void scheduleReset(void) {
|
|
||||||
scheduleMsg(&sharedLogger, "Rebooting in 5 seconds...");
|
|
||||||
lockAnyContext();
|
|
||||||
chVTSetI(&resetTimer, 5 * CH_FREQUENCY, (vtfunc_t) rebootNow, NULL);
|
|
||||||
unlockAnyContext();
|
|
||||||
}
|
|
||||||
|
|
||||||
void chDbgStackOverflowPanic(Thread *otp) {
|
void chDbgStackOverflowPanic(Thread *otp) {
|
||||||
strcpy(panicMessage, "stack overflow: ");
|
strcpy(panicMessage, "stack overflow: ");
|
||||||
#ifdef CH_USE_REGISTRY
|
#ifdef CH_USE_REGISTRY
|
||||||
|
|
|
@ -9,6 +9,5 @@
|
||||||
#define RUSEFI_H_
|
#define RUSEFI_H_
|
||||||
|
|
||||||
void runRusEfi(void);
|
void runRusEfi(void);
|
||||||
void scheduleReset(void);
|
|
||||||
|
|
||||||
#endif /* RUSEFI_H_ */
|
#endif /* RUSEFI_H_ */
|
||||||
|
|
Loading…
Reference in New Issue