processData method
Future<List<WTResult> >
processData({
- required List<
SensorEvent> accData, - required List<
SensorEvent> gyroData, - required List<
SensorEvent> magData, - required double accActualRate,
- required double gyroActualRate,
- required double magActualRate,
override
Processes raw sensor data and returns a list of WTResults.
accData
- List of accelerometer sensor events.
gyroData
- List of gyroscope sensor events.
magData
- List of magnetometer sensor events.
accActualRate
- Actual sampling rate of accelerometer.
gyroActualRate
- Actual sampling rate of gyroscope.
magActualRate
- Actual sampling rate of magnetometer.
Returns a list of processed WTResults.
Implementation
@override
Future<List<WTResult>> processData({
required List<SensorEvent> accData,
required List<SensorEvent> gyroData,
required List<SensorEvent> magData,
required double accActualRate,
required double gyroActualRate,
required double magActualRate,
}) async {
List<SensorEvent> processedAccData = [];
// Process only accelerometer y-axis for chest placement
if (config.useAccelerometer && config.accelerometerAxes.contains(SensorAxis.y)) {
// Decimate data to target sampling rate
processedAccData = decimateData(
accData,
config.accelerometerSamplingRate,
accActualRate,
);
}
// Detect all steps in the processed data
final steps = detectSteps(acc: processedAccData.map((e) => e.y - 9.8).toList(), threshold: 0.4);
// Calculate measurement window (20% to 80% of target steps)
final firstStepIndex = (measure.numberOfSteps * 0.2).round();
final lastStepIndex = (measure.numberOfSteps * 0.8).round();
// Get timestamps for measurement window
final firstMeasuredStep = processedAccData[steps[firstStepIndex].timestampIndex].timestamp;
final lastMeasuredStep = processedAccData[steps[lastStepIndex].timestampIndex].timestamp;
// Calculate time for the measured step range
final time = lastMeasuredStep.difference(firstMeasuredStep).inMilliseconds / 1e3;
if (kDebugMode) {
print('Detected time: $time');
}
return [
WTResult.fromResults(
time: time,
),
];
}