FSIO to stop engine if things are REALLY bad - user-configurable and disabled by default obviously

This commit is contained in:
rusefi 2019-01-05 23:48:37 -05:00
parent 5bac3f799c
commit a1d834130e
13 changed files with 108 additions and 15 deletions

View File

@ -22,6 +22,9 @@
#define HAL_USE_USB_MSD FALSE
#define EFI_ENABLE_CRITICAL_ENGINE_STOP TRUE
#define EFI_ENABLE_ENGINE_WARNING TRUE
#define EFI_USE_CCM TRUE
/**

View File

@ -41,6 +41,14 @@ EXTERN_ENGINE
extern TunerStudioOutputChannels tsOutputChannels;
#endif /* EFI_TUNER_STUDIO */
FsioState::FsioState() {
#if EFI_ENABLE_ENGINE_WARNING
isEngineWarning = FALSE;
#endif
#if EFI_ENABLE_CRITICAL_ENGINE_STOP
isCriticalEngineCondition = FALSE;
#endif
}
void Engine::initializeTriggerShape(Logging *logger DECLARE_ENGINE_PARAMETER_SUFFIX) {
#if !EFI_UNIT_TEST

View File

@ -285,6 +285,26 @@ class WallFuel;
typedef void (*configuration_callback_t)(Engine*);
class FsioState {
public:
FsioState();
#if EFI_ENABLE_ENGINE_WARNING
/**
* Shall we purposely miss on some cylinders in order to attract driver's attention to some problem
* like getting too hot
*/
float isEngineWarning;
#endif /* EFI_ENABLE_ENGINE_WARNING */
#if EFI_ENABLE_CRITICAL_ENGINE_STOP
/**
* Shall we stop engine due to some critical condition in order to save the engine
*/
float isCriticalEngineCondition;
#endif /* EFI_ENABLE_CRITICAL_ENGINE_STOP */
};
class Engine {
public:
Engine(persistent_config_s *config);
@ -391,11 +411,13 @@ public:
bool isRunningPwmTest;
// todo: move this into FsioState class
float fsioTimingAdjustment;
float fsioIdleTargetRPMAdjustment;
float servoValues[SERVO_COUNT];
FsioState fsioState;
/**
* Are we experiencing knock right now?
*/

View File

@ -1,4 +1,4 @@
// this section was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Fri Jan 04 22:03:58 EST 2019
// this section was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Sat Jan 05 23:35:34 EST 2019
// begin
#ifndef ENGINE_CONFIGURATION_GENERATED_H_
#define ENGINE_CONFIGURATION_GENERATED_H_
@ -1366,8 +1366,19 @@ typedef struct {
offset 1472 bit 26 */
bool useFSIO15ForIdleRpmAdjustment : 1;
/**
* Sometimes we just have to shut the engine down. Use carefully!
offset 1472 bit 27 */
bool unused_bit_1472_27 : 1;
bool useFSIO5ForCriticalIssueEngineStop : 1;
/**
* Sometimes we have to miss injection on purpose to attract driver's attention
offset 1472 bit 28 */
bool useFSIO4ForSeriousEngineWarning : 1;
/**
offset 1472 bit 29 */
bool unused_bit_1472_29 : 1;
/**
offset 1472 bit 30 */
bool unused_bit_1472_30 : 1;
/**
* offset 1476
*/
@ -2461,4 +2472,4 @@ typedef struct {
#endif
// end
// this section was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Fri Jan 04 22:03:58 EST 2019
// this section was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Sat Jan 05 23:35:34 EST 2019

View File

@ -923,8 +923,14 @@
#define useFSIO12ForServo5_offset_hex 5c0
#define useFSIO15ForIdleRpmAdjustment_offset 1472
#define useFSIO15ForIdleRpmAdjustment_offset_hex 5c0
#define unused_bit_1472_27_offset 1472
#define unused_bit_1472_27_offset_hex 5c0
#define useFSIO5ForCriticalIssueEngineStop_offset 1472
#define useFSIO5ForCriticalIssueEngineStop_offset_hex 5c0
#define useFSIO4ForSeriousEngineWarning_offset 1472
#define useFSIO4ForSeriousEngineWarning_offset_hex 5c0
#define unused_bit_1472_29_offset 1472
#define unused_bit_1472_29_offset_hex 5c0
#define unused_bit_1472_30_offset 1472
#define unused_bit_1472_30_offset_hex 5c0
#define hipOutputChannel_offset 1476
#define hipOutputChannel_offset_hex 5c4
#define idleMode_offset 1480

View File

@ -113,7 +113,7 @@ void LECalculator::add(LEElement *element) {
}
}
static bool float2bool(float v) {
bool float2bool(float v) {
return v != 0;
}

View File

@ -133,5 +133,6 @@ public:
const char *getNextToken(const char *line, char *buffer, const int bufferSize);
bool isNumeric(const char* line);
le_action_e parseAction(const char * line);
bool float2bool(float v);
#endif /* LOGIC_EXPRESSION_H_ */

View File

@ -14,6 +14,7 @@
#if EFI_FSIO || defined(__DOXYGEN__)
#include "fsio_impl.h"
#include "settings.h"
#include "allsensors.h"
#include "rpm_calculator.h"
#include "efiGpio.h"
@ -25,6 +26,8 @@
*/
#define NO_PWM 0
#define MAGIC_OFFSET_FOR_ENGINE_WARNING 4
#define MAGIC_OFFSET_FOR_CRITICAL_ENGINE 5
// see useFSIO15ForIdleRpmAdjustment
#define MAGIC_OFFSET_FOR_IDLE_TARGET_RPM 14
@ -410,13 +413,18 @@ static void setFsioFrequency(int index, int frequency) {
/**
* @param out param! current and new value as long as element is not NULL
* @return 'true' if value has changed
*/
static void updateValueOrWarning(int fsioIndex, const char *msg, float *value DECLARE_ENGINE_PARAMETER_SUFFIX) {
static bool updateValueOrWarning(int fsioIndex, const char *msg, float *value DECLARE_ENGINE_PARAMETER_SUFFIX) {
LEElement * element = fsioLogics[fsioIndex];
if (element == NULL) {
warning(CUSTOM_FSIO_INVALID_EXPRESSION, "invalid expression for %s", msg);
return false;
} else {
*value = calc.getValue2(*value, element PASS_ENGINE_PARAMETER_SUFFIX);
float beforeValue = *value;
*value = calc.getValue2(beforeValue, element PASS_ENGINE_PARAMETER_SUFFIX);
// floating '==' comparison without EPS seems fine here
return (beforeValue != *value);
}
}
@ -468,12 +476,29 @@ void runFsio(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
setPinState("fan", &enginePins.fanRelay, radiatorFanLogic PASS_ENGINE_PARAMETER_SUFFIX);
}
#if EFI_ENABLE_ENGINE_WARNING
if (engineConfiguration->useFSIO4ForSeriousEngineWarning) {
updateValueOrWarning(MAGIC_OFFSET_FOR_ENGINE_WARNING, "eng warning", &ENGINE(fsioState.isEngineWarning) PASS_ENGINE_PARAMETER_SUFFIX);
}
#endif
#if EFI_ENABLE_CRITICAL_ENGINE_STOP
if (engineConfiguration->useFSIO5ForCriticalIssueEngineStop) {
bool changed = updateValueOrWarning(MAGIC_OFFSET_FOR_CRITICAL_ENGINE, "eng critical", &ENGINE(fsioState.isCriticalEngineCondition) PASS_ENGINE_PARAMETER_SUFFIX);
if (changed && float2bool(ENGINE(fsioState.isCriticalEngineCondition))) {
#if EFI_PROD_CODE || EFI_SIMULATOR
scheduleStopEngine();
#endif
}
}
#endif
if (engineConfiguration->useFSIO15ForIdleRpmAdjustment) {
updateValueOrWarning(MAGIC_OFFSET_FOR_IDLE_TARGET_RPM, "RPM target", &engine->fsioIdleTargetRPMAdjustment PASS_ENGINE_PARAMETER_SUFFIX);
updateValueOrWarning(MAGIC_OFFSET_FOR_IDLE_TARGET_RPM, "RPM target", &ENGINE(fsioIdleTargetRPMAdjustment) PASS_ENGINE_PARAMETER_SUFFIX);
}
if (engineConfiguration->useFSIO16ForTimingAdjustment) {
updateValueOrWarning(MAGIC_OFFSET_FOR_TIMING_FSIO, "timing", &engine->fsioTimingAdjustment PASS_ENGINE_PARAMETER_SUFFIX);
updateValueOrWarning(MAGIC_OFFSET_FOR_TIMING_FSIO, "timing", &ENGINE(fsioTimingAdjustment) PASS_ENGINE_PARAMETER_SUFFIX);
}
if (engineConfiguration->useFSIO8ForServo1) {

View File

@ -669,7 +669,10 @@ bit hasFrequencyReportingMapSensor;
bit useFSIO11ForServo4
bit useFSIO12ForServo5
bit useFSIO15ForIdleRpmAdjustment;
bit unused_bit_1472_27;
bit useFSIO5ForCriticalIssueEngineStop;Sometimes we just have to shut the engine down. Use carefully!
bit useFSIO4ForSeriousEngineWarning;Sometimes we have to miss injection on purpose to attract driver's attention
bit unused_bit_1472_29;
bit unused_bit_1472_30;
adc_channel_e hipOutputChannel;
custom idle_mode_e 4 bits, U32, @OFFSET@, [0:0], "Automatic", "Manual"

View File

@ -2128,7 +2128,9 @@ cmd_stop_engine = "w\x00\x99\x00\x00"
field = "#1", fsioFormulas1
field = "#2", fsioFormulas2
field = "#3", fsioFormulas3
field = "use FSIO #8 for serious eninge warning",useFSIO4ForSeriousEngineWarning
field = "#4", fsioFormulas4
field = "use FSIO #5 for critical engine stop", useFSIO5ForCriticalIssueEngineStop
field = "#5", fsioFormulas5
field = "#6", fsioFormulas6
field = "#7", fsioFormulas7

View File

@ -1,6 +1,6 @@
package com.rusefi.config;
// this file was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Fri Jan 04 22:03:58 EST 2019
// this file was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Sat Jan 05 16:40:23 EST 2019
public class Fields {
public static final int LE_COMMAND_LENGTH = 200;
public static final int BLOCKING_FACTOR = 400;
@ -632,7 +632,10 @@ public class Fields {
public static final int useFSIO11ForServo4_offset = 1472;
public static final int useFSIO12ForServo5_offset = 1472;
public static final int useFSIO15ForIdleRpmAdjustment_offset = 1472;
public static final int unused_bit_1472_27_offset = 1472;
public static final int useFSIO5ForCriticalIssueEngineStop_offset = 1472;
public static final int useFSIO4ForSeriousEngineWarning_offset = 1472;
public static final int unused_bit_1472_29_offset = 1472;
public static final int unused_bit_1472_30_offset = 1472;
public static final int hipOutputChannel_offset = 1476;
public static final int idleMode_offset = 1480;
public static final int isInjectionEnabled_offset = 1484;
@ -1603,7 +1606,10 @@ public class Fields {
public static final Field USEFSIO11FORSERVO4 = Field.create("USEFSIO11FORSERVO4", 1472, FieldType.BIT, 24);
public static final Field USEFSIO12FORSERVO5 = Field.create("USEFSIO12FORSERVO5", 1472, FieldType.BIT, 25);
public static final Field USEFSIO15FORIDLERPMADJUSTMENT = Field.create("USEFSIO15FORIDLERPMADJUSTMENT", 1472, FieldType.BIT, 26);
public static final Field UNUSED_BIT_1472_27 = Field.create("UNUSED_BIT_1472_27", 1472, FieldType.BIT, 27);
public static final Field USEFSIO5FORCRITICALISSUEENGINESTOP = Field.create("USEFSIO5FORCRITICALISSUEENGINESTOP", 1472, FieldType.BIT, 27);
public static final Field USEFSIO4FORSERIOUSENGINEWARNING = Field.create("USEFSIO4FORSERIOUSENGINEWARNING", 1472, FieldType.BIT, 28);
public static final Field UNUSED_BIT_1472_29 = Field.create("UNUSED_BIT_1472_29", 1472, FieldType.BIT, 29);
public static final Field UNUSED_BIT_1472_30 = Field.create("UNUSED_BIT_1472_30", 1472, FieldType.BIT, 30);
public static final Field HIPOUTPUTCHANNEL = Field.create("HIPOUTPUTCHANNEL", 1476, FieldType.INT, adc_channel_e);
public static final Field IDLEMODE = Field.create("IDLEMODE", 1480, FieldType.INT);
public static final Field ISINJECTIONENABLED = Field.create("ISINJECTIONENABLED", 1484, FieldType.BIT, 0);

View File

@ -13,6 +13,9 @@
#define EFI_ENABLE_MOCK_ADC TRUE
#define EFI_PRINTF_FUEL_DETAILS TRUE
#define EFI_ENABLE_CRITICAL_ENGINE_STOP TRUE
#define EFI_ENABLE_ENGINE_WARNING TRUE
#define EFI_CDM_INTEGRATION FALSE

View File

@ -16,6 +16,9 @@
#define SPARK_EXTREME_LOGGING TRUE
#define EFI_ENABLE_CRITICAL_ENGINE_STOP TRUE
#define EFI_ENABLE_ENGINE_WARNING TRUE
#define EFI_GPIO_HARDWARE FALSE
#define FUEL_MATH_EXTREME_LOGGING FALSE