diff --git a/libraries/AP_Terrain/AP_Terrain.cpp b/libraries/AP_Terrain/AP_Terrain.cpp index d0e000259d..c73c62a6e9 100644 --- a/libraries/AP_Terrain/AP_Terrain.cpp +++ b/libraries/AP_Terrain/AP_Terrain.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include "AP_Terrain.h" #if AP_TERRAIN_AVAILABLE @@ -281,4 +282,40 @@ enum AP_Terrain::TerrainStatus AP_Terrain::status(void) return TerrainStatusOK; } +/* + log terrain data to dataflash log + */ +void AP_Terrain::log_terrain_data(DataFlash_Class &dataflash) +{ + if (!enable) { + return; + } + Location loc; + if (!ahrs.get_position(loc)) { + // we don't know where we are + return; + } + float terrain_height = 0; + float current_height = 0; + uint16_t pending, loaded; + + height_amsl(loc, terrain_height); + height_above_terrain(current_height, true); + get_statistics(pending, loaded); + + struct log_TERRAIN pkt = { + LOG_PACKET_HEADER_INIT(LOG_TERRAIN_MSG), + time_ms : hal.scheduler->millis(), + status : (uint8_t)status(), + lat : loc.lat, + lng : loc.lng, + spacing : grid_spacing, + terrain_height : terrain_height, + current_height : current_height, + pending : pending, + loaded : loaded + }; + dataflash.WriteBlock(&pkt, sizeof(pkt)); +} + #endif // AP_TERRAIN_AVAILABLE diff --git a/libraries/AP_Terrain/AP_Terrain.h b/libraries/AP_Terrain/AP_Terrain.h index ede22547de..190bbdfc45 100644 --- a/libraries/AP_Terrain/AP_Terrain.h +++ b/libraries/AP_Terrain/AP_Terrain.h @@ -19,6 +19,7 @@ #include #include +#include #if HAL_OS_POSIX_IO && defined(HAL_BOARD_TERRAIN_DIRECTORY) #define AP_TERRAIN_AVAILABLE 1 @@ -151,6 +152,11 @@ public: */ bool height_above_terrain(float &terrain_altitude, bool extrapolate = false); + /* + log terrain status to DataFlash + */ + void log_terrain_data(DataFlash_Class &dataflash); + private: // allocate the terrain subsystem data void allocate(void);