mirror of
https://github.com/iNavFlight/inav.git
synced 2025-07-25 01:05:21 +03:00
Merge pull request #5535 from iNavFlight/agh_canvas_ahi_line
[CANVAS] Add alternate AHI style with a single line
This commit is contained in:
commit
a70ac0399b
4 changed files with 73 additions and 10 deletions
|
@ -138,6 +138,9 @@ tables:
|
||||||
- name: pidTypeTable
|
- name: pidTypeTable
|
||||||
values: ["NONE", "PID", "PIFF", "AUTO"]
|
values: ["NONE", "PID", "PIFF", "AUTO"]
|
||||||
enum: pidType_e
|
enum: pidType_e
|
||||||
|
- name: osd_ahi_style
|
||||||
|
values: ["DEFAULT", "LINE"]
|
||||||
|
enum: osd_ahi_style_e
|
||||||
|
|
||||||
groups:
|
groups:
|
||||||
- name: PG_GYRO_CONFIG
|
- name: PG_GYRO_CONFIG
|
||||||
|
@ -1999,6 +2002,9 @@ groups:
|
||||||
min: 10
|
min: 10
|
||||||
max: 13
|
max: 13
|
||||||
|
|
||||||
|
- name: osd_ahi_style
|
||||||
|
table: osd_ahi_style
|
||||||
|
|
||||||
- name: PG_SYSTEM_CONFIG
|
- name: PG_SYSTEM_CONFIG
|
||||||
type: systemConfig_t
|
type: systemConfig_t
|
||||||
headers: ["fc/config.h"]
|
headers: ["fc/config.h"]
|
||||||
|
|
|
@ -198,7 +198,7 @@ static bool osdDisplayHasCanvas;
|
||||||
#define AH_SIDEBAR_WIDTH_POS 7
|
#define AH_SIDEBAR_WIDTH_POS 7
|
||||||
#define AH_SIDEBAR_HEIGHT_POS 3
|
#define AH_SIDEBAR_HEIGHT_POS 3
|
||||||
|
|
||||||
PG_REGISTER_WITH_RESET_FN(osdConfig_t, osdConfig, PG_OSD_CONFIG, 10);
|
PG_REGISTER_WITH_RESET_FN(osdConfig_t, osdConfig, PG_OSD_CONFIG, 11);
|
||||||
|
|
||||||
static int digitCount(int32_t value)
|
static int digitCount(int32_t value)
|
||||||
{
|
{
|
||||||
|
|
|
@ -187,6 +187,11 @@ typedef enum {
|
||||||
OSD_ALIGN_RIGHT
|
OSD_ALIGN_RIGHT
|
||||||
} osd_alignment_e;
|
} osd_alignment_e;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
OSD_AHI_STYLE_DEFAULT,
|
||||||
|
OSD_AHI_STYLE_LINE,
|
||||||
|
} osd_ahi_style_e;
|
||||||
|
|
||||||
typedef struct osdConfig_s {
|
typedef struct osdConfig_s {
|
||||||
// Layouts
|
// Layouts
|
||||||
uint16_t item_pos[OSD_LAYOUT_COUNT][OSD_ITEM_COUNT];
|
uint16_t item_pos[OSD_LAYOUT_COUNT][OSD_ITEM_COUNT];
|
||||||
|
@ -245,6 +250,7 @@ typedef struct osdConfig_s {
|
||||||
|
|
||||||
bool osd_failsafe_switch_layout;
|
bool osd_failsafe_switch_layout;
|
||||||
uint8_t plus_code_digits; // Number of digits to use in OSD_PLUS_CODE
|
uint8_t plus_code_digits; // Number of digits to use in OSD_PLUS_CODE
|
||||||
|
uint8_t osd_ahi_style;
|
||||||
} osdConfig_t;
|
} osdConfig_t;
|
||||||
|
|
||||||
PG_DECLARE(osdConfig_t, osdConfig);
|
PG_DECLARE(osdConfig_t, osdConfig);
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
|
|
||||||
#define AHI_MIN_DRAW_INTERVAL_MS 100
|
#define AHI_MIN_DRAW_INTERVAL_MS 100
|
||||||
#define AHI_MAX_DRAW_INTERVAL_MS 1000
|
#define AHI_MAX_DRAW_INTERVAL_MS 1000
|
||||||
|
#define AHI_CROSSHAIR_MARGIN 6
|
||||||
|
|
||||||
#include "common/log.h"
|
#include "common/log.h"
|
||||||
#include "common/maths.h"
|
#include "common/maths.h"
|
||||||
|
@ -45,6 +46,7 @@
|
||||||
#include "drivers/time.h"
|
#include "drivers/time.h"
|
||||||
|
|
||||||
#include "io/osd_common.h"
|
#include "io/osd_common.h"
|
||||||
|
#include "io/osd.h"
|
||||||
|
|
||||||
void osdCanvasDrawVarioShape(displayCanvas_t *canvas, unsigned ex, unsigned ey, float zvel, bool erase)
|
void osdCanvasDrawVarioShape(displayCanvas_t *canvas, unsigned ex, unsigned ey, float zvel, bool erase)
|
||||||
{
|
{
|
||||||
|
@ -162,7 +164,6 @@ static void osdDrawArtificialHorizonShapes(displayCanvas_t *canvas, float pitchA
|
||||||
{
|
{
|
||||||
int barWidth = (OSD_AHI_WIDTH - 1) * canvas->gridElementWidth;
|
int barWidth = (OSD_AHI_WIDTH - 1) * canvas->gridElementWidth;
|
||||||
int levelBarWidth = barWidth * (3.0/4);
|
int levelBarWidth = barWidth * (3.0/4);
|
||||||
int crosshairMargin = 6;
|
|
||||||
float pixelsPerDegreeLevel = 3.5f;
|
float pixelsPerDegreeLevel = 3.5f;
|
||||||
int borderSize = 3;
|
int borderSize = 3;
|
||||||
char buf[12];
|
char buf[12];
|
||||||
|
@ -220,9 +221,9 @@ static void osdDrawArtificialHorizonShapes(displayCanvas_t *canvas, float pitchA
|
||||||
if (ii == 0) {
|
if (ii == 0) {
|
||||||
displayCanvasSetLineOutlineType(canvas, DISPLAY_CANVAS_OUTLINE_TYPE_BOTTOM);
|
displayCanvasSetLineOutlineType(canvas, DISPLAY_CANVAS_OUTLINE_TYPE_BOTTOM);
|
||||||
displayCanvasMoveToPoint(canvas, -barWidth / 2, 0);
|
displayCanvasMoveToPoint(canvas, -barWidth / 2, 0);
|
||||||
displayCanvasStrokeLineToPoint(canvas, -crosshairMargin, 0);
|
displayCanvasStrokeLineToPoint(canvas, -AHI_CROSSHAIR_MARGIN, 0);
|
||||||
displayCanvasMoveToPoint(canvas, barWidth / 2, 0);
|
displayCanvasMoveToPoint(canvas, barWidth / 2, 0);
|
||||||
displayCanvasStrokeLineToPoint(canvas, crosshairMargin, 0);
|
displayCanvasStrokeLineToPoint(canvas, AHI_CROSSHAIR_MARGIN, 0);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -257,6 +258,48 @@ static void osdDrawArtificialHorizonShapes(displayCanvas_t *canvas, float pitchA
|
||||||
displayCanvasContextPop(canvas);
|
displayCanvasContextPop(canvas);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void osdDrawArtificialHorizonLine(displayCanvas_t *canvas, float pitchAngle, float rollAngle, bool erase)
|
||||||
|
{
|
||||||
|
int barWidth = (OSD_AHI_WIDTH - 1) * canvas->gridElementWidth;
|
||||||
|
int maxHeight = canvas->height;
|
||||||
|
float pixelsPerDegreeLevel = 1.5f;
|
||||||
|
int maxWidth = (OSD_AHI_WIDTH + 1) * canvas->gridElementWidth;
|
||||||
|
|
||||||
|
int lx = (canvas->width - maxWidth) / 2;
|
||||||
|
|
||||||
|
displayCanvasContextPush(canvas);
|
||||||
|
|
||||||
|
displayCanvasClipToRect(canvas, lx, 0, maxWidth, maxHeight);
|
||||||
|
osdGridBufferClearPixelRect(canvas, lx, 0, maxWidth, maxHeight);
|
||||||
|
|
||||||
|
if (erase) {
|
||||||
|
displayCanvasSetStrokeColor(canvas, DISPLAY_CANVAS_COLOR_TRANSPARENT);
|
||||||
|
displayCanvasSetLineOutlineColor(canvas, DISPLAY_CANVAS_COLOR_TRANSPARENT);
|
||||||
|
} else {
|
||||||
|
displayCanvasSetStrokeColor(canvas, DISPLAY_CANVAS_COLOR_WHITE);
|
||||||
|
displayCanvasSetLineOutlineColor(canvas, DISPLAY_CANVAS_COLOR_BLACK);
|
||||||
|
}
|
||||||
|
|
||||||
|
float pitchDegrees = RADIANS_TO_DEGREES(pitchAngle);
|
||||||
|
float pitchOffset = -pitchDegrees * pixelsPerDegreeLevel;
|
||||||
|
float translateX = canvas->width / 2;
|
||||||
|
float translateY = canvas->height / 2;
|
||||||
|
|
||||||
|
displayCanvasCtmTranslate(canvas, 0, pitchOffset);
|
||||||
|
displayCanvasCtmRotate(canvas, rollAngle);
|
||||||
|
displayCanvasCtmTranslate(canvas, translateX, translateY);
|
||||||
|
|
||||||
|
|
||||||
|
displayCanvasSetStrokeWidth(canvas, 2);
|
||||||
|
displayCanvasSetLineOutlineType(canvas, DISPLAY_CANVAS_OUTLINE_TYPE_BOTTOM);
|
||||||
|
displayCanvasMoveToPoint(canvas, -barWidth / 2, 0);
|
||||||
|
displayCanvasStrokeLineToPoint(canvas, -AHI_CROSSHAIR_MARGIN, 0);
|
||||||
|
displayCanvasMoveToPoint(canvas, barWidth / 2, 0);
|
||||||
|
displayCanvasStrokeLineToPoint(canvas, AHI_CROSSHAIR_MARGIN, 0);
|
||||||
|
|
||||||
|
displayCanvasContextPop(canvas);
|
||||||
|
}
|
||||||
|
|
||||||
void osdCanvasDrawArtificialHorizon(displayPort_t *display, displayCanvas_t *canvas, const osdDrawPoint_t *p, float pitchAngle, float rollAngle)
|
void osdCanvasDrawArtificialHorizon(displayPort_t *display, displayCanvas_t *canvas, const osdDrawPoint_t *p, float pitchAngle, float rollAngle)
|
||||||
{
|
{
|
||||||
UNUSED(display);
|
UNUSED(display);
|
||||||
|
@ -271,12 +314,20 @@ void osdCanvasDrawArtificialHorizon(displayPort_t *display, displayCanvas_t *can
|
||||||
|
|
||||||
float totalError = fabsf(prevPitchAngle - pitchAngle) + fabsf(prevRollAngle - rollAngle);
|
float totalError = fabsf(prevPitchAngle - pitchAngle) + fabsf(prevRollAngle - rollAngle);
|
||||||
if ((now > nextDrawMinMs && totalError > 0.05f)|| now > nextDrawMaxMs) {
|
if ((now > nextDrawMinMs && totalError > 0.05f)|| now > nextDrawMaxMs) {
|
||||||
|
switch ((osd_ahi_style_e)osdConfig()->osd_ahi_style) {
|
||||||
int x, y, w, h;
|
case OSD_AHI_STYLE_DEFAULT:
|
||||||
osdArtificialHorizonRect(canvas, &x, &y, &w, &h);
|
{
|
||||||
displayCanvasClearRect(canvas, x, y, w, h);
|
int x, y, w, h;
|
||||||
|
osdArtificialHorizonRect(canvas, &x, &y, &w, &h);
|
||||||
osdDrawArtificialHorizonShapes(canvas, pitchAngle, rollAngle);
|
displayCanvasClearRect(canvas, x, y, w, h);
|
||||||
|
osdDrawArtificialHorizonShapes(canvas, pitchAngle, rollAngle);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case OSD_AHI_STYLE_LINE:
|
||||||
|
osdDrawArtificialHorizonLine(canvas, prevPitchAngle, prevRollAngle, true);
|
||||||
|
osdDrawArtificialHorizonLine(canvas, pitchAngle, rollAngle, false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
prevPitchAngle = pitchAngle;
|
prevPitchAngle = pitchAngle;
|
||||||
prevRollAngle = rollAngle;
|
prevRollAngle = rollAngle;
|
||||||
nextDrawMinMs = now + AHI_MIN_DRAW_INTERVAL_MS;
|
nextDrawMinMs = now + AHI_MIN_DRAW_INTERVAL_MS;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue