mirror of
https://github.com/betaflight/betaflight.git
synced 2025-07-19 14:25:20 +03:00
Fix reset PG behaviour and configurator interactions based on USE_OSD_SD and USE_OSD_HD definitions (#12152)
This commit is contained in:
parent
a3a21d9233
commit
107d577a90
7 changed files with 89 additions and 50 deletions
|
@ -20,6 +20,10 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#define VIDEO_COLUMNS_SD 30
|
||||||
|
#define VIDEO_LINES_NTSC 13
|
||||||
|
#define VIDEO_LINES_PAL 16
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
DISPLAYPORT_DEVICE_TYPE_MAX7456 = 0,
|
DISPLAYPORT_DEVICE_TYPE_MAX7456 = 0,
|
||||||
DISPLAYPORT_DEVICE_TYPE_OLED,
|
DISPLAYPORT_DEVICE_TYPE_OLED,
|
||||||
|
|
|
@ -27,8 +27,6 @@
|
||||||
/** PAL or NTSC, value is number of chars total */
|
/** PAL or NTSC, value is number of chars total */
|
||||||
#define VIDEO_BUFFER_CHARS_NTSC 390
|
#define VIDEO_BUFFER_CHARS_NTSC 390
|
||||||
#define VIDEO_BUFFER_CHARS_PAL 480
|
#define VIDEO_BUFFER_CHARS_PAL 480
|
||||||
#define VIDEO_LINES_NTSC 13
|
|
||||||
#define VIDEO_LINES_PAL 16
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
// IO defined and MAX7456 was detected
|
// IO defined and MAX7456 was detected
|
||||||
|
|
|
@ -165,20 +165,14 @@ static bool isSynced(const displayPort_t *displayPort)
|
||||||
|
|
||||||
static void redraw(displayPort_t *displayPort)
|
static void redraw(displayPort_t *displayPort)
|
||||||
{
|
{
|
||||||
#ifdef USE_OSD
|
|
||||||
if (vcdProfile()->video_system == VIDEO_SYSTEM_HD) {
|
if (vcdProfile()->video_system == VIDEO_SYSTEM_HD) {
|
||||||
displayPort->rows = osdConfig()->canvas_rows;
|
displayPort->rows = osdConfig()->canvas_rows;
|
||||||
displayPort->cols = osdConfig()->canvas_cols;
|
displayPort->cols = osdConfig()->canvas_cols;
|
||||||
} else {
|
} else {
|
||||||
const uint8_t displayRows = (vcdProfile()->video_system == VIDEO_SYSTEM_PAL) ? 16 : 13;
|
const uint8_t displayRows = (vcdProfile()->video_system == VIDEO_SYSTEM_PAL) ? VIDEO_LINES_PAL : VIDEO_LINES_NTSC;
|
||||||
displayPort->rows = displayRows + displayPortProfileMsp()->rowAdjust;
|
displayPort->rows = displayRows + displayPortProfileMsp()->rowAdjust;
|
||||||
displayPort->cols = 30 + displayPortProfileMsp()->colAdjust;
|
displayPort->cols = OSD_SD_COLS + displayPortProfileMsp()->colAdjust;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
const uint8_t displayRows = (vcdProfile()->video_system == VIDEO_SYSTEM_PAL) ? 16 : 13;
|
|
||||||
displayPort->rows = displayRows + displayPortProfileMsp()->rowAdjust;
|
|
||||||
displayPort->cols = 30 + displayPortProfileMsp()->colAdjust;
|
|
||||||
#endif // USE_OSD
|
|
||||||
drawScreen(displayPort);
|
drawScreen(displayPort);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -215,6 +209,17 @@ displayPort_t *displayPortMspInit(void)
|
||||||
mspDisplayPort.useDeviceBlink = true;
|
mspDisplayPort.useDeviceBlink = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef USE_OSD_SD
|
||||||
|
if (vcdProfile()->video_system != VIDEO_SYSTEM_HD) {
|
||||||
|
vcdProfileMutable()->video_system = VIDEO_SYSTEM_HD;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifndef USE_OSD_HD
|
||||||
|
if (vcdProfile()->video_system == VIDEO_SYSTEM_HD) {
|
||||||
|
vcdProfileMutable()->video_system = VIDEO_SYSTEM_AUTO;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
redraw(&mspDisplayPort);
|
redraw(&mspDisplayPort);
|
||||||
return &mspDisplayPort;
|
return &mspDisplayPort;
|
||||||
}
|
}
|
||||||
|
|
|
@ -982,7 +982,7 @@ static bool mspCommonProcessOutCommand(int16_t cmdMSP, sbuf_t *dst, mspPostProce
|
||||||
#endif
|
#endif
|
||||||
sbufWriteU8(dst, osdFlags);
|
sbufWriteU8(dst, osdFlags);
|
||||||
|
|
||||||
#ifdef USE_MAX7456
|
#ifdef USE_OSD_SD
|
||||||
// send video system (AUTO/PAL/NTSC/HD)
|
// send video system (AUTO/PAL/NTSC/HD)
|
||||||
sbufWriteU8(dst, vcdProfile()->video_system);
|
sbufWriteU8(dst, vcdProfile()->video_system);
|
||||||
#else
|
#else
|
||||||
|
@ -4081,12 +4081,14 @@ static mspResult_e mspCommonProcessInCommand(mspDescriptor_t srcDesc, int16_t cm
|
||||||
|
|
||||||
if ((int8_t)addr == -1) {
|
if ((int8_t)addr == -1) {
|
||||||
/* Set general OSD settings */
|
/* Set general OSD settings */
|
||||||
#ifdef USE_MAX7456
|
videoSystem_e video_system = sbufReadU8(src);
|
||||||
vcdProfileMutable()->video_system = sbufReadU8(src);
|
#ifndef USE_OSD_HD
|
||||||
#else
|
if (video_system == VIDEO_SYSTEM_HD) {
|
||||||
sbufReadU8(src); // Skip video system
|
video_system = VIDEO_SYSTEM_AUTO;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
#if defined(USE_OSD)
|
vcdProfileMutable()->video_system = video_system;
|
||||||
|
|
||||||
osdConfigMutable()->units = sbufReadU8(src);
|
osdConfigMutable()->units = sbufReadU8(src);
|
||||||
|
|
||||||
// Alarms
|
// Alarms
|
||||||
|
@ -4134,19 +4136,16 @@ static mspResult_e mspCommonProcessInCommand(mspDescriptor_t srcDesc, int16_t cm
|
||||||
osdConfigMutable()->camera_frame_width = sbufReadU8(src);
|
osdConfigMutable()->camera_frame_width = sbufReadU8(src);
|
||||||
osdConfigMutable()->camera_frame_height = sbufReadU8(src);
|
osdConfigMutable()->camera_frame_height = sbufReadU8(src);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
} else if ((int8_t)addr == -2) {
|
} else if ((int8_t)addr == -2) {
|
||||||
#if defined(USE_OSD)
|
|
||||||
// Timers
|
// Timers
|
||||||
uint8_t index = sbufReadU8(src);
|
uint8_t index = sbufReadU8(src);
|
||||||
if (index > OSD_TIMER_COUNT) {
|
if (index > OSD_TIMER_COUNT) {
|
||||||
return MSP_RESULT_ERROR;
|
return MSP_RESULT_ERROR;
|
||||||
}
|
}
|
||||||
osdConfigMutable()->timers[index] = sbufReadU16(src);
|
osdConfigMutable()->timers[index] = sbufReadU16(src);
|
||||||
#endif
|
|
||||||
return MSP_RESULT_ERROR;
|
return MSP_RESULT_ERROR;
|
||||||
} else {
|
} else {
|
||||||
#if defined(USE_OSD)
|
|
||||||
const uint16_t value = sbufReadU16(src);
|
const uint16_t value = sbufReadU16(src);
|
||||||
|
|
||||||
/* Get screen index, 0 is post flight statistics, 1 and above are in flight OSD screens */
|
/* Get screen index, 0 is post flight statistics, 1 and above are in flight OSD screens */
|
||||||
|
@ -4162,9 +4161,6 @@ static mspResult_e mspCommonProcessInCommand(mspDescriptor_t srcDesc, int16_t cm
|
||||||
} else {
|
} else {
|
||||||
return MSP_RESULT_ERROR;
|
return MSP_RESULT_ERROR;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
return MSP_RESULT_ERROR;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -4207,6 +4203,7 @@ static mspResult_e mspCommonProcessInCommand(mspDescriptor_t srcDesc, int16_t cm
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#ifdef USE_OSD_HD
|
||||||
case MSP_SET_OSD_CANVAS:
|
case MSP_SET_OSD_CANVAS:
|
||||||
{
|
{
|
||||||
osdConfigMutable()->canvas_cols = sbufReadU8(src);
|
osdConfigMutable()->canvas_cols = sbufReadU8(src);
|
||||||
|
@ -4216,6 +4213,7 @@ static mspResult_e mspCommonProcessInCommand(mspDescriptor_t srcDesc, int16_t cm
|
||||||
vcdProfileMutable()->video_system = VIDEO_SYSTEM_HD;
|
vcdProfileMutable()->video_system = VIDEO_SYSTEM_HD;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
#endif //USE_OSD_HD
|
||||||
#endif // OSD
|
#endif // OSD
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -402,15 +402,29 @@ void pgResetFn_osdConfig(osdConfig_t *osdConfig)
|
||||||
osdConfig->aux_scale = 200;
|
osdConfig->aux_scale = 200;
|
||||||
osdConfig->aux_symbol = 'A';
|
osdConfig->aux_symbol = 'A';
|
||||||
|
|
||||||
|
// Make it obvious on the configurator that the FC doesn't support HD
|
||||||
|
#ifdef USE_OSD_HD
|
||||||
osdConfig->canvas_cols = OSD_HD_COLS;
|
osdConfig->canvas_cols = OSD_HD_COLS;
|
||||||
osdConfig->canvas_rows = OSD_HD_ROWS;
|
osdConfig->canvas_rows = OSD_HD_ROWS;
|
||||||
|
#else
|
||||||
|
osdConfig->canvas_cols = OSD_SD_COLS;
|
||||||
|
osdConfig->canvas_rows = OSD_SD_ROWS;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void pgResetFn_osdElementConfig(osdElementConfig_t *osdElementConfig)
|
void pgResetFn_osdElementConfig(osdElementConfig_t *osdElementConfig)
|
||||||
{
|
{
|
||||||
|
#ifdef USE_OSD_SD
|
||||||
|
uint8_t midRow = 7;
|
||||||
|
uint8_t midCol = 15;
|
||||||
|
#else
|
||||||
|
uint8_t midRow = 10;
|
||||||
|
uint8_t midCol = 26;
|
||||||
|
#endif
|
||||||
|
|
||||||
// Position elements near centre of screen and disabled by default
|
// Position elements near centre of screen and disabled by default
|
||||||
for (int i = 0; i < OSD_ITEM_COUNT; i++) {
|
for (int i = 0; i < OSD_ITEM_COUNT; i++) {
|
||||||
osdElementConfig->item_pos[i] = OSD_POS(10, 7);
|
osdElementConfig->item_pos[i] = OSD_POS((midCol - 5), midRow);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Always enable warnings elements by default
|
// Always enable warnings elements by default
|
||||||
|
@ -418,14 +432,14 @@ void pgResetFn_osdElementConfig(osdElementConfig_t *osdElementConfig)
|
||||||
for (unsigned i = 1; i <= OSD_PROFILE_COUNT; i++) {
|
for (unsigned i = 1; i <= OSD_PROFILE_COUNT; i++) {
|
||||||
profileFlags |= OSD_PROFILE_FLAG(i);
|
profileFlags |= OSD_PROFILE_FLAG(i);
|
||||||
}
|
}
|
||||||
osdElementConfig->item_pos[OSD_WARNINGS] = OSD_POS(9, 10) | profileFlags;
|
osdElementConfig->item_pos[OSD_WARNINGS] = OSD_POS((midCol - 6), (midRow + 3)) | profileFlags;
|
||||||
|
|
||||||
// Default to old fixed positions for these elements
|
// Default to old fixed positions for these elements
|
||||||
osdElementConfig->item_pos[OSD_CROSSHAIRS] = OSD_POS(13, 6);
|
osdElementConfig->item_pos[OSD_CROSSHAIRS] = OSD_POS((midCol - 2), (midRow - 1));
|
||||||
osdElementConfig->item_pos[OSD_ARTIFICIAL_HORIZON] = OSD_POS(14, 2);
|
osdElementConfig->item_pos[OSD_ARTIFICIAL_HORIZON] = OSD_POS((midCol - 1), (midRow - 5));
|
||||||
osdElementConfig->item_pos[OSD_HORIZON_SIDEBARS] = OSD_POS(14, 6);
|
osdElementConfig->item_pos[OSD_HORIZON_SIDEBARS] = OSD_POS((midCol - 1), (midRow - 1));
|
||||||
osdElementConfig->item_pos[OSD_CAMERA_FRAME] = OSD_POS(3, 1);
|
osdElementConfig->item_pos[OSD_CAMERA_FRAME] = OSD_POS((midCol - 12), (midRow - 6));
|
||||||
osdElementConfig->item_pos[OSD_UP_DOWN_REFERENCE] = OSD_POS(13, 6);
|
osdElementConfig->item_pos[OSD_UP_DOWN_REFERENCE] = OSD_POS((midCol - 2), (midRow - 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void osdDrawLogo(int x, int y)
|
static void osdDrawLogo(int x, int y)
|
||||||
|
@ -497,29 +511,30 @@ void osdInit(displayPort_t *osdDisplayPortToUse, osdDisplayPortDevice_e displayP
|
||||||
cmsDisplayPortRegister(osdDisplayPort);
|
cmsDisplayPortRegister(osdDisplayPort);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Ensure that all OSD elements are on the canvas
|
if (osdDisplayPort->cols && osdDisplayPort->rows) {
|
||||||
for (int i = 0; i < OSD_ITEM_COUNT; i++) {
|
// Ensure that all OSD elements are on the canvas once number of row/columns is known
|
||||||
uint16_t itemPos = osdElementConfig()->item_pos[i];
|
for (int i = 0; i < OSD_ITEM_COUNT; i++) {
|
||||||
uint8_t elemPosX = OSD_X(itemPos);
|
uint16_t itemPos = osdElementConfig()->item_pos[i];
|
||||||
uint8_t elemPosY = OSD_Y(itemPos);
|
uint8_t elemPosX = OSD_X(itemPos);
|
||||||
uint16_t elemProfileType = itemPos & (OSD_PROFILE_MASK | OSD_TYPE_MASK);
|
uint8_t elemPosY = OSD_Y(itemPos);
|
||||||
bool pos_reset = false;
|
uint16_t elemProfileType = itemPos & (OSD_PROFILE_MASK | OSD_TYPE_MASK);
|
||||||
|
bool pos_reset = false;
|
||||||
|
|
||||||
if (elemPosX >= osdDisplayPort->cols) {
|
if (elemPosX >= osdDisplayPort->cols) {
|
||||||
elemPosX = osdDisplayPort->cols - 1;
|
elemPosX = osdDisplayPort->cols - 1;
|
||||||
pos_reset = true;
|
pos_reset = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (elemPosY >= osdDisplayPort->rows) {
|
if (elemPosY >= osdDisplayPort->rows) {
|
||||||
elemPosY = osdDisplayPort->rows - 1;
|
elemPosY = osdDisplayPort->rows - 1;
|
||||||
pos_reset = true;
|
pos_reset = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pos_reset) {
|
if (pos_reset) {
|
||||||
osdElementConfigMutable()->item_pos[i] = elemProfileType | OSD_POS(elemPosX, elemPosY);
|
osdElementConfigMutable()->item_pos[i] = elemProfileType | OSD_POS(elemPosX, elemPosY);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void osdResetStats(void)
|
static void osdResetStats(void)
|
||||||
|
|
|
@ -82,6 +82,9 @@ extern const char * const osdTimerSourceNames[OSD_NUM_TIMER_TYPES];
|
||||||
#define OSD_Y(x) ((x >> OSD_POSITION_BITS) & OSD_POSITION_XY_MASK)
|
#define OSD_Y(x) ((x >> OSD_POSITION_BITS) & OSD_POSITION_XY_MASK)
|
||||||
#define OSD_TYPE(x) ((x & OSD_TYPE_MASK) >> 14)
|
#define OSD_TYPE(x) ((x & OSD_TYPE_MASK) >> 14)
|
||||||
|
|
||||||
|
#define OSD_SD_COLS VIDEO_COLUMNS_SD
|
||||||
|
#define OSD_SD_ROWS VIDEO_LINES_PAL
|
||||||
|
|
||||||
// Default HD OSD canvas size to be applied unless the goggles announce otherwise
|
// Default HD OSD canvas size to be applied unless the goggles announce otherwise
|
||||||
#define OSD_HD_COLS 53
|
#define OSD_HD_COLS 53
|
||||||
#define OSD_HD_ROWS 20
|
#define OSD_HD_ROWS 20
|
||||||
|
|
|
@ -364,6 +364,8 @@ extern uint8_t _dmaram_end__;
|
||||||
|
|
||||||
#define USE_GPS
|
#define USE_GPS
|
||||||
#define USE_OSD
|
#define USE_OSD
|
||||||
|
#define USE_OSD_SD
|
||||||
|
#define USE_OSD_HD
|
||||||
#define USE_LED_STRIP
|
#define USE_LED_STRIP
|
||||||
#define USE_BLACKBOX
|
#define USE_BLACKBOX
|
||||||
|
|
||||||
|
@ -526,11 +528,25 @@ extern uint8_t _dmaram_end__;
|
||||||
#define USE_GPS_RESCUE
|
#define USE_GPS_RESCUE
|
||||||
#endif // USE_GPS
|
#endif // USE_GPS
|
||||||
|
|
||||||
#if defined(USE_OSD) || defined(USE_OSD_HD) || defined(USE_OSD_SD)
|
#if defined(USE_OSD_HD) || defined(USE_OSD_SD)
|
||||||
|
// If either USE_OSD_SD for USE_OSD_HD are defined, ensure that USE_OSD is also defined
|
||||||
#ifndef USE_OSD
|
#ifndef USE_OSD
|
||||||
#define USE_OSD
|
#define USE_OSD
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_OSD
|
||||||
|
|
||||||
|
#if !defined(USE_OSD_HD) && !defined(USE_OSD_SD)
|
||||||
|
// If USE_OSD is defined without specifying SD or HD, then support both
|
||||||
|
#define USE_OSD_SD
|
||||||
|
#define USE_OSD_HD
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(USE_OSD_SD) && defined(USE_MAX7456)
|
||||||
|
// If USE_OSD_SD isn't defined then explicitly exclude MAX7456 support
|
||||||
|
#undef USE_MAX7456
|
||||||
|
#endif
|
||||||
|
|
||||||
#define USE_CMS
|
#define USE_CMS
|
||||||
#define USE_MSP_DISPLAYPORT
|
#define USE_MSP_DISPLAYPORT
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue