mirror of
https://github.com/betaflight/betaflight.git
synced 2025-07-25 17:25:20 +03:00
Allow smartport to be configured. Fix shared port flag calculation.
This commit is contained in:
parent
0f8d231aad
commit
668c9c0457
4 changed files with 31 additions and 26 deletions
|
@ -61,7 +61,8 @@ const serialPortFunctionScenario_e serialPortScenarios[SERIAL_PORT_SCENARIO_COUN
|
||||||
SCENARIO_MSP_CLI_GPS_PASTHROUGH,
|
SCENARIO_MSP_CLI_GPS_PASTHROUGH,
|
||||||
SCENARIO_CLI_ONLY,
|
SCENARIO_CLI_ONLY,
|
||||||
SCENARIO_GPS_PASSTHROUGH_ONLY,
|
SCENARIO_GPS_PASSTHROUGH_ONLY,
|
||||||
SCENARIO_MSP_ONLY
|
SCENARIO_MSP_ONLY,
|
||||||
|
SCENARIO_SMARTPORT_TELEMETRY_ONLY
|
||||||
};
|
};
|
||||||
|
|
||||||
static serialConfig_t *serialConfig;
|
static serialConfig_t *serialConfig;
|
||||||
|
|
|
@ -55,7 +55,7 @@ typedef enum {
|
||||||
SCENARIO_SMARTPORT_TELEMETRY_ONLY = FUNCTION_SMARTPORT_TELEMETRY
|
SCENARIO_SMARTPORT_TELEMETRY_ONLY = FUNCTION_SMARTPORT_TELEMETRY
|
||||||
} serialPortFunctionScenario_e;
|
} serialPortFunctionScenario_e;
|
||||||
|
|
||||||
#define SERIAL_PORT_SCENARIO_COUNT 9
|
#define SERIAL_PORT_SCENARIO_COUNT 10
|
||||||
#define SERIAL_PORT_SCENARIO_MAX (SERIAL_PORT_SCENARIO_COUNT - 1)
|
#define SERIAL_PORT_SCENARIO_MAX (SERIAL_PORT_SCENARIO_COUNT - 1)
|
||||||
extern const serialPortFunctionScenario_e serialPortScenarios[SERIAL_PORT_SCENARIO_COUNT];
|
extern const serialPortFunctionScenario_e serialPortScenarios[SERIAL_PORT_SCENARIO_COUNT];
|
||||||
|
|
||||||
|
|
|
@ -131,7 +131,7 @@ const uint16_t frSkyDataIdTable[] = {
|
||||||
#define SMARTPORT_SERVICE_DELAY_MS 5 // telemetry requests comes in at roughly 12 ms intervals, keep this under that
|
#define SMARTPORT_SERVICE_DELAY_MS 5 // telemetry requests comes in at roughly 12 ms intervals, keep this under that
|
||||||
#define SMARTPORT_NOT_CONNECTED_TIMEOUT_MS 7000
|
#define SMARTPORT_NOT_CONNECTED_TIMEOUT_MS 7000
|
||||||
|
|
||||||
static serialPort_t *mySerPort;
|
static serialPort_t *smartPortSerialPort; // The 'SmartPort'(tm) Port.
|
||||||
static telemetryConfig_t *telemetryConfig;
|
static telemetryConfig_t *telemetryConfig;
|
||||||
static portMode_t previousPortMode;
|
static portMode_t previousPortMode;
|
||||||
static uint32_t previousBaudRate;
|
static uint32_t previousBaudRate;
|
||||||
|
@ -168,11 +168,11 @@ static void smartPortSendByte(uint8_t c, uint16_t *crcp)
|
||||||
{
|
{
|
||||||
// smart port escape sequence
|
// smart port escape sequence
|
||||||
if (c == 0x7D || c == 0x7E) {
|
if (c == 0x7D || c == 0x7E) {
|
||||||
serialWrite(mySerPort, 0x7D);
|
serialWrite(smartPortSerialPort, 0x7D);
|
||||||
c ^= 0x20;
|
c ^= 0x20;
|
||||||
}
|
}
|
||||||
|
|
||||||
serialWrite(mySerPort, c);
|
serialWrite(smartPortSerialPort, c);
|
||||||
|
|
||||||
if (crcp == NULL)
|
if (crcp == NULL)
|
||||||
return;
|
return;
|
||||||
|
@ -216,17 +216,17 @@ void freeSmartPortTelemetryPort(void)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (isTelemetryPortShared()) {
|
if (isTelemetryPortShared()) {
|
||||||
endSerialPortFunction(mySerPort, FUNCTION_SMARTPORT_TELEMETRY);
|
endSerialPortFunction(smartPortSerialPort, FUNCTION_SMARTPORT_TELEMETRY);
|
||||||
smartPortState = SPSTATE_DEINITIALIZED;
|
smartPortState = SPSTATE_DEINITIALIZED;
|
||||||
serialInit(&masterConfig.serialConfig);
|
serialInit(&masterConfig.serialConfig);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
serialSetMode(mySerPort, previousPortMode);
|
serialSetMode(smartPortSerialPort, previousPortMode);
|
||||||
serialSetBaudRate(mySerPort, previousBaudRate);
|
serialSetBaudRate(smartPortSerialPort, previousBaudRate);
|
||||||
endSerialPortFunction(mySerPort, FUNCTION_SMARTPORT_TELEMETRY);
|
endSerialPortFunction(smartPortSerialPort, FUNCTION_SMARTPORT_TELEMETRY);
|
||||||
smartPortState = SPSTATE_DEINITIALIZED;
|
smartPortState = SPSTATE_DEINITIALIZED;
|
||||||
}
|
}
|
||||||
mySerPort = NULL;
|
smartPortSerialPort = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void configureSmartPortTelemetryPort(void)
|
void configureSmartPortTelemetryPort(void)
|
||||||
|
@ -236,23 +236,23 @@ void configureSmartPortTelemetryPort(void)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mySerPort = findOpenSerialPort(FUNCTION_SMARTPORT_TELEMETRY);
|
smartPortSerialPort = findOpenSerialPort(FUNCTION_SMARTPORT_TELEMETRY);
|
||||||
if (mySerPort) {
|
if (smartPortSerialPort) {
|
||||||
previousPortMode = mySerPort->mode;
|
previousPortMode = smartPortSerialPort->mode;
|
||||||
previousBaudRate = mySerPort->baudRate;
|
previousBaudRate = smartPortSerialPort->baudRate;
|
||||||
|
|
||||||
//waitForSerialPortToFinishTransmitting(mySerPort); // FIXME locks up the system
|
//waitForSerialPortToFinishTransmitting(smartPortPort); // FIXME locks up the system
|
||||||
|
|
||||||
serialSetBaudRate(mySerPort, SMARTPORT_BAUD);
|
serialSetBaudRate(smartPortSerialPort, SMARTPORT_BAUD);
|
||||||
serialSetMode(mySerPort, SMARTPORT_UART_MODE);
|
serialSetMode(smartPortSerialPort, SMARTPORT_UART_MODE);
|
||||||
beginSerialPortFunction(mySerPort, FUNCTION_SMARTPORT_TELEMETRY);
|
beginSerialPortFunction(smartPortSerialPort, FUNCTION_SMARTPORT_TELEMETRY);
|
||||||
} else {
|
} else {
|
||||||
mySerPort = openSerialPort(FUNCTION_SMARTPORT_TELEMETRY, NULL, SMARTPORT_BAUD, SMARTPORT_UART_MODE, telemetryConfig->telemetry_inversion);
|
smartPortSerialPort = openSerialPort(FUNCTION_SMARTPORT_TELEMETRY, NULL, SMARTPORT_BAUD, SMARTPORT_UART_MODE, telemetryConfig->telemetry_inversion);
|
||||||
|
|
||||||
if (mySerPort) {
|
if (smartPortSerialPort) {
|
||||||
smartPortState = SPSTATE_INITIALIZED;
|
smartPortState = SPSTATE_INITIALIZED;
|
||||||
previousPortMode = mySerPort->mode;
|
previousPortMode = smartPortSerialPort->mode;
|
||||||
previousBaudRate = mySerPort->baudRate;
|
previousBaudRate = smartPortSerialPort->baudRate;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// failed, resume MSP and CLI
|
// failed, resume MSP and CLI
|
||||||
|
@ -289,8 +289,8 @@ void handleSmartPortTelemetry(void)
|
||||||
if (!canSendSmartPortTelemetry())
|
if (!canSendSmartPortTelemetry())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
while (serialTotalBytesWaiting(mySerPort) > 0) {
|
while (serialTotalBytesWaiting(smartPortSerialPort) > 0) {
|
||||||
uint8_t c = serialRead(mySerPort);
|
uint8_t c = serialRead(smartPortSerialPort);
|
||||||
smartPortDataReceive(c);
|
smartPortDataReceive(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -302,7 +302,7 @@ void handleSmartPortTelemetry(void)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// limit the rate at which we send responses, we don't want to affect flight characteristics (but USART1 is using DMA so I doubt it matters)
|
// limit the rate at which we send responses, we don't want to affect flight characteristics
|
||||||
if ((now - smartPortLastServiceTime) < SMARTPORT_SERVICE_DELAY_MS)
|
if ((now - smartPortLastServiceTime) < SMARTPORT_SERVICE_DELAY_MS)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
@ -97,7 +97,11 @@ bool canUseTelemetryWithCurrentConfiguration(void)
|
||||||
|
|
||||||
void initTelemetry()
|
void initTelemetry()
|
||||||
{
|
{
|
||||||
telemetryPortIsShared = isSerialPortFunctionShared(FUNCTION_TELEMETRY, FUNCTION_MSP) | isSerialPortFunctionShared(FUNCTION_SMARTPORT_TELEMETRY, FUNCTION_MSP);
|
if (isTelemetryProviderSmartPort()) {
|
||||||
|
telemetryPortIsShared = isSerialPortFunctionShared(FUNCTION_SMARTPORT_TELEMETRY, FUNCTION_MSP);
|
||||||
|
} else {
|
||||||
|
telemetryPortIsShared = isSerialPortFunctionShared(FUNCTION_TELEMETRY, FUNCTION_MSP);
|
||||||
|
}
|
||||||
isTelemetryConfigurationValid = canUseTelemetryWithCurrentConfiguration();
|
isTelemetryConfigurationValid = canUseTelemetryWithCurrentConfiguration();
|
||||||
|
|
||||||
if (isTelemetryProviderFrSky()) {
|
if (isTelemetryProviderFrSky()) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue