Added ESC passtrough to MSP (poc).

Fixed typo.

Cleanup.

Fixed indentation.
This commit is contained in:
Michael Keller 2016-11-30 15:18:20 +13:00 committed by mikeller
parent 9165098af6
commit 455e54e1c5
3 changed files with 87 additions and 42 deletions

View File

@ -27,14 +27,6 @@ typedef enum {
BAUDRATE_CASTLE = 18880 BAUDRATE_CASTLE = 18880
} escBaudRate_e; } escBaudRate_e;
typedef enum {
PROTOCOL_SIMONK = 0,
PROTOCOL_BLHELI = 1,
PROTOCOL_KISS = 2,
PROTOCOL_KISSALL = 3,
PROTOCOL_CASTLE = 4
} escProtocol_e;
#if defined(USE_ESCSERIAL) #if defined(USE_ESCSERIAL)
#include "build/build_config.h" #include "build/build_config.h"

View File

@ -24,6 +24,15 @@ typedef enum {
ESCSERIAL2 ESCSERIAL2
} escSerialPortIndex_e; } escSerialPortIndex_e;
typedef enum {
PROTOCOL_SIMONK = 0,
PROTOCOL_BLHELI = 1,
PROTOCOL_KISS = 2,
PROTOCOL_KISSALL = 3,
PROTOCOL_CASTLE = 4,
PROTOCOL_COUNT
} escProtocol_e;
serialPort_t *openEscSerial(escSerialPortIndex_e portIndex, serialReceiveCallbackPtr callback, uint16_t output, uint32_t baud, portOptions_t options, uint8_t mode); serialPort_t *openEscSerial(escSerialPortIndex_e portIndex, serialReceiveCallbackPtr callback, uint16_t output, uint32_t baud, portOptions_t options, uint8_t mode);
// serialPort API // serialPort API

View File

@ -46,6 +46,7 @@
#include "drivers/max7456.h" #include "drivers/max7456.h"
#include "drivers/vtx_soft_spi_rtc6705.h" #include "drivers/vtx_soft_spi_rtc6705.h"
#include "drivers/pwm_output.h" #include "drivers/pwm_output.h"
#include "drivers/serial_escserial.h"
#include "fc/config.h" #include "fc/config.h"
#include "fc/mw.h" #include "fc/mw.h"
@ -182,14 +183,61 @@ typedef enum {
#define RATEPROFILE_MASK (1 << 7) #define RATEPROFILE_MASK (1 << 7)
#ifdef USE_SERIAL_4WAY_BLHELI_INTERFACE #ifdef USE_SERIAL_4WAY_BLHELI_INTERFACE
static void msp4WayIfFn(serialPort_t *serialPort) #define ESC_4WAY 0xff
uint8_t escMode;
uint8_t escPortIndex = 0;
#ifdef USE_ESCSERIAL
static void mspEscPassthroughFn(serialPort_t *serialPort)
{ {
// rem: App: Wait at least appx. 500 ms for BLHeli to jump into escEnablePassthrough(serialPort, escPortIndex, escMode);
// bootloader mode before try to connect any ESC }
// Start to activate here #endif
esc4wayProcess(serialPort);
// former used MSP uart is still active static void mspFc4waySerialCommand(sbuf_t *dst, sbuf_t *src, mspPostProcessFnPtr *mspPostProcessFn)
// proceed as usual with MSP commands {
const unsigned int dataSize = sbufBytesRemaining(src);
if (dataSize == 0) {
// Legacy format
escMode = ESC_4WAY;
} else {
escMode = sbufReadU8(src);
escPortIndex = sbufReadU8(src);
}
switch(escMode) {
case ESC_4WAY:
// get channel number
// switch all motor lines HI
// reply with the count of ESC found
sbufWriteU8(dst, esc4wayInit());
if (mspPostProcessFn) {
*mspPostProcessFn = esc4wayProcess;
}
break;
#ifdef USE_ESCSERIAL
case PROTOCOL_SIMONK:
case PROTOCOL_BLHELI:
case PROTOCOL_KISS:
case PROTOCOL_KISSALL:
case PROTOCOL_CASTLE:
if (escPortIndex < USABLE_TIMER_CHANNEL_COUNT || (escMode == PROTOCOL_KISS && escPortIndex == 255)) {
sbufWriteU8(dst, 1);
if (mspPostProcessFn) {
*mspPostProcessFn = mspEscPassthroughFn;
}
break;
}
#endif
default:
sbufWriteU8(dst, 0);
}
} }
#endif #endif
@ -431,21 +479,24 @@ static void serializeSDCardSummaryReply(sbuf_t *dst)
state = MSP_SDCARD_STATE_FATAL; state = MSP_SDCARD_STATE_FATAL;
} else { } else {
switch (afatfs_getFilesystemState()) { switch (afatfs_getFilesystemState()) {
case AFATFS_FILESYSTEM_STATE_READY: case AFATFS_FILESYSTEM_STATE_READY:
state = MSP_SDCARD_STATE_READY; state = MSP_SDCARD_STATE_READY;
break;
case AFATFS_FILESYSTEM_STATE_INITIALIZATION: break;
if (sdcard_isInitialized()) { case AFATFS_FILESYSTEM_STATE_INITIALIZATION:
state = MSP_SDCARD_STATE_FS_INIT; if (sdcard_isInitialized()) {
} else { state = MSP_SDCARD_STATE_FS_INIT;
state = MSP_SDCARD_STATE_CARD_INIT; } else {
} state = MSP_SDCARD_STATE_CARD_INIT;
break; }
case AFATFS_FILESYSTEM_STATE_FATAL:
case AFATFS_FILESYSTEM_STATE_UNKNOWN: break;
default: case AFATFS_FILESYSTEM_STATE_FATAL:
state = MSP_SDCARD_STATE_FATAL; case AFATFS_FILESYSTEM_STATE_UNKNOWN:
break; default:
state = MSP_SDCARD_STATE_FATAL;
break;
} }
} }
@ -1139,18 +1190,6 @@ static bool mspFcProcessOutCommand(uint8_t cmdMSP, sbuf_t *dst, mspPostProcessFn
} }
break; break;
#ifdef USE_SERIAL_4WAY_BLHELI_INTERFACE
case MSP_SET_4WAY_IF:
// get channel number
// switch all motor lines HI
// reply with the count of ESC found
sbufWriteU8(dst, esc4wayInit());
if (mspPostProcessFn) {
*mspPostProcessFn = msp4WayIfFn;
}
break;
#endif
default: default:
return false; return false;
} }
@ -1842,6 +1881,11 @@ mspResult_e mspFcProcessCommand(mspPacket_t *cmd, mspPacket_t *reply, mspPostPro
if (mspFcProcessOutCommand(cmdMSP, dst, mspPostProcessFn)) { if (mspFcProcessOutCommand(cmdMSP, dst, mspPostProcessFn)) {
ret = MSP_RESULT_ACK; ret = MSP_RESULT_ACK;
#ifdef USE_SERIAL_4WAY_BLHELI_INTERFACE
} else if (cmdMSP == MSP_SET_4WAY_IF) {
mspFc4waySerialCommand(dst, src, mspPostProcessFn);
ret = MSP_RESULT_ACK;
#endif
#ifdef GPS #ifdef GPS
} else if (cmdMSP == MSP_WP) { } else if (cmdMSP == MSP_WP) {
mspFcWpCommand(dst, src); mspFcWpCommand(dst, src);