diff --git a/libraries/AP_ICEngine/AP_ICEngine.cpp b/libraries/AP_ICEngine/AP_ICEngine.cpp index 449a5fa4be..b45d4889ba 100644 --- a/libraries/AP_ICEngine/AP_ICEngine.cpp +++ b/libraries/AP_ICEngine/AP_ICEngine.cpp @@ -23,6 +23,8 @@ extern const AP_HAL::HAL& hal; +#define AP_ICENGINE_START_CHAN_DEBOUNCE_MS 300 + const AP_Param::GroupInfo AP_ICEngine::var_info[] = { // @Param: ENABLE @@ -163,14 +165,36 @@ void AP_ICEngine::update(void) if (c != nullptr) { // get starter control channel cvalue = c->get_radio_in(); + + // snap the input to either 1000, 1500, or 2000 + // this is useful to compare a debounce changed value + // while ignoring tiny noise + if (cvalue >= 1700) { + cvalue = 2000; + } else if (cvalue <= 1300) { + cvalue = 1300; + } else { + cvalue = 1500; + } } bool should_run = false; uint32_t now = AP_HAL::millis(); - if (state == ICE_OFF && cvalue >= 1700) { + + // debounce timer to protect from spurious changes on start_chan rc input + // If the cached value is the same, reset timer + if (start_chan_last_value == cvalue) { + start_chan_last_ms = now; + } else if (now - start_chan_last_ms >= AP_ICENGINE_START_CHAN_DEBOUNCE_MS) { + // if it has changed, and stayed changed for the duration, then use that new value + start_chan_last_value = cvalue; + } + + + if (state == ICE_OFF && start_chan_last_value >= 1700) { should_run = true; - } else if (cvalue <= 1300) { + } else if (start_chan_last_value <= 1300) { should_run = false; } else if (state != ICE_OFF) { should_run = true; diff --git a/libraries/AP_ICEngine/AP_ICEngine.h b/libraries/AP_ICEngine/AP_ICEngine.h index de9061edd1..4ce28e6d40 100644 --- a/libraries/AP_ICEngine/AP_ICEngine.h +++ b/libraries/AP_ICEngine/AP_ICEngine.h @@ -121,6 +121,10 @@ private: DISABLE_IGNITION_RC_FAILSAFE=(1U<<0), }; AP_Int16 options; + + // start_chan debounce + uint16_t start_chan_last_value; + uint32_t start_chan_last_ms; };