1const LINEAR1_END: u8 = 127;
2const LINEAR1_END_WEIGHT: f32 = 32.0;
3const LINEAR2_END_WEIGHT: f32 = 4096.0;
4
5pub fn intensity_to_weight(intensity: u8) -> f32 {
7 if intensity <= LINEAR1_END {
8 intensity as f32 / LINEAR1_END as f32 * LINEAR1_END_WEIGHT
9 } else {
10 ((intensity - LINEAR1_END) as f32 / (255 - LINEAR1_END) as f32)
11 * (LINEAR2_END_WEIGHT - LINEAR1_END_WEIGHT)
12 + LINEAR1_END_WEIGHT
13 }
14}
15pub fn weight_to_intensity(weight: f32) -> u8 {
17 if weight >= LINEAR1_END_WEIGHT {
18 ((weight - LINEAR1_END_WEIGHT) / (LINEAR2_END_WEIGHT - LINEAR1_END_WEIGHT)
19 * ((255 - LINEAR1_END) as f32)) as u8
20 } else {
21 (weight / LINEAR1_END_WEIGHT * LINEAR1_END as f32).round() as u8
22 }
23}
24
25#[test]
26fn check_intensity_to_weight() {
27 for i in 0..=255 {
28 println!("{}", intensity_to_weight(i));
29 }
30}