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

Add support for serial passthrough via MSP

- Rename MSP_SET_4WAY_IF to MSP_SET_PASSTHROUGH
- Keep backwards compatibility with existing uses of the command
- Add 2 new values for the passthrough mode: one that sets up
a serial port given its ID and another one that sets it up from
a function ID.
This commit is contained in:
Alberto García Hierro 2019-12-08 22:48:57 +00:00
parent 18c485707e
commit deeabdbca3
2 changed files with 76 additions and 25 deletions

View file

@ -172,6 +172,19 @@ typedef enum {
MSP_FLASHFS_FLAG_SUPPORTED = 2 MSP_FLASHFS_FLAG_SUPPORTED = 2
} mspFlashFsFlags_e; } mspFlashFsFlags_e;
typedef enum {
MSP_PASSTHROUGH_ESC_SIMONK = PROTOCOL_SIMONK,
MSP_PASSTHROUGH_ESC_BLHELI = PROTOCOL_BLHELI,
MSP_PASSTHROUGH_ESC_KISS = PROTOCOL_KISS,
MSP_PASSTHROUGH_ESC_KISSALL = PROTOCOL_KISSALL,
MSP_PASSTHROUGH_ESC_CASTLE = PROTOCOL_CASTLE,
MSP_PASSTHROUGH_SERIAL_ID = 0xFD,
MSP_PASSTHROUGH_SERIAL_FUNCTION_ID = 0xFE,
MSP_PASSTHROUGH_ESC_4WAY = 0xFF,
} mspPassthroughType_e;
#define RATEPROFILE_MASK (1 << 7) #define RATEPROFILE_MASK (1 << 7)
#define RTC_NOT_SUPPORTED 0xff #define RTC_NOT_SUPPORTED 0xff
@ -209,33 +222,73 @@ static bool mspIsMspArmingEnabled(void)
return mspArmingDisableFlags == 0; return mspArmingDisableFlags == 0;
} }
#ifdef USE_SERIAL_4WAY_BLHELI_INTERFACE #define MSP_PASSTHROUGH_ESC_4WAY 0xff
#define ESC_4WAY 0xff
uint8_t escMode; static uint8_t mspPassthroughMode;
uint8_t escPortIndex; static uint8_t mspPassthroughArgument;
#ifdef USE_ESCSERIAL #ifdef USE_ESCSERIAL
static void mspEscPassthroughFn(serialPort_t *serialPort) static void mspEscPassthroughFn(serialPort_t *serialPort)
{ {
escEnablePassthrough(serialPort, &motorConfig()->dev, escPortIndex, escMode); escEnablePassthrough(serialPort, &motorConfig()->dev, mspPassthroughArgument, mspPassthroughMode);
} }
#endif #endif
static void mspFc4waySerialCommand(sbuf_t *dst, sbuf_t *src, mspPostProcessFnPtr *mspPostProcessFn) static serialPort_t *mspFindPassthroughSerialPort(void)
{
serialPortUsage_t *portUsage = NULL;
switch (mspPassthroughMode) {
case MSP_PASSTHROUGH_SERIAL_ID:
{
portUsage = findSerialPortUsageByIdentifier(mspPassthroughArgument);
break;
}
case MSP_PASSTHROUGH_SERIAL_FUNCTION_ID:
{
const serialPortConfig_t *portConfig = findSerialPortConfig(1 << mspPassthroughArgument);
if (portConfig) {
portUsage = findSerialPortUsageByIdentifier(portConfig->identifier);
}
break;
}
}
return portUsage ? portUsage->serialPort : NULL;
}
static void mspSerialPassthroughFn(serialPort_t *serialPort)
{
serialPort_t *passthroughPort = mspFindPassthroughSerialPort();
if (passthroughPort && serialPort) {
serialPassthrough(passthroughPort, serialPort, NULL, NULL);
}
}
static void mspFcSetPassthroughCommand(sbuf_t *dst, sbuf_t *src, mspPostProcessFnPtr *mspPostProcessFn)
{ {
const unsigned int dataSize = sbufBytesRemaining(src); const unsigned int dataSize = sbufBytesRemaining(src);
if (dataSize == 0) { if (dataSize == 0) {
// Legacy format // Legacy format
mspPassthroughMode = MSP_PASSTHROUGH_ESC_4WAY;
escMode = ESC_4WAY;
} else { } else {
escMode = sbufReadU8(src); mspPassthroughMode = sbufReadU8(src);
escPortIndex = sbufReadU8(src); mspPassthroughArgument = sbufReadU8(src);
} }
switch (escMode) { switch (mspPassthroughMode) {
case ESC_4WAY: case MSP_PASSTHROUGH_SERIAL_ID:
case MSP_PASSTHROUGH_SERIAL_FUNCTION_ID:
if (mspFindPassthroughSerialPort()) {
if (mspPostProcessFn) {
*mspPostProcessFn = mspSerialPassthroughFn;
}
sbufWriteU8(dst, 1);
} else {
sbufWriteU8(dst, 0);
}
break;
#ifdef USE_SERIAL_4WAY_BLHELI_INTERFACE
case MSP_PASSTHROUGH_ESC_4WAY:
// get channel number // get channel number
// switch all motor lines HI // switch all motor lines HI
// reply with the count of ESC found // reply with the count of ESC found
@ -247,12 +300,12 @@ static void mspFc4waySerialCommand(sbuf_t *dst, sbuf_t *src, mspPostProcessFnPtr
break; break;
#ifdef USE_ESCSERIAL #ifdef USE_ESCSERIAL
case PROTOCOL_SIMONK: case MSP_PASSTHROUGH_ESC_SIMONK:
case PROTOCOL_BLHELI: case MSP_PASSTHROUGH_ESC_BLHELI:
case PROTOCOL_KISS: case MSP_PASSTHROUGH_ESC_KISS:
case PROTOCOL_KISSALL: case MSP_PASSTHROUGH_ESC_KISSALL:
case PROTOCOL_CASTLE: case MSP_PASSTHROUGH_ESC_CASTLE:
if (escPortIndex < getMotorCount() || (escMode == PROTOCOL_KISS && escPortIndex == ALL_MOTORS)) { if (mspPassthroughArgument < getMotorCount() || (mspPassthroughMode == MSP_PASSTHROUGH_ESC_KISS && mspPassthroughArgument == ALL_MOTORS)) {
sbufWriteU8(dst, 1); sbufWriteU8(dst, 1);
if (mspPostProcessFn) { if (mspPostProcessFn) {
@ -262,12 +315,12 @@ static void mspFc4waySerialCommand(sbuf_t *dst, sbuf_t *src, mspPostProcessFnPtr
break; break;
} }
FALLTHROUGH; FALLTHROUGH;
#endif #endif // USE_ESCSERIAL
#endif //USE_SERIAL_4WAY_BLHELI_INTERFACE
default: default:
sbufWriteU8(dst, 0); sbufWriteU8(dst, 0);
} }
} }
#endif //USE_SERIAL_4WAY_BLHELI_INTERFACE
// TODO: Remove the pragma once this is called from unconditional code // TODO: Remove the pragma once this is called from unconditional code
#pragma GCC diagnostic ignored "-Wunused-function" #pragma GCC diagnostic ignored "-Wunused-function"
@ -3369,11 +3422,9 @@ mspResult_e mspFcProcessCommand(mspDescriptor_t srcDesc, mspPacket_t *cmd, mspPa
ret = MSP_RESULT_ACK; ret = MSP_RESULT_ACK;
} else if ((ret = mspFcProcessOutCommandWithArg(srcDesc, cmdMSP, src, dst, mspPostProcessFn)) != MSP_RESULT_CMD_UNKNOWN) { } else if ((ret = mspFcProcessOutCommandWithArg(srcDesc, cmdMSP, src, dst, mspPostProcessFn)) != MSP_RESULT_CMD_UNKNOWN) {
/* ret */; /* ret */;
#ifdef USE_SERIAL_4WAY_BLHELI_INTERFACE } else if (cmdMSP == MSP_SET_PASSTHROUGH) {
} else if (cmdMSP == MSP_SET_4WAY_IF) { mspFcSetPassthroughCommand(dst, src, mspPostProcessFn);
mspFc4waySerialCommand(dst, src, mspPostProcessFn);
ret = MSP_RESULT_ACK; ret = MSP_RESULT_ACK;
#endif
#ifdef USE_FLASHFS #ifdef USE_FLASHFS
} else if (cmdMSP == MSP_DATAFLASH_READ) { } else if (cmdMSP == MSP_DATAFLASH_READ) {
mspFcDataFlashReadCommand(dst, src); mspFcDataFlashReadCommand(dst, src);

View file

@ -336,7 +336,7 @@
#define MSP_SET_ACC_TRIM 239 //in message set acc angle trim values #define MSP_SET_ACC_TRIM 239 //in message set acc angle trim values
#define MSP_SERVO_MIX_RULES 241 //out message Returns servo mixer configuration #define MSP_SERVO_MIX_RULES 241 //out message Returns servo mixer configuration
#define MSP_SET_SERVO_MIX_RULE 242 //in message Sets servo mixer configuration #define MSP_SET_SERVO_MIX_RULE 242 //in message Sets servo mixer configuration
#define MSP_SET_4WAY_IF 245 //in message Sets 4way interface #define MSP_SET_PASSTHROUGH 245 //in message Sets up passthrough to different peripherals (4way interface, uart, etc...)
#define MSP_SET_RTC 246 //in message Sets the RTC clock #define MSP_SET_RTC 246 //in message Sets the RTC clock
#define MSP_RTC 247 //out message Gets the RTC clock #define MSP_RTC 247 //out message Gets the RTC clock
#define MSP_SET_BOARD_INFO 248 //in message Sets the board information for this board #define MSP_SET_BOARD_INFO 248 //in message Sets the board information for this board