]> sigrok.org Git - libsigrok.git/commit
serial: add support for optional "RX chunk" callback
authorGerhard Sittig <redacted>
Wed, 3 Apr 2019 05:52:00 +0000 (07:52 +0200)
committerUwe Hermann <redacted>
Tue, 4 Jun 2019 16:59:04 +0000 (18:59 +0200)
commitd47872480164724f348ceedc8af2f39fc2e9fce4
tree7cb9495131ebe8c32df64945e710655c4e2a357d
parent2fba14d05a9dd65fc873b59c438f62b87ab5e2d9
serial: add support for optional "RX chunk" callback

The previous implementation provided a raw input stream of RX data from
read() calls to device drivers. This works great with genuine COM ports,
as well as with most setups which involve simple "cable expanders".

Recent additions of alternative transports (serial over HID and BLE)
added more protocol layers to the setup, and some device drivers are
reported to depend on the very framing of these transports: Mooshimeter
cares about individual BLE notification "frames", and the information
cannot get derived from the payload bytes. Some HID based cables which
obscure the DMM chips' serial protocol, or some HID based setups which
the serial layer does not abstract away as "a cable" may suffer from
similar requirements (do some drivers require access to individual HID
reports? Ikalogic? Victor DMM?).

Add support for an optional "RX chunk callback" which takes precedence
over "mere payload byte streams". Instead of returning payload bytes
from read() calls, the serial layer can call an application defined
routine and pass data bytes in the very framing which the physical
transport happens to use.

It's still up to the implementation of the specific transport whether
the callback approach is supported, and whether the wire's framing is
obeyed or whether payload data keeps getting provided as one raw stream.
It's also implementation dependent whether data reception transparently
occurs in background, or whether callers need to periodically "stimulate"
data reception by calling read or check routines which happen to call
back into the caller should RX data become available.

The approach that got implemented here is not universally applicable,
but serves those specific environments that were identified so far.
src/libsigrok-internal.h
src/serial.c