From 9fb4c0edf47fedad266447e801778fb4e2b9267f Mon Sep 17 00:00:00 2001 From: lenn Date: Tue, 7 Jul 2026 21:13:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9=E4=BA=94=E4=B8=AA=E6=89=8B=E6=8C=87?= =?UTF-8?q?=E5=88=86=E5=88=AB=E8=BF=9B=E8=A1=8C=E6=9F=A5=E8=A1=A8=E6=8F=92?= =?UTF-8?q?=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app.rs | 189 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 186 insertions(+), 3 deletions(-) diff --git a/src/app.rs b/src/app.rs index b13b484..5b2ff31 100644 --- a/src/app.rs +++ b/src/app.rs @@ -667,14 +667,22 @@ fn update_hand_signal_histories( raw_values: &[u32], ) { let mut offset = 0usize; - for (history, sample_count) in histories.iter_mut().zip(HAND_FORCE_SEGMENT_COUNTS) { + for (index, (history, sample_count)) in histories.iter_mut().zip(HAND_FORCE_SEGMENT_COUNTS).enumerate() { let raw_total = raw_values .get(offset..offset + sample_count) .unwrap_or(&[]) .iter() .fold(0_u64, |sum, value| sum + *value as u64) .min(u32::MAX as u64) as u32; - let force = raw_to_g1(raw_total).min(25.6); + let force = match index { + 0 => raw_to_g1(raw_total).min(20.6), + 1 => raw_to_g2(raw_total).min(20.6), + 2 => raw_to_g3(raw_total).min(20.6), + 3 => raw_to_g4(raw_total).min(20.6), + 4 => raw_to_g5(raw_total).min(20.6), + _ => raw_to_gd(raw_total).min(20.6), + }; + // let force = raw_to_g1(raw_total).min(25.6); let force = if force <= 0.1 { 0.0 } else { force }; history.push(force); @@ -686,7 +694,7 @@ fn update_hand_signal_histories( } } -fn raw_to_g1(raw: u32) -> f32 { +fn raw_to_gd(raw: u32) -> f32 { const RAW: [u32; 12] = [ 0, 21382, 108507, 123183, 147405, 171105, 192395, 250443, 231423, 350560, 396616, 429444, ]; @@ -721,6 +729,181 @@ fn raw_to_g1(raw: u32) -> f32 { (FORCE_CENTI_N[left] + ratio * (FORCE_CENTI_N[right] - FORCE_CENTI_N[left])) / 100.0 } +fn raw_to_g1(raw: u32) -> f32 { + const RAW: [u32; 11] = [ + 0, 20239, 121454, 171532, 223968, 241467, 293500, 322744, 436294, 523275, 633083, + ]; + const FORCE_CENTI_N: [f32; 11] = [ + 0.0, 57.0, 257.0, 357.0, 457.0, 557.0, 657.0, 857.0, 1057.0, 1557.0, 2057.0, + ]; + + if raw <= RAW[0] { + return FORCE_CENTI_N[0] / 100.0; + } + + if raw >= RAW[RAW.len() - 1] { + return FORCE_CENTI_N[FORCE_CENTI_N.len() - 1] / 100.0; + } + + let mut left = 0usize; + let mut right = RAW.len() - 1; + while left + 1 < right { + let mid = (left + right) / 2; + if RAW[mid] <= raw { + left = mid; + } else { + right = mid; + } + } + + let raw_left = RAW[left] as f32; + let raw_right = RAW[right] as f32; + let span = (raw_right - raw_left).max(1.0); + let ratio = (raw as f32 - raw_left) / span; + + (FORCE_CENTI_N[left] + ratio * (FORCE_CENTI_N[right] - FORCE_CENTI_N[left])) / 100.0 +} + +fn raw_to_g2(raw: u32) -> f32 { + const RAW: [u32; 11] = [ + 0, 5398, 52896, 86945, 122546, 145001, 165933, 220575, 241578, 350285, 449530, + ]; + const FORCE_CENTI_N: [f32; 11] = [ + 0.0, 57.0, 257.0, 357.0, 457.0, 557.0, 657.0, 857.0, 1057.0, 1557.0, 2057.0, + ]; + + if raw <= RAW[0] { + return FORCE_CENTI_N[0] / 100.0; + } + + if raw >= RAW[RAW.len() - 1] { + return FORCE_CENTI_N[FORCE_CENTI_N.len() - 1] / 100.0; + } + + let mut left = 0usize; + let mut right = RAW.len() - 1; + while left + 1 < right { + let mid = (left + right) / 2; + if RAW[mid] <= raw { + left = mid; + } else { + right = mid; + } + } + + let raw_left = RAW[left] as f32; + let raw_right = RAW[right] as f32; + let span = (raw_right - raw_left).max(1.0); + let ratio = (raw as f32 - raw_left) / span; + + (FORCE_CENTI_N[left] + ratio * (FORCE_CENTI_N[right] - FORCE_CENTI_N[left])) / 100.0 +} + +fn raw_to_g3(raw: u32) -> f32 { + const RAW: [u32; 11] = [ + 0, 4920, 35945, 46499, 65566, 69613, 89971, 122321, 146384, 203426, 269474, + ]; + const FORCE_CENTI_N: [f32; 11] = [ + 0.0, 57.0, 257.0, 357.0, 457.0, 557.0, 657.0, 857.0, 1057.0, 1557.0, 2057.0, + ]; + + if raw <= RAW[0] { + return FORCE_CENTI_N[0] / 100.0; + } + + if raw >= RAW[RAW.len() - 1] { + return FORCE_CENTI_N[FORCE_CENTI_N.len() - 1] / 100.0; + } + + let mut left = 0usize; + let mut right = RAW.len() - 1; + while left + 1 < right { + let mid = (left + right) / 2; + if RAW[mid] <= raw { + left = mid; + } else { + right = mid; + } + } + + let raw_left = RAW[left] as f32; + let raw_right = RAW[right] as f32; + let span = (raw_right - raw_left).max(1.0); + let ratio = (raw as f32 - raw_left) / span; + + (FORCE_CENTI_N[left] + ratio * (FORCE_CENTI_N[right] - FORCE_CENTI_N[left])) / 100.0 +} + +fn raw_to_g4(raw: u32) -> f32 { + const RAW: [u32; 11] = [ + 0, 11346, 92229, 139822, 182282, 220004, 259898, 307303, 377922, 460755, 587834, + ]; + const FORCE_CENTI_N: [f32; 11] = [ + 0.0, 57.0, 257.0, 357.0, 457.0, 557.0, 657.0, 857.0, 1057.0, 1557.0, 2057.0, + ]; + + if raw <= RAW[0] { + return FORCE_CENTI_N[0] / 100.0; + } + + if raw >= RAW[RAW.len() - 1] { + return FORCE_CENTI_N[FORCE_CENTI_N.len() - 1] / 100.0; + } + + let mut left = 0usize; + let mut right = RAW.len() - 1; + while left + 1 < right { + let mid = (left + right) / 2; + if RAW[mid] <= raw { + left = mid; + } else { + right = mid; + } + } + + let raw_left = RAW[left] as f32; + let raw_right = RAW[right] as f32; + let span = (raw_right - raw_left).max(1.0); + let ratio = (raw as f32 - raw_left) / span; + + (FORCE_CENTI_N[left] + ratio * (FORCE_CENTI_N[right] - FORCE_CENTI_N[left])) / 100.0 +} + +fn raw_to_g5(raw: u32) -> f32 { + const RAW: [u32; 11] = [ + 0, 10081, 40910, 49944, 64291, 68299, 79282, 97767, 113567, 140520, 167132, + ]; + const FORCE_CENTI_N: [f32; 11] = [ + 0.0, 57.0, 257.0, 357.0, 457.0, 557.0, 657.0, 857.0, 1057.0, 1557.0, 2057.0, + ]; + + if raw <= RAW[0] { + return FORCE_CENTI_N[0] / 100.0; + } + + if raw >= RAW[RAW.len() - 1] { + return FORCE_CENTI_N[FORCE_CENTI_N.len() - 1] / 100.0; + } + + let mut left = 0usize; + let mut right = RAW.len() - 1; + while left + 1 < right { + let mid = (left + right) / 2; + if RAW[mid] <= raw { + left = mid; + } else { + right = mid; + } + } + + let raw_left = RAW[left] as f32; + let raw_right = RAW[right] as f32; + let span = (raw_right - raw_left).max(1.0); + let ratio = (raw as f32 - raw_left) / span; + + (FORCE_CENTI_N[left] + ratio * (FORCE_CENTI_N[right] - FORCE_CENTI_N[left])) / 100.0 +} + fn paint_split_viewport_shell( ui: &egui::Ui, rect: egui::Rect,