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

Fix arm/disarm/arm bug when using shared msp/telemetry ports.

All msp ports are now re-initialised when disarming.

Bug wa introduced by c06fd78b83 - see
#144.

Runtime serial port scenario should not have been erased.

Fixes #144 and #155. Cleanup #125.
This commit is contained in:
Dominic Clifton 2014-11-05 19:39:13 +00:00
parent 2d7184b25b
commit db36cfe12e
6 changed files with 21 additions and 7 deletions

View file

@ -41,6 +41,7 @@ uartPort_t *serialUSART3(uint32_t baudRate, portMode_t mode);
static void uartReconfigure(uartPort_t *uartPort) static void uartReconfigure(uartPort_t *uartPort)
{ {
USART_InitTypeDef USART_InitStructure; USART_InitTypeDef USART_InitStructure;
USART_Cmd(uartPort->USARTx, DISABLE);
USART_InitStructure.USART_BaudRate = uartPort->port.baudRate; USART_InitStructure.USART_BaudRate = uartPort->port.baudRate;
USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_WordLength = USART_WordLength_8b;
@ -59,6 +60,7 @@ static void uartReconfigure(uartPort_t *uartPort)
USART_InitStructure.USART_Mode |= USART_Mode_Tx; USART_InitStructure.USART_Mode |= USART_Mode_Tx;
USART_Init(uartPort->USARTx, &USART_InitStructure); USART_Init(uartPort->USARTx, &USART_InitStructure);
USART_Cmd(uartPort->USARTx, ENABLE);
} }
serialPort_t *uartOpen(USART_TypeDef *USARTx, serialReceiveCallbackPtr callback, uint32_t baudRate, portMode_t mode, serialInversion_e inversion) serialPort_t *uartOpen(USART_TypeDef *USARTx, serialReceiveCallbackPtr callback, uint32_t baudRate, portMode_t mode, serialInversion_e inversion)
@ -170,7 +172,6 @@ void uartSetBaudRate(serialPort_t *instance, uint32_t baudRate)
uartPort_t *uartPort = (uartPort_t *)instance; uartPort_t *uartPort = (uartPort_t *)instance;
uartPort->port.baudRate = baudRate; uartPort->port.baudRate = baudRate;
uartReconfigure(uartPort); uartReconfigure(uartPort);
USART_Cmd(uartPort->USARTx, ENABLE);
} }
void uartSetMode(serialPort_t *instance, portMode_t mode) void uartSetMode(serialPort_t *instance, portMode_t mode)
@ -178,7 +179,6 @@ void uartSetMode(serialPort_t *instance, portMode_t mode)
uartPort_t *uartPort = (uartPort_t *)instance; uartPort_t *uartPort = (uartPort_t *)instance;
uartPort->port.mode = mode; uartPort->port.mode = mode;
uartReconfigure(uartPort); uartReconfigure(uartPort);
USART_Cmd(uartPort->USARTx, ENABLE);
} }
void uartStartTxDMA(uartPort_t *s) void uartStartTxDMA(uartPort_t *s)

View file

@ -32,10 +32,10 @@
#include "drivers/serial_uart.h" #include "drivers/serial_uart.h"
#include "drivers/serial_usb_vcp.h" #include "drivers/serial_usb_vcp.h"
#include "io/serial.h"
#include "serial_cli.h" #include "serial_cli.h"
#include "serial_msp.h" #include "serial_msp.h"
#include "io/serial.h"
#include "config/config.h" #include "config/config.h"
uint32_t getTelemetryProviderBaudRate(void); uint32_t getTelemetryProviderBaudRate(void);
@ -372,7 +372,6 @@ void endSerialPortFunction(serialPort_t *port, serialPortFunction_e function)
serialPortFunction_t *serialPortFunction = findSerialPortFunctionByPort(port); serialPortFunction_t *serialPortFunction = findSerialPortFunctionByPort(port);
serialPortFunction->currentFunction = FUNCTION_NONE; serialPortFunction->currentFunction = FUNCTION_NONE;
serialPortFunction->scenario = SCENARIO_UNUSED;
serialPortFunction->port = NULL; serialPortFunction->port = NULL;
} }

View file

@ -615,7 +615,11 @@ void mspInit(serialConfig_t *serialConfig)
activeBoxIds[activeBoxIdCount++] = BOXSONAR; activeBoxIds[activeBoxIdCount++] = BOXSONAR;
} }
mspReset(serialConfig);
}
void mspReset(serialConfig_t *serialConfig)
{
memset(mspPorts, 0x00, sizeof(mspPorts)); memset(mspPorts, 0x00, sizeof(mspPorts));
openAllMSPSerialPorts(serialConfig); openAllMSPSerialPorts(serialConfig);

View file

@ -23,3 +23,4 @@
void mspProcess(void); void mspProcess(void);
void sendMspTelemetry(void); void sendMspTelemetry(void);
void mspSetTelemetryPort(serialPort_t *mspTelemetryPort); void mspSetTelemetryPort(serialPort_t *mspTelemetryPort);
void mspReset(serialConfig_t *serialConfig);

View file

@ -59,8 +59,9 @@
#include "io/gimbal.h" #include "io/gimbal.h"
#include "io/gps.h" #include "io/gps.h"
#include "io/ledstrip.h" #include "io/ledstrip.h"
#include "io/serial_cli.h"
#include "io/serial.h" #include "io/serial.h"
#include "io/serial_cli.h"
#include "io/serial_msp.h"
#include "io/statusindicator.h" #include "io/statusindicator.h"
#include "rx/msp.h" #include "rx/msp.h"
#include "telemetry/telemetry.h" #include "telemetry/telemetry.h"
@ -294,8 +295,17 @@ void annexCode(void)
void mwDisarm(void) void mwDisarm(void)
{ {
if (ARMING_FLAG(ARMED)) if (ARMING_FLAG(ARMED)) {
DISABLE_ARMING_FLAG(ARMED); DISABLE_ARMING_FLAG(ARMED);
#ifdef TELEMETRY
// the telemetry state must be checked immediately so that shared serial ports are released.
checkTelemetryState();
if (isSerialPortFunctionShared(FUNCTION_TELEMETRY, FUNCTION_MSP)) {
mspReset(&masterConfig.serialConfig);
}
#endif
}
} }
void mwArm(void) void mwArm(void)

View file

@ -33,8 +33,8 @@
#include "drivers/serial.h" #include "drivers/serial.h"
#include "telemetry/telemetry.h" #include "telemetry/telemetry.h"
#include "io/serial_msp.h"
#include "io/serial.h" #include "io/serial.h"
#include "io/serial_msp.h"
static telemetryConfig_t *telemetryConfig; static telemetryConfig_t *telemetryConfig;