readFIFO method

Future<List<_SensorFIFOSample>> readFIFO()

Implementation

Future<List<_SensorFIFOSample>> readFIFO() async {
  int fifoReadPointer = readRegister('FIFO_READ', false);
  int fifoWritePointer = readRegister('FIFO_WRITE', false);
  if (fifoReadPointer == fifoWritePointer) {
    return [];
  }

  int numSamples = fifoWritePointer - fifoReadPointer;
  if (numSamples < 0) {
    numSamples = 32;
  }

  int bytesToRead = numSamples * 3 * ledsEnabled;
  List<int> data = [];
  while (bytesToRead > 0) {
    var bytesRead = readFrom('FIFO_DATA', min(bytesToRead, 32), false);
    data.addAll(bytesRead);
    if (captureSamples) {
      var logMessage = '${DateTime.now().microsecondsSinceEpoch - captureStartTimeMicros} | $bytesRead';
      await captureFile.writeAsString('$logMessage\n', flush: true, mode: FileMode.append);
      printWithTimestamp(logMessage);
    }
    bytesToRead -= 32;
  }

  clearFIFO(false);

  List<_SensorFIFOSample> result = [];

  for (int i = 0; i < data.length; i += 3 * ledsEnabled) {
    _SensorFIFOSample sample = _SensorFIFOSample();
    // 3 bytes for each LED : Red, IR, Green
    sample.rawRed = data[i] << 16 | data[i + 1] << 8 | data[i + 2];
    sample.rawIR = data[i + 3] << 16 | data[i + 4] << 8 | data[i + 5];
    if (ledsEnabled >= 3) {
      sample.rawGreen = data[i + 6] << 16 | data[i + 7] << 8 | data[i + 8];
    }

    result.add(sample);
  }

  return result;
}