Plane: fixed allocation and reporting of fence status

prevent a false fence active report on boot, and prevent the fence
from loading when it is not needed. This saves about 200 bytes of ram
on APM2 for most users
This commit is contained in:
Andrew Tridgell 2014-04-07 17:20:22 +10:00
parent 8a4d82f43a
commit 95764f4d78
1 changed files with 34 additions and 23 deletions

View File

@ -140,38 +140,48 @@ static bool geofence_present(void)
{
//require at least a return point and a triangle
//to define a geofence area:
if (g.fence_action != FENCE_ACTION_NONE && g.fence_total < MIN_GEOFENCE_POINTS) {
if (g.fence_action == FENCE_ACTION_NONE || g.fence_total < MIN_GEOFENCE_POINTS) {
return false;
}
return true;
}
static void geofence_update_pwm_enabled_state() {
/*
check FENCE_CHANNEL and update the is_pwm_enabled state
*/
static void geofence_update_pwm_enabled_state()
{
bool is_pwm_enabled;
if (g.fence_channel == 0) {
is_pwm_enabled = false;
} else {
is_pwm_enabled = (hal.rcin->read(g.fence_channel-1) > FENCE_ENABLE_PWM);
}
if (is_pwm_enabled && geofence_state == NULL) {
// we need to load the fence
geofence_load();
return;
}
if (geofence_state == NULL) {
// not loaded
return;
}
geofence_state->previous_is_pwm_enabled = geofence_state->is_pwm_enabled;
geofence_state->is_pwm_enabled = is_pwm_enabled;
if (g.fence_channel == 0) {
geofence_state->is_pwm_enabled = false;
} else {
geofence_state->is_pwm_enabled =
(hal.rcin->read(g.fence_channel-1) > FENCE_ENABLE_PWM);
}
if (geofence_state->is_pwm_enabled == true &&
geofence_state->previous_is_pwm_enabled == false) {
geofence_set_enabled(true, PWM_TOGGLED);
} else if (geofence_state->is_pwm_enabled == false &&
geofence_state->previous_is_pwm_enabled == true) {
geofence_set_enabled(false, PWM_TOGGLED);
if (geofence_state->is_pwm_enabled != geofence_state->previous_is_pwm_enabled) {
geofence_set_enabled(geofence_state->is_pwm_enabled, PWM_TOGGLED);
}
}
//return true on success, false on failure
static bool geofence_set_enabled(bool enable, GeofenceEnableReason r) {
static bool geofence_set_enabled(bool enable, GeofenceEnableReason r)
{
if (geofence_state == NULL && enable) {
geofence_load();
}
if (geofence_state == NULL) {
return false;
}
@ -189,15 +199,16 @@ static bool geofence_enabled(void)
{
geofence_update_pwm_enabled_state();
if (geofence_state == NULL) {
return false;
}
if (g.fence_action == FENCE_ACTION_NONE ||
!geofence_present() ||
(g.fence_action != FENCE_ACTION_REPORT &&
(geofence_state != NULL && !geofence_state->is_enabled))) {
(g.fence_action != FENCE_ACTION_REPORT && !geofence_state->is_enabled)) {
// geo-fencing is disabled
if (geofence_state != NULL) {
// re-arm for when the channel trigger is switched on
geofence_state->fence_triggered = false;
}
return false;
}