forked from baskerville/plato
/
remarkable.rs
114 lines (103 loc) · 4.15 KB
/
remarkable.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
use fnv::FnvHashMap;
use fnv::FnvHashSet;
use device::CURRENT_DEVICE;
use geom::Point;
use std::mem;
use input::*;
use std::sync::mpsc::{self, Sender, Receiver};
extern crate libremarkable;
use self::libremarkable::framebuffer::common::{MTWIDTH, MTHEIGHT};
struct TouchState {
position: Point,
pressure: i32,
status: FingerStatus,
track_id: i32,
}
impl Default for TouchState {
fn default() -> Self {
TouchState {
pressure: 0,
position: Point::default(),
status: FingerStatus::Down,
track_id: 0,
}
}
}
pub fn remarkable_parse_device_events(rx: &Receiver<InputEvent>, ty: &Sender<DeviceEvent>, dims: (u32, u32)) {
let (scr_width, scr_height) = dims;
let mut slot = 0;
let mut fingers: FnvHashMap<i32, TouchState> = FnvHashMap::default();
let proto = CURRENT_DEVICE.proto;
let mut tc = MULTI_TOUCH_CODES_B;
while let Ok(evt) = rx.recv() {
// println!("{:.6} {} {} {}", seconds(evt.time), evt.kind, evt.code, evt.value);
if evt.kind == EV_ABS {
if evt.code == ABS_MT_SLOT {
// println!("ABS_MT_SLOT {}", evt.value);
slot = evt.value;
if fingers.contains_key(&slot) {
// println!("Finger moves: {}", slot);
fingers.get_mut(&slot).unwrap().status = FingerStatus::Motion;
} else {
fingers.insert(slot, TouchState::default());
// println!("Finger added: {}", slot);
}
} else if evt.code == tc.x {
if let Some(ts) = fingers.get_mut(&slot) {
let pos = MTWIDTH as i32 - 1 - evt.value;
ts.position.x = (pos as f32 / MTWIDTH as f32 * scr_width as f32) as i32;
}
} else if evt.code == tc.y {
if let Some(ts) = fingers.get_mut(&slot) {
let pos = MTHEIGHT as i32 - 1 - evt.value;
ts.position.y = (pos as f32 / MTHEIGHT as f32 * scr_height as f32) as i32;
}
} else if evt.code == tc.pressure {
if let Some(ts) = fingers.get_mut(&slot) {
ts.pressure = evt.value;
}
} else if evt.code == ABS_MT_FINGER_COUNT {
//fixme do nothing
} else if evt.code == ABS_MT_TRACKING_ID && evt.value == -1 {
// println!("Finger up: {} (via TRACKING_ID)", slot);
if let Some(ts) = fingers.get_mut(&slot) {
ts.status = FingerStatus::Up;
}
} else if evt.code == ABS_MT_TRACKING_ID {
if slot == 0 {
fingers.insert(slot, TouchState::default());
}
if fingers.contains_key(&slot) {
fingers.get_mut(&slot).unwrap().track_id = evt.value;
}
} else {
// println!("UNKNOWN EV_ABS CODE: {} {}", evt.code, evt.value);
}
} else if evt.kind == EV_SYN && evt.code == SYN_REPORT {
// println!("Finger reporting: #{}", fingers.len());
fingers.retain(|slot, ts| {
ty.send(DeviceEvent::Finger {
id: *slot,
time: seconds(evt.time),
status: ts.status,
position: ts.position,
}).unwrap();
//once we reported down, for one finger, next reports should be up
if ts.status == FingerStatus::Down {
ts.status = FingerStatus::Motion;
}
ts.status != FingerStatus::Up
});
} else if evt.kind == EV_KEY {
// println!("BUTTON PRESSED: CODE {}", evt.code);
ty.send(DeviceEvent::Button {
time: seconds(evt.time),
code: ButtonCode::from_raw(evt.code),
status: if evt.value == 1 { ButtonStatus::Pressed } else
{ ButtonStatus::Released },
}).unwrap();
} else {
println!("UNKNOWN CODE: {} {} {}", evt.kind, evt.code, evt.value);
}
}
}