summaryrefslogtreecommitdiffstats
path: root/core/qtserialbluetooth.cpp
diff options
context:
space:
mode:
authorGravatar Jan Mulder <jlmulder@xs4all.nl>2017-07-11 13:41:21 +0200
committerGravatar Jan Mulder <jlmulder@xs4all.nl>2017-07-11 13:41:21 +0200
commit891128159352621f6694d6a62b0af6a451b32ec7 (patch)
tree6262f8e3448a42252ddc736c9ee0a98e1110720c /core/qtserialbluetooth.cpp
parentb409e9fc91d87bbd5f88c53cf937cf73a66821f4 (diff)
downloadsubsurface-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.cpp25
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;