mdbDecode method

MdbReply mdbDecode(
  1. Uint16List words
)

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);
      }
    });