diff --git a/data_processing/1.py b/data_processing/1.py new file mode 100644 index 0000000..3fd7127 --- /dev/null +++ b/data_processing/1.py @@ -0,0 +1,11 @@ +import matplotlib.pyplot as plt + +y = [0, 160, 260, 360, 460, 560, 660, 860, 1060, 1560, 2060] +x = [0, 74602, 105503, 131459, 153512, 172041, 193794, 218947, 240580, 295118, 332346] + +plt.plot(x, y) +plt.title("Simple Line Plot") +plt.xlabel("g") +plt.ylabel("raw data") + +plt.show() diff --git a/data_processing/~$第一次粗标定.xlsx b/data_processing/~$第一次粗标定.xlsx new file mode 100644 index 0000000..6c66d32 Binary files /dev/null and b/data_processing/~$第一次粗标定.xlsx differ diff --git a/doc/第一次粗标定.xlsx b/data_processing/第一次粗标定.xlsx similarity index 100% rename from doc/第一次粗标定.xlsx rename to data_processing/第一次粗标定.xlsx diff --git a/src-tauri/src/serial_core/codecs/tactile_a.rs b/src-tauri/src/serial_core/codecs/tactile_a.rs index 1bc8388..c8fb858 100644 --- a/src-tauri/src/serial_core/codecs/tactile_a.rs +++ b/src-tauri/src/serial_core/codecs/tactile_a.rs @@ -241,7 +241,8 @@ impl FrameHandler for TactileAHandler { match frame { TactileAFrame::Rep(rep) => { let vals = TactileACodec::parse_data_frame(&rep.payload)?; - + let g = raw_to_g1(vals.iter().sum::() as u32); + debug!("force is {g}"); Ok(Some(vals)) } _ => Ok(None), @@ -249,12 +250,47 @@ impl FrameHandler for TactileAHandler { } } +fn raw_to_g1(raw: u32) -> f64 { + const X: [u32; 11] = [ + 0, 74602, 105503, 131459, 153512, 172041, 193794, 218947, 240580, 295118, 332346, + ]; -fn trans_data_2_n(val: i32) -> i32 { - if val <= 74602 { - val / 466 - } else if val > 74602 && val <= 105503 { - + const Y: [f64; 11] = [ + 0.0, 160.0, 260.0, 360.0, 460.0, 560.0, 660.0, 860.0, 1060.0, 1560.0, 2060.0, + ]; + + let n = X.len(); + if raw <= X[0] { + return Y[0]; + } + if raw >= X[n - 1] { + return Y[n - 1]; + } + + let mut left = 0; + let mut right = n - 1; + + while left + 1 < right { + let mid = (left + right) / 2; + if raw < X[mid] { + right = mid; + } else { + left = mid; + } + } + + let ratio = (raw - X[left]) as f64 / (X[right] - X[left]) as f64; + Y[left] + ratio * (Y[right] - Y[left]) / 100.0 +} + +#[cfg(test)] +mod test { + use crate::serial_core::codecs::tactile_a::raw_to_g1; + #[test] + fn raw_to_g1_test() { + let input = 198000; + let g = raw_to_g1(input); + println!("input {input} -> g {g}"); } }