1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-23 00:05:33 +03:00

CF/BF - Allow OSD slave to be configured.

This highlights the face that MSP_SET_OSD_CONFIG is ill-conceived.  See
Cleanflight v1.x where multiple commands are used - one for video config
and one for element config.

In light of other recent changes it's possible a 3rd command is needed,
for unit selection and alarms.
This commit is contained in:
Hydra 2017-04-08 20:34:36 +01:00 committed by Dominic Clifton
parent ba75dc4f1d
commit 0f7a986003

View file

@ -1096,15 +1096,36 @@ static bool mspFcProcessOutCommand(uint8_t cmdMSP, sbuf_t *dst, mspPostProcessFn
#endif #endif
break; break;
case MSP_OSD_CONFIG: case MSP_OSD_CONFIG: {
#ifdef OSD
sbufWriteU8(dst, 1); // OSD supported #define OSD_FLAGS_OSD_FEATURE (1 << 0)
// send video system (AUTO/PAL/NTSC) #define OSD_FLAGS_OSD_SLAVE (1 << 1)
#define OSD_FLAGS_RESERVED_1 (1 << 2)
#define OSD_FLAGS_RESERVED_2 (1 << 3)
#define OSD_FLAGS_OSD_HARDWARE_MAX_7456 (1 << 4)
uint8_t osdFlags = 0;
#if defined(OSD)
osdFlags |= OSD_FLAGS_OSD_FEATURE;
#endif
#if defined(USE_OSD_SLAVE)
osdFlags |= OSD_FLAGS_OSD_SLAVE;
#endif
#ifdef USE_MAX7456 #ifdef USE_MAX7456
osdFlags |= OSD_FLAGS_OSD_HARDWARE_MAX_7456;
#endif
sbufWriteU8(dst, osdFlags);
#ifdef USE_MAX7456
// send video system (AUTO/PAL/NTSC)
sbufWriteU8(dst, vcdProfile()->video_system); sbufWriteU8(dst, vcdProfile()->video_system);
#else #else
sbufWriteU8(dst, 0); sbufWriteU8(dst, 0);
#endif #endif
#ifdef OSD
// OSD specific, not applicable to OSD slaves.
sbufWriteU8(dst, osdConfig()->units); sbufWriteU8(dst, osdConfig()->units);
sbufWriteU8(dst, osdConfig()->rssi_alarm); sbufWriteU8(dst, osdConfig()->rssi_alarm);
sbufWriteU16(dst, osdConfig()->cap_alarm); sbufWriteU16(dst, osdConfig()->cap_alarm);
@ -1113,11 +1134,9 @@ static bool mspFcProcessOutCommand(uint8_t cmdMSP, sbuf_t *dst, mspPostProcessFn
for (int i = 0; i < OSD_ITEM_COUNT; i++) { for (int i = 0; i < OSD_ITEM_COUNT; i++) {
sbufWriteU16(dst, osdConfig()->item_pos[i]); sbufWriteU16(dst, osdConfig()->item_pos[i]);
} }
#else
sbufWriteU8(dst, 0); // OSD not supported
#endif #endif
break; break;
}
case MSP_MOTOR_3D_CONFIG: case MSP_MOTOR_3D_CONFIG:
sbufWriteU16(dst, flight3DConfig()->deadband3d_low); sbufWriteU16(dst, flight3DConfig()->deadband3d_low);
sbufWriteU16(dst, flight3DConfig()->deadband3d_high); sbufWriteU16(dst, flight3DConfig()->deadband3d_high);
@ -1621,7 +1640,7 @@ static mspResult_e mspFcProcessInCommand(uint8_t cmdMSP, sbuf_t *src)
break; break;
#endif #endif
#ifdef OSD #if defined(OSD) || defined (USE_OSD_SLAVE)
case MSP_SET_OSD_CONFIG: case MSP_SET_OSD_CONFIG:
{ {
const uint8_t addr = sbufReadU8(src); const uint8_t addr = sbufReadU8(src);
@ -1632,20 +1651,27 @@ static mspResult_e mspFcProcessInCommand(uint8_t cmdMSP, sbuf_t *src)
#else #else
sbufReadU8(src); // Skip video system sbufReadU8(src); // Skip video system
#endif #endif
#if defined(OSD)
osdConfigMutable()->units = sbufReadU8(src); osdConfigMutable()->units = sbufReadU8(src);
osdConfigMutable()->rssi_alarm = sbufReadU8(src); osdConfigMutable()->rssi_alarm = sbufReadU8(src);
osdConfigMutable()->cap_alarm = sbufReadU16(src); osdConfigMutable()->cap_alarm = sbufReadU16(src);
osdConfigMutable()->time_alarm = sbufReadU16(src); osdConfigMutable()->time_alarm = sbufReadU16(src);
osdConfigMutable()->alt_alarm = sbufReadU16(src); osdConfigMutable()->alt_alarm = sbufReadU16(src);
#endif
} else { } else {
#if defined(OSD)
// set a position setting // set a position setting
const uint16_t pos = sbufReadU16(src); const uint16_t pos = sbufReadU16(src);
if (addr < OSD_ITEM_COUNT) { if (addr < OSD_ITEM_COUNT) {
osdConfigMutable()->item_pos[addr] = pos; osdConfigMutable()->item_pos[addr] = pos;
} }
#else
return MSP_RESULT_ERROR;
#endif
} }
} }
break; break;
case MSP_OSD_CHAR_WRITE: case MSP_OSD_CHAR_WRITE:
#ifdef USE_MAX7456 #ifdef USE_MAX7456
{ {
@ -1658,14 +1684,18 @@ static mspResult_e mspFcProcessInCommand(uint8_t cmdMSP, sbuf_t *src)
max7456WriteNvm(addr, font_data); max7456WriteNvm(addr, font_data);
} }
#else #else
return MSP_RESULT_ERROR;
/*
// just discard the data // just discard the data
sbufReadU8(src); sbufReadU8(src);
for (int i = 0; i < 54; i++) { for (int i = 0; i < 54; i++) {
sbufReadU8(src); sbufReadU8(src);
} }
*/
#endif #endif
break; break;
#endif #endif // OSD || USE_OSD_SLAVE
#if defined(USE_RTC6705) || defined(VTX_COMMON) #if defined(USE_RTC6705) || defined(VTX_COMMON)
case MSP_SET_VTX_CONFIG: case MSP_SET_VTX_CONFIG: