Skip to main content

Overview

The Synheart Focus Dart/Flutter SDK provides real-time cognitive load inference from biosignals for cross-platform mobile applications.

Installation

Add to pubspec.yaml:
dependencies:
  synheart_focus: ^0.0.1
Install:
flutter pub get

Requirements

  • Flutter >= 3.10.0
  • Dart >= 3.0.0

Quick Start

Basic Usage

import 'package:synheart_focus/synheart_focus.dart';

void main() async {
  // Initialize the focus engine
  final engine = FocusEngine(
    config: const FocusConfig(
      windowSeconds: 60,  // 60-second window
      stepSeconds: 5,     // 5-second step
      minRrCount: 30,
    ),
  );

  // Initialize with ONNX model
  await engine.initialize(
    modelPath: 'assets/models/Gradient_Boosting.onnx',
    backend: 'onnx',
  );

  // Subscribe to focus updates
  engine.onUpdate.listen((result) {
    print('Focus Score: ${result.focusScore}');
    print('Focus State: ${result.focusState}');
    print('Confidence: ${result.confidence}');
  });

  // Provide HR data (BPM) - inference happens automatically when window is ready
  await engine.inferFromHrData(
    hrBpm: 72.0,
    timestamp: DateTime.now(),
  );
}

Real-Time Integration

import 'package:synheart_wear/synheart_wear.dart';
import 'package:synheart_focus/synheart_focus.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // Initialize SynheartWear SDK
  final synheartWear = SynheartWear(
    config: SynheartWearConfig.withAdapters({
      DeviceAdapter.appleHealthKit,
    }),
  );
  await synheartWear.requestPermissions(
    permissions: {PermissionType.heartRate},
  );
  await synheartWear.initialize();

  // Initialize Focus Engine
  final focusEngine = FocusEngine(
    config: const FocusConfig(
      windowSeconds: 60,
      stepSeconds: 5,
      minRrCount: 30,
    ),
  );
  await focusEngine.initialize(
    modelPath: 'assets/models/Gradient_Boosting.onnx',
    backend: 'onnx',
  );

  // Stream HR data from wearable and feed to focus engine
  synheartWear.streamHR(interval: const Duration(seconds: 1)).listen((metrics) {
    final hr = metrics.getMetric(MetricType.hr);
    if (hr != null) {
      focusEngine.inferFromHrData(
        hrBpm: hr.toDouble(),
        timestamp: DateTime.now(),
      ).then((result) {
        if (result != null) {
          print('Focus State: ${result.focusState}');
          print('Focus Score: ${result.focusScore}');
        }
      });
    }
  });
}

Supported Focus States

The library supports four cognitive state categories:
  • 🎯 Focused: Optimal cognitive state, high attention and productivity (Score: 70-100)
  • 😴 Bored: Low engagement, reduced attention (Score: 30-50)
  • 😰 Anxious: Heightened arousal, reduced efficiency (Score: 20-40)
  • 🔥 Overload: Cognitive overload, information processing difficulty (Score: 0-20)

API Reference

FocusEngine

Methods:
MethodDescriptionReturns
FocusEngine(config)Create engine with configFocusEngine
initialize({modelPath, backend})Load ONNX modelFuture<void>
inferFromHrData({hrBpm, timestamp})Push HR data and inferFuture<FocusResult?>
inferFromRrIntervals({rrIntervalsMs, hrMean, motionMagnitude})Infer from RR intervalsFuture<FocusResult?>
infer(hsiData, behaviorData)Legacy: infer from HSI + behaviorFuture<FocusState>
onUpdateStream of focus updatesStream<FocusState>
reset()Reset engine statevoid
dispose()Dispose resourcesvoid

FocusConfig

Parameters:
ParameterTypeDefault
windowSecondsint60
stepSecondsint5
minRrCountint30
enableSmoothingbooltrue
smoothingLambdadouble0.9
enableArtifactDetectionbooltrue
motionThresholddouble2.0
enableDebugLoggingboolfalse

FocusResult

Properties:
PropertyTypeDescription
focusStateStringDetected state: “Focused”, “Bored”, “Anxious”, or “Overload”
focusScoredoubleFocus score (0-100)
confidencedoubleConfidence (0-1)
probabilitiesMap<String, double>All 4 class probabilities
featuresMap<String, double>All 24 HRV features
timestampDateTimeWhen inferred
modelMap<String, dynamic>Model metadata
24 HRV Features Extracted:
  • Time Domain (9): mean_rr, std_rr, min_rr, max_rr, range_rr, rmssd, sdnn, nn50, pnn50
  • Frequency Domain (11): VLF, LF, HF, UHF powers, total_power, lf_hf_ratio, normalized powers
  • Statistical (4): skewness, kurtosis, median_rr, iqr

Resources

For comprehensive documentation, see the full README on GitHub.
Author: Synheart AI Team