Skip to content

Commit

Permalink
AP_ICEngine: added IC engine control library
Browse files Browse the repository at this point in the history
  • Loading branch information
Pradeep-Carbonix committed Nov 7, 2024
1 parent 9ab9fcc commit f7e5c00
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 2 deletions.
30 changes: 28 additions & 2 deletions libraries/AP_ICEngine/AP_ICEngine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,13 @@ const AP_Param::GroupInfo AP_ICEngine::var_info[] = {
// @Values: 0:Forward,1:Reverse
AP_GROUPINFO("CRANK_DIR", 19, AP_ICEngine, crank_direction, 0),

// @Param: STRT_MX_RTRY
// @DisplayName: Maximum number of retries
// @Description: If set 0 then there is no limit to retrials. If set to a value greater than 0 then the engine will retry starting the engine this many times before giving up.
// @User: Standard
// @Range: 0 127
AP_GROUPINFO("STRT_MX_RTRY", 20, AP_ICEngine, max_crank_retry, 0),

AP_GROUPEND
};

Expand Down Expand Up @@ -291,6 +298,10 @@ void AP_ICEngine::update(void)
if (should_run) {
state = ICE_START_DELAY;
}
crank_retry_ct = 0;
// clear the last uncommanded stop time, we only care about tracking
// the last one since the engine was started
last_uncommanded_stop_ms = 0;
break;

case ICE_START_HEIGHT_DELAY: {
Expand All @@ -314,8 +325,16 @@ void AP_ICEngine::update(void)
if (!should_run) {
state = ICE_OFF;
} else if (now - starter_last_run_ms >= starter_delay*1000) {
GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Starting engine");
state = ICE_STARTING;
// check if we should retry starting the engine
if (max_crank_retry <= 0 || crank_retry_ct < max_crank_retry) {
GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Starting engine");
state = ICE_STARTING;
crank_retry_ct++;
} else {
GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Engine max crank attempts reached");
// Mark the last run now so we don't send this message every loop
starter_last_run_ms = now;
}
}
break;

Expand All @@ -342,6 +361,13 @@ void AP_ICEngine::update(void)
// engine has stopped when it should be running
state = ICE_START_DELAY;
GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Uncommanded engine stop");
if (last_uncommanded_stop_ms != 0 &&
now - last_uncommanded_stop_ms > 3*(starter_time + starter_delay)*1000) {
// if it has been a long enough time since the last uncommanded stop
// (3 times the time between start attempts) then reset the retry count
crank_retry_ct = 0;
}
last_uncommanded_stop_ms = now;
}
}
#endif
Expand Down
7 changes: 7 additions & 0 deletions libraries/AP_ICEngine/AP_ICEngine.h
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,10 @@ class AP_ICEngine {
AP_Int16 pwm_starter_on;
AP_Int16 pwm_starter_off;

// max crank retry
AP_Int8 max_crank_retry;
int8_t crank_retry_ct;

#if AP_RPM_ENABLED
// RPM above which engine is considered to be running
AP_Int32 rpm_threshold;
Expand All @@ -124,6 +128,9 @@ class AP_ICEngine {
// time when we last ran the starter
uint32_t starter_last_run_ms;

// time when we last had an uncommanded engine stop
uint32_t last_uncommanded_stop_ms;

// throttle percentage for engine start
AP_Int8 start_percent;

Expand Down

0 comments on commit f7e5c00

Please sign in to comment.