use std::collections::{BTreeMap, HashMap};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum HapticIntensity {
Low,
Medium,
High,
}
impl Default for HapticIntensity {
fn default() -> Self {
Self::Medium
}
}
#[derive(Debug, Clone)]
pub struct HapticConfig {
pub actuator_count: u32,
pub frequency: u32,
pub max_intensity: HapticIntensity,
}
impl Default for HapticConfig {
fn default() -> Self {
Self {
actuator_count: 16,
frequency: 300,
max_intensity: HapticIntensity::High,
}
}
}
#[derive(Debug, Clone)]
pub struct HapticPattern {
pub name: String,
pub duration_ms: u32,
pub intensity: HapticIntensity,
pub waveform: Vec<f32>,
}
pub struct HapticFeedback {
config: HapticConfig,
active: bool,
}
impl HapticFeedback {
pub fn new(config: HapticConfig) -> Result<Self, HapticError> {
Ok(Self {
config,
active: false,
})
}
pub fn actuator_count(&self) -> u32 {
self.config.actuator_count
}
pub fn play_pattern(&mut self, pattern: &HapticPattern) -> Result<(), HapticError> {
self.active = true;
self.active = false;
Ok(())
}
pub fn stop(&mut self) {
self.active = false;
}
pub fn is_active(&self) -> bool {
self.active
}
pub fn set_actuator(&mut self, index: u32, intensity: f32) -> Result<(), HapticError> {
if index >= self.config.actuator_count {
return Err(HapticError::InvalidActuator(index));
}
Ok(())
}
}
#[derive(Debug, Clone)]
pub enum HapticError {
InitializationFailed(String),
PlaybackFailed(String),
InvalidActuator(u32),
DeviceNotFound,
}
impl std::fmt::Display for HapticError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::InitializationFailed(msg) => write!(f, "初始化失败: {}", msg),
Self::PlaybackFailed(msg) => write!(f, "播放失败: {}", msg),
Self::InvalidActuator(idx) => write!(f, "无效的执行器: {}", idx),
Self::DeviceNotFound => write!(f, "设备未找到"),
}
}
}
impl std::error::Error for HapticError {}