mirror of
https://github.com/betaflight/betaflight.git
synced 2025-07-24 00:35:39 +03:00
First cut of configurable serial port functionality.
Currently port usage is hard-coded to the default port layout, cli commands are coming in a future commit. This decouples all code from the global 'serialPorts' structure which has been removed. Any code that needs to use a serial port can use findOpenSerialPort() and openSerialPort() and maintain it's own reference to the port. Ports can switch between functions. e.g. by default cli/msp/telemetry/gps passthrough all use USART1. Each port maintains it's current function. see begin/endSerialPortFunction. There are only certain combinations of serial port functions that are supported, these are listed in serialPortFunctionScenario_e. This commit also adds a few 'static' keywords to variables that should have been. There a a few other minor fixes and tweaks to various bits of code that this uncovered too.
This commit is contained in:
parent
533a1f9e48
commit
1777d8feda
33 changed files with 787 additions and 394 deletions
|
@ -1,24 +1,85 @@
|
|||
#pragma once
|
||||
|
||||
typedef struct serialPorts_s {
|
||||
serialPort_t *mainport;
|
||||
serialPort_t *gpsport;
|
||||
serialPort_t *telemport;
|
||||
serialPort_t *rcvrport;
|
||||
} serialPorts_t;
|
||||
typedef enum {
|
||||
FUNCTION_NONE = 0,
|
||||
FUNCTION_MSP = (1 << 0),
|
||||
FUNCTION_CLI = (1 << 1),
|
||||
FUNCTION_TELEMETRY = (1 << 2),
|
||||
FUNCTION_SERIAL_RX = (1 << 3),
|
||||
FUNCTION_GPS = (1 << 4),
|
||||
FUNCTION_GPS_PASSTHROUGH = (1 << 5)
|
||||
} serialPortFunction_e;
|
||||
|
||||
typedef enum {
|
||||
SCENARIO_MAIN_PORT = FUNCTION_MSP | FUNCTION_CLI | FUNCTION_TELEMETRY | FUNCTION_GPS_PASSTHROUGH,
|
||||
SCENARIO_CLI_ONLY = FUNCTION_CLI,
|
||||
SCENARIO_GPS_AND_TELEMETRY = FUNCTION_GPS | FUNCTION_TELEMETRY,
|
||||
SCENARIO_GPS_PASSTHROUGH_ONLY = FUNCTION_GPS_PASSTHROUGH,
|
||||
SCENARIO_GPS_ONLY = FUNCTION_GPS,
|
||||
SCENARIO_MSP_ONLY = FUNCTION_MSP,
|
||||
SCENARIO_SERIAL_RX_ONLY = FUNCTION_SERIAL_RX,
|
||||
SCENARIO_TELEMETRY_ONLY = FUNCTION_TELEMETRY,
|
||||
SCENARIO_MSP_CLI_GPS_PASTHROUGH = FUNCTION_CLI | FUNCTION_MSP | FUNCTION_GPS_PASSTHROUGH,
|
||||
SCENARIO_UNUSED = FUNCTION_NONE
|
||||
} serialPortFunctionScenario_e;
|
||||
|
||||
#define SERIAL_PORT_COUNT 4
|
||||
|
||||
typedef enum {
|
||||
SERIAL_PORT_1 = 0,
|
||||
SERIAL_PORT_2,
|
||||
SERIAL_PORT_3,
|
||||
SERIAL_PORT_4
|
||||
} serialPortIndex_e;
|
||||
|
||||
typedef enum {
|
||||
SERIAL_PORT_USART1 = 0,
|
||||
SERIAL_PORT_USART2,
|
||||
SERIAL_PORT_SOFTSERIAL1,
|
||||
SERIAL_PORT_SOFTSERIAL2
|
||||
} serialPortIdentifier_e;
|
||||
|
||||
// bitmask
|
||||
typedef enum {
|
||||
SPF_NONE = 0,
|
||||
SPF_SUPPORTS_CALLBACK = (1 << 0),
|
||||
SPF_SUPPORTS_SBUS_MODE = (1 << 1),
|
||||
SPF_IS_SOFTWARE_INVERTABLE = (1 << 2)
|
||||
} serialPortFeature_t;
|
||||
|
||||
typedef struct serialPortConstraint_s {
|
||||
const serialPortIdentifier_e identifier;
|
||||
uint32_t minBaudRate;
|
||||
uint32_t maxBaudRate;
|
||||
serialPortFeature_t feature;
|
||||
} serialPortConstraint_t;
|
||||
|
||||
typedef struct serialPortFunction_s {
|
||||
serialPortIdentifier_e identifier;
|
||||
serialPort_t *port; // a NULL values indicates the port has not been opened yet.
|
||||
serialPortFunctionScenario_e scenario;
|
||||
serialPortFunction_e currentFunction;
|
||||
} serialPortFunction_t;
|
||||
|
||||
typedef struct serialConfig_s {
|
||||
uint32_t port1_baudrate;
|
||||
uint32_t msp_baudrate;
|
||||
uint32_t cli_baudrate;
|
||||
uint32_t gps_passthrough_baudrate;
|
||||
|
||||
uint32_t hott_baudrate;
|
||||
|
||||
uint32_t softserial_baudrate; // shared by both soft serial ports
|
||||
uint8_t softserial_1_inverted; // use inverted softserial input and output signals on port 1
|
||||
uint8_t softserial_2_inverted; // use inverted softserial input and output signals on port 2
|
||||
uint8_t reboot_character; // which byte is used to reboot. Default 'R', could be changed carefully to something else.
|
||||
} serialConfig_t;
|
||||
|
||||
extern serialPorts_t serialPorts;
|
||||
serialPort_t *findOpenSerialPort(uint16_t functionMask);
|
||||
serialPort_t *openSerialPort(serialPortFunction_e functionMask, serialReceiveCallbackPtr callback, uint32_t baudRate, portMode_t mode, serialInversion_e inversion);
|
||||
|
||||
bool canOpenSerialPort(uint16_t functionMask);
|
||||
void beginSerialPortFunction(serialPort_t *port, serialPortFunction_e function);
|
||||
void endSerialPortFunction(serialPort_t *port, serialPortFunction_e function);
|
||||
serialPortFunction_t *findSerialPortFunction(uint16_t functionMask);
|
||||
|
||||
void waitForSerialPortToFinishTransmitting(serialPort_t *serialPort);
|
||||
|
||||
void resetMainSerialPort(void);
|
||||
void openMainSerialPort(uint32_t baudrate);
|
||||
void evaluateOtherData(uint8_t sr);
|
||||
void handleSerial(void);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue