use std::fmt;
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BciReading {
pub timestamp: DateTime<Utc>,
pub delta_hz: f64,
pub theta_hz: f64,
pub alpha_hz: f64,
pub beta_hz: f64,
pub gamma_hz: f64,
pub attention_index: f64,
pub meditation_index: f64,
}
impl fmt::Display for BciReading {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"δ={:.1} θ={:.1} α={:.1} β={:.1} γ={:.1} Hz | attn={:.2} med={:.2}",
self.delta_hz,
self.theta_hz,
self.alpha_hz,
self.beta_hz,
self.gamma_hz,
self.attention_index,
self.meditation_index,
)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AccelerometerReading {
pub timestamp: DateTime<Utc>,
pub x: f64,
pub y: f64,
pub z: f64,
pub magnitude: f64,
pub activity_state: ActivityState,
}
impl fmt::Display for AccelerometerReading {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"x={:+.2} y={:+.2} z={:.2} m/s² | {:?}",
self.x, self.y, self.z, self.activity_state,
)
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum ActivityState {
Stationary,
Walking,
Running,
Gesture,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FusedReading {
pub timestamp: DateTime<Utc>,
pub sequence_id: u64,
pub bci: BciReading,
pub accelerometer: AccelerometerReading,
pub cognitive_load: f64,
pub emotional_valence: f64,
pub arousal_level: f64,
}
impl fmt::Display for FusedReading {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"#{} cogLoad={:.2} valence={:+.2} arousal={:.2}",
self.sequence_id, self.cognitive_load, self.emotional_valence, self.arousal_level,
)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InferenceResult {
pub timestamp: DateTime<Utc>,
pub sequence_id: u64,
pub fused_reading: FusedReading,
pub cognitive_state: String,
pub recommendations: Vec<String>,
pub alert_level: AlertLevel,
pub raw_llm_response: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum AlertLevel {
Normal,
Elevated,
Critical,
}
impl fmt::Display for AlertLevel {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
AlertLevel::Normal => write!(f, "✅ Normal"),
AlertLevel::Elevated => write!(f, "⚠️ Elevated"),
AlertLevel::Critical => write!(f, "🚨 CRITICAL"),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SignedOutput {
pub inference_result: InferenceResult,
pub payload_hash_hex: String,
pub signature_hex: String,
pub public_key_hex: String,
pub signed_at: DateTime<Utc>,
}