addCalibrationPoint method
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;
}
}