// init - // init - initialise serial ports void AP_SerialManager::init() { // initialise pointers to serial ports state[1].uart = hal.uartC; // serial1, uartC, normally telem1 state[2].uart = hal.uartD; // serial2, uartD, normally telem2 state[3].uart = hal.uartB; // serial3, uartB, normally 1st GPS state[4].uart = hal.uartE; // serial4, uartE, normally 2nd GPS // initialise serial ports for (uint8_t i=1; i<SERIALMANAGER_NUM_PORTS; i++) { if (state[i].uart != NULL) { switch (state[i].protocol) { case SerialProtocol_Console: state[i].uart->begin(map_baudrate(state[i].baud), AP_SERIALMANAGER_CONSOLE_BUFSIZE_RX, AP_SERIALMANAGER_CONSOLE_BUFSIZE_TX); break; case SerialProtocol_MAVLink: case SerialProtocol_MAVLink2: state[i].uart->begin(map_baudrate(state[i].baud), AP_SERIALMANAGER_MAVLINK_BUFSIZE_RX, AP_SERIALMANAGER_MAVLINK_BUFSIZE_TX); break; case SerialProtocol_FRSky_DPort: // Note baudrate is hardcoded to 57600 state[i].baud = AP_SERIALMANAGER_FRSKY_DPORT_BAUD/1000; // update baud param in case user looks at it state[i].uart->begin(AP_SERIALMANAGER_FRSKY_DPORT_BAUD, AP_SERIALMANAGER_FRSKY_BUFSIZE_RX, AP_SERIALMANAGER_FRSKY_BUFSIZE_TX); break; case SerialProtocol_FRSky_SPort: // Note baudrate is hardcoded to 9600 state[i].baud = AP_SERIALMANAGER_FRSKY_SPORT_BAUD/1000; // update baud param in case user looks at it // begin is handled by AP_Frsky_telem library break; case SerialProtocol_GPS: case SerialProtocol_GPS2: state[i].uart->begin(map_baudrate(state[i].baud), AP_SERIALMANAGER_GPS_BUFSIZE_RX, AP_SERIALMANAGER_GPS_BUFSIZE_TX); break; case SerialProtocol_AlexMos: // Note baudrate is hardcoded to 115200 state[i].baud = AP_SERIALMANAGER_ALEXMOS_BAUD / 1000; // update baud param in case user looks at it state[i].uart->begin(AP_SERIALMANAGER_ALEXMOS_BAUD, AP_SERIALMANAGER_ALEXMOS_BUFSIZE_RX, AP_SERIALMANAGER_ALEXMOS_BUFSIZE_TX); break; case SerialProtocol_SToRM32: // Note baudrate is hardcoded to 115200 state[i].baud = AP_SERIALMANAGER_SToRM32_BAUD / 1000; // update baud param in case user looks at it state[i].uart->begin(map_baudrate(state[i].baud), AP_SERIALMANAGER_SToRM32_BUFSIZE_RX, AP_SERIALMANAGER_SToRM32_BUFSIZE_TX); break; } } } }
// set_console_baud - sets the console's baud rate to the rate specified by the protocol // used on APM2 to switch the console between the console baud rate (115200) and the SERIAL1 baud rate (user configurable) void AP_SerialManager::set_console_baud(enum SerialProtocol protocol) const { // find baud rate of this protocol for (uint8_t i=0; i<SERIALMANAGER_NUM_PORTS; i++) { if (state[i].protocol == protocol) { // set console's baud rate state[0].uart->begin(map_baudrate(state[i].baud)); return; } } }
// find_baudrate - searches available serial ports for the first instance that allows the given protocol // returns baudrate on success, 0 if a serial port cannot be found uint32_t AP_SerialManager::find_baudrate(enum SerialProtocol protocol) const { // search for matching protocol for(uint8_t i=0; i<SERIALMANAGER_NUM_PORTS; i++) { if (state[i].protocol == protocol) { return map_baudrate(state[i].baud); } } // if we got this far we did not find the uart return 0; }
// set_console_baud - sets the console's baud rate to the rate specified by the protocol void AP_SerialManager::set_console_baud(enum SerialProtocol protocol, uint8_t instance) const { uint8_t found_instance = 0; // find baud rate of this protocol for (uint8_t i=0; i<SERIALMANAGER_NUM_PORTS; i++) { if (protocol_match(protocol, (enum SerialProtocol)state[i].protocol.get())) { if (instance == found_instance) { // set console's baud rate state[0].uart->begin(map_baudrate(state[i].baud)); return; } found_instance++; } } }
// find_baudrate - searches available serial ports for the first instance that allows the given protocol // instance should be zero if searching for the first instance, 1 for the second, etc // returns baudrate on success, 0 if a serial port cannot be found uint32_t AP_SerialManager::find_baudrate(enum SerialProtocol protocol, uint8_t instance) const { uint8_t found_instance = 0; // search for matching protocol for(uint8_t i=0; i<SERIALMANAGER_NUM_PORTS; i++) { if (protocol_match(protocol, (enum SerialProtocol)state[i].protocol.get())) { if (found_instance == instance) { return map_baudrate(state[i].baud); } found_instance++; } } // if we got this far we did not find the uart return 0; }
// init - // init - initialise serial ports void AP_SerialManager::init() { // initialise pointers to serial ports state[1].uart = hal.uartC; // serial1, uartC, normally telem1 state[2].uart = hal.uartD; // serial2, uartD, normally telem2 state[3].uart = hal.uartB; // serial3, uartB, normally 1st GPS state[4].uart = hal.uartE; // serial4, uartE, normally 2nd GPS state[5].uart = hal.uartF; // serial5 if (state[0].uart == nullptr) { init_console(); } // initialise serial ports for (uint8_t i=1; i<SERIALMANAGER_NUM_PORTS; i++) { #ifdef CONFIG_ARCH_BOARD_PX4FMU_V2 if (i == 5 && state[i].protocol != SerialProtocol_None) { // tell nsh to exit to free up this uart g_nsh_should_exit = true; } #endif if (state[i].uart != nullptr) { switch (state[i].protocol) { case SerialProtocol_None: break; case SerialProtocol_Console: case SerialProtocol_MAVLink: case SerialProtocol_MAVLink2: state[i].uart->begin(map_baudrate(state[i].baud), AP_SERIALMANAGER_MAVLINK_BUFSIZE_RX, AP_SERIALMANAGER_MAVLINK_BUFSIZE_TX); break; case SerialProtocol_FrSky_D: // Note baudrate is hardcoded to 9600 state[i].baud = AP_SERIALMANAGER_FRSKY_D_BAUD/1000; // update baud param in case user looks at it // begin is handled by AP_Frsky_telem library break; case SerialProtocol_FrSky_SPort: case SerialProtocol_FrSky_SPort_Passthrough: // Note baudrate is hardcoded to 57600 state[i].baud = AP_SERIALMANAGER_FRSKY_SPORT_BAUD/1000; // update baud param in case user looks at it // begin is handled by AP_Frsky_telem library break; case SerialProtocol_GPS: case SerialProtocol_GPS2: state[i].uart->begin(map_baudrate(state[i].baud), AP_SERIALMANAGER_GPS_BUFSIZE_RX, AP_SERIALMANAGER_GPS_BUFSIZE_TX); break; case SerialProtocol_AlexMos: // Note baudrate is hardcoded to 115200 state[i].baud = AP_SERIALMANAGER_ALEXMOS_BAUD / 1000; // update baud param in case user looks at it state[i].uart->begin(AP_SERIALMANAGER_ALEXMOS_BAUD, AP_SERIALMANAGER_ALEXMOS_BUFSIZE_RX, AP_SERIALMANAGER_ALEXMOS_BUFSIZE_TX); break; case SerialProtocol_SToRM32: // Note baudrate is hardcoded to 115200 state[i].baud = AP_SERIALMANAGER_SToRM32_BAUD / 1000; // update baud param in case user looks at it state[i].uart->begin(map_baudrate(state[i].baud), AP_SERIALMANAGER_SToRM32_BUFSIZE_RX, AP_SERIALMANAGER_SToRM32_BUFSIZE_TX); break; case SerialProtocol_Aerotenna_uLanding: // Note baudrate is hardcoded to 115200 state[i].baud = AP_SERIALMANAGER_ULANDING_BAUD / 1000; // update baud param in case user looks at it state[i].uart->begin(map_baudrate(state[i].baud), AP_SERIALMANAGER_ULANDING_BUFSIZE_RX, AP_SERIALMANAGER_ULANDING_BUFSIZE_TX); break; case SerialProtocol_Volz: // Note baudrate is hardcoded to 115200 state[i].baud = AP_SERIALMANAGER_VOLZ_BAUD; // update baud param in case user looks at it state[i].uart->begin(map_baudrate(state[i].baud), AP_SERIALMANAGER_VOLZ_BUFSIZE_RX, AP_SERIALMANAGER_VOLZ_BUFSIZE_TX); state[i].uart->set_unbuffered_writes(true); state[i].uart->set_flow_control(AP_HAL::UARTDriver::FLOW_CONTROL_DISABLE); break; case SerialProtocol_Sbus1: state[i].baud = AP_SERIALMANAGER_SBUS1_BAUD / 1000; // update baud param in case user looks at it state[i].uart->begin(map_baudrate(state[i].baud), AP_SERIALMANAGER_SBUS1_BUFSIZE_RX, AP_SERIALMANAGER_SBUS1_BUFSIZE_TX); state[i].uart->configure_parity(2); // enable even parity state[i].uart->set_stop_bits(2); state[i].uart->set_unbuffered_writes(true); state[i].uart->set_flow_control(AP_HAL::UARTDriver::FLOW_CONTROL_DISABLE); break; } } } }