locus_core_rs/application/services/
calibration_service.rs1use std::sync::Arc;
2
3use anyhow::Result;
4
5use crate::domain::contracts::NodeStore;
6use crate::domain::models::{AvecState, CalibrationResult};
7
8pub struct CalibrationService {
9 store: Arc<dyn NodeStore>,
10}
11
12impl CalibrationService {
13 pub fn new(store: Arc<dyn NodeStore>) -> Self {
15 Self { store }
16 }
17
18 pub async fn calibrate_async(
20 &self,
21 session_id: &str,
22 stability: f32,
23 friction: f32,
24 logic: f32,
25 autonomy: f32,
26 trigger: &str,
27 ) -> Result<CalibrationResult> {
28 let current = AvecState {
29 stability,
30 friction,
31 logic,
32 autonomy,
33 };
34
35 let previous = self.store.get_last_avec_async(session_id).await?;
36 let history = self.store.get_trigger_history_async(session_id).await?;
37 let is_first = previous.is_none();
38 let baseline = previous.unwrap_or(current);
39
40 self.store
41 .store_calibration_async(session_id, current, trigger)
42 .await?;
43
44 let mut trigger_history = history;
45 trigger_history.push(trigger.to_string());
46
47 Ok(CalibrationResult {
48 previous_avec: baseline,
49 delta: current.drift_from(baseline),
50 drift_classification: current.classify_drift(baseline),
51 trigger: trigger.to_string(),
52 trigger_history,
53 is_first_calibration: is_first,
54 })
55 }
56}