/// -*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*-
/*
Please contribute your ideas! See http://dev.ardupilot.com for details
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
/*
SerialManager allows defining the protocol and baud rates for the available
serial ports and provides helper functions so objects (like a gimbal) can
find which serial port they should use
*/
#pragma once
#include
#include
#include
#include
#define SERIALMANAGER_NUM_PORTS 5
// console default baud rates and buffer sizes
#ifdef HAL_SERIAL0_BAUD_DEFAULT
# define AP_SERIALMANAGER_CONSOLE_BAUD HAL_SERIAL0_BAUD_DEFAULT
#else
# define AP_SERIALMANAGER_CONSOLE_BAUD 115200
#endif
# define AP_SERIALMANAGER_CONSOLE_BUFSIZE_RX 128
# define AP_SERIALMANAGER_CONSOLE_BUFSIZE_TX 512
// mavlink default baud rates and buffer sizes
#define AP_SERIALMANAGER_MAVLINK_BAUD 57600
#define AP_SERIALMANAGER_MAVLINK_BUFSIZE_RX 128
#define AP_SERIALMANAGER_MAVLINK_BUFSIZE_TX 256
// mavlink default baud rates, use default buffer sizes
#define AP_SERIALMANAGER_FRSKY_DPORT_BAUD 9600
#define AP_SERIALMANAGER_FRSKY_SPORT_BAUD 57600
#define AP_SERIALMANAGER_FRSKY_BUFSIZE_RX 0
#define AP_SERIALMANAGER_FRSKY_BUFSIZE_TX 0
// GPS default baud rates and buffer sizes
// we need a 256 byte buffer for some GPS types (eg. UBLOX)
#define AP_SERIALMANAGER_GPS_BAUD 38400
#define AP_SERIALMANAGER_GPS_BUFSIZE_RX 256
#define AP_SERIALMANAGER_GPS_BUFSIZE_TX 16
// AlexMos Gimbal protocol default baud rates and buffer sizes
#define AP_SERIALMANAGER_ALEXMOS_BAUD 115200
#define AP_SERIALMANAGER_ALEXMOS_BUFSIZE_RX 128
#define AP_SERIALMANAGER_ALEXMOS_BUFSIZE_TX 128
#define AP_SERIALMANAGER_SToRM32_BAUD 115200
#define AP_SERIALMANAGER_SToRM32_BUFSIZE_RX 128
#define AP_SERIALMANAGER_SToRM32_BUFSIZE_TX 128
class AP_SerialManager {
public:
enum SerialProtocol {
SerialProtocol_Console = 0,
SerialProtocol_MAVLink = 1,
SerialProtocol_MAVLink2 = 2, // do not use - use MAVLink and provide instance of 1
SerialProtocol_FRSky_DPort = 3,
SerialProtocol_FRSky_SPort = 4,
SerialProtocol_GPS = 5,
SerialProtocol_GPS2 = 6, // do not use - use GPS and provide instance of 1
SerialProtocol_AlexMos = 7,
SerialProtocol_SToRM32 = 8,
SerialProtocol_Lidar = 9,
};
// Constructor
AP_SerialManager();
// init_console - initialise console at default baud rate
void init_console();
// init - initialise serial ports
void init();
// find_serial - searches available serial ports that allows the given protocol
// instance should be zero if searching for the first instance, 1 for the second, etc
// returns uart on success, NULL if a serial port cannot be found
AP_HAL::UARTDriver *find_serial(enum SerialProtocol protocol, uint8_t instance) const;
// 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 the baudrate of that protocol on success, 0 if a serial port cannot be found
uint32_t find_baudrate(enum SerialProtocol protocol, uint8_t instance) const;
// get_mavlink_channel - provides the mavlink channel associated with a given protocol (and instance)
// instance should be zero if searching for the first instance, 1 for the second, etc
// returns true if a channel is found, false if not
bool get_mavlink_channel(enum SerialProtocol protocol, uint8_t instance, mavlink_channel_t &mav_chan) const;
// set_blocking_writes_all - sets block_writes on or off for all serial channels
void set_blocking_writes_all(bool blocking);
// set_console_baud - sets the console's baud rate to the rate specified by the protocol
void set_console_baud(enum SerialProtocol protocol, uint8_t instance) const;
// parameter var table
static const struct AP_Param::GroupInfo var_info[];
private:
// array of uart info
struct {
AP_Int8 protocol;
AP_Int32 baud;
AP_HAL::UARTDriver* uart;
} state[SERIALMANAGER_NUM_PORTS];
uint32_t map_baudrate(int32_t rate) const;
// protocol_match - returns true if the protocols match
bool protocol_match(enum SerialProtocol protocol1, enum SerialProtocol protocol2) const;
};