1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2024-12-01 09:24:10 +01:00

LP-343 Change return type from PIOS_COM_Available() to give extended status about RX and TX availability on given COM device.

This commit is contained in:
Vladimir Zidar 2016-06-22 01:37:42 +02:00
parent 298fc947b4
commit 27cc48b362
10 changed files with 87 additions and 41 deletions

View File

@ -338,7 +338,7 @@ static int32_t PIOS_COM_SendBufferNonBlockingInternal(struct pios_com_dev *com_d
{
PIOS_Assert(com_dev);
PIOS_Assert(com_dev->has_tx);
if (com_dev->driver->available && !com_dev->driver->available(com_dev->lower_id)) {
if (com_dev->driver->available && !(com_dev->driver->available(com_dev->lower_id) & COM_AVAILABLE_TX)) {
/*
* Underlying device is down/unconnected.
* Dump our fifo contents and act like an infinite data sink.
@ -625,18 +625,26 @@ check_again:
* used to check a link is established even if the device
* is valid.
*/
bool PIOS_COM_Available(uint32_t com_id)
uint32_t PIOS_COM_Available(uint32_t com_id)
{
struct pios_com_dev *com_dev = (struct pios_com_dev *)com_id;
if (!PIOS_COM_validate(com_dev)) {
return false;
return COM_AVAILABLE_NONE;
}
// If a driver does not provide a query method assume always
// available if valid
if (com_dev->driver->available == NULL) {
return true;
if (com_dev->has_rx && com_dev->has_tx) {
return COM_AVAILABLE_RXTX;
} else if (com_dev->has_rx) {
return COM_AVAILABLE_RX;
} else if (com_dev->has_tx) {
return COM_AVAILABLE_TX;
}
return COM_AVAILABLE_NONE; /* can this really happen? */
}
return (com_dev->driver->available)(com_dev->lower_id);

View File

@ -40,7 +40,7 @@ static void PIOS_RFM22B_COM_RegisterRxCallback(uint32_t rfm22b_id, pios_com_call
static void PIOS_RFM22B_COM_RegisterTxCallback(uint32_t rfm22b_id, pios_com_callback tx_out_cb, uint32_t context);
static void PIOS_RFM22B_COM_TxStart(uint32_t rfm22b_id, uint16_t tx_bytes_avail);
static void PIOS_RFM22B_COM_RxStart(uint32_t rfm22b_id, uint16_t rx_bytes_avail);
static bool PIOS_RFM22B_COM_Available(uint32_t rfm22b_com_id);
static uint32_t PIOS_RFM22B_COM_Available(uint32_t rfm22b_com_id);
/* Local variables */
const struct pios_com_driver pios_rfm22b_com_driver = {
@ -135,9 +135,9 @@ static void PIOS_RFM22B_COM_RegisterTxCallback(uint32_t rfm22b_id, pios_com_call
* @param[in] rfm22b_dev The device ID.
* @return True of the device is available.
*/
static bool PIOS_RFM22B_COM_Available(uint32_t rfm22b_id)
static uint32_t PIOS_RFM22B_COM_Available(uint32_t rfm22b_id)
{
return PIOS_RFM22B_LinkStatus(rfm22b_id);
return PIOS_RFM22B_LinkStatus(rfm22b_id) ? COM_AVAILABLE_RXTX : COM_AVAILABLE_NONE;
}
#endif /* PIOS_INCLUDE_RFM22B_COM */

View File

@ -39,15 +39,15 @@ typedef uint16_t (*pios_com_callback)(uint32_t context, uint8_t *buf, uint16_t b
typedef void (*pios_com_callback_ctrl_line)(uint32_t context, uint32_t mask, uint32_t state);
struct pios_com_driver {
void (*init)(uint32_t id);
void (*set_baud)(uint32_t id, uint32_t baud);
void (*set_ctrl_line)(uint32_t id, uint32_t mask, uint32_t state);
void (*tx_start)(uint32_t id, uint16_t tx_bytes_avail);
void (*rx_start)(uint32_t id, uint16_t rx_bytes_avail);
void (*bind_rx_cb)(uint32_t id, pios_com_callback rx_in_cb, uint32_t context);
void (*bind_tx_cb)(uint32_t id, pios_com_callback tx_out_cb, uint32_t context);
void (*bind_ctrl_line_cb)(uint32_t id, pios_com_callback_ctrl_line ctrl_line_cb, uint32_t context);
bool (*available)(uint32_t id);
void (*init)(uint32_t id);
void (*set_baud)(uint32_t id, uint32_t baud);
void (*set_ctrl_line)(uint32_t id, uint32_t mask, uint32_t state);
void (*tx_start)(uint32_t id, uint16_t tx_bytes_avail);
void (*rx_start)(uint32_t id, uint16_t rx_bytes_avail);
void (*bind_rx_cb)(uint32_t id, pios_com_callback rx_in_cb, uint32_t context);
void (*bind_tx_cb)(uint32_t id, pios_com_callback tx_out_cb, uint32_t context);
void (*bind_ctrl_line_cb)(uint32_t id, pios_com_callback_ctrl_line ctrl_line_cb, uint32_t context);
uint32_t (*available)(uint32_t id);
};
/* Control line definitions */
@ -68,7 +68,12 @@ extern int32_t PIOS_COM_SendString(uint32_t com_id, const char *str);
extern int32_t PIOS_COM_SendFormattedStringNonBlocking(uint32_t com_id, const char *format, ...);
extern int32_t PIOS_COM_SendFormattedString(uint32_t com_id, const char *format, ...);
extern uint16_t PIOS_COM_ReceiveBuffer(uint32_t com_id, uint8_t *buf, uint16_t buf_len, uint32_t timeout_ms);
extern bool PIOS_COM_Available(uint32_t com_id);
extern uint32_t PIOS_COM_Available(uint32_t com_id);
#define COM_AVAILABLE_NONE (0)
#define COM_AVAILABLE_RX (1 << 0)
#define COM_AVAILABLE_TX (1 << 1)
#define COM_AVAILABLE_RXTX (COM_AVAILABLE_RX | COM_AVAILABLE_TX)
#endif /* PIOS_COM_H */

View File

@ -35,13 +35,13 @@
typedef uint16_t (*pios_com_callback)(uint32_t context, uint8_t *buf, uint16_t buf_len, uint16_t *headroom, bool *task_woken);
struct pios_com_driver {
void (*init)(uint32_t id);
void (*set_baud)(uint32_t id, uint32_t baud);
void (*tx_start)(uint32_t id, uint16_t tx_bytes_avail);
void (*rx_start)(uint32_t id, uint16_t rx_bytes_avail);
void (*bind_rx_cb)(uint32_t id, pios_com_callback rx_in_cb, uint32_t context);
void (*bind_tx_cb)(uint32_t id, pios_com_callback tx_out_cb, uint32_t context);
bool (*available)(uint32_t id);
void (*init)(uint32_t id);
void (*set_baud)(uint32_t id, uint32_t baud);
void (*tx_start)(uint32_t id, uint16_t tx_bytes_avail);
void (*rx_start)(uint32_t id, uint16_t rx_bytes_avail);
void (*bind_rx_cb)(uint32_t id, pios_com_callback rx_in_cb, uint32_t context);
void (*bind_tx_cb)(uint32_t id, pios_com_callback tx_out_cb, uint32_t context);
uint32_t (*available)(uint32_t id);
};
/* Public Functions */
@ -56,7 +56,12 @@ extern int32_t PIOS_COM_SendString(uint32_t com_id, const char *str);
extern int32_t PIOS_COM_SendFormattedStringNonBlocking(uint32_t com_id, const char *format, ...);
extern int32_t PIOS_COM_SendFormattedString(uint32_t com_id, const char *format, ...);
extern uint16_t PIOS_COM_ReceiveBuffer(uint32_t com_id, uint8_t *buf, uint16_t buf_len, uint32_t timeout_ms);
extern bool PIOS_COM_Available(uint32_t com_id);
extern uint32_t PIOS_COM_Available(uint32_t com_id);
#define COM_AVAILABLE_NONE (0)
#define COM_AVAILABLE_RX (1 << 0)
#define COM_AVAILABLE_TX (1 << 1)
#define COM_AVAILABLE_RXTX (COM_AVAILABLE_RX | COM_AVAILABLE_TX)
#endif /* PIOS_COM_H */

View File

@ -509,18 +509,26 @@ check_again:
* used to check a link is established even if the device
* is valid.
*/
bool PIOS_COM_Available(uint32_t com_id)
uint32_t PIOS_COM_Available(uint32_t com_id)
{
struct pios_com_dev *com_dev = PIOS_COM_find_dev(com_id);
if (!PIOS_COM_validate(com_dev)) {
return false;
return COM_AVAILABLE_NONE;
}
// If a driver does not provide a query method assume always
// available if valid
if (com_dev->driver->available == NULL) {
return true;
if (com_dev->has_rx && com_dev->has_tx) {
return COM_AVAILABLE_RXTX;
} else if (com_dev->has_rx) {
return COM_AVAILABLE_RX;
} else if (com_dev->has_tx) {
return COM_AVAILABLE_TX;
}
return COM_AVAILABLE_NONE; /* can this really happen? */
}
return (com_dev->driver->available)(com_dev->lower_id);

View File

@ -509,18 +509,26 @@ check_again:
* used to check a link is established even if the device
* is valid.
*/
bool PIOS_COM_Available(uint32_t com_id)
uint32_t PIOS_COM_Available(uint32_t com_id)
{
struct pios_com_dev *com_dev = PIOS_COM_find_dev(com_id);
if (!PIOS_COM_validate(com_dev)) {
return false;
return COM_AVAILABLE_NONE;
}
// If a driver does not provide a query method assume always
// available if valid
if (com_dev->driver->available == NULL) {
return true;
if (com_dev->has_rx && com_dev->has_tx) {
return COM_AVAILABLE_RXTX;
} else if (com_dev->has_rx) {
return COM_AVAILABLE_RX;
} else if (com_dev->has_tx) {
return COM_AVAILABLE_TX;
}
return COM_AVAILABLE_NONE; /* can this really happen? */
}
return (com_dev->driver->available)(com_dev->lower_id);

View File

@ -43,7 +43,7 @@ static void PIOS_USB_CDC_RegisterTxCallback(uint32_t usbcdc_id, pios_com_callbac
static void PIOS_USB_CDC_RegisterRxCallback(uint32_t usbcdc_id, pios_com_callback rx_in_cb, uint32_t context);
static void PIOS_USB_CDC_TxStart(uint32_t usbcdc_id, uint16_t tx_bytes_avail);
static void PIOS_USB_CDC_RxStart(uint32_t usbcdc_id, uint16_t rx_bytes_avail);
static bool PIOS_USB_CDC_Available(uint32_t usbcdc_id);
static uint32_t PIOS_USB_CDC_Available(uint32_t usbcdc_id);
const struct pios_com_driver pios_usb_cdc_com_driver = {
.tx_start = PIOS_USB_CDC_TxStart,
@ -353,7 +353,7 @@ RESULT PIOS_USB_CDC_SetControlLineState(void)
return USB_SUCCESS;
}
static bool PIOS_USB_CDC_Available(uint32_t usbcdc_id)
static uint32_t PIOS_USB_CDC_Available(uint32_t usbcdc_id)
{
struct pios_usb_cdc_dev *usb_cdc_dev = (struct pios_usb_cdc_dev *)usbcdc_id;
@ -361,8 +361,8 @@ static bool PIOS_USB_CDC_Available(uint32_t usbcdc_id)
PIOS_Assert(valid);
return PIOS_USB_CheckAvailable(usb_cdc_dev->lower_id) &&
(control_line_state & USB_CDC_CONTROL_LINE_STATE_DTE_PRESENT);
return (PIOS_USB_CheckAvailable(usb_cdc_dev->lower_id) &&
(control_line_state & USB_CDC_CONTROL_LINE_STATE_DTE_PRESENT)) ? COM_AVAILABLE_RXTX : COM_AVAILABLE_NONE;
}
static struct usb_cdc_line_coding line_coding = {

View File

@ -43,13 +43,14 @@ static void PIOS_USB_HID_RegisterTxCallback(uint32_t usbhid_id, pios_com_callbac
static void PIOS_USB_HID_RegisterRxCallback(uint32_t usbhid_id, pios_com_callback rx_in_cb, uint32_t context);
static void PIOS_USB_HID_TxStart(uint32_t usbhid_id, uint16_t tx_bytes_avail);
static void PIOS_USB_HID_RxStart(uint32_t usbhid_id, uint16_t rx_bytes_avail);
static uint32_t PIOS_USB_HID_Available(uint32_t usbhid_id);
const struct pios_com_driver pios_usb_hid_com_driver = {
.tx_start = PIOS_USB_HID_TxStart,
.rx_start = PIOS_USB_HID_RxStart,
.bind_tx_cb = PIOS_USB_HID_RegisterTxCallback,
.bind_rx_cb = PIOS_USB_HID_RegisterRxCallback,
.available = PIOS_USB_CheckAvailable,
.available = PIOS_USB_HID_Available,
};
enum pios_usb_hid_dev_magic {
@ -370,4 +371,9 @@ static void PIOS_USB_HID_EP_OUT_Callback(void)
#endif /* PIOS_INCLUDE_FREERTOS */
}
static uint32_t PIOS_USB_HID_Available(uint32_t usbhid_id)
{
return PIOS_USB_CheckAvailable(usbhid_id) ? COM_AVAILABLE_RXTX : COM_AVAILABLE_NONE;
}
#endif /* PIOS_INCLUDE_USB_HID */

View File

@ -43,7 +43,7 @@ static void PIOS_USB_CDC_RegisterRxCallback(uint32_t usbcdc_id, pios_com_callbac
static void PIOS_USB_CDC_RegisterCtrlLineCallback(uint32_t usbcdc_id, pios_com_callback_ctrl_line ctrl_line_cb, uint32_t context);
static void PIOS_USB_CDC_TxStart(uint32_t usbcdc_id, uint16_t tx_bytes_avail);
static void PIOS_USB_CDC_RxStart(uint32_t usbcdc_id, uint16_t rx_bytes_avail);
static bool PIOS_USB_CDC_Available(uint32_t usbcdc_id);
static uint32_t PIOS_USB_CDC_Available(uint32_t usbcdc_id);
const struct pios_com_driver pios_usb_cdc_com_driver = {
.tx_start = PIOS_USB_CDC_TxStart,
@ -445,7 +445,7 @@ static bool PIOS_USB_CDC_CTRL_IF_Setup(uint32_t usb_cdc_id, struct usb_setup_req
return true;
}
static bool PIOS_USB_CDC_Available(uint32_t usbcdc_id)
static uint32_t PIOS_USB_CDC_Available(uint32_t usbcdc_id)
{
struct pios_usb_cdc_dev *usb_cdc_dev = (struct pios_usb_cdc_dev *)usbcdc_id;
@ -453,8 +453,8 @@ static bool PIOS_USB_CDC_Available(uint32_t usbcdc_id)
PIOS_Assert(valid);
return PIOS_USB_CheckAvailable(usb_cdc_dev->lower_id) &&
(control_line_state & USB_CDC_CONTROL_LINE_STATE_DTE_PRESENT);
return (PIOS_USB_CheckAvailable(usb_cdc_dev->lower_id) &&
(control_line_state & USB_CDC_CONTROL_LINE_STATE_DTE_PRESENT)) ? COM_AVAILABLE_NONE : COM_AVAILABLE_RXTX;
}
/**

View File

@ -41,13 +41,14 @@ static void PIOS_USB_HID_RegisterTxCallback(uint32_t usbhid_id, pios_com_callbac
static void PIOS_USB_HID_RegisterRxCallback(uint32_t usbhid_id, pios_com_callback rx_in_cb, uint32_t context);
static void PIOS_USB_HID_TxStart(uint32_t usbhid_id, uint16_t tx_bytes_avail);
static void PIOS_USB_HID_RxStart(uint32_t usbhid_id, uint16_t rx_bytes_avail);
static uint32_t PIOS_USB_HID_Available(uint32_t usbhid_id);
const struct pios_com_driver pios_usb_hid_com_driver = {
.tx_start = PIOS_USB_HID_TxStart,
.rx_start = PIOS_USB_HID_RxStart,
.bind_tx_cb = PIOS_USB_HID_RegisterTxCallback,
.bind_rx_cb = PIOS_USB_HID_RegisterRxCallback,
.available = PIOS_USB_CheckAvailable,
.available = PIOS_USB_HID_Available,
};
enum pios_usb_hid_dev_magic {
@ -549,4 +550,9 @@ static bool PIOS_USB_HID_EP_OUT_Callback(uint32_t usb_hid_id, __attribute__((unu
return rc;
}
static uint32_t PIOS_USB_HID_Available(uint32_t usbhid_id)
{
return PIOS_USB_CheckAvailable(usbhid_id) ? COM_AVAILABLE_RXTX : COM_AVAILABLE_NONE;
}
#endif /* PIOS_INCLUDE_USB_HID */