ardupilot/ArduCopter/landing_gear.cpp
Randy Mackay 8d99f204b0 Copter: integrate landing gear option and make edge based
also guided mode now retracts landing gear after takeoff
previously landing gear deployment was "level based" meaning the pilot could not override the gear's position
2020-02-26 08:01:00 +09:00

50 lines
1.6 KiB
C++

#include "Copter.h"
// Run landing gear controller at 10Hz
void Copter::landinggear_update()
{
// exit immediately if no landing gear output has been enabled
if (!SRV_Channels::function_assigned(SRV_Channel::k_landing_gear_control)) {
return;
}
// last status (deployed or retracted) used to check for changes, initialised to startup state of landing gear
static bool last_deploy_status = landinggear.deployed();
// send event message to datalog if status has changed
if (landinggear.deployed() != last_deploy_status) {
if (landinggear.deployed()) {
AP::logger().Write_Event(LogEvent::LANDING_GEAR_DEPLOYED);
} else {
AP::logger().Write_Event(LogEvent::LANDING_GEAR_RETRACTED);
}
}
last_deploy_status = landinggear.deployed();
// support height based triggering using rangefinder or altitude above ground
int32_t height_cm = flightmode->get_alt_above_ground_cm();
// use rangefinder if available
switch (rangefinder.status_orient(ROTATION_PITCH_270)) {
case RangeFinder::Status::NotConnected:
case RangeFinder::Status::NoData:
// use altitude above home for non-functioning rangefinder
break;
case RangeFinder::Status::OutOfRangeLow:
// altitude is close to zero (gear should deploy)
height_cm = 0;
break;
case RangeFinder::Status::OutOfRangeHigh:
case RangeFinder::Status::Good:
// use last good reading
height_cm = rangefinder_state.alt_cm_filt.get();
break;
}
landinggear.update(height_cm * 0.01f); // convert cm->m for update call
}