diff --git a/firmware/controllers/settings.cpp b/firmware/controllers/settings.cpp index a6c72437b1..341e484ec2 100644 --- a/firmware/controllers/settings.cpp +++ b/firmware/controllers/settings.cpp @@ -1109,13 +1109,19 @@ void setDateTime(const char * const isoDateTime) { #if EFI_RTC if (strlen(isoDateTime) >= 19 && isoDateTime[10] == 'T') { efidatetime_t dateTime; - int scanned = sscanf(isoDateTime, "%4lu", &dateTime.year); - scanned += sscanf(isoDateTime + 5, "%2hhu", &dateTime.month); - scanned += sscanf(isoDateTime + 8, "%2hhu", &dateTime.day); - scanned += sscanf(isoDateTime + 11, "%2hhu", &dateTime.hour); - scanned += sscanf(isoDateTime + 14, "%2hhu", &dateTime.minute); - scanned += sscanf(isoDateTime + 17, "%2hhu", &dateTime.second); - if (scanned == 6) { // 6 fields to properly scan + dateTime.year = atoi(isoDateTime); + dateTime.month = atoi(isoDateTime + 5); + dateTime.day = atoi(isoDateTime + 8); + dateTime.hour = atoi(isoDateTime + 11); + dateTime.minute = atoi(isoDateTime + 14); + dateTime.second = atoi(isoDateTime + 17); + if (dateTime.year != ATOI_ERROR_CODE && + dateTime.month >= 1 && dateTime.month <= 12 && + dateTime.day >= 1 && dateTime.day <= 31 && + dateTime.hour <= 23 && + dateTime.minute <= 59 && + dateTime.second <= 59) { + // doesn't concern about leap years or seconds; ChibiOS doesn't support (added) leap seconds anyway setRtcDateTime(&dateTime); return; } diff --git a/firmware/util/efilib.cpp b/firmware/util/efilib.cpp index dff057411c..2c3aef6396 100644 --- a/firmware/util/efilib.cpp +++ b/firmware/util/efilib.cpp @@ -82,7 +82,6 @@ int indexOf(const char *string, char ch) { // string to integer int atoi(const char *string) { - // todo: use stdlib '#include ' int len = strlen(string); if (len == 0) { return -ATOI_ERROR_CODE; @@ -95,7 +94,11 @@ int atoi(const char *string) { for (int i = 0; i < len; i++) { char ch = string[i]; if (ch < '0' || ch > '9') { - return ATOI_ERROR_CODE; + if (i > 0) { + break; + } else { + return ATOI_ERROR_CODE; + } } int c = ch - '0'; result = result * 10 + c; diff --git a/java_console/autotest/src/main/java/com/rusefi/RusefiTestBase.java b/java_console/autotest/src/main/java/com/rusefi/RusefiTestBase.java index 4228b19f81..99504795c2 100644 --- a/java_console/autotest/src/main/java/com/rusefi/RusefiTestBase.java +++ b/java_console/autotest/src/main/java/com/rusefi/RusefiTestBase.java @@ -2,7 +2,7 @@ package com.rusefi; import com.rusefi.functional_tests.EcuTestHelper; import com.rusefi.waves.EngineChart; -import org.junit.Before; +import org.junit.*; public class RusefiTestBase { protected EcuTestHelper ecu; @@ -17,6 +17,11 @@ public class RusefiTestBase { ecu = EcuTestHelper.createInstance(needsHardwareTriggerInput()); } + @After + public void checkStackUsage() { + ecu.sendCommand("threadsinfo"); + } + protected EngineChart nextChart() { return TestingUtils.nextChart(ecu.commandQueue); } diff --git a/java_console/autotest/src/main/java/com/rusefi/common/MiscTest.java b/java_console/autotest/src/main/java/com/rusefi/common/MiscTest.java index 3b4e50cab8..6d872c8196 100644 --- a/java_console/autotest/src/main/java/com/rusefi/common/MiscTest.java +++ b/java_console/autotest/src/main/java/com/rusefi/common/MiscTest.java @@ -7,6 +7,7 @@ import com.rusefi.core.SensorCentral; import org.junit.Test; import static com.devexperts.util.TimeUtil.SECOND; +import static com.rusefi.IoUtil.sleepSeconds; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -37,4 +38,13 @@ public class MiscTest extends RusefiTestBase { // wow sometimes my utility closet is pretty warm? assertTrue(message, mcuTemp < 52); } + + @Test + public void testSetDate() { + // set some random time + ecu.sendCommand("set date 2022-12-07T11:14:22"); + + // If things are going to crash, let it happen in this test + sleepSeconds(5); + } }