addCalibrationPoint method

  1. @override
Future<bool> addCalibrationPoint(
  1. CalibrationPoint point
)
override

Implementation

@override
Future<bool> addCalibrationPoint(CalibrationPoint point) async {
  if (!_isCalibrating) return false;

  try {
    if (_webGazerStarted && _hasWebGazerProperty()) {
      // Add calibration point to WebGazer multiple times for better accuracy
      // ---- 1) TRAIN PHASE ----
      const trainDuration = Duration(milliseconds: 1200);
      const trainTick = Duration(milliseconds: 100);
      final trainEnd = DateTime.now().add(trainDuration);

      while (DateTime.now().isBefore(trainEnd)) {
        try {
          _callWebGazerMethod('recordScreenPosition', [
            point.x.toJS,
            point.y.toJS,
          ]);
        } catch (_) {
          _evalJS(
            'webgazer.recordScreenPosition(${point.x}, ${point.y})',
          );
        }
        _calibTrainSamples++;
        await Future.delayed(trainTick);
      }

      // ---- 2) EVAL PHASE (no recording, just measure error) ----
      const evalDuration = Duration(milliseconds: 800);
      final evalEnd = DateTime.now().add(evalDuration);

      // listen temporarily to our gaze stream
      final sub = _gazeController.stream.listen((g) {
        if (!g.x.isFinite || !g.y.isFinite) return;
        final dx = g.x - point.x;
        final dy = g.y - point.y;
        _sumErrPx += math.sqrt(dx * dx + dy * dy);
        _calibEvalSamples++;
      });

      while (DateTime.now().isBefore(evalEnd)) {
        await Future.delayed(
          const Duration(milliseconds: 16),
        ); // ~60 Hz
      }
      await sub.cancel();
    }
    return true;
  } catch (e) {
    return false;
  }
}