mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-02-07 00:13:59 -04:00
AP_OSD: Adding flight distance and summary panels for OSD
This commit is contained in:
parent
001948d40c
commit
5f72c9040e
@ -48,6 +48,7 @@
|
|||||||
#define ceil(x) DO_NOT_USE_DOUBLE_MATHS()
|
#define ceil(x) DO_NOT_USE_DOUBLE_MATHS()
|
||||||
#define floor(x) DO_NOT_USE_DOUBLE_MATHS()
|
#define floor(x) DO_NOT_USE_DOUBLE_MATHS()
|
||||||
#define round(x) DO_NOT_USE_DOUBLE_MATHS()
|
#define round(x) DO_NOT_USE_DOUBLE_MATHS()
|
||||||
|
#define fmax(x) DO_NOT_USE_DOUBLE_MATHS()
|
||||||
#if !HAL_WITH_UAVCAN
|
#if !HAL_WITH_UAVCAN
|
||||||
// we should do log() and fabs() as well, but can't because of a conflict in uavcan
|
// we should do log() and fabs() as well, but can't because of a conflict in uavcan
|
||||||
#define log(x) DO_NOT_USE_DOUBLE_MATHS()
|
#define log(x) DO_NOT_USE_DOUBLE_MATHS()
|
||||||
|
@ -25,8 +25,9 @@
|
|||||||
#include <AP_HAL/AP_HAL.h>
|
#include <AP_HAL/AP_HAL.h>
|
||||||
#include <AP_HAL/Util.h>
|
#include <AP_HAL/Util.h>
|
||||||
#include <RC_Channel/RC_Channel.h>
|
#include <RC_Channel/RC_Channel.h>
|
||||||
|
#include <AP_AHRS/AP_AHRS.h>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
#include <AP_Notify/AP_Notify.h>
|
||||||
|
|
||||||
const AP_Param::GroupInfo AP_OSD::var_info[] = {
|
const AP_Param::GroupInfo AP_OSD::var_info[] = {
|
||||||
|
|
||||||
@ -199,7 +200,7 @@ void AP_OSD::osd_thread()
|
|||||||
void AP_OSD::update_osd()
|
void AP_OSD::update_osd()
|
||||||
{
|
{
|
||||||
backend->clear();
|
backend->clear();
|
||||||
|
stats();
|
||||||
update_current_screen();
|
update_current_screen();
|
||||||
|
|
||||||
screen[current_screen].set_backend(backend);
|
screen[current_screen].set_backend(backend);
|
||||||
@ -208,6 +209,51 @@ void AP_OSD::update_osd()
|
|||||||
backend->flush();
|
backend->flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//update maximums and totals
|
||||||
|
void AP_OSD::stats()
|
||||||
|
{
|
||||||
|
uint32_t now = AP_HAL::millis();
|
||||||
|
if (!AP_Notify::flags.armed) {
|
||||||
|
last_update_ms = now;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// flight distance
|
||||||
|
uint32_t delta_ms = now - last_update_ms;
|
||||||
|
last_update_ms = now;
|
||||||
|
|
||||||
|
AP_AHRS &ahrs = AP::ahrs();
|
||||||
|
Vector2f v = ahrs.groundspeed_vector();
|
||||||
|
float speed = v.length();
|
||||||
|
if (speed < 2.0) {
|
||||||
|
speed = 0.0;
|
||||||
|
}
|
||||||
|
float dist_m = (speed * delta_ms)*0.001;
|
||||||
|
last_distance_m += dist_m;
|
||||||
|
|
||||||
|
// maximum ground speed
|
||||||
|
max_speed_mps = fmaxf(max_speed_mps,speed);
|
||||||
|
|
||||||
|
// maximum distance
|
||||||
|
Location loc;
|
||||||
|
if (ahrs.get_position(loc) && ahrs.home_is_set()) {
|
||||||
|
const Location &home_loc = ahrs.get_home();
|
||||||
|
float distance = get_distance(home_loc, loc);
|
||||||
|
max_dist_m = fmaxf(max_dist_m, distance);
|
||||||
|
}
|
||||||
|
|
||||||
|
// maximum altitude
|
||||||
|
float alt;
|
||||||
|
AP::ahrs().get_relative_position_D_home(alt);
|
||||||
|
alt = -alt;
|
||||||
|
max_alt_m = fmaxf(max_alt_m, alt);
|
||||||
|
// maximum current
|
||||||
|
AP_BattMonitor &battery = AP_BattMonitor::battery();
|
||||||
|
float amps = battery.current_amps();
|
||||||
|
max_current_a = fmaxf(max_current_a, amps);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//Thanks to minimosd authors for the multiple osd screen idea
|
//Thanks to minimosd authors for the multiple osd screen idea
|
||||||
void AP_OSD::update_current_screen()
|
void AP_OSD::update_current_screen()
|
||||||
{
|
{
|
||||||
|
@ -104,6 +104,8 @@ private:
|
|||||||
AP_OSD_Setting hdop{false, 0, 0};
|
AP_OSD_Setting hdop{false, 0, 0};
|
||||||
AP_OSD_Setting waypoint{false, 0, 0};
|
AP_OSD_Setting waypoint{false, 0, 0};
|
||||||
AP_OSD_Setting xtrack_error{false, 0, 0};
|
AP_OSD_Setting xtrack_error{false, 0, 0};
|
||||||
|
AP_OSD_Setting dist{false,22,11};
|
||||||
|
AP_OSD_Setting stat{false,0,0};
|
||||||
|
|
||||||
bool check_option(uint32_t option);
|
bool check_option(uint32_t option);
|
||||||
|
|
||||||
@ -156,6 +158,8 @@ private:
|
|||||||
void draw_hdop(uint8_t x, uint8_t y);
|
void draw_hdop(uint8_t x, uint8_t y);
|
||||||
void draw_waypoint(uint8_t x, uint8_t y);
|
void draw_waypoint(uint8_t x, uint8_t y);
|
||||||
void draw_xtrack_error(uint8_t x, uint8_t y);
|
void draw_xtrack_error(uint8_t x, uint8_t y);
|
||||||
|
void draw_dist(uint8_t x, uint8_t y);
|
||||||
|
void draw_stat(uint8_t x, uint8_t y);
|
||||||
};
|
};
|
||||||
|
|
||||||
class AP_OSD {
|
class AP_OSD {
|
||||||
@ -230,15 +234,22 @@ public:
|
|||||||
private:
|
private:
|
||||||
void osd_thread();
|
void osd_thread();
|
||||||
void update_osd();
|
void update_osd();
|
||||||
|
void stats();
|
||||||
void update_current_screen();
|
void update_current_screen();
|
||||||
void next_screen();
|
void next_screen();
|
||||||
AP_OSD_Backend *backend;
|
AP_OSD_Backend *backend;
|
||||||
uint32_t last_update_ms;
|
|
||||||
|
|
||||||
//variables for screen switching
|
//variables for screen switching
|
||||||
uint8_t current_screen;
|
uint8_t current_screen;
|
||||||
uint16_t previous_channel_value;
|
uint16_t previous_channel_value;
|
||||||
bool switch_debouncer;
|
bool switch_debouncer;
|
||||||
uint32_t last_switch_ms;
|
uint32_t last_switch_ms;
|
||||||
struct NavInfo nav_info;
|
struct NavInfo nav_info;
|
||||||
|
|
||||||
|
uint32_t last_update_ms;
|
||||||
|
float last_distance_m;
|
||||||
|
float max_dist_m;
|
||||||
|
float max_alt_m;
|
||||||
|
float max_speed_mps;
|
||||||
|
float max_current_a;
|
||||||
};
|
};
|
||||||
|
@ -169,6 +169,15 @@ const AP_Param::GroupInfo AP_OSD_Screen::var_info[] = {
|
|||||||
// @Path: AP_OSD_Setting.cpp
|
// @Path: AP_OSD_Setting.cpp
|
||||||
AP_SUBGROUPINFO(xtrack_error, "XTRACK", 31, AP_OSD_Screen, AP_OSD_Setting),
|
AP_SUBGROUPINFO(xtrack_error, "XTRACK", 31, AP_OSD_Screen, AP_OSD_Setting),
|
||||||
|
|
||||||
|
// @Group: DIST
|
||||||
|
// @Path: AP_OSD_Setting.cpp
|
||||||
|
AP_SUBGROUPINFO(dist, "DIST", 32, AP_OSD_Screen, AP_OSD_Setting),
|
||||||
|
|
||||||
|
// @Group: STATS
|
||||||
|
// @Path: AP_OSD_Setting.cpp
|
||||||
|
AP_SUBGROUPINFO(stat, "STATS", 33, AP_OSD_Screen, AP_OSD_Setting),
|
||||||
|
|
||||||
|
|
||||||
AP_GROUPEND
|
AP_GROUPEND
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -259,6 +268,7 @@ AP_OSD_Screen::AP_OSD_Screen()
|
|||||||
#define SYM_XERR 0xEE
|
#define SYM_XERR 0xEE
|
||||||
#define SYM_KN 0xF0
|
#define SYM_KN 0xF0
|
||||||
#define SYM_NM 0xF1
|
#define SYM_NM 0xF1
|
||||||
|
#define SYM_DIST 0x22
|
||||||
|
|
||||||
void AP_OSD_Screen::set_backend(AP_OSD_Backend *_backend)
|
void AP_OSD_Screen::set_backend(AP_OSD_Backend *_backend)
|
||||||
{
|
{
|
||||||
@ -822,6 +832,25 @@ void AP_OSD_Screen::draw_xtrack_error(uint8_t x, uint8_t y)
|
|||||||
backend->write(x, y, false, "%c%4d", SYM_XERR, (int)osd->nav_info.wp_xtrack_error);
|
backend->write(x, y, false, "%c%4d", SYM_XERR, (int)osd->nav_info.wp_xtrack_error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AP_OSD_Screen::draw_stat(uint8_t x, uint8_t y)
|
||||||
|
{
|
||||||
|
backend->write(x+2, y, false, "%c%c%c", 0x4d,0x41,0x58);
|
||||||
|
backend->write(x, y+1, false, "%c",SYM_GSPD);
|
||||||
|
backend->write(x+1, y+1, false, "%4d%c", (int)u_scale(SPEED, osd->max_speed_mps), u_icon(SPEED));
|
||||||
|
backend->write(x, y+2, false, "%5.1f%c", (double)osd->max_current_a, SYM_AMP);
|
||||||
|
backend->write(x, y+3, false, "%5d%c", (int)u_scale(ALTITUDE, osd->max_alt_m), u_icon(ALTITUDE));
|
||||||
|
backend->write(x, y+4, false, "%c", SYM_HOME);
|
||||||
|
draw_distance(x+1, y+4, osd->max_dist_m);
|
||||||
|
backend->write(x, y+5, false, "%c", SYM_DIST);
|
||||||
|
draw_distance(x+1, y+5, osd->last_distance_m);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AP_OSD_Screen::draw_dist(uint8_t x, uint8_t y)
|
||||||
|
{
|
||||||
|
backend->write(x, y, false, "%c", SYM_DIST);
|
||||||
|
draw_distance(x+1, y, osd->last_distance_m);
|
||||||
|
}
|
||||||
|
|
||||||
#define DRAW_SETTING(n) if (n.enabled) draw_ ## n(n.xpos, n.ypos)
|
#define DRAW_SETTING(n) if (n.enabled) draw_ ## n(n.xpos, n.ypos)
|
||||||
|
|
||||||
void AP_OSD_Screen::draw(void)
|
void AP_OSD_Screen::draw(void)
|
||||||
@ -865,5 +894,8 @@ void AP_OSD_Screen::draw(void)
|
|||||||
|
|
||||||
DRAW_SETTING(gps_latitude);
|
DRAW_SETTING(gps_latitude);
|
||||||
DRAW_SETTING(gps_longitude);
|
DRAW_SETTING(gps_longitude);
|
||||||
|
DRAW_SETTING(dist);
|
||||||
|
DRAW_SETTING(stat);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user