diff --git a/conf/modules/extra_dl.xml b/conf/modules/extra_dl.xml
index b1d4069f27..bf0dc3bbb1 100644
--- a/conf/modules/extra_dl.xml
+++ b/conf/modules/extra_dl.xml
@@ -17,7 +17,7 @@
-
+
diff --git a/sw/airborne/arch/linux/mcu_periph/uart_arch.c b/sw/airborne/arch/linux/mcu_periph/uart_arch.c
index ba904e3c04..2f6176230b 100644
--- a/sw/airborne/arch/linux/mcu_periph/uart_arch.c
+++ b/sw/airborne/arch/linux/mcu_periph/uart_arch.c
@@ -240,7 +240,7 @@ void uart_periph_set_baudrate(struct uart_periph *periph, uint32_t baud)
}
}
-void uart_put_byte(struct uart_periph *periph, uint8_t data)
+void uart_put_byte(struct uart_periph *periph, long fd __attribute__((unused)), uint8_t data)
{
if (periph->reg_addr == NULL) { return; } // device not initialized ?
diff --git a/sw/airborne/arch/linux/mcu_periph/udp_arch.c b/sw/airborne/arch/linux/mcu_periph/udp_arch.c
index d020bcbc3f..dbd251b3b4 100644
--- a/sw/airborne/arch/linux/mcu_periph/udp_arch.c
+++ b/sw/airborne/arch/linux/mcu_periph/udp_arch.c
@@ -139,7 +139,7 @@ void udp_receive(struct udp_periph *p)
/**
* Send a message
*/
-void udp_send_message(struct udp_periph *p)
+void udp_send_message(struct udp_periph *p, long fd __attribute__((unused)))
{
if (p == NULL) return;
if (p->network == NULL) return;
@@ -165,7 +165,7 @@ void udp_send_message(struct udp_periph *p)
/**
* Send a packet from another buffer
*/
-void udp_send_raw(struct udp_periph *p, uint8_t *buffer, uint16_t size)
+void udp_send_raw(struct udp_periph *p, long fd __attribute__((unused)), uint8_t *buffer, uint16_t size)
{
if (p == NULL) return;
if (p->network == NULL) return;
diff --git a/sw/airborne/arch/lpc21/mcu_periph/spi_slave_hs_arch.c b/sw/airborne/arch/lpc21/mcu_periph/spi_slave_hs_arch.c
index 26b9e601f3..762e583d27 100644
--- a/sw/airborne/arch/lpc21/mcu_periph/spi_slave_hs_arch.c
+++ b/sw/airborne/arch/lpc21/mcu_periph/spi_slave_hs_arch.c
@@ -105,12 +105,12 @@ static void SSP_ISR(void) __attribute__((naked));
// Functions for the generic device API
-static int spi_slave_hs_check_free_space(struct spi_slave_hs *p __attribute__((unused)), uint8_t len __attribute__((unused)))
+static int spi_slave_hs_check_free_space(struct spi_slave_hs *p __attribute__((unused)), long *fd __attribute__((unused)), uint16_t len __attribute__((unused)))
{
return true;
}
-static void spi_slave_hs_transmit(struct spi_slave_hs *p __attribute__((unused)), uint8_t byte)
+static void spi_slave_hs_transmit(struct spi_slave_hs *p __attribute__((unused)), long fd __attribute__((unused)), uint8_t byte)
{
uint8_t temp = (spi_slave_hs_tx_insert_idx + 1) % SPI_SLAVE_HS_TX_BUFFER_SIZE;
if (temp != spi_slave_hs_tx_extract_idx) /* there is room left */
@@ -120,7 +120,15 @@ static void spi_slave_hs_transmit(struct spi_slave_hs *p __attribute__((unused))
}
}
-static void spi_slave_hs_send(struct spi_slave_hs *p __attribute__((unused))) { }
+static void spi_slave_hs_transmit_buffer(struct spi_slave_hs *p __attribute__((unused)), long fd, uint8_t *data, uint16_t len)
+{
+ int i;
+ for (i = 0; i < len; i++) {
+ spi_slave_hs_transmit(p, fd, data[i]);
+ }
+}
+
+static void spi_slave_hs_send(struct spi_slave_hs *p __attribute__((unused)), long fd __attribute__((unused))) { }
static int spi_slave_hs_char_available(struct spi_slave_hs *p __attribute__((unused)))
{
@@ -164,6 +172,7 @@ void spi_slave_hs_init(void)
spi_slave_hs.device.periph = (void *)(&spi_slave_hs);
spi_slave_hs.device.check_free_space = (check_free_space_t) spi_slave_hs_check_free_space;
spi_slave_hs.device.put_byte = (put_byte_t) spi_slave_hs_transmit;
+ spi_slave_hs.device.put_buffer = (put_buffer_t) spi_slave_hs_transmit_buffer;
spi_slave_hs.device.send_message = (send_message_t) spi_slave_hs_send;
spi_slave_hs.device.char_available = (char_available_t) spi_slave_hs_char_available;
spi_slave_hs.device.get_byte = (get_byte_t) spi_slave_hs_getch;
diff --git a/sw/airborne/arch/lpc21/mcu_periph/uart_arch.c b/sw/airborne/arch/lpc21/mcu_periph/uart_arch.c
index bd1daf927e..1a85092e18 100644
--- a/sw/airborne/arch/lpc21/mcu_periph/uart_arch.c
+++ b/sw/airborne/arch/lpc21/mcu_periph/uart_arch.c
@@ -80,7 +80,7 @@ void uart_periph_set_bits_stop_parity(struct uart_periph *p __attribute__((unuse
// TBD
}
-void uart_put_byte(struct uart_periph *p, uint8_t data)
+void uart_put_byte(struct uart_periph *p, long fd __attribute__((unused)), uint8_t data)
{
uint16_t temp;
unsigned cpsr;
diff --git a/sw/airborne/arch/lpc21/usb_ser_hw.c b/sw/airborne/arch/lpc21/usb_ser_hw.c
index 471fb7bfe4..2018628311 100644
--- a/sw/airborne/arch/lpc21/usb_ser_hw.c
+++ b/sw/airborne/arch/lpc21/usb_ser_hw.c
@@ -406,7 +406,7 @@ int VCOM_getchar(void)
@returns TRUE if len bytes are free
*/
-bool VCOM_check_free_space(uint8_t len)
+bool VCOM_check_free_space(uint16_t len)
{
return (fifo_free(&txfifo) >= len ? TRUE : FALSE);
}
@@ -547,17 +547,25 @@ static void USBFrameHandler(U16 wFrame __attribute__((unused)))
struct usb_serial_periph usb_serial;
// Functions for the generic device API
-static int usb_serial_check_free_space(struct usb_serial_periph *p __attribute__((unused)), uint8_t len)
+static int usb_serial_check_free_space(struct usb_serial_periph *p __attribute__((unused)), long *fd __attribute__((unused)), uint8_t len)
{
return (int)VCOM_check_free_space(len);
}
-static void usb_serial_transmit(struct usb_serial_periph *p __attribute__((unused)), uint8_t byte)
+static void usb_serial_transmit(struct usb_serial_periph *p __attribute__((unused)), long fd __attribute__((unused)), uint8_t byte)
{
VCOM_putchar(byte);
}
-static void usb_serial_send(struct usb_serial_periph *p __attribute__((unused))) { }
+static void usb_serial_transmit_buffer(struct usb_serial_periph *p __attribute__((unused)), long fd __attribute__((unused)), uint8_t *data, uint16_t len)
+{
+ int i;
+ for (i = 0; i < len; i++) {
+ VCOM_putchar(data[i]);
+ }
+}
+
+static void usb_serial_send(struct usb_serial_periph *p __attribute__((unused)), long fd __attribute__((unused))) { }
// Empty for lpc21
void VCOM_event(void) {}
@@ -619,6 +627,7 @@ void VCOM_init(void)
usb_serial.device.periph = (void *)(&usb_serial);
usb_serial.device.check_free_space = (check_free_space_t) usb_serial_check_free_space;
usb_serial.device.put_byte = (put_byte_t) usb_serial_transmit;
+ usb_serial.device.put_buffer = (put_buffer_t) usb_serial_transmit_buffer;
usb_serial.device.send_message = (send_message_t) usb_serial_send;
usb_serial.device.char_available = (char_available_t) usb_serial_char_available;
usb_serial.device.get_byte = (get_byte_t) usb_serial_getch;
diff --git a/sw/airborne/arch/stm32/mcu_periph/uart_arch.c b/sw/airborne/arch/stm32/mcu_periph/uart_arch.c
index 8a17599095..8871e5eb3c 100644
--- a/sw/airborne/arch/stm32/mcu_periph/uart_arch.c
+++ b/sw/airborne/arch/stm32/mcu_periph/uart_arch.c
@@ -109,7 +109,7 @@ void uart_periph_set_mode(struct uart_periph *p, bool tx_enabled, bool rx_enable
}
}
-void uart_put_byte(struct uart_periph *p, uint8_t data)
+void uart_put_byte(struct uart_periph *p, long fd __attribute__((unused)), uint8_t data)
{
uint16_t temp = (p->tx_insert_idx + 1) % UART_TX_BUFFER_SIZE;
diff --git a/sw/airborne/arch/stm32/usb_ser_hw.c b/sw/airborne/arch/stm32/usb_ser_hw.c
index c2c30d2e76..f0852818e5 100644
--- a/sw/airborne/arch/stm32/usb_ser_hw.c
+++ b/sw/airborne/arch/stm32/usb_ser_hw.c
@@ -500,17 +500,30 @@ struct usb_serial_periph usb_serial;
// Functions for the generic device API
static int usb_serial_check_free_space(struct usb_serial_periph *p __attribute__((unused)),
+ long *fd __attribute__((unused)),
uint8_t len)
{
return (int)VCOM_check_free_space(len);
}
-static void usb_serial_transmit(struct usb_serial_periph *p __attribute__((unused)), uint8_t byte)
+static void usb_serial_transmit(struct usb_serial_periph *p __attribute__((unused)),
+ long fd __attribute__((unused)),
+ uint8_t byte)
{
VCOM_putchar(byte);
}
-static void usb_serial_send(struct usb_serial_periph *p __attribute__((unused)))
+static void usb_serial_transmit_buffer(struct usb_serial_periph *p __attribute__((unused)),
+ long fd __attribute__((unused)),
+ uint8_t *data, uint16_t len)
+{
+ int i;
+ for (i = 0; i < len; i++) {
+ VCOM_putchar(data[i]);
+ }
+}
+
+static void usb_serial_send(struct usb_serial_periph *p __attribute__((unused)), long fd __attribute__((unused)))
{
VCOM_send_message();
}
@@ -558,9 +571,11 @@ void VCOM_init(void)
usb_serial.device.periph = (void *)(&usb_serial);
usb_serial.device.check_free_space = (check_free_space_t) usb_serial_check_free_space;
usb_serial.device.put_byte = (put_byte_t) usb_serial_transmit;
+ usb_serial.device.put_buffer = (put_buffer_t) usb_serial_transmit_buffer;
usb_serial.device.send_message = (send_message_t) usb_serial_send;
usb_serial.device.char_available = (char_available_t) usb_serial_char_available;
usb_serial.device.get_byte = (get_byte_t) usb_serial_getch;
tx_timeout = 0;
}
+
diff --git a/sw/airborne/firmwares/fixedwing/fbw_datalink.c b/sw/airborne/firmwares/fixedwing/fbw_datalink.c
index dfb5d6b7d0..689323c15e 100644
--- a/sw/airborne/firmwares/fixedwing/fbw_datalink.c
+++ b/sw/airborne/firmwares/fixedwing/fbw_datalink.c
@@ -36,12 +36,12 @@
static inline void autopilot_parse(char c)
{
- ModemLinkDevice->put_byte(ModemLinkDevice->periph, c);
+ ModemLinkDevice->put_byte(ModemLinkDevice->periph, 0, c);
}
static inline void modem_parse(char c)
{
- AutopilotLinkDevice->put_byte(AutopilotLinkDevice->periph, c);
+ AutopilotLinkDevice->put_byte(AutopilotLinkDevice->periph, 0, c);
}
void fbw_datalink_periodic(void)
diff --git a/sw/airborne/firmwares/setup/usb_tunnel.c b/sw/airborne/firmwares/setup/usb_tunnel.c
index 289438c423..cc0d152d57 100644
--- a/sw/airborne/firmwares/setup/usb_tunnel.c
+++ b/sw/airborne/firmwares/setup/usb_tunnel.c
@@ -74,13 +74,14 @@ static inline void tunnel_event(void)
inc = uart_getch(&USB_TUNNEL_UART);
VCOM_putchar(inc);
}
- if (VCOM_check_available() && uart_check_free_space(&USB_TUNNEL_UART, 1)) {
+ long fd = 0;
+ if (VCOM_check_available() && uart_check_free_space(&USB_TUNNEL_UART, &fd, 1)) {
#if LED_AVAILABLE(TUNNEL_TX_LED)
LED_ON(TUNNEL_TX_LED);
tx_time = get_sys_time_msec();
#endif
inc = VCOM_getchar();
- uart_put_byte(&USB_TUNNEL_UART, inc);
+ uart_put_byte(&USB_TUNNEL_UART, fd, inc);
}
}
diff --git a/sw/airborne/link_mcu_usart.c b/sw/airborne/link_mcu_usart.c
index 067e2e5d46..41705d0fa7 100644
--- a/sw/airborne/link_mcu_usart.c
+++ b/sw/airborne/link_mcu_usart.c
@@ -31,7 +31,7 @@
// Use uart interface directly
#define InterMcuBuffer() uart_char_available(&(INTERMCU_LINK))
-#define InterMcuUartSend1(c) uart_put_byte(&(INTERMCU_LINK), c)
+#define InterMcuUartSend1(c) uart_put_byte(&(INTERMCU_LINK), 0, c)
#define InterMcuUartSetBaudrate(_a) uart_periph_set_baudrate(&(INTERMCU_LINK), _a)
#define InterMcuUartSendMessage() {}
#define InterMcuUartGetch() uart_getch(&(INTERMCU_LINK))
diff --git a/sw/airborne/mcu_periph/uart.c b/sw/airborne/mcu_periph/uart.c
index ab8d69696f..3e3ffefaeb 100644
--- a/sw/airborne/mcu_periph/uart.c
+++ b/sw/airborne/mcu_periph/uart.c
@@ -228,8 +228,6 @@ static void send_uart_err(struct transport_tx *trans __attribute__ ((unused)),
}
#endif
-static void null_function(struct uart_periph *p __attribute__((unused))) {}
-
void uart_periph_init(struct uart_periph *p)
{
p->rx_insert_idx = 0;
@@ -241,12 +239,13 @@ void uart_periph_init(struct uart_periph *p)
p->ne_err = 0;
p->fe_err = 0;
p->device.periph = (void *)p;
- p->device.check_free_space = (check_free_space_t)uart_check_free_space;
- p->device.put_byte = (put_byte_t)uart_put_byte;
- p->device.send_message = (send_message_t)null_function;
- p->device.char_available = (char_available_t)uart_char_available;
- p->device.get_byte = (get_byte_t)uart_getch;
- p->device.set_baudrate = (set_baudrate_t)uart_periph_set_baudrate;
+ p->device.check_free_space = (check_free_space_t) uart_check_free_space;
+ p->device.put_byte = (put_byte_t) uart_put_byte;
+ p->device.put_buffer = (put_buffer_t) uart_put_buffer;
+ p->device.send_message = (send_message_t) uart_send_message;
+ p->device.char_available = (char_available_t) uart_char_available;
+ p->device.get_byte = (get_byte_t) uart_getch;
+ p->device.set_baudrate = (set_baudrate_t) uart_periph_set_baudrate;
#if PERIODIC_TELEMETRY
// the first to register do it for the others
@@ -254,7 +253,7 @@ void uart_periph_init(struct uart_periph *p)
#endif
}
-bool uart_check_free_space(struct uart_periph *p, uint8_t len)
+bool WEAK uart_check_free_space(struct uart_periph *p, long *fd __attribute__((unused)), uint16_t len)
{
int16_t space = p->tx_extract_idx - p->tx_insert_idx;
if (space <= 0) {
@@ -263,6 +262,20 @@ bool uart_check_free_space(struct uart_periph *p, uint8_t len)
return (uint16_t)(space - 1) >= len;
}
+// Weak implementation of put_buffer, byte by byte
+void WEAK uart_put_buffer(struct uart_periph *p, long fd, const uint8_t *data, uint16_t len)
+{
+ int i = 0;
+ for (i = 0; i < len; i++) {
+ uart_put_byte(p, fd, data[i]);
+ }
+}
+
+// Weak implementation of send_message, not needed for stream operation
+void WEAK uart_send_message(struct uart_periph *p __attribute__((unused)), long fd __attribute__((unused)))
+{
+}
+
uint8_t WEAK uart_getch(struct uart_periph *p)
{
uint8_t ret = p->rx_buf[p->rx_extract_idx];
@@ -282,3 +295,4 @@ uint16_t WEAK uart_char_available(struct uart_periph *p)
void WEAK uart_arch_init(void)
{
}
+
diff --git a/sw/airborne/mcu_periph/uart.h b/sw/airborne/mcu_periph/uart.h
index 177bfd42b6..8f78fea965 100644
--- a/sw/airborne/mcu_periph/uart.h
+++ b/sw/airborne/mcu_periph/uart.h
@@ -95,8 +95,10 @@ extern void uart_periph_init(struct uart_periph *p);
extern void uart_periph_set_baudrate(struct uart_periph *p, uint32_t baud);
extern void uart_periph_set_bits_stop_parity(struct uart_periph *p, uint8_t bits, uint8_t stop, uint8_t parity);
extern void uart_periph_set_mode(struct uart_periph *p, bool tx_enabled, bool rx_enabled, bool hw_flow_control);
-extern void uart_put_byte(struct uart_periph *p, uint8_t data);
-extern bool uart_check_free_space(struct uart_periph *p, uint8_t len);
+extern void uart_put_byte(struct uart_periph *p, long fd, uint8_t data);
+extern void uart_put_buffer(struct uart_periph *p, long fd, const uint8_t *data, uint16_t len);
+extern bool uart_check_free_space(struct uart_periph *p, long *fd, uint16_t len);
+extern void uart_send_message(struct uart_periph *p, long fd);
extern uint8_t uart_getch(struct uart_periph *p);
/**
diff --git a/sw/airborne/mcu_periph/udp.c b/sw/airborne/mcu_periph/udp.c
index b064d9a1cb..9278c39b3d 100644
--- a/sw/airborne/mcu_periph/udp.c
+++ b/sw/airborne/mcu_periph/udp.c
@@ -63,6 +63,7 @@ void udp_periph_init(struct udp_periph *p, char *host, int port_out, int port_in
p->device.periph = (void *)p;
p->device.check_free_space = (check_free_space_t) udp_check_free_space;
p->device.put_byte = (put_byte_t) udp_put_byte;
+ p->device.put_buffer = (put_buffer_t) udp_send_raw;
p->device.send_message = (send_message_t) udp_send_message;
p->device.char_available = (char_available_t) udp_char_available;
p->device.get_byte = (get_byte_t) udp_getch;
@@ -77,7 +78,7 @@ void udp_periph_init(struct udp_periph *p, char *host, int port_out, int port_in
* @param len how many bytes of free space to check for
* @return TRUE if enough space for len bytes
*/
-bool udp_check_free_space(struct udp_periph *p, uint8_t len)
+bool WEAK udp_check_free_space(struct udp_periph *p, long *fd __attribute__((unused)), uint16_t len)
{
return (UDP_TX_BUFFER_SIZE - p->tx_insert_idx) >= len;
}
@@ -87,7 +88,7 @@ bool udp_check_free_space(struct udp_periph *p, uint8_t len)
* @param p pointer to UDP peripheral
* @param data byte to add to tx buffer
*/
-void udp_put_byte(struct udp_periph *p, uint8_t data)
+void WEAK udp_put_byte(struct udp_periph *p, long fd __attribute__((unused)), uint8_t data)
{
if (p->tx_insert_idx >= UDP_TX_BUFFER_SIZE) {
return; // no room
diff --git a/sw/airborne/mcu_periph/udp.h b/sw/airborne/mcu_periph/udp.h
index 636adf91b6..51219b0e52 100644
--- a/sw/airborne/mcu_periph/udp.h
+++ b/sw/airborne/mcu_periph/udp.h
@@ -49,14 +49,14 @@ struct udp_periph {
struct link_device device;
};
-extern void udp_periph_init(struct udp_periph *p, char *host, int port_out, int port_in, bool broadcast);
-extern bool udp_check_free_space(struct udp_periph *p, uint8_t len);
-extern void udp_put_byte(struct udp_periph *p, uint8_t data);
+extern void udp_periph_init(struct udp_periph *p, char *host, int port_out, int port_in, bool_t broadcast);
+extern bool udp_check_free_space(struct udp_periph *p, long *fd, uint16_t len);
+extern void udp_put_byte(struct udp_periph *p, long fd, uint8_t data);
extern uint16_t udp_char_available(struct udp_periph *p);
extern uint8_t udp_getch(struct udp_periph *p);
extern void udp_arch_periph_init(struct udp_periph *p, char *host, int port_out, int port_in, bool broadcast);
-extern void udp_send_message(struct udp_periph *p);
-extern void udp_send_raw(struct udp_periph *p, uint8_t *buffer, uint16_t size);
+extern void udp_send_message(struct udp_periph *p, long fd);
+extern void udp_send_raw(struct udp_periph *p, long fd, uint8_t *buffer, uint16_t size);
extern void udp_receive(struct udp_periph *p);
#if USE_UDP0
diff --git a/sw/airborne/mcu_periph/usb_serial.h b/sw/airborne/mcu_periph/usb_serial.h
index 17582a967b..928882dd9d 100644
--- a/sw/airborne/mcu_periph/usb_serial.h
+++ b/sw/airborne/mcu_periph/usb_serial.h
@@ -42,7 +42,7 @@ extern struct usb_serial_periph usb_serial;
void VCOM_init(void);
int VCOM_putchar(int c);
int VCOM_getchar(void);
-bool VCOM_check_free_space(uint8_t len);
+bool VCOM_check_free_space(uint16_t len);
int VCOM_check_available(void);
void VCOM_set_linecoding(uint8_t mode);
void VCOM_allow_linecoding(uint8_t mode);
diff --git a/sw/airborne/modules/com/uart_drop.c b/sw/airborne/modules/com/uart_drop.c
index e4cc7a2876..90c91a3025 100644
--- a/sw/airborne/modules/com/uart_drop.c
+++ b/sw/airborne/modules/com/uart_drop.c
@@ -31,7 +31,7 @@ static uint8_t drop_string[] = "put_byte(MAVLinkDev->periph, c)
+#define MAVLinkTransmit(c) MAVLinkDev->put_byte(MAVLinkDev->periph, 0, c)
#define MAVLinkChAvailable() MAVLinkDev->char_available(MAVLinkDev->periph)
#define MAVLinkGetch() MAVLinkDev->get_byte(MAVLinkDev->periph)
-#define MAVLinkSendMessage() MAVLinkDev->send_message(MAVLinkDev->periph)
+#define MAVLinkSendMessage() MAVLinkDev->send_message(MAVLinkDev->periph, 0)
/**
* Module functions
diff --git a/sw/airborne/modules/digital_cam/uart_cam_ctrl.c b/sw/airborne/modules/digital_cam/uart_cam_ctrl.c
index c09e67937b..9f494e09a7 100644
--- a/sw/airborne/modules/digital_cam/uart_cam_ctrl.c
+++ b/sw/airborne/modules/digital_cam/uart_cam_ctrl.c
@@ -47,7 +47,7 @@
#define CameraLinkDev (&((CAMERA_LINK).device))
-#define CameraLinkTransmit(c) CameraLinkDev->put_byte(CameraLinkDev->periph, c)
+#define CameraLinkTransmit(c) CameraLinkDev->put_byte(CameraLinkDev->periph, 0, c)
#define CameraLinkChAvailable() CameraLinkDev->char_available(CameraLinkDev->periph)
#define CameraLinkGetch() CameraLinkDev->get_byte(CameraLinkDev->periph)
diff --git a/sw/airborne/modules/gps/gps_ubx_i2c.c b/sw/airborne/modules/gps/gps_ubx_i2c.c
index 8ec8c6fd6d..00b1d98b97 100644
--- a/sw/airborne/modules/gps/gps_ubx_i2c.c
+++ b/sw/airborne/modules/gps/gps_ubx_i2c.c
@@ -20,13 +20,13 @@
* Boston, MA 02111-1307, USA.
*
*/
-
+
/**
* @file modules/gps/gps_ubx_i2c.c
- * pprz link device for Ublox over I2C
+ * pprz link device for Ublox over I2C
*
* This module adds i2c functionality for the ublox using existing
- * driver
+ * driver
*/
#include "mcu_periph/i2c.h"
@@ -56,20 +56,38 @@ uint16_t gps_ubx_i2c_bytes_to_read; ///< ublox bytes to read
* @param p unused
*/
void null_function(struct GpsUbxI2C *p);
+
+/** Check available space in transmit buffer
+ * @param p unused
+ * @param fd unused
+ * @param len number of bytes to check
+ */
+int gps_i2c_check_free_space(struct GpsUbxI2C *p, long *fd, uint16_t len);
+
/** Put byte into transmit buffer.
* @param p unused
+ * @param fd unused
* @param data byte to put in buffer
*/
-void gps_i2c_put_byte(struct GpsUbxI2C *p, uint8_t data);
+void gps_i2c_put_byte(struct GpsUbxI2C *p, long fd, uint8_t data);
+
+/** Put bytes into transmit buffer.
+ * @param p unused
+ * @param fd unused
+ * @param data byte to put in buffer
+ */
+void gps_i2c_put_buffer(struct GpsUbxI2C *p, long fd, uint8_t *data, uint16_t len);
/** send buffer when ready
* @param p unused
*/
-void gps_i2c_msg_ready(struct GpsUbxI2C *p);
+void gps_i2c_msg_ready(struct GpsUbxI2C *p, long fd);
+
/** check if a new character is available
* @param p unused
*/
uint8_t gps_i2c_char_available(struct GpsUbxI2C *p);
+
/** get a new char
* @param p unused
*/
@@ -88,22 +106,36 @@ void gps_ubx_i2c_init(void)
gps_i2c.tx_rdy = TRUE;
gps_i2c.device.periph = (void *)&gps_i2c;
- gps_i2c.device.check_free_space = (check_free_space_t)null_function; ///< check if transmit buffer is not full
- gps_i2c.device.put_byte = (put_byte_t)gps_i2c_put_byte; ///< put one byte
- gps_i2c.device.send_message = (send_message_t)gps_i2c_msg_ready; ///< send completed buffer
- gps_i2c.device.char_available = (char_available_t)gps_i2c_char_available; ///< check if a new character is available
- gps_i2c.device.get_byte = (get_byte_t)gps_i2c_getch; ///< get a new char
- gps_i2c.device.set_baudrate = (set_baudrate_t)null_function; ///< set device baudrate
+ gps_i2c.device.check_free_space = (check_free_space_t)gps_i2c_check_free_space; ///< check if transmit buffer is not full
+ gps_i2c.device.put_byte = (put_byte_t)gps_i2c_put_byte; ///< put one byte
+ gps_i2c.device.put_buffer = (put_buffer_t)gps_i2c_put_buffer; ///< put several bytes
+ gps_i2c.device.send_message = (send_message_t)gps_i2c_msg_ready; ///< send completed buffer
+ gps_i2c.device.char_available = (char_available_t)gps_i2c_char_available; ///< check if a new character is available
+ gps_i2c.device.get_byte = (get_byte_t)gps_i2c_getch; ///< get a new char
+ gps_i2c.device.set_baudrate = (set_baudrate_t)null_function; ///< set device baudrate
}
void null_function(struct GpsUbxI2C *p __attribute__((unused))) {}
-void gps_i2c_put_byte(struct GpsUbxI2C *p __attribute__((unused)), uint8_t data)
+int gps_i2c_check_free_space(struct GpsUbxI2C *p __attribute__((unused)), long *fd __attribute__((unused)), uint16_t len)
+{
+ return (GPS_I2C_BUF_SIZE - gps_i2c.tx_buf_idx) >= len;
+}
+
+void gps_i2c_put_buffer(struct GpsUbxI2C *p, long fd, uint8_t *data, uint16_t len)
+{
+ int i = 0;
+ for (i = 0; i < len; i++) {
+ gps_i2c_put_byte(p, fd, data[i]);
+ }
+}
+
+void gps_i2c_put_byte(struct GpsUbxI2C *p __attribute__((unused)), long fd __attribute__((unused)), uint8_t data)
{
gps_i2c.tx_buf[gps_i2c.tx_buf_idx++] = data;
}
-void gps_i2c_msg_ready(struct GpsUbxI2C *p __attribute__((unused)))
+void gps_i2c_msg_ready(struct GpsUbxI2C *p __attribute__((unused)), long fd __attribute__((unused)))
{
gps_i2c.write_state = gps_i2c_write_cfg;
gps_i2c.tx_rdy = FALSE;
diff --git a/sw/airborne/modules/gps/gps_ubx_i2c.h b/sw/airborne/modules/gps/gps_ubx_i2c.h
index c5c0884fb2..dea5f399e1 100644
--- a/sw/airborne/modules/gps/gps_ubx_i2c.h
+++ b/sw/airborne/modules/gps/gps_ubx_i2c.h
@@ -23,10 +23,10 @@
/**
* @file modules/gps/gps_ubx_i2c.h
- * pprz link device for Ublox over I2C
+ * pprz link device for Ublox over I2C
*
* This module adds i2c functionality for the ublox using existing
- * driver
+ * driver
*/
#ifndef GPS_UBX_I2C_H
@@ -46,7 +46,7 @@ typedef enum GpsI2CReadState
gps_i2c_read_sizeof, ///< read size of ubx buffer
gps_i2c_read_data ///< read data from ubx buffer
} GpsI2CReadState;
-
+
/** write states
*/
typedef enum GpsI2CWriteState
@@ -108,4 +108,4 @@ static inline void GpsUbxi2cEvent(void)
}
}
-#endif // GPS_UBX_I2C_H
\ No newline at end of file
+#endif // GPS_UBX_I2C_H
diff --git a/sw/airborne/modules/gsm/gsm.c b/sw/airborne/modules/gsm/gsm.c
index fa9285a88a..e560fd5e49 100644
--- a/sw/airborne/modules/gsm/gsm.c
+++ b/sw/airborne/modules/gsm/gsm.c
@@ -73,7 +73,7 @@ Receiving:
#define GSMLinkDev (&(GSM_LINK).device)
#define GSMLinkChAvailable() GSMLinkDev->check_available(GSMLinkDev->periph)
-#define GSMLinkTransmit(_c) GSMLinkDev->put_byte(GSMLinkDev->periph, _c)
+#define GSMLinkTransmit(_c) GSMLinkDev->put_byte(GSMLinkDev->periph, 0, _c)
#define GSMLinkGetch() GSMLinkDev->get_byte(GSMLinkDev->periph)
#define ReadGSMBuffer() { while (GSMLinkChAvailable&&!gsm_line_received) gsm_parse(GSMLinkGetch()); }
diff --git a/sw/airborne/modules/hott/hott.c b/sw/airborne/modules/hott/hott.c
index f41ea9e4f2..48bf993e92 100644
--- a/sw/airborne/modules/hott/hott.c
+++ b/sw/airborne/modules/hott/hott.c
@@ -187,9 +187,9 @@ static void hott_send_telemetry_data(void)
--hott_msg_len;
if (hott_msg_len != 0) {
msg_crc += *hott_msg_ptr;
- uart_put_byte(&HOTT_PORT, *hott_msg_ptr++);
+ uart_put_byte(&HOTT_PORT, 0, *hott_msg_ptr++);
} else {
- uart_put_byte(&HOTT_PORT, (int8_t)msg_crc);
+ uart_put_byte(&HOTT_PORT, 0, (int8_t)msg_crc);
}
}
}
diff --git a/sw/airborne/modules/ins/ins_module.h b/sw/airborne/modules/ins/ins_module.h
index 86a724eb26..036ce87bec 100644
--- a/sw/airborne/modules/ins/ins_module.h
+++ b/sw/airborne/modules/ins/ins_module.h
@@ -79,7 +79,7 @@ void parse_ins_buffer(uint8_t);
#include "mcu_periph/uart.h"
#include "mcu_periph/spi.h"
-#define InsSend1(c) InsLinkDevice->put_byte(InsLinkDevice->periph, c)
+#define InsSend1(c) InsLinkDevice->put_byte(InsLinkDevice->periph, 0, c)
#define InsUartSend1(c) InsSend1(c)
#define InsSend(_dat,_len) { for (uint8_t i = 0; i< (_len); i++) InsSend1(_dat[i]); };
#define InsUartSetBaudrate(_b) uart_periph_set_baudrate(INS_LINK, _b)
diff --git a/sw/airborne/modules/loggers/direct_memory_logger.c b/sw/airborne/modules/loggers/direct_memory_logger.c
index 8084b0a341..15d81efeb2 100644
--- a/sw/airborne/modules/loggers/direct_memory_logger.c
+++ b/sw/airborne/modules/loggers/direct_memory_logger.c
@@ -159,7 +159,7 @@ void direct_memory_logger_periodic(void)
}
for (i = 5; i < end_idx; i++) {
- uart_put_byte(&DM_LOG_UART, dml.buffer[i]);
+ uart_put_byte(&DM_LOG_UART, 0, dml.buffer[i]);
}
// Read next bytes
diff --git a/sw/airborne/modules/loggers/high_speed_logger_direct_memory.c b/sw/airborne/modules/loggers/high_speed_logger_direct_memory.c
index 97c06491b9..7070b51b12 100644
--- a/sw/airborne/modules/loggers/high_speed_logger_direct_memory.c
+++ b/sw/airborne/modules/loggers/high_speed_logger_direct_memory.c
@@ -740,10 +740,11 @@ void send_buffer_to_uart(void)
uint8_t msg_size = memory_transaction.input_length;
static uint8_t i = MEMORY_READ_LATTENCY;
+ long fd = 0;
if (sending_buffer_to_uart) {
- while (uart_check_free_space(&HS_LOG_UART, 1)) {
+ while (uart_check_free_space(&HS_LOG_UART, &fd, 1)) {
if (i >= msg_size) {
@@ -756,7 +757,7 @@ void send_buffer_to_uart(void)
}
break;
}
- uart_put_byte(&HS_LOG_UART, uart_read_buff[i]);
+ uart_put_byte(&HS_LOG_UART, fd, uart_read_buff[i]);
i++;
}
diff --git a/sw/airborne/modules/loggers/sdlogger_spi_direct.c b/sw/airborne/modules/loggers/sdlogger_spi_direct.c
index 22092fb2bc..9630a7c821 100644
--- a/sw/airborne/modules/loggers/sdlogger_spi_direct.c
+++ b/sw/airborne/modules/loggers/sdlogger_spi_direct.c
@@ -90,6 +90,7 @@ void sdlogger_spi_direct_init(void)
/* Set function pointers in link_device to the logger functions */
sdlogger_spi.device.check_free_space = (check_free_space_t)sdlogger_spi_direct_check_free_space;
sdlogger_spi.device.put_byte = (put_byte_t)sdlogger_spi_direct_put_byte;
+ sdlogger_spi.device.put_buffer = (put_buffer_t)sdlogger_spi_direct_put_buffer;
sdlogger_spi.device.send_message = (send_message_t)sdlogger_spi_direct_send_message;
sdlogger_spi.device.char_available = (char_available_t)sdlogger_spi_direct_char_available;
sdlogger_spi.device.get_byte = (get_byte_t)sdlogger_spi_direct_get_byte;
@@ -177,8 +178,9 @@ void sdlogger_spi_direct_periodic(void)
if (sdcard1.status == SDCard_Idle) {
/* Put bytes to the buffer until all is written or buffer is full */
for (uint16_t i = sdlogger_spi.sdcard_buf_idx; i < SD_BLOCK_SIZE; i++) {
- if(uart_check_free_space(&(DOWNLINK_DEVICE), 1)) {
- uart_put_byte(&(DOWNLINK_DEVICE), sdcard1.input_buf[i]);
+ long fd = 0;
+ if (uart_check_free_space(&(DOWNLINK_DEVICE), &fd, 1)) {
+ uart_put_byte(&(DOWNLINK_DEVICE), fd, sdcard1.input_buf[i]);
}
else {
/* No free space left, abort for-loop */
@@ -344,7 +346,7 @@ void sdlogger_spi_direct_command(void)
sdlogger_spi.command = 0;
}
-bool sdlogger_spi_direct_check_free_space(struct sdlogger_spi_periph *p, uint8_t len)
+bool sdlogger_spi_direct_check_free_space(struct sdlogger_spi_periph *p, long *fd __attribute__((unused)), uint16_t len)
{
if (p->status == SDLogger_Logging) {
/* Calculating free space in both buffers */
@@ -355,7 +357,7 @@ bool sdlogger_spi_direct_check_free_space(struct sdlogger_spi_periph *p, uint8_t
return false;
}
-void sdlogger_spi_direct_put_byte(struct sdlogger_spi_periph *p, uint8_t data)
+void sdlogger_spi_direct_put_byte(struct sdlogger_spi_periph *p, long fd __attribute__((unused)), uint8_t data)
{
/* SD Buffer full, write in logger buffer */
if (p->sdcard_buf_idx > 512) {
@@ -375,7 +377,15 @@ void sdlogger_spi_direct_put_byte(struct sdlogger_spi_periph *p, uint8_t data)
}
}
-void sdlogger_spi_direct_send_message(void *p)
+void sdlogger_spi_direct_put_buffer(struct sdlogger_spi_periph *p, long fd, uint8_t *data, uint16_t len)
+{
+ int i;
+ for (i = 0; i < len; i++) {
+ sdlogger_spi_direct_put_byte(p, fd, data[i]);
+ }
+}
+
+void sdlogger_spi_direct_send_message(void *p, long fd __attribute__((unused)))
{
(void) p;
}
diff --git a/sw/airborne/modules/loggers/sdlogger_spi_direct.h b/sw/airborne/modules/loggers/sdlogger_spi_direct.h
index 251b8c84a6..042c3bebaf 100644
--- a/sw/airborne/modules/loggers/sdlogger_spi_direct.h
+++ b/sw/airborne/modules/loggers/sdlogger_spi_direct.h
@@ -72,9 +72,10 @@ extern void sdlogger_spi_direct_index_received(void);
extern void sdlogger_spi_direct_multiwrite_written(void);
extern void sdlogger_spi_direct_command(void);
-extern bool sdlogger_spi_direct_check_free_space(struct sdlogger_spi_periph *p, uint8_t len);
-extern void sdlogger_spi_direct_put_byte(struct sdlogger_spi_periph *p, uint8_t data);
-extern void sdlogger_spi_direct_send_message(void *p);
+extern bool sdlogger_spi_direct_check_free_space(struct sdlogger_spi_periph *p, long *fd, uint16_t len);
+extern void sdlogger_spi_direct_put_byte(struct sdlogger_spi_periph *p, long fd, uint8_t data);
+extern void sdlogger_spi_direct_put_buffer(struct sdlogger_spi_periph *p, long fd, uint8_t data, uint16_t len);
+extern void sdlogger_spi_direct_send_message(void *p, long fd);
extern int sdlogger_spi_direct_char_available(void *p);
extern uint8_t sdlogger_spi_direct_get_byte(void *p);
diff --git a/sw/airborne/modules/sensors/met_module.h b/sw/airborne/modules/sensors/met_module.h
index 98dd020787..2b4aab1906 100644
--- a/sw/airborne/modules/sensors/met_module.h
+++ b/sw/airborne/modules/sensors/met_module.h
@@ -42,7 +42,7 @@
#define MetBuffer() MetLinkDevice->char_available(MetLinkDevice->periph)
#define MetGetch() MetLinkDevice->get_byte(MetLinkDevice->periph)
#define ReadMetBuffer() { while (MetBuffer()&&!met_msg_received) parse_met_buffer(MetGetch()); }
-#define MetSend1(c) MetLinkDevice->put_byte(MetLinkDevice->periph, c)
+#define MetSend1(c) MetLinkDevice->put_byte(MetLinkDevice->periph, 0, c)
#define MetUartSend1(c) MetSend1(c)
#define MetSend(_dat,_len) { for (uint8_t i = 0; i< (_len); i++) MetSend1(_dat[i]); };
#define MetUartSetBaudrate(_b) uart_periph_set_baudrate(&(MET_LINK), _b)
diff --git a/sw/airborne/modules/stereocam/droplet/stereocam_droplet.c b/sw/airborne/modules/stereocam/droplet/stereocam_droplet.c
index 5c6a6da15b..684efec4cc 100644
--- a/sw/airborne/modules/stereocam/droplet/stereocam_droplet.c
+++ b/sw/airborne/modules/stereocam/droplet/stereocam_droplet.c
@@ -41,7 +41,7 @@ PRINT_CONFIG_VAR(STEREO_UART)
struct link_device *xdev = STEREO_PORT;
#define StereoGetch() STEREO_PORT ->get_byte(STEREO_PORT->periph)
-#define StereoSend1(c) STEREO_PORT->put_byte(STEREO_PORT->periph, c)
+#define StereoSend1(c) STEREO_PORT->put_byte(STEREO_PORT->periph, 0, c)
#define StereoUartSend1(c) StereoSend1(c)
#define StereoSend(_dat,_len) { for (uint8_t i = 0; i< (_len); i++) StereoSend1(_dat[i]); };
#define StereoUartSetBaudrate(_b) uart_periph_set_baudrate(STEREO_PORT, _b);
diff --git a/sw/airborne/modules/stereocam/stereoprotocol.c b/sw/airborne/modules/stereocam/stereoprotocol.c
index cc56ae23bf..2823a4f7dd 100644
--- a/sw/airborne/modules/stereocam/stereoprotocol.c
+++ b/sw/airborne/modules/stereocam/stereoprotocol.c
@@ -76,9 +76,10 @@ uint8_t stereoprot_isStartOfMsg(uint8_t *stack, uint16_t i, uint16_t buffer_size
void WritePart(struct link_device *dev, uint8_t *code, uint8_t length)
{
- if (dev->check_free_space(dev->periph, length)) {
+ long fd = 0;
+ if (dev->check_free_space(dev->periph, &fd, length)) {
for (uint8_t index = 0; index < length; index++) {
- dev->put_byte(dev->periph, code[index]);
+ dev->put_byte(dev->periph, fd, code[index]);
}
}
}
diff --git a/sw/airborne/subsystems/actuators/actuators_spektrum.c b/sw/airborne/subsystems/actuators/actuators_spektrum.c
index af7e30b615..e46555bf2f 100644
--- a/sw/airborne/subsystems/actuators/actuators_spektrum.c
+++ b/sw/airborne/subsystems/actuators/actuators_spektrum.c
@@ -83,12 +83,12 @@ void actuators_spektrum_set(void)
static inline void actuators_spektrum_send(struct link_device *dev)
{
uint8_t i = 0;
- dev->put_byte(dev->periph, 0x00); // number missed frames
- dev->put_byte(dev->periph, 0x12); // 7 channels, 11 bit, 11ms
+ dev->put_byte(dev->periph, 0, 0x00); // number missed frames
+ dev->put_byte(dev->periph, 0x12); // 7 channels, 11 bit, 0, 11ms
/* Transmit all channels */
for (i = 0; i < ACTUATORS_SPEKTRUM_MAX_NB; i++) {
- dev->put_byte(dev->periph, i << 3 | actuators_spektrum.cmds[i] >> 8);
- dev->put_byte(dev->periph, actuators_spektrum.cmds[i] & 0xFF);
+ dev->put_byte(dev->periph, 0, i << 3 | actuators_spektrum.cmds[i] >> 8);
+ dev->put_byte(dev->periph, 0, actuators_spektrum.cmds[i] & 0xFF);
}
}
diff --git a/sw/airborne/subsystems/ahrs/ahrs_gx3.c b/sw/airborne/subsystems/ahrs/ahrs_gx3.c
index 293e59ce3b..2485b0aa9e 100644
--- a/sw/airborne/subsystems/ahrs/ahrs_gx3.c
+++ b/sw/airborne/subsystems/ahrs/ahrs_gx3.c
@@ -77,11 +77,11 @@ void ahrs_gx3_align(void)
ahrs_gx3.is_aligned = false;
//make the gyros zero, takes 10s (specified in Byte 4 and 5)
- uart_put_byte(&GX3_PORT, 0xcd);
- uart_put_byte(&GX3_PORT, 0xc1);
- uart_put_byte(&GX3_PORT, 0x29);
- uart_put_byte(&GX3_PORT, 0x27);
- uart_put_byte(&GX3_PORT, 0x10);
+ uart_put_byte(&GX3_PORT, 0, 0xcd);
+ uart_put_byte(&GX3_PORT, 0, 0xc1);
+ uart_put_byte(&GX3_PORT, 0, 0x29);
+ uart_put_byte(&GX3_PORT, 0, 0x27);
+ uart_put_byte(&GX3_PORT, 0, 0x10);
ahrs_gx3.is_aligned = true;
}
@@ -125,59 +125,59 @@ void imu_impl_init(void)
/*
// FOR NON-CONTINUOUS MODE UNCOMMENT THIS
//4 byte command for non-Continous Mode so we can set the other settings
- uart_put_byte(&GX3_PORT, 0xc4);
- uart_put_byte(&GX3_PORT, 0xc1);
- uart_put_byte(&GX3_PORT, 0x29);
- uart_put_byte(&GX3_PORT, 0x00); // stop
+ uart_put_byte(&GX3_PORT, 0, 0xc4);
+ uart_put_byte(&GX3_PORT, 0, 0xc1);
+ uart_put_byte(&GX3_PORT, 0, 0x29);
+ uart_put_byte(&GX3_PORT, 0, 0x00); // stop
*/
//Sampling Settings (0xDB)
- uart_put_byte(&GX3_PORT, 0xdb); //set update speed
- uart_put_byte(&GX3_PORT, 0xa8);
- uart_put_byte(&GX3_PORT, 0xb9);
+ uart_put_byte(&GX3_PORT, 0, 0xdb); //set update speed
+ uart_put_byte(&GX3_PORT, 0, 0xa8);
+ uart_put_byte(&GX3_PORT, 0, 0xb9);
//set rate of IMU link, is 1000/IMU_DIV
#define IMU_DIV1 0
#define IMU_DIV2 2
#define ACC_FILT_DIV 2
#define MAG_FILT_DIV 30
#ifdef GX3_SAVE_SETTINGS
- uart_put_byte(&GX3_PORT, 0x02);//set params and save them in non-volatile memory
+ uart_put_byte(&GX3_PORT, 0, 0x02);//set params and save them in non-volatile memory
#else
- uart_put_byte(&GX3_PORT, 0x02); //set and don't save
+ uart_put_byte(&GX3_PORT, 0, 0x02); //set and don't save
#endif
- uart_put_byte(&GX3_PORT, IMU_DIV1);
- uart_put_byte(&GX3_PORT, IMU_DIV2);
- uart_put_byte(&GX3_PORT, 0b00000000); //set options byte 8 - GOOD
- uart_put_byte(&GX3_PORT, 0b00000011); //set options byte 7 - GOOD
+ uart_put_byte(&GX3_PORT, 0, IMU_DIV1);
+ uart_put_byte(&GX3_PORT, 0, IMU_DIV2);
+ uart_put_byte(&GX3_PORT, 0, 0b00000000); //set options byte 8 - GOOD
+ uart_put_byte(&GX3_PORT, 0, 0b00000011); //set options byte 7 - GOOD
//0 - calculate orientation, 1 - enable coning & sculling, 2-3 reserved, 4 - no little endian data,
// 5 - no NaN supressed, 6 - disable finite size correction, 7 - reserved,
// 8 - enable magnetometer, 9 - reserved, 10 - enable magnetic north compensation, 11 - enable gravity compensation
// 12 - no quaternion calculation, 13-15 reserved
- uart_put_byte(&GX3_PORT, ACC_FILT_DIV);
- uart_put_byte(&GX3_PORT, MAG_FILT_DIV); //mag window filter size == 33hz
- uart_put_byte(&GX3_PORT, 0x00);
- uart_put_byte(&GX3_PORT, 10); // Up Compensation in secs, def=10s
- uart_put_byte(&GX3_PORT, 0x00);
- uart_put_byte(&GX3_PORT, 10); // North Compensation in secs
- uart_put_byte(&GX3_PORT, 0x00); //power setting = 0, high power/bw
- uart_put_byte(&GX3_PORT, 0x00); //rest of the bytes are 0
- uart_put_byte(&GX3_PORT, 0x00);
- uart_put_byte(&GX3_PORT, 0x00);
- uart_put_byte(&GX3_PORT, 0x00);
- uart_put_byte(&GX3_PORT, 0x00);
+ uart_put_byte(&GX3_PORT, 0, ACC_FILT_DIV);
+ uart_put_byte(&GX3_PORT, 0, MAG_FILT_DIV); //mag window filter size == 33hz
+ uart_put_byte(&GX3_PORT, 0, 0x00);
+ uart_put_byte(&GX3_PORT, 10); // Up Compensation in secs, 0, def=10s
+ uart_put_byte(&GX3_PORT, 0, 0x00);
+ uart_put_byte(&GX3_PORT, 0, 10); // North Compensation in secs
+ uart_put_byte(&GX3_PORT, 0x00); //power setting = 0, 0, high power/bw
+ uart_put_byte(&GX3_PORT, 0, 0x00); //rest of the bytes are 0
+ uart_put_byte(&GX3_PORT, 0, 0x00);
+ uart_put_byte(&GX3_PORT, 0, 0x00);
+ uart_put_byte(&GX3_PORT, 0, 0x00);
+ uart_put_byte(&GX3_PORT, 0, 0x00);
// OPTIONAL: realign up and north
/*
- uart_put_byte(&GX3_PORT, 0xdd);
- uart_put_byte(&GX3_PORT, 0x54);
- uart_put_byte(&GX3_PORT, 0x4c);
- uart_put_byte(&GX3_PORT, 3);
- uart_put_byte(&GX3_PORT, 10);
- uart_put_byte(&GX3_PORT, 10);
- uart_put_byte(&GX3_PORT, 0x00);
- uart_put_byte(&GX3_PORT, 0x00);
- uart_put_byte(&GX3_PORT, 0x00);
- uart_put_byte(&GX3_PORT, 0x00);
+ uart_put_byte(&GX3_PORT, 0, 0xdd);
+ uart_put_byte(&GX3_PORT, 0, 0x54);
+ uart_put_byte(&GX3_PORT, 0, 0x4c);
+ uart_put_byte(&GX3_PORT, 0, 3);
+ uart_put_byte(&GX3_PORT, 0, 10);
+ uart_put_byte(&GX3_PORT, 0, 10);
+ uart_put_byte(&GX3_PORT, 0, 0x00);
+ uart_put_byte(&GX3_PORT, 0, 0x00);
+ uart_put_byte(&GX3_PORT, 0, 0x00);
+ uart_put_byte(&GX3_PORT, 0, 0x00);
*/
//Another wait loop for proper GX3 init
@@ -187,23 +187,23 @@ void imu_impl_init(void)
#ifdef GX3_SET_WAKEUP_MODE
//Mode Preset (0xD5)
- uart_put_byte(&GX3_PORT, 0xD5);
- uart_put_byte(&GX3_PORT, 0xBA);
- uart_put_byte(&GX3_PORT, 0x89);
- uart_put_byte(&GX3_PORT, 0x02); // wake up in continuous mode
+ uart_put_byte(&GX3_PORT, 0, 0xD5);
+ uart_put_byte(&GX3_PORT, 0, 0xBA);
+ uart_put_byte(&GX3_PORT, 0, 0x89);
+ uart_put_byte(&GX3_PORT, 0, 0x02); // wake up in continuous mode
//Continuous preset (0xD6)
- uart_put_byte(&GX3_PORT, 0xD6);
- uart_put_byte(&GX3_PORT, 0xC6);
- uart_put_byte(&GX3_PORT, 0x6B);
- uart_put_byte(&GX3_PORT, 0xc8); // accel, gyro, R
+ uart_put_byte(&GX3_PORT, 0, 0xD6);
+ uart_put_byte(&GX3_PORT, 0, 0xC6);
+ uart_put_byte(&GX3_PORT, 0, 0x6B);
+ uart_put_byte(&GX3_PORT, 0xc8); // accel, gyro, 0, R
#endif
//4 byte command for Continous Mode
- uart_put_byte(&GX3_PORT, 0xc4);
- uart_put_byte(&GX3_PORT, 0xc1);
- uart_put_byte(&GX3_PORT, 0x29);
- uart_put_byte(&GX3_PORT, 0xc8); // accel,gyro,R
+ uart_put_byte(&GX3_PORT, 0, 0xc4);
+ uart_put_byte(&GX3_PORT, 0, 0xc1);
+ uart_put_byte(&GX3_PORT, 0, 0x29);
+ uart_put_byte(&GX3_PORT, 0xc8); // accel,gyro, 0,R
// Reset gyros to zero
ahrs_gx3_align();
@@ -218,7 +218,7 @@ void imu_impl_init(void)
void imu_periodic(void)
{
/* IF IN NON-CONTINUOUS MODE, REQUEST DATA NOW
- uart_put_byte(&GX3_PORT, 0xc8); // accel,gyro,R
+ uart_put_byte(&GX3_PORT, 0xc8); // accel,gyro, 0,R
*/
}
diff --git a/sw/airborne/subsystems/chibios-libopencm3/chibios_sdlog.c b/sw/airborne/subsystems/chibios-libopencm3/chibios_sdlog.c
index d5c32997e1..b7850ed11c 100644
--- a/sw/airborne/subsystems/chibios-libopencm3/chibios_sdlog.c
+++ b/sw/airborne/subsystems/chibios-libopencm3/chibios_sdlog.c
@@ -64,17 +64,22 @@ static void launchBatterySurveyThread (void)
}
// Functions for the generic device API
-static int sdlog_check_free_space(struct chibios_sdlog* p __attribute__((unused)), uint8_t len __attribute__((unused)))
+static int sdlog_check_free_space(struct chibios_sdlog* p __attribute__((unused)), long *fd __attribute__((unused)), uint16_t len __attribute__((unused)))
{
- return true;
+ return 1;
}
-static void sdlog_transmit(struct chibios_sdlog* p, uint8_t byte)
+static void sdlog_transmit(struct chibios_sdlog* p, long fd __attribute__((unused)), uint8_t byte)
{
sdLogWriteByte(*p->file, byte);
}
-static void sdlog_send(struct chibios_sdlog* p __attribute__((unused))) { }
+static void sdlog_transmit_buffer(struct chibios_sdlog* p, long fd __attribute__((unused)), uint8_t *data, uint16_t len)
+{
+ sdLogWriteRaw(*p->file, data, len);
+}
+
+static void sdlog_send(struct chibios_sdlog* p __attribute__((unused)), long fd __attribute__((unused))) { }
static int null_function(struct chibios_sdlog *p __attribute__((unused))) { return 0; }
@@ -86,6 +91,7 @@ void chibios_sdlog_init(struct chibios_sdlog *sdlog, FileDes *file)
sdlog->device.periph = (void *)(sdlog);
sdlog->device.check_free_space = (check_free_space_t) sdlog_check_free_space;
sdlog->device.put_byte = (put_byte_t) sdlog_transmit;
+ sdlog->device.put_buffer = (put_buffer_t) sdlog_transmit_buffer;
sdlog->device.send_message = (send_message_t) sdlog_send;
sdlog->device.char_available = (char_available_t) null_function; // write only
sdlog->device.get_byte = (get_byte_t) null_function; // write only
diff --git a/sw/airborne/subsystems/datalink/bluegiga.c b/sw/airborne/subsystems/datalink/bluegiga.c
index b7135a1532..764cfa7b15 100644
--- a/sw/airborne/subsystems/datalink/bluegiga.c
+++ b/sw/airborne/subsystems/datalink/bluegiga.c
@@ -72,7 +72,7 @@ void bluegiga_transmit(struct bluegiga_periph *p, uint8_t data);
void bluegiga_receive(struct spi_transaction *trans);
// Functions for the generic link device device API
-static int dev_check_free_space(struct bluegiga_periph *p, uint8_t len)
+static int dev_check_free_space(struct bluegiga_periph *p, long *fd __attribute__((unused)), uint16_t len)
{
// check if there is enough space for message
// NB if BLUEGIGA_BUFFER_SIZE is smaller than 256 then an additional check is needed that len < BLUEGIGA_BUFFER_SIZE
@@ -82,11 +82,18 @@ static int dev_check_free_space(struct bluegiga_periph *p, uint8_t len)
return false;
}
-static void dev_put_byte(struct bluegiga_periph *p, uint8_t byte)
+static void dev_put_buffer(struct bluegiga_periph *p, long fd __attribute__((unused)), uint8_t *data, uint16_t len)
+{
+ int i;
+ for (i = 0; i < len; i++) {
+ bluegiga_transmit(p, data[i]);
+ }
+}
+static void dev_put_byte(struct bluegiga_periph *p, long fd __attribute__((unused)), uint8_t byte)
{
bluegiga_transmit(p, byte);
}
-static void dev_send_message(struct bluegiga_periph *p)
+static void dev_send_message(struct bluegiga_periph *p, long fd __attribute__((unused)))
{
p->end_of_msg = p->tx_insert_idx;
}
@@ -163,6 +170,7 @@ void bluegiga_init(struct bluegiga_periph *p)
p->device.periph = (void *)(p);
p->device.check_free_space = (check_free_space_t) dev_check_free_space;
p->device.put_byte = (put_byte_t) dev_put_byte;
+ p->device.put_buffer = (put_buffer_t) dev_put_buffer;
p->device.send_message = (send_message_t) dev_send_message;
p->device.char_available = (char_available_t) dev_char_available;
p->device.get_byte = (get_byte_t) dev_get_byte;
@@ -199,7 +207,8 @@ void bluegiga_init(struct bluegiga_periph *p)
/* Add one byte to the end of tx circular buffer */
void bluegiga_transmit(struct bluegiga_periph *p, uint8_t data)
{
- if (dev_check_free_space(p, 1) && coms_status != BLUEGIGA_UNINIT) {
+ long fd = 0;
+ if (dev_check_free_space(p, &fd, 1) && coms_status != BLUEGIGA_UNINIT) {
p->tx_buf[p->tx_insert_idx] = data;
bluegiga_increment_buf(&p->tx_insert_idx, 1);
}
diff --git a/sw/airborne/subsystems/datalink/superbitrf.c b/sw/airborne/subsystems/datalink/superbitrf.c
index 9bfd074e13..8366967798 100644
--- a/sw/airborne/subsystems/datalink/superbitrf.c
+++ b/sw/airborne/subsystems/datalink/superbitrf.c
@@ -201,7 +201,7 @@ static void send_superbit(struct transport_tx *trans, struct link_device *dev)
#endif
// Functions for the generic device API
-static bool superbitrf_check_free_space(struct SuperbitRF *p, uint8_t len)
+static bool superbitrf_check_free_space(struct SuperbitRF *p, long *fd __attribute__((unused)), uint16_t len)
{
int16_t space = p->tx_extract_idx - p->tx_insert_idx;
if (space <= 0) {
@@ -210,13 +210,21 @@ static bool superbitrf_check_free_space(struct SuperbitRF *p, uint8_t len)
return (uint16_t)(space - 1) >= len;
}
-static void superbitrf_transmit(struct SuperbitRF *p, uint8_t byte)
+static void superbitrf_transmit(struct SuperbitRF *p, long fd __attribute__((unused)), uint8_t byte)
{
p->tx_buffer[p->tx_insert_idx] = byte;
p->tx_insert_idx = (p->tx_insert_idx + 1) % SUPERBITRF_TX_BUFFER_SIZE;
}
-static void superbitrf_send(struct SuperbitRF *p __attribute__((unused))) { }
+static void superbitrf_transmit_buffer(struct SuperbitRF *p, long fd, uint8_t *data, uint16_t len)
+{
+ int i;
+ for (i = 0; i < len; i++) {
+ superbitrf_transmit(p, fd, data[i]);
+ }
+}
+
+static void superbitrf_send(struct SuperbitRF *p __attribute__((unused)), long fd __attribute__((unused))) { }
static int null_function(struct SuperbitRF *p __attribute__((unused))) { return 0; }
@@ -244,6 +252,7 @@ void superbitrf_init(void)
superbitrf.device.periph = (void *)(&superbitrf);
superbitrf.device.check_free_space = (check_free_space_t) superbitrf_check_free_space;
superbitrf.device.put_byte = (put_byte_t) superbitrf_transmit;
+ superbitrf.device.put_buffer = (put_buffer_t) superbitrf_transmit_buffer;
superbitrf.device.send_message = (send_message_t) superbitrf_send;
superbitrf.device.char_available = (char_available_t) null_function; // not needed
superbitrf.device.get_byte = (get_byte_t) null_function; // not needed
diff --git a/sw/airborne/subsystems/datalink/uart_print.h b/sw/airborne/subsystems/datalink/uart_print.h
index 23ba84823f..59e16187b6 100644
--- a/sw/airborne/subsystems/datalink/uart_print.h
+++ b/sw/airborne/subsystems/datalink/uart_print.h
@@ -39,7 +39,7 @@ static inline void print_string(struct link_device *dev, char *s)
{
uint8_t i = 0;
while (s[i]) {
- dev->put_byte(dev->periph, s[i]);
+ dev->put_byte(dev->periph, 0, s[i]);
i++;
}
}
@@ -60,8 +60,8 @@ static inline void print_hex(struct link_device *dev, uint8_t c)
'8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
uint8_t high = (c & 0xF0)>>4;
uint8_t low = c & 0x0F;
- dev->put_byte(dev->periph, hex[high]);
- dev->put_byte(dev->periph, hex[low]);
+ dev->put_byte(dev->periph, 0, hex[high]);
+ dev->put_byte(dev->periph, 0, hex[low]);
}
#define _PrintHex16(out_fun, c ) { \
diff --git a/sw/airborne/subsystems/datalink/w5100.c b/sw/airborne/subsystems/datalink/w5100.c
index 30df7d696b..684c0a400b 100644
--- a/sw/airborne/subsystems/datalink/w5100.c
+++ b/sw/airborne/subsystems/datalink/w5100.c
@@ -169,9 +169,10 @@ static inline uint16_t w5100_sock_get16(uint8_t _sock, uint16_t _reg)
}
// Functions for the generic device API
-static int true_function(struct w5100_periph *p __attribute__((unused)), uint8_t len __attribute__((unused))) { return true; }
-static void dev_transmit(struct w5100_periph *p __attribute__((unused)), uint8_t byte) { w5100_transmit(byte); }
-static void dev_send(struct w5100_periph *p __attribute__((unused))) { w5100_send(); }
+static int true_function(struct w5100_periph *p __attribute__((unused)), long *fd __attribute__((unused)), uint16_t len __attribute__((unused))) { return true; }
+static void dev_transmit(struct w5100_periph *p __attribute__((unused)), long fd __attribute__((unused)), uint8_t byte) { w5100_transmit(byte); }
+static void dev_transmit_buffer(struct w5100_periph *p __attribute__((unused)), long fd __attribute__((unused)), uint8_t *data, uint16_t len) { w5100_transmit_buffer(data, len); }
+static void dev_send(struct w5100_periph *p __attribute__((unused)), long fd __attribute__((unused))) { w5100_send(); }
static int dev_char_available(struct w5100_periph *p __attribute__((unused))) { return w5100_ch_available; }
static uint8_t dev_getch(struct w5100_periph *p __attribute__((unused)))
{
@@ -252,6 +253,7 @@ void w5100_init(void)
chip0.device.periph = (void *)(&chip0);
chip0.device.check_free_space = (check_free_space_t) true_function;
chip0.device.put_byte = (put_byte_t) dev_transmit;
+ chip0.device.put_buffer = (put_buffer_t) dev_transmit_buffer;
chip0.device.send_message = (send_message_t) dev_send;
chip0.device.char_available = (char_available_t) dev_char_available;
chip0.device.get_byte = (get_byte_t) dev_getch;
@@ -272,6 +274,14 @@ void w5100_transmit(uint8_t data)
chip0.tx_insert_idx[ chip0.curbuf ] = temp;
}
+void w5100_transmit_buffer(uint8_t *data, uint16_t len)
+{
+ int i;
+ for (i = 0; i < len; i++) {
+ w5100_transmit(data[i]);
+ }
+}
+
void w5100_send()
{
// Now send off spi transaction.
diff --git a/sw/airborne/subsystems/datalink/w5100.h b/sw/airborne/subsystems/datalink/w5100.h
index 9dd888831e..9eeb468680 100644
--- a/sw/airborne/subsystems/datalink/w5100.h
+++ b/sw/airborne/subsystems/datalink/w5100.h
@@ -66,6 +66,7 @@ extern struct w5100_periph chip0;
void w5100_init(void);
void w5100_transmit(uint8_t data);
+void w5100_transmit_buffer(uint8_t *data, uint16_t len);
uint16_t w5100_receive(uint8_t *buf, uint16_t len);
void w5100_send(void);
uint16_t w5100_rx_size(uint8_t _s);
diff --git a/sw/airborne/subsystems/gps/gps_furuno.c b/sw/airborne/subsystems/gps/gps_furuno.c
index bd3413946d..13e362f108 100644
--- a/sw/airborne/subsystems/gps/gps_furuno.c
+++ b/sw/airborne/subsystems/gps/gps_furuno.c
@@ -71,11 +71,12 @@ void nmea_configure(void)
for (i = furuno_cfg_cnt; i < GPS_FURUNO_SETTINGS_NB; i++) {
len = strlen(gps_furuno_settings[i]);
// Check if there is enough space to send the config msg
- if (GpsLinkDevice->check_free_space(GpsLinkDevice->periph, len + 6)) {
+ long fd = 0;
+ if (GpsLinkDevice->check_free_space(GpsLinkDevice->periph, &fd, len + 6)) {
crc = nmea_calc_crc(gps_furuno_settings[i], len);
sprintf(buf, "$%s*%02X\r\n", gps_furuno_settings[i], crc);
for (j = 0; j < len + 6; j++) {
- GpsLinkDevice->put_byte(GpsLinkDevice->periph, buf[j]);
+ GpsLinkDevice->put_byte(GpsLinkDevice->periph, fd, buf[j]);
}
furuno_cfg_cnt++;
} else {
diff --git a/sw/airborne/subsystems/gps/gps_mtk.c b/sw/airborne/subsystems/gps/gps_mtk.c
index 693b311f4b..6f6ce51607 100644
--- a/sw/airborne/subsystems/gps/gps_mtk.c
+++ b/sw/airborne/subsystems/gps/gps_mtk.c
@@ -432,7 +432,7 @@ void gps_mtk_register(void)
static void MtkSend_CFG(char *dat)
{
struct link_device *dev = &((MTK_GPS_LINK).device);
- while (*dat != 0) { dev->put_byte(dev->periph, *dat++); }
+ while (*dat != 0) { dev->put_byte(dev->periph, 0, *dat++); }
}
void gps_configure_uart(void)
diff --git a/sw/airborne/subsystems/gps/gps_piksi.c b/sw/airborne/subsystems/gps/gps_piksi.c
index dbb0c0f94c..db5430b10d 100644
--- a/sw/airborne/subsystems/gps/gps_piksi.c
+++ b/sw/airborne/subsystems/gps/gps_piksi.c
@@ -397,7 +397,7 @@ uint32_t gps_piksi_write(uint8_t *buff, uint32_t n, void *context __attribute__(
{
uint32_t i = 0;
for (i = 0; i < n; i++) {
- uart_put_byte(&(PIKSI_GPS_LINK), buff[i]);
+ uart_put_byte(&(PIKSI_GPS_LINK), 0, buff[i]);
}
return n;
}
diff --git a/sw/airborne/subsystems/gps/gps_ubx.c b/sw/airborne/subsystems/gps/gps_ubx.c
index 57462f693e..a7ee9acf61 100644
--- a/sw/airborne/subsystems/gps/gps_ubx.c
+++ b/sw/airborne/subsystems/gps/gps_ubx.c
@@ -280,15 +280,15 @@ restart:
static void ubx_send_1byte(struct link_device *dev, uint8_t byte)
{
- dev->put_byte(dev->periph, byte);
+ dev->put_byte(dev->periph, 0, byte);
gps_ubx.send_ck_a += byte;
gps_ubx.send_ck_b += gps_ubx.send_ck_a;
}
void ubx_header(struct link_device *dev, uint8_t nav_id, uint8_t msg_id, uint16_t len)
{
- dev->put_byte(dev->periph, UBX_SYNC1);
- dev->put_byte(dev->periph, UBX_SYNC2);
+ dev->put_byte(dev->periph, 0, UBX_SYNC1);
+ dev->put_byte(dev->periph, 0, UBX_SYNC2);
gps_ubx.send_ck_a = 0;
gps_ubx.send_ck_b = 0;
ubx_send_1byte(dev, nav_id);
@@ -299,9 +299,9 @@ void ubx_header(struct link_device *dev, uint8_t nav_id, uint8_t msg_id, uint16_
void ubx_trailer(struct link_device *dev)
{
- dev->put_byte(dev->periph, gps_ubx.send_ck_a);
- dev->put_byte(dev->periph, gps_ubx.send_ck_b);
- dev->send_message(dev->periph);
+ dev->put_byte(dev->periph, 0, gps_ubx.send_ck_a);
+ dev->put_byte(dev->periph, 0, gps_ubx.send_ck_b);
+ dev->send_message(dev->periph, 0);
}
void ubx_send_bytes(struct link_device *dev, uint8_t len, uint8_t *bytes)
diff --git a/sw/airborne/subsystems/imu/imu_um6.c b/sw/airborne/subsystems/imu/imu_um6.c
index a4a1efb372..e7b04e5f67 100644
--- a/sw/airborne/subsystems/imu/imu_um6.c
+++ b/sw/airborne/subsystems/imu/imu_um6.c
@@ -77,7 +77,7 @@ inline uint16_t UM6_calculate_checksum(uint8_t packet_buffer[], uint8_t packet_l
inline void UM6_send_packet(uint8_t *packet_buffer, uint8_t packet_length)
{
for (int i = 0; i < packet_length; i++) {
- uart_put_byte(&(UM6_LINK), packet_buffer[i]);
+ uart_put_byte(&(UM6_LINK), 0, packet_buffer[i]);
}
}
diff --git a/sw/airborne/subsystems/intermcu/intermcu_fbw.c b/sw/airborne/subsystems/intermcu/intermcu_fbw.c
index 5c3654e2b2..b4bebed41f 100644
--- a/sw/airborne/subsystems/intermcu/intermcu_fbw.c
+++ b/sw/airborne/subsystems/intermcu/intermcu_fbw.c
@@ -199,11 +199,11 @@ static void checkPx4RebootCommand(unsigned char b)
//send some magic back
//this is the same as the Pixhawk IO code would send
- intermcu_device->put_byte(intermcu_device->periph, 0x00);
- intermcu_device->put_byte(intermcu_device->periph, 0xe5);
- intermcu_device->put_byte(intermcu_device->periph, 0x32);
- intermcu_device->put_byte(intermcu_device->periph, 0x0a);
- intermcu_device->put_byte(intermcu_device->periph,
+ intermcu_device->put_byte(intermcu_device->periph, 0, 0x00);
+ intermcu_device->put_byte(intermcu_device->periph, 0, 0xe5);
+ intermcu_device->put_byte(intermcu_device->periph, 0, 0x32);
+ intermcu_device->put_byte(intermcu_device->periph, 0, 0x0a);
+ intermcu_device->put_byte(intermcu_device->periph, 0,
0x66); // dummy byte, seems to be necessary otherwise one byte is missing at the fmu side...
while (((struct uart_periph *)(intermcu_device->periph))->tx_running) {
diff --git a/sw/airborne/test/generic_uart_tunnel.c b/sw/airborne/test/generic_uart_tunnel.c
index d540a4c3f5..235c12e8d4 100644
--- a/sw/airborne/test/generic_uart_tunnel.c
+++ b/sw/airborne/test/generic_uart_tunnel.c
@@ -63,10 +63,10 @@ static inline void main_event_task(void)
mcu_event();
if (uart_char_available(&uart2)) {
- uart_put_byte(&uart1, uart_getch(&uart2));
+ uart_put_byte(&uart1, 0, uart_getch(&uart2));
}
if (uart_char_available(&uart1)) {
- uart_put_byte(&uart2, uart_getch(&uart1));
+ uart_put_byte(&uart2, 0, uart_getch(&uart1));
}
}
diff --git a/sw/airborne/test/mcu_periph/test_uart.c b/sw/airborne/test/mcu_periph/test_uart.c
index eb3d90fcce..75a5538757 100644
--- a/sw/airborne/test/mcu_periph/test_uart.c
+++ b/sw/airborne/test/mcu_periph/test_uart.c
@@ -53,19 +53,19 @@ static inline void main_periodic(void)
char ch;
#if USE_UART1
- uart_put_byte(&uart1, 'a');
+ uart_put_byte(&uart1, 0, 'a');
#endif
#if USE_UART2
- uart_put_byte(&uart2, 'b');
+ uart_put_byte(&uart2, 0, 'b');
#endif
#if USE_UART3
- uart_put_byte(&uart3, 'c');
+ uart_put_byte(&uart3, 0, 'c');
#endif
#if USE_UART4
- uart_put_byte(&uart4, 'd');
+ uart_put_byte(&uart4, 0, 'd');
#endif
#if USE_UART5
- uart_put_byte(&uart5, 'e');
+ uart_put_byte(&uart5, 0, 'e');
#endif
LED_OFF(1);
diff --git a/sw/airborne/test/mcu_periph/test_uart_echo.c b/sw/airborne/test/mcu_periph/test_uart_echo.c
index fe109732bf..b9d30e7420 100644
--- a/sw/airborne/test/mcu_periph/test_uart_echo.c
+++ b/sw/airborne/test/mcu_periph/test_uart_echo.c
@@ -71,7 +71,7 @@ static inline void main_periodic(void)
i = 0;
}
- uart_put_byte(&TEST_UART, foo[i]);
+ uart_put_byte(&TEST_UART, 0, foo[i]);
printf("%f, transmit: '%c'\n", get_sys_time_float(), foo[i]);
if (uart_char_available(&TEST_UART)) {
diff --git a/sw/airborne/test/mcu_periph/test_uart_send.c b/sw/airborne/test/mcu_periph/test_uart_send.c
index 85e586eb88..cb9a9bb738 100644
--- a/sw/airborne/test/mcu_periph/test_uart_send.c
+++ b/sw/airborne/test/mcu_periph/test_uart_send.c
@@ -70,8 +70,8 @@ static inline void main_periodic(void)
static uint8_t i = 0;
/* start "packet with zero */
- //uart_put_byte(&TEST_UART, 0);
- uart_put_byte(&TEST_UART, i);
+ //uart_put_byte(&TEST_UART, 0, 0);
+ uart_put_byte(&TEST_UART, 0, i);
/* print status every x cycles */
RunOnceEvery(1, printf("%f, transmit: '%d'\n", get_sys_time_float(), i););
diff --git a/sw/ext/pprzlink b/sw/ext/pprzlink
index c323e3cce1..c8cefaf8ce 160000
--- a/sw/ext/pprzlink
+++ b/sw/ext/pprzlink
@@ -1 +1 @@
-Subproject commit c323e3cce1adf72e5f495417a3ee7f73ab2eae91
+Subproject commit c8cefaf8ce4c6efe08681b45dd081b9c015aa864