diff options
author | Jan Mulder <jlmulder@xs4all.nl> | 2017-07-11 13:41:21 +0200 |
---|---|---|
committer | Jan Mulder <jlmulder@xs4all.nl> | 2017-07-11 13:41:21 +0200 |
commit | 891128159352621f6694d6a62b0af6a451b32ec7 (patch) | |
tree | 6262f8e3448a42252ddc736c9ee0a98e1110720c /core/qtserialbluetooth.cpp | |
parent | b409e9fc91d87bbd5f88c53cf937cf73a66821f4 (diff) | |
download | subsurface-891128159352621f6694d6a62b0af6a451b32ec7.tar.gz |
OSTC over BLE: read a long as needed
See also b409e9fc91d87bbd5 and 709c1df2af4b87. The OSTC parser
cannot handle reads of single 20 byte BLE packages in serial mode.
Instead of doing a deeper down agressive read, we can read on
the serial level more subtile. As the parser is requesting a
specific number of bytes, we just read that number of bytes and
return them. As the 20 byte BLE packets do (obviously) not
align with the reading requirement of the libdc parser, a little
housekeeing needs to be done in between individual reads.
CAVEAT 1: In contradiction to 709c1df2af4b87, this is supposed to
work for all parsers that properly specify the needed bytes to fetch.
CAVEAT 2: All above tested on Linux Desktop with bluez stack.
Subsurface mobile is step 2.
Signed-off-by: Jan Mulder <jlmulder@xs4all.nl>
Diffstat (limited to 'core/qtserialbluetooth.cpp')
-rw-r--r-- | core/qtserialbluetooth.cpp | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/core/qtserialbluetooth.cpp b/core/qtserialbluetooth.cpp index 8b5779ce5..3a031e1ae 100644 --- a/core/qtserialbluetooth.cpp +++ b/core/qtserialbluetooth.cpp @@ -126,19 +126,34 @@ static dc_status_t ble_serial_read(dc_custom_io_t *io, void* data, size_t size, { Q_UNUSED(io) size_t len; + size_t received = 0; if (buffer.in_pos >= buffer.in_bytes) { + ble_serial_flush_write(); + } + + /* There is still unused/unread data in the input steam. + * So preseve it at the start of a new read. + */ + if (buffer.in_pos > 0) { + len = buffer.in_bytes - buffer.in_pos; + memcpy(buffer.in, buffer.in + buffer.in_pos, len); + buffer.in_pos = 0; + buffer.in_bytes = len; + } + + /* Read a long as requested in the size parameter */ + while ((buffer.in_bytes - buffer.in_pos) < size) { dc_status_t rc; - size_t received; - ble_serial_flush_write(); - rc = ble_serial_ops.packet_read(&ble_serial_ops, buffer.in, sizeof(buffer.in), &received); + rc = ble_serial_ops.packet_read(&ble_serial_ops, buffer.in + buffer.in_bytes, + sizeof(buffer.in) - buffer.in_bytes, &received); if (rc != DC_STATUS_SUCCESS) return rc; if (!received) return DC_STATUS_IO; - buffer.in_pos = 0; - buffer.in_bytes = received; + + buffer.in_bytes += received; } len = buffer.in_bytes - buffer.in_pos; |