1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-14 20:10:18 +03:00

Remove MCU name table from CLI (rely on build info), add MCU info MSP2 command (#14148)

This commit is contained in:
Jay Blackman 2025-01-18 04:17:57 +11:00 committed by GitHub
parent 6d5ed84f96
commit cec5d00bbf
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 246 additions and 249 deletions

View file

@ -31,54 +31,12 @@
mcuTypeId_e getMcuTypeId(void) mcuTypeId_e getMcuTypeId(void)
{ {
#if defined(SIMULATOR_BUILD) const mcuTypeInfo_t *mcuTypeInfo = getMcuTypeInfo();
return MCU_TYPE_SIMULATOR; return mcuTypeInfo ? mcuTypeInfo->id : MCU_TYPE_UNKNOWN;
#elif defined(STM32F40_41xxx)
return MCU_TYPE_F40X;
#elif defined(STM32F411xE)
return MCU_TYPE_F411;
#elif defined(STM32F446xx)
return MCU_TYPE_F446;
#elif defined(STM32F722xx)
return MCU_TYPE_F722;
#elif defined(STM32F745xx)
return MCU_TYPE_F745;
#elif defined(STM32F746xx)
return MCU_TYPE_F746;
#elif defined(STM32F765xx)
return MCU_TYPE_F765;
#elif defined(STM32H750xx)
return MCU_TYPE_H750;
#elif defined(STM32H730xx)
return MCU_TYPE_H730;
#elif defined(STM32H743xx)
switch (HAL_GetREVID()) {
case REV_ID_Y:
return MCU_TYPE_H743_REV_Y;
case REV_ID_X:
return MCU_TYPE_H743_REV_X;
case REV_ID_V:
return MCU_TYPE_H743_REV_V;
default:
return MCU_TYPE_H743_REV_UNKNOWN;
} }
#elif defined(STM32H7A3xx) || defined(STM32H7A3xxQ)
return MCU_TYPE_H7A3; const char *getMcuTypeName(void)
#elif defined(STM32H723xx) || defined(STM32H725xx) {
return MCU_TYPE_H723_725; const mcuTypeInfo_t *mcuTypeInfo = getMcuTypeInfo();
#elif defined(STM32G474xx) return mcuTypeInfo ? mcuTypeInfo->name : "Unknown";
return MCU_TYPE_G474;
#elif defined(AT32F435G)
return MCU_TYPE_AT32F435G;
#elif defined(AT32F435M)
return MCU_TYPE_AT32F435M;
#elif defined(APM32F405)
return MCU_TYPE_APM32F405;
#elif defined(APM32F407)
return MCU_TYPE_APM32F407;
#elif defined(RP2350B)
return MCU_TYPE_RP2350B;
#else
return MCU_TYPE_UNKNOWN;
#endif
} }

View file

@ -68,4 +68,11 @@ typedef enum {
MCU_TYPE_UNKNOWN = 255, MCU_TYPE_UNKNOWN = 255,
} mcuTypeId_e; } mcuTypeId_e;
typedef struct mcuTypeInfo_s {
mcuTypeId_e id;
const char *name;
} mcuTypeInfo_t;
const mcuTypeInfo_t *getMcuTypeInfo(void);
mcuTypeId_e getMcuTypeId(void); mcuTypeId_e getMcuTypeId(void);
const char *getMcuTypeName(void);

View file

@ -279,32 +279,6 @@ static const char * const *sensorHardwareNames[] = {
}; };
#endif // USE_SENSOR_NAMES #endif // USE_SENSOR_NAMES
// Needs to be aligned with mcuTypeId_e
static const char *mcuTypeNames[MCU_TYPE_COUNT] = {
"SIMULATOR",
"F40X",
"F411",
"F446",
"F722",
"F745",
"F746",
"F765",
"H750",
"H743 (Rev Unknown)",
"H743 (Rev.Y)",
"H743 (Rev.X)",
"H743 (Rev.V)",
"H7A3",
"H723/H725",
"G474",
"H730",
"AT32F435G",
"APM32F405",
"APM32F407",
"AT32F435M",
"RP2350B",
};
static const char *configurationStates[] = { static const char *configurationStates[] = {
[CONFIGURATION_STATE_UNCONFIGURED] = "UNCONFIGURED", [CONFIGURATION_STATE_UNCONFIGURED] = "UNCONFIGURED",
[CONFIGURATION_STATE_CONFIGURED] = "CONFIGURED" [CONFIGURATION_STATE_CONFIGURED] = "CONFIGURED"
@ -4692,15 +4666,6 @@ STATIC_UNIT_TESTED void cliSet(const char *cmdName, char *cmdline)
} }
} }
static const char *getMcuTypeById(mcuTypeId_e id)
{
if (id < ARRAYLEN(mcuTypeNames)) {
return mcuTypeNames[id];
} else {
return "UNKNOWN";
}
}
static void cliStatus(const char *cmdName, char *cmdline) static void cliStatus(const char *cmdName, char *cmdline)
{ {
UNUSED(cmdName); UNUSED(cmdName);
@ -4708,7 +4673,7 @@ static void cliStatus(const char *cmdName, char *cmdline)
// MCU type, clock, vrefint, core temperature // MCU type, clock, vrefint, core temperature
cliPrintf("MCU %s Clock=%dMHz", getMcuTypeById(getMcuTypeId()), (SystemCoreClock / 1000000)); cliPrintf("MCU %s Clock=%dMHz", getMcuTypeName(), (SystemCoreClock / 1000000));
#if defined(STM32F4) || defined(STM32G4) || defined(APM32F4) #if defined(STM32F4) || defined(STM32G4) || defined(APM32F4)
// Only F4 and G4 is capable of switching between HSE/HSI (for now) // Only F4 and G4 is capable of switching between HSE/HSI (for now)

View file

@ -24,6 +24,7 @@
#include "platform.h" #include "platform.h"
#include "streambuf.h" #include "streambuf.h"
#include "common/maths.h"
sbuf_t *sbufInit(sbuf_t *sbuf, uint8_t *ptr, uint8_t *end) sbuf_t *sbufInit(sbuf_t *sbuf, uint8_t *ptr, uint8_t *end)
{ {
@ -82,6 +83,13 @@ void sbufWriteString(sbuf_t *dst, const char *string)
sbufWriteData(dst, string, strlen(string)); sbufWriteData(dst, string, strlen(string));
} }
void sbufWritePString(sbuf_t *dst, const char *string)
{
const int length = MIN((int)strlen(string), 255);
sbufWriteU8(dst, length);
sbufWriteData(dst, string, length);
}
void sbufWriteStringWithZeroTerminator(sbuf_t *dst, const char *string) void sbufWriteStringWithZeroTerminator(sbuf_t *dst, const char *string)
{ {
sbufWriteData(dst, string, strlen(string) + 1); sbufWriteData(dst, string, strlen(string) + 1);

View file

@ -39,6 +39,7 @@ void sbufWriteU32BigEndian(sbuf_t *dst, uint32_t val);
void sbufFill(sbuf_t *dst, uint8_t data, int len); void sbufFill(sbuf_t *dst, uint8_t data, int len);
void sbufWriteData(sbuf_t *dst, const void *data, int len); void sbufWriteData(sbuf_t *dst, const void *data, int len);
void sbufWriteString(sbuf_t *dst, const char *string); void sbufWriteString(sbuf_t *dst, const char *string);
void sbufWritePString(sbuf_t *dst, const char *string);
void sbufWriteStringWithZeroTerminator(sbuf_t *dst, const char *string); void sbufWriteStringWithZeroTerminator(sbuf_t *dst, const char *string);
uint8_t sbufReadU8(sbuf_t *src); uint8_t sbufReadU8(sbuf_t *src);

View file

@ -409,8 +409,7 @@ void mspReboot(dispatchEntry_t* self)
mspRebootFn(NULL); mspRebootFn(NULL);
} }
dispatchEntry_t mspRebootEntry = dispatchEntry_t mspRebootEntry = {
{
mspReboot, 0, NULL, false mspReboot, 0, NULL, false
}; };
@ -433,8 +432,7 @@ void writeReadEeprom(dispatchEntry_t* self)
#endif #endif
} }
dispatchEntry_t writeReadEepromEntry = dispatchEntry_t writeReadEepromEntry = {
{
writeReadEeprom, 0, NULL, false writeReadEeprom, 0, NULL, false
}; };
@ -643,8 +641,13 @@ static bool mspCommonProcessOutCommand(int16_t cmdMSP, sbuf_t *dst, mspPostProce
sbufWriteU8(dst, FC_VERSION_PATCH_LEVEL); sbufWriteU8(dst, FC_VERSION_PATCH_LEVEL);
break; break;
case MSP_BOARD_INFO: case MSP2_MCU_INFO: {
{ sbufWriteU8(dst, getMcuTypeId());
sbufWritePString(dst, getMcuTypeName());
break;
}
case MSP_BOARD_INFO: {
sbufWriteData(dst, systemConfig()->boardIdentifier, BOARD_IDENTIFIER_LENGTH); sbufWriteData(dst, systemConfig()->boardIdentifier, BOARD_IDENTIFIER_LENGTH);
#ifdef USE_HARDWARE_REVISION_DETECTION #ifdef USE_HARDWARE_REVISION_DETECTION
sbufWriteU16(dst, hardwareRevision); sbufWriteU16(dst, hardwareRevision);
@ -682,19 +685,14 @@ static bool mspCommonProcessOutCommand(int16_t cmdMSP, sbuf_t *dst, mspPostProce
sbufWriteU8(dst, targetCapabilities); sbufWriteU8(dst, targetCapabilities);
// Target name with explicit length // Target name with explicit length
sbufWriteU8(dst, strlen(targetName)); sbufWritePString(dst, targetName);
sbufWriteData(dst, targetName, strlen(targetName));
#if defined(USE_BOARD_INFO) #if defined(USE_BOARD_INFO)
// Board name with explicit length // Board name with explicit length
char *value = getBoardName(); sbufWritePString(dst, getBoardName());
sbufWriteU8(dst, strlen(value));
sbufWriteString(dst, value);
// Manufacturer id with explicit length // Manufacturer id with explicit length
value = getManufacturerId(); sbufWritePString(dst, getManufacturerId());
sbufWriteU8(dst, strlen(value));
sbufWriteString(dst, value);
#else #else
sbufWriteU8(dst, 0); sbufWriteU8(dst, 0);
sbufWriteU8(dst, 0); sbufWriteU8(dst, 0);
@ -845,8 +843,7 @@ static bool mspCommonProcessOutCommand(int16_t cmdMSP, sbuf_t *dst, mspPostProce
break; break;
} }
case MSP_VOLTAGE_METER_CONFIG: case MSP_VOLTAGE_METER_CONFIG: {
{
// by using a sensor type and a sub-frame length it's possible to configure any type of voltage meter, // by using a sensor type and a sub-frame length it's possible to configure any type of voltage meter,
// e.g. an i2c/spi/can sensor or any sensor not built directly into the FC such as ESC/RX/SPort/SBus that has // e.g. an i2c/spi/can sensor or any sensor not built directly into the FC such as ESC/RX/SPort/SBus that has
// different configuration requirements. // different configuration requirements.
@ -864,9 +861,9 @@ static bool mspCommonProcessOutCommand(int16_t cmdMSP, sbuf_t *dst, mspPostProce
sbufWriteU8(dst, voltageSensorADCConfig(i)->vbatresdivmultiplier); sbufWriteU8(dst, voltageSensorADCConfig(i)->vbatresdivmultiplier);
} }
// if we had any other voltage sensors, this is where we would output any needed configuration // if we had any other voltage sensors, this is where we would output any needed configuration
break;
} }
break;
case MSP_CURRENT_METER_CONFIG: { case MSP_CURRENT_METER_CONFIG: {
// the ADC and VIRTUAL sensors have the same configuration requirements, however this API reflects // the ADC and VIRTUAL sensors have the same configuration requirements, however this API reflects
// that this situation may change and allows us to support configuration of any current sensor with // that this situation may change and allows us to support configuration of any current sensor with
@ -1085,8 +1082,7 @@ static bool mspProcessOutCommand(mspDescriptor_t srcDesc, int16_t cmdMSP, sbuf_t
switch (cmdMSP) { switch (cmdMSP) {
case MSP_STATUS_EX: case MSP_STATUS_EX:
case MSP_STATUS: case MSP_STATUS: {
{
boxBitmask_t flightModeFlags; boxBitmask_t flightModeFlags;
const int flagBits = packFlightModeFlags(&flightModeFlags); const int flagBits = packFlightModeFlags(&flightModeFlags);
@ -1132,12 +1128,10 @@ static bool mspProcessOutCommand(mspDescriptor_t srcDesc, int16_t cmdMSP, sbuf_t
#else #else
sbufWriteU16(dst, 0); sbufWriteU16(dst, 0);
#endif #endif
}
break; break;
}
case MSP_RAW_IMU: case MSP_RAW_IMU: {
{
for (int i = 0; i < 3; i++) { for (int i = 0; i < 3; i++) {
#if defined(USE_ACC) #if defined(USE_ACC)
sbufWriteU16(dst, lrintf(acc.accADC.v[i])); sbufWriteU16(dst, lrintf(acc.accADC.v[i]));
@ -1155,8 +1149,8 @@ static bool mspProcessOutCommand(mspDescriptor_t srcDesc, int16_t cmdMSP, sbuf_t
sbufWriteU16(dst, 0); sbufWriteU16(dst, 0);
#endif #endif
} }
}
break; break;
}
case MSP_NAME: case MSP_NAME:
sbufWriteString(dst, pilotConfig()->craftName); sbufWriteString(dst, pilotConfig()->craftName);
@ -1203,7 +1197,6 @@ case MSP_NAME:
sbufWriteU16(dst, 0); sbufWriteU16(dst, 0);
#endif #endif
} }
break; break;
// Added in API version 1.42 // Added in API version 1.42
@ -1285,30 +1278,27 @@ case MSP_NAME:
break; break;
#ifdef USE_VTX_COMMON #ifdef USE_VTX_COMMON
case MSP2_GET_VTX_DEVICE_STATUS: case MSP2_GET_VTX_DEVICE_STATUS: {
{
const vtxDevice_t *vtxDevice = vtxCommonDevice(); const vtxDevice_t *vtxDevice = vtxCommonDevice();
vtxCommonSerializeDeviceStatus(vtxDevice, dst); vtxCommonSerializeDeviceStatus(vtxDevice, dst);
}
break; break;
}
#endif #endif
#ifdef USE_OSD #ifdef USE_OSD
case MSP2_GET_OSD_WARNINGS: case MSP2_GET_OSD_WARNINGS: {
{
bool isBlinking; bool isBlinking;
uint8_t displayAttr; uint8_t displayAttr;
char warningsBuffer[OSD_WARNINGS_MAX_SIZE + 1]; char warningsBuffer[OSD_WARNINGS_MAX_SIZE + 1];
renderOsdWarning(warningsBuffer, &isBlinking, &displayAttr); renderOsdWarning(warningsBuffer, &isBlinking, &displayAttr);
const uint8_t warningsLen = strlen(warningsBuffer);
if (isBlinking) { if (isBlinking) {
displayAttr |= DISPLAYPORT_BLINK; displayAttr |= DISPLAYPORT_BLINK;
} }
sbufWriteU8(dst, displayAttr); // see displayPortSeverity_e sbufWriteU8(dst, displayAttr); // see displayPortSeverity_e
sbufWriteU8(dst, warningsLen); // length byte followed by the actual characters sbufWritePString(dst, warningsBuffer);
sbufWriteData(dst, warningsBuffer, warningsLen);
break; break;
} }
#endif #endif
@ -1687,6 +1677,7 @@ case MSP_NAME:
sbufWriteU8(dst, serialConfig()->portConfigs[i].blackbox_baudrateIndex); sbufWriteU8(dst, serialConfig()->portConfigs[i].blackbox_baudrateIndex);
} }
break; break;
case MSP2_COMMON_SERIAL_CONFIG: { case MSP2_COMMON_SERIAL_CONFIG: {
uint8_t count = 0; uint8_t count = 0;
for (int i = 0; i < SERIAL_PORT_COUNT; i++) { for (int i = 0; i < SERIAL_PORT_COUNT; i++) {
@ -1876,6 +1867,7 @@ case MSP_NAME:
#endif #endif
break; break;
} }
case MSP_ADVANCED_CONFIG: case MSP_ADVANCED_CONFIG:
sbufWriteU8(dst, 1); // was gyroConfig()->gyro_sync_denom - removed in API 1.43 sbufWriteU8(dst, 1); // was gyroConfig()->gyro_sync_denom - removed in API 1.43
sbufWriteU8(dst, pidConfig()->pid_process_denom); sbufWriteU8(dst, pidConfig()->pid_process_denom);
@ -1894,8 +1886,8 @@ case MSP_NAME:
//Added in MSP API 1.42 //Added in MSP API 1.42
sbufWriteU8(dst, systemConfig()->debug_mode); sbufWriteU8(dst, systemConfig()->debug_mode);
sbufWriteU8(dst, DEBUG_COUNT); sbufWriteU8(dst, DEBUG_COUNT);
break; break;
case MSP_FILTER_CONFIG: case MSP_FILTER_CONFIG:
sbufWriteU8(dst, gyroConfig()->gyro_lpf1_static_hz); sbufWriteU8(dst, gyroConfig()->gyro_lpf1_static_hz);
sbufWriteU16(dst, currentPidProfile->dterm_lpf1_static_hz); sbufWriteU16(dst, currentPidProfile->dterm_lpf1_static_hz);
@ -1963,8 +1955,8 @@ case MSP_NAME:
#else #else
sbufWriteU8(dst, 0); sbufWriteU8(dst, 0);
#endif #endif
break; break;
case MSP_PID_ADVANCED: case MSP_PID_ADVANCED:
sbufWriteU16(dst, 0); sbufWriteU16(dst, 0);
sbufWriteU16(dst, 0); sbufWriteU16(dst, 0);
@ -2147,8 +2139,7 @@ case MSP_NAME:
break; break;
#if defined(USE_VTX_COMMON) #if defined(USE_VTX_COMMON)
case MSP_VTX_CONFIG: case MSP_VTX_CONFIG: {
{
const vtxDevice_t *vtxDevice = vtxCommonDevice(); const vtxDevice_t *vtxDevice = vtxCommonDevice();
unsigned vtxStatus = 0; unsigned vtxStatus = 0;
vtxDevType_e vtxType = VTXDEV_UNKNOWN; vtxDevType_e vtxType = VTXDEV_UNKNOWN;
@ -2183,8 +2174,8 @@ case MSP_NAME:
#ifdef USE_VTX_MSP #ifdef USE_VTX_MSP
setMspVtxDeviceStatusReady(srcDesc); setMspVtxDeviceStatusReady(srcDesc);
#endif #endif
}
break; break;
}
#endif #endif
case MSP_TX_INFO: case MSP_TX_INFO:
@ -2199,11 +2190,10 @@ case MSP_NAME:
rtcDateTimeIsSet = RTC_NOT_SUPPORTED; rtcDateTimeIsSet = RTC_NOT_SUPPORTED;
#endif #endif
sbufWriteU8(dst, rtcDateTimeIsSet); sbufWriteU8(dst, rtcDateTimeIsSet);
break; break;
#ifdef USE_RTC_TIME #ifdef USE_RTC_TIME
case MSP_RTC: case MSP_RTC: {
{
dateTime_t dt; dateTime_t dt;
if (rtcGetDateTime(&dt)) { if (rtcGetDateTime(&dt)) {
sbufWriteU16(dst, dt.year); sbufWriteU16(dst, dt.year);
@ -2214,10 +2204,10 @@ case MSP_NAME:
sbufWriteU8(dst, dt.seconds); sbufWriteU8(dst, dt.seconds);
sbufWriteU16(dst, dt.millis); sbufWriteU16(dst, dt.millis);
} }
}
break; break;
}
#endif #endif
default: default:
unsupportedCommand = true; unsupportedCommand = true;
} }
@ -2629,12 +2619,9 @@ static mspResult_e mspFcProcessOutCommandWithArg(mspDescriptor_t srcDesc, int16_
if (!textVar) return MSP_RESULT_ERROR; if (!textVar) return MSP_RESULT_ERROR;
const uint8_t textLength = strlen(textVar);
// type byte, then length byte followed by the actual characters // type byte, then length byte followed by the actual characters
sbufWriteU8(dst, textType); sbufWriteU8(dst, textType);
sbufWriteU8(dst, textLength); sbufWritePString(dst, textVar);
sbufWriteData(dst, textVar, textLength);
} }
break; break;
#ifdef USE_LED_STRIP #ifdef USE_LED_STRIP

View file

@ -30,6 +30,7 @@
#define MSP2_SET_LED_STRIP_CONFIG_VALUES 0x3009 #define MSP2_SET_LED_STRIP_CONFIG_VALUES 0x3009
#define MSP2_SENSOR_CONFIG_ACTIVE 0x300A #define MSP2_SENSOR_CONFIG_ACTIVE 0x300A
#define MSP2_SENSOR_OPTICALFLOW 0x300B #define MSP2_SENSOR_OPTICALFLOW 0x300B
#define MSP2_MCU_INFO 0x300C
// MSP2_SET_TEXT and MSP2_GET_TEXT variable types // MSP2_SET_TEXT and MSP2_GET_TEXT variable types
#define MSP2TEXT_PILOT_NAME 1 #define MSP2TEXT_PILOT_NAME 1

View file

@ -789,3 +789,9 @@ IO_t IOGetByTag(ioTag_t tag)
UNUSED(tag); UNUSED(tag);
return NULL; return NULL;
} }
const mcuTypeInfo_t *getMcuTypeInfo(void)
{
static const mcuTypeInfo_t info = { .id = MCU_TYPE_SIMULATOR, .name = "SIMULATOR" };
return &info;
}

View file

@ -322,3 +322,66 @@ void unusedPinsInit(void)
{ {
IOTraversePins(unusedPinInit); IOTraversePins(unusedPinInit);
} }
const mcuTypeInfo_t *getMcuTypeInfo(void)
{
static const mcuTypeInfo_t info[] = {
#if defined(STM32H743xx)
{ .id = MCU_TYPE_H743_REV_UNKNOWN, .name = "STM32H743 (Rev Unknown)" },
{ .id = MCU_TYPE_H743_REV_Y, .name = "STM32H743 (Rev.Y)" },
{ .id = MCU_TYPE_H743_REV_X, .name = "STM32H743 (Rev.X)" },
{ .id = MCU_TYPE_H743_REV_V, .name = "STM32H743 (Rev.V)" },
#elif defined(STM32F40_41xxx)
{ .id = MCU_TYPE_F40X, .name = "STM32F40X" },
#elif defined(STM32F411xE)
{ .id = MCU_TYPE_F411, .name = "STM32F411" },
#elif defined(STM32F446xx)
{ .id = MCU_TYPE_F446, .name = "STM32F446" },
#elif defined(STM32F722xx)
{ .id = MCU_TYPE_F722, .name = "STM32F722" },
#elif defined(STM32F745xx)
{ .id = MCU_TYPE_F745, .name = "STM32F745" },
#elif defined(STM32F746xx)
{ .id = MCU_TYPE_F746, .name = "STM32F746" },
#elif defined(STM32F765xx)
{ .id = MCU_TYPE_F765, .name = "STM32F765" },
#elif defined(STM32H750xx)
{ .id = MCU_TYPE_H750, .name = "STM32H750" },
#elif defined(STM32H730xx)
{ .id = MCU_TYPE_H730, .name = "STM32H730" },
#elif defined(STM32H7A3xx) || defined(STM32H7A3xxQ)
{ .id = MCU_TYPE_H7A3, .name = "STM32H7A3" },
#elif defined(STM32H723xx) || defined(STM32H725xx)
{ .id = MCU_TYPE_H723_725, .name = "STM32H723/H725" },
#elif defined(STM32G474xx)
{ .id = MCU_TYPE_G474, .name = "STM32G474" },
#elif defined(AT32F435G)
{ .id = MCU_TYPE_AT32F435G, .name = "AT32F435G" },
#elif defined(AT32F435M)
{ .id = MCU_TYPE_AT32F435M, .name = "AT32F435M" },
#elif defined(APM32F405)
{ .id = MCU_TYPE_APM32F405, .name = "APM32F405" },
#elif defined(APM32F407)
{ .id = MCU_TYPE_APM32F407, .name = "APM32F407" },
#else
#error MCU Type info not defined for STM (or clone)
#endif
};
unsigned revision = 0;
#if defined(STM32H743xx)
switch (HAL_GetREVID()) {
case REV_ID_Y:
revision = 1;
break;
case REV_ID_X:
revision = 2;
break;
case REV_ID_V:
revision = 3;
break;
default:
revision = 0;
}
#endif
return info + revision;
}

View file

@ -401,6 +401,7 @@ bool isModeActivationConditionConfigured(const modeActivationCondition_t *, cons
void delay(uint32_t) {} void delay(uint32_t) {}
displayPort_t *osdGetDisplayPort(osdDisplayPortDevice_e *) { return NULL; } displayPort_t *osdGetDisplayPort(osdDisplayPortDevice_e *) { return NULL; }
mcuTypeId_e getMcuTypeId(void) { return MCU_TYPE_UNKNOWN; } mcuTypeId_e getMcuTypeId(void) { return MCU_TYPE_UNKNOWN; }
const char *getMcuTypeName(void) { return targetName; }
uint16_t getCurrentRxRateHz(void) { return 0; } uint16_t getCurrentRxRateHz(void) { return 0; }
uint16_t getAverageSystemLoadPercent(void) { return 0; } uint16_t getAverageSystemLoadPercent(void) { return 0; }
bool getRxRateValid(void) { return false; } bool getRxRateValid(void) { return false; }