Add serial read-length handling.

This commit is contained in:
px4dev 2013-05-22 22:09:00 +02:00
parent 437d9e4180
commit 308ec6001a
2 changed files with 13 additions and 6 deletions

View File

@ -36,7 +36,8 @@
/**
* @file protocol.h
*
* PX4IO interface protocol.
* PX4IO interface protocol
* ========================
*
* Communication is performed via writes to and reads from 16-bit virtual
* registers organised into pages of 255 registers each.
@ -63,19 +64,21 @@
* readable pages to be densely packed. Page numbers do not need to be
* packed.
*
* PX4IO I2C interface notes:
* PX4IO I2C interface notes
* -------------------------
*
* Register read/write operations are mapped directly to PX4IO register
* read/write operations.
*
* PX4IO Serial interface notes:
* PX4IO Serial interface notes
* ----------------------------
*
* The MSB of the page number is used to distinguish between read and
* write operations. If set, the operation is a write and additional
* data is expected to follow in the packet as for I2C writes.
*
* If clear, the packet is expected to contain a single byte giving the
* number of bytes to be read. PX4IO will respond with a packet containing
* number of registers to be read. PX4IO will respond with a packet containing
* the same header (page, offset) and the requested data.
*
* If a read is requested when PX4IO does not have buffer space to store

View File

@ -107,7 +107,9 @@ serial_callback(void *arg, const void *data, unsigned length)
return;
}
/* it's a read */
/* it's a read - must contain length byte */
if (length != 3)
return;
uint16_t *registers;
unsigned count;
@ -118,10 +120,12 @@ serial_callback(void *arg, const void *data, unsigned length)
if (registers_get(message[0], message[1], &registers, &count) < 0)
count = 0;
/* fill buffer with message */
/* fill buffer with message, limited by length */
#define TX_MAX ((sizeof(tx_buf) - 2) / 2)
if (count > TX_MAX)
count = TX_MAX;
if (count > message[2])
count = message[2];
memcpy(&tx_buf[2], registers, count * 2);
/* try to send the message */