headTrackingFusionEntry function

void headTrackingFusionEntry(
  1. dynamic mainSendPortArg
)

Head-tracking worker using the exact same fusion and signs as the main thread. Messages carry sensor acquisition timestamps and a reset revision so queued pre-recenter output cannot rotate a freshly recentered camera. Protocol:

  • 0, sensitivity, predictionMs, offsetX, offsetY, pitchGain, damping, revision
  • 1, accelX, accelY, accelZ
  • 2, gyroX, gyroY, timestampUs, revision
  • 3, revision resets temporal state, retaining measured gravity.
  • 4, revision invalidates a stale or unavailable gravity reference. Emits revision, dYaw, dPitch, absolutePitchOrNull.

Implementation

void headTrackingFusionEntry(dynamic mainSendPortArg) {
  final mainSendPort = mainSendPortArg as SendPort;
  final receivePort = ReceivePort();
  final fusion = HeadTrackingFusion();
  var revision = 0;
  mainSendPort.send(receivePort.sendPort);
  receivePort.listen((message) {
    if (message is! List) return;
    switch (message[0]) {
      case 0:
        fusion
          ..sensitivity = (message[1] as num).toDouble()
          ..predictionMs = (message[2] as num).toDouble()
          ..offsetX = (message[3] as num).toDouble()
          ..offsetY = (message[4] as num).toDouble()
          ..pitchGain = (message[5] as num).toDouble()
          ..jitterDamping = message[6] as bool;
        revision = message[7] as int;
      case 1:
        fusion.updateGravity(
          (message[1] as num).toDouble(),
          (message[2] as num).toDouble(),
          (message[3] as num).toDouble(),
        );
      case 2:
        if (message[4] != revision) return;
        if (fusion.addGyroscope(
          (message[1] as num).toDouble(),
          (message[2] as num).toDouble(),
          message[3] as int,
        )) {
          mainSendPort.send([
            revision,
            fusion.dYaw,
            fusion.dPitch,
            fusion.absolutePitch,
          ]);
        }
      case 3:
        revision = message[1] as int;
        fusion.reset();
      case 4:
        revision = message[1] as int;
        fusion.clearGravity();
    }
  });
}