mdbDecode method
Read one peripheral-to-master frame.
Implementation
MdbReply mdbDecode(Uint16List words) =>
_withStatus('rk_devices_mdb_decode', (status) {
final len = words.isEmpty ? 1 : words.length;
final input = calloc<Uint16>(len);
final kind = calloc<Uint8>(16);
const payloadCap = 288;
final payload = calloc<Uint8>(payloadCap);
final payloadLen = calloc<Size>();
final consumed = calloc<Size>();
try {
input.asTypedList(len).setAll(0, words);
final rc = _bindings.mdbDecode(
input,
words.length,
kind.cast<Utf8>(),
16,
payload,
payloadCap,
payloadLen,
consumed,
status,
_statusCap,
);
_check(rc, status, 'rk_devices_mdb_decode');
return switch (kind.cast<Utf8>().toDartString()) {
'ack' => MdbAck(consumed.value),
'nak' => MdbNak(consumed.value),
'ret' => MdbRet(consumed.value),
'incomplete' => const MdbIncomplete(),
'bad_checksum' => MdbBadChecksum(consumed.value),
'block' => MdbBlock(
consumed.value,
Uint8List.fromList(payload.asTypedList(payloadLen.value)),
),
final other => throw StateError('unknown MDB reply kind: $other'),
};
} finally {
calloc.free(input);
calloc.free(kind);
calloc.free(payload);
calloc.free(payloadLen);
calloc.free(consumed);
}
});