1
0
Fork 0
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:
Dominic Clifton 2014-11-12 01:30:05 +00:00
parent 0f8d231aad
commit 668c9c0457
4 changed files with 31 additions and 26 deletions

View file

@ -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;

View file

@ -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];

View file

@ -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;

View file

@ -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()) {