diff --git a/firmware/controllers/algo/engine_configuration.cpp b/firmware/controllers/algo/engine_configuration.cpp index afcb054161..23f92ec5f3 100644 --- a/firmware/controllers/algo/engine_configuration.cpp +++ b/firmware/controllers/algo/engine_configuration.cpp @@ -1416,6 +1416,15 @@ void validateConfiguration(DECLARE_ENGINE_PARAMETER_SIGNATURE) { engineConfiguration->adcVcc = 3.0f; } engine->preCalculate(PASS_ENGINE_PARAMETER_SIGNATURE); + + /** + * TunerStudio text tune files convert negative zero into positive zero so to keep things consistent we should avoid + * negative zeros altogether. Unfortunately default configuration had one and here we are mitigating that. + */ + for (int i = 0;i < CLT_CURVE_SIZE;i++) { + engineConfiguration->cltIdleRpmBins[i] = fixNegativeZero(engineConfiguration->cltIdleRpmBins[i]); + } + } void applyNonPersistentConfiguration(Logging * logger DECLARE_ENGINE_PARAMETER_SUFFIX) { diff --git a/firmware/util/efilib.cpp b/firmware/util/efilib.cpp index 8360321914..b35322bab8 100644 --- a/firmware/util/efilib.cpp +++ b/firmware/util/efilib.cpp @@ -36,7 +36,7 @@ float efiFloor(float value, float precision) { float efiRound(float value, float precision) { efiAssert(CUSTOM_ERR_ASSERT, precision != 0, "zero precision", NAN); float a = rintf (value / precision); - return a * precision; + return fixNegativeZero(a * precision); } float absF(float value) { diff --git a/firmware/util/efilib.h b/firmware/util/efilib.h index 7bffa3fa72..06b195bf4f 100644 --- a/firmware/util/efilib.h +++ b/firmware/util/efilib.h @@ -87,6 +87,7 @@ float expf_taylor(float x); #include #define IS_NEGATIVE_ZERO(value) (std::signbit(value) && value==0) +#define fixNegativeZero(value) (IS_NEGATIVE_ZERO(value) ? 0 : value) // C++ helpers go here namespace efi diff --git a/java_console/ui/src/test/java/com/rusefi/ui/TuneReadWriteTest.java b/java_console/ui/src/test/java/com/rusefi/ui/TuneReadWriteTest.java index cb71620866..6fa397d04a 100644 --- a/java_console/ui/src/test/java/com/rusefi/ui/TuneReadWriteTest.java +++ b/java_console/ui/src/test/java/com/rusefi/ui/TuneReadWriteTest.java @@ -38,18 +38,18 @@ public class TuneReadWriteTest { int mismatchCounter = compareImages(tsBinaryData, fileBinaryData); // todo: why one byte mismatch? since it's in floats I kind of do not care, floats are weird - assertEquals(1, mismatchCounter); + assertEquals(0, mismatchCounter); } @Test public void testWriteAndReadTSTune() throws Exception { - ConfigurationImage originalBinaryData = ConfigurationImageFile.readFromFile(TEST_BINARY_FILE); + ConfigurationImage fileBinaryData = ConfigurationImageFile.readFromFile(TEST_BINARY_FILE); Path path = Files.createTempFile("unit_test_", ".xml"); String fileName = path.getFileName().toString(); // writing TS XML tune file with rusEFI code - Msq tuneFromBinary = Msq.valueOf(originalBinaryData); + Msq tuneFromBinary = Msq.valueOf(fileBinaryData); tuneFromBinary.writeXmlFile(fileName); // and now reading that XML back @@ -57,13 +57,14 @@ public class TuneReadWriteTest { ConfigurationImage binaryDataFromXml = tuneFromFile.asImage(IniFileModel.getInstance()); - assertEquals(0, compareImages(originalBinaryData, binaryDataFromXml)); + assertEquals(0, compareImages(binaryDataFromXml, fileBinaryData)); + // todo: looks like this is not removing the temporary file? Files.delete(path); } - private static int compareImages(ConfigurationImage image1, ConfigurationImage image2) { + private static int compareImages(ConfigurationImage image1, ConfigurationImage fileData) { byte[] tsBinaryDataContent = image1.getContent(); - byte[] fileBinaryDataContent = image2.getContent(); + byte[] fileBinaryDataContent = fileData.getContent(); int mismatchCounter = 0; @@ -72,7 +73,7 @@ public class TuneReadWriteTest { byte fileByte = fileBinaryDataContent[i]; if (tsByte != fileByte) { IniField field = IniFileModel.getInstance().findByOffset(i); - System.out.println("Mismatch at " + (field == null ? "offset " + i : field) + " " + tsByte + "/" + fileByte); + System.out.println("Mismatch at offset=" + i + ", " + (field == null ? "(no field)" : field) + " runtime=" + tsByte + "/file=" + fileByte); mismatchCounter++; } } diff --git a/java_console/ui/src/test/resources/frankenso/current_configuration.rusefi_binary b/java_console/ui/src/test/resources/frankenso/current_configuration.rusefi_binary index c63b9496cc..80c8583d21 100644 Binary files a/java_console/ui/src/test/resources/frankenso/current_configuration.rusefi_binary and b/java_console/ui/src/test/resources/frankenso/current_configuration.rusefi_binary differ