diff --git a/firmware/config/engines/test_engine.cpp b/firmware/config/engines/test_engine.cpp
index 9b4b21e99d..e9936efbea 100644
--- a/firmware/config/engines/test_engine.cpp
+++ b/firmware/config/engines/test_engine.cpp
@@ -1,6 +1,8 @@
/**
* @file test_engine.cpp
*
+ * set_engine_type 26
+ *
* @date Nov 14, 2014
* @author Andrey Belomutskiy, (c) 2012-2014
*/
@@ -9,5 +11,29 @@
#include "test_engine.h"
void setTestEngineConfiguration(engine_configuration_s *engineConfiguration) {
+ engineConfiguration->triggerConfig.triggerType = TT_TOOTHED_WHEEL_60_2;
+
+ setOperationMode(engineConfiguration, FOUR_STROKE_CRANK_SENSOR);
+
+ engineConfiguration->ignitionMode = IM_ONE_COIL;
+ setConstantDwell(engineConfiguration, 3); // 50% duty cycle @ 5000 rpm
+
+ board_configuration_s *bc = &engineConfiguration->bc;
+ bc->malfunctionIndicatorPin = GPIO_UNASSIGNED;
+
+ bc->ignitionPins[0] = GPIOC_7; // #1
+ bc->ignitionPins[1] = GPIO_UNASSIGNED; // #2
+ bc->ignitionPins[2] = GPIO_UNASSIGNED; // #3
+ bc->ignitionPins[3] = GPIO_UNASSIGNED; // #4
+ bc->ignitionPins[4] = GPIO_UNASSIGNED; // #5
+ bc->ignitionPins[5] = GPIO_UNASSIGNED; // #6
+
+ bc->logicAnalyzerPins[0] = GPIO_UNASSIGNED;
+ bc->logicAnalyzerPins[1] = GPIO_UNASSIGNED;
+ bc->logicAnalyzerPins[2] = GPIO_UNASSIGNED;
+ bc->logicAnalyzerPins[3] = GPIO_UNASSIGNED;
+
+ engineConfiguration->hasCltSensor = false;
+ engineConfiguration->hasIatSensor = false;
}
diff --git a/firmware/controllers/algo/auto_generated_enums.cpp b/firmware/controllers/algo/auto_generated_enums.cpp
index 4c1f3a74cc..4a5d177f86 100644
--- a/firmware/controllers/algo/auto_generated_enums.cpp
+++ b/firmware/controllers/algo/auto_generated_enums.cpp
@@ -247,6 +247,8 @@ case MAZDA_MIATA_NB:
return "MAZDA_MIATA_NB";
case BMW_E34:
return "BMWe34";
+case TEST_ENGINE:
+ return "TESTENG";
}
return NULL;
}
diff --git a/firmware/controllers/algo/engine_configuration.cpp b/firmware/controllers/algo/engine_configuration.cpp
index 4587d923c1..e37b23c0fc 100644
--- a/firmware/controllers/algo/engine_configuration.cpp
+++ b/firmware/controllers/algo/engine_configuration.cpp
@@ -51,6 +51,7 @@
#include "rover_v8.h"
#include "mitsubishi.h"
#include "subaru.h"
+#include "test_engine.h"
//#define TS_DEFAULT_SPEED 115200
#define TS_DEFAULT_SPEED 38400
@@ -548,9 +549,11 @@ void resetConfigurationExt(Logging * logger, engine_type_e engineType, Engine *e
case BMW_E34:
setBmwE34(engineConfiguration);
break;
+ case TEST_ENGINE:
+ setTestEngineConfiguration(engineConfiguration);
+ break;
default:
firmwareError("Unexpected engine type: %d", engineType);
-
}
applyNonPersistentConfiguration(logger, engine);
diff --git a/firmware/controllers/algo/enum_strings.cpp b/firmware/controllers/algo/enum_strings.cpp
index e91c2b7827..1b8f28773c 100644
--- a/firmware/controllers/algo/enum_strings.cpp
+++ b/firmware/controllers/algo/enum_strings.cpp
@@ -70,6 +70,8 @@ const char* getConfigurationName(engine_type_e engineType) {
return "MX596";
case BMW_E34:
return "BMWe34";
+ case TEST_ENGINE:
+ return "Test";
default:
firmwareError("Unexpected: engineType %d", engineType);
return NULL;
diff --git a/firmware/controllers/algo/rusefi_enums.h b/firmware/controllers/algo/rusefi_enums.h
index f90babd887..2fd08ed08a 100644
--- a/firmware/controllers/algo/rusefi_enums.h
+++ b/firmware/controllers/algo/rusefi_enums.h
@@ -94,7 +94,9 @@ typedef enum {
BMW_E34 = 25,
- ET_UNUSED = 26,
+ TEST_ENGINE = 26,
+
+ ET_UNUSED = 27,
Force_4b_engine_type = ENUM_SIZE_HACK,
} engine_type_e;
diff --git a/firmware/controllers/trigger/main_trigger_callback.cpp b/firmware/controllers/trigger/main_trigger_callback.cpp
index 49b1447f7b..cc4d80ef70 100644
--- a/firmware/controllers/trigger/main_trigger_callback.cpp
+++ b/firmware/controllers/trigger/main_trigger_callback.cpp
@@ -235,7 +235,8 @@ static ALWAYS_INLINE void handleSparkEvent(uint32_t eventIndex, IgnitionEvent *i
}
}
-static ALWAYS_INLINE void handleSpark(uint32_t eventIndex, int rpm, IgnitionEventList *list DECLARE_ENGINE_PARAMETER_S) {
+static ALWAYS_INLINE void handleSpark(uint32_t eventIndex, int rpm,
+ IgnitionEventList *list DECLARE_ENGINE_PARAMETER_S) {
if (!isValidRpm(rpm) || !engineConfiguration->isIgnitionEnabled)
return; // this might happen for instance in case of a single trigger event after a pause
@@ -348,6 +349,18 @@ void mainTriggerCallback(trigger_event_e ckpSignalType, uint32_t eventIndex, Eng
float dwellAngle = dwellMs / getOneDegreeTimeMs(rpm);
+ float maxAllowedDwellAngle = engineConfiguration->engineCycle / 2;
+
+ if (engineConfiguration->ignitionMode == IM_ONE_COIL) {
+ maxAllowedDwellAngle = engineConfiguration->engineCycle / engineConfiguration->cylindersCount / 1.1;
+ }
+
+ if (dwellAngle > maxAllowedDwellAngle) {
+ warning(OBD_PCM_Processor_Fault, "dwell angle too long: %f", dwellAngle);
+ }
+
+ // todo: add some check for dwell overflow? like 4 times 6 ms while engine cycle is less then that
+
initializeIgnitionActions(fixAngle(-advance PASS_ENGINE_PARAMETER), dwellAngle, engine->engineConfiguration2,
&engine->engineConfiguration2->ignitionEvents[revolutionIndex] PASS_ENGINE_PARAMETER);
}
diff --git a/firmware/iar/ch.ewp b/firmware/iar/ch.ewp
index 884673089b..ea82ba65c1 100644
--- a/firmware/iar/ch.ewp
+++ b/firmware/iar/ch.ewp
@@ -2031,6 +2031,12 @@
$PROJ_DIR$\..\config\engines\subaru.h
+
+ $PROJ_DIR$\..\config\engines\test_engine.cpp
+
+
+ $PROJ_DIR$\..\config\engines\test_engine.h
+
system