diff options
author | Jan Mulder <jlmulder@xs4all.nl> | 2017-09-22 10:03:42 +0200 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2017-09-22 02:30:58 -0700 |
commit | f442031fdd43c4ffc9cc2c10fe2c8efd604b1a53 (patch) | |
tree | 134604a4604d63f672b22475aa76d0019d5beb1c /core/qtserialbluetooth.cpp | |
parent | bb1df1218d83aaa2bcb503e53246e19ab2e29c62 (diff) | |
download | subsurface-f442031fdd43c4ffc9cc2c10fe2c8efd604b1a53.tar.gz |
BLE: big writes to connected DC (OSTC firmware)
Most writes to a connected DC are small, typically some
command bytes to get DC in download mode, or to set
some parameter. All this just worked over BLE,
however, sending a full firmware update (on an
OSTC device) failed, as the underlying BLE interface
can only handle small 20 byte BLE packets at once.
So, send max ble->packet_size chuncks at once.
Tested for the following cases (linux desktop with
OSTC3 over BLE):
1) normal download of dive data.
2) read and write settings from configure UI
3) update firmware (from 2.15 to 2.15)
And to my surprise, no flow control credit administration
is required here.
Signed-off-by: Jan Mulder <jlmulder@xs4all.nl>
Diffstat (limited to 'core/qtserialbluetooth.cpp')
-rw-r--r-- | core/qtserialbluetooth.cpp | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/core/qtserialbluetooth.cpp b/core/qtserialbluetooth.cpp index ca721d78c..8e5fac499 100644 --- a/core/qtserialbluetooth.cpp +++ b/core/qtserialbluetooth.cpp @@ -169,15 +169,26 @@ static dc_status_t ble_serial_write(dc_custom_io_t *io, const void* data, size_t size_t transferred = 0; ble_serial_flush_read(); + + /* + * Most writes to a connected DC are small, typically some command bytes to get + * DC in download mode, or to set some parameter. All this just worked over BLE, + * however, sending a full firmware update (on an OSTC device) failed, as the + * underlying BLE interface can only handle small 20 byte BLE packets at once. + * + * So, send max ble->packet_size chuncks at once. + */ while (size) { - size_t len = sizeof(buffer.out) - buffer.out_bytes; + size_t len = sizeof(buffer.out) - transferred; + if (len > io->packet_size) + len = io->packet_size; if (len > size) len = size; memcpy(buffer.out + buffer.out_bytes, data, len); buffer.out_bytes += len; - if (buffer.out_bytes == sizeof(buffer.out)) { + if (buffer.out_bytes <= io->packet_size || buffer.out_bytes == size) { rc = ble_serial_flush_write(); if (rc != DC_STATUS_SUCCESS) break; |