getMapping static method

List<int> getMapping(
  1. int length,
  2. int start,
  3. DBCSignalType signalType
)

Returns a mapping to be used when decoding

This mapping contains the weight each bit will have towards a decoded value

Implementation

static List<int> getMapping(int length, int start, DBCSignalType signalType) {
  if (signalType == DBCSignalType.INTEL) {
    List<int> data = List.filled(64, 0);
    int exp = 0;
    List<int> indexes = List.filled(length, 0);
    int idxIdx = 0;
    while (idxIdx < indexes.length) {
      indexes[idxIdx++] = start++;
    }

    for (int byte = 0; byte < maxPayload; byte++) {
      int offset = byte * byteLen;
      for (int bit = offset; bit < offset + byteLen; bit++) {
        if (indexes.contains(bit)) {
          data[bit] = pow(2, exp++).toInt();
        }
      }
    }
    return data;
  } else {
    List<int> data = List.filled(64, 0);
    int exp = length - 1;

    int trueStart = start;
    if (start.remainder(byteLen) < length) {
      trueStart = start - start.remainder(byteLen);
    } else {
      trueStart = start - length + 1;
    }
    List<int> indexes = List.filled(length, 0);
    int idxIdx = 0;
    int rem = 0;
    rem = start.remainder(byteLen) == 0 ? 8 : start.remainder(byteLen) + 1;
    rem = min(rem, length);
    while (idxIdx < indexes.length) {
      indexes[idxIdx] = trueStart + rem - 1;
      idxIdx++;
      trueStart--;
      if ((trueStart + rem) % byteLen == 0) {
        trueStart += (byteLen + rem + (length - idxIdx).remainder(byteLen));
        rem = (length - idxIdx).remainder(byteLen) == 0
            ? 8
            : (length - idxIdx).remainder(byteLen);
      }
    }

    for (int byte = 0; byte < maxPayload; byte++) {
      int offset = byte * byteLen;
      for (int bit = byteLen - 1 + offset; bit >= offset; bit--) {
        if (indexes.contains(bit)) {
          data[bit] = pow(2, exp--).toInt();
        }
      }
    }
    return data;
  }
}