summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/hwdata.c49
-rw-r--r--src/hwdata.h22
-rw-r--r--src/state.c9
3 files changed, 59 insertions, 21 deletions
diff --git a/src/hwdata.c b/src/hwdata.c
index 9e384dc..e76bcd8 100644
--- a/src/hwdata.c
+++ b/src/hwdata.c
@@ -26,17 +26,42 @@ void init_hwdata(struct HWData *hw)
26 memset(hw, 0, sizeof(struct HWData)); 26 memset(hw, 0, sizeof(struct HWData));
27} 27}
28 28
29static void set_value(struct HWData *hw, int code, int value)
30{
31 if (hw->nread < DIM_FINGER) {
32 (&hw->finger[hw->nread].touch_major)[code] = value;
33 SETBIT(hw->mread[hw->nread], code);
34 }
35}
36
37static void accept_finger(struct HWData *hw)
38{
39 if (hw->nread < DIM_FINGER &&
40 GETBIT(hw->mread[hw->nread], BIT_MT_POSITION_X) &&
41 GETBIT(hw->mread[hw->nread], BIT_MT_POSITION_Y)) {
42 hw->mask[hw->nread] = hw->mread[hw->nread];
43 hw->nfinger = ++hw->nread;
44 }
45 if (hw->nread < DIM_FINGER)
46 hw->mread[hw->nread] = 0;
47}
48
49static void accept_packet(struct HWData *hw)
50{
51 hw->nread = 0;
52 hw->mread[hw->nread] = 0;
53}
54
29int read_hwdata(struct HWData *hw, const struct input_event* ev) 55int read_hwdata(struct HWData *hw, const struct input_event* ev)
30{ 56{
31 switch (ev->type) { 57 switch (ev->type) {
32 case EV_SYN: 58 case EV_SYN:
33 switch (ev->code) { 59 switch (ev->code) {
34 case SYN_REPORT: 60 case SYN_REPORT:
35 hw->nread = 0; 61 accept_packet(hw);
36 return 1; 62 return 1;
37 case SYN_MT_REPORT: 63 case SYN_MT_REPORT:
38 hw->nread++; 64 accept_finger(hw);
39 hw->nfinger = hw->nread;
40 break; 65 break;
41 } 66 }
42 break; 67 break;
@@ -63,32 +88,30 @@ int read_hwdata(struct HWData *hw, const struct input_event* ev)
63 } 88 }
64 break; 89 break;
65 case EV_ABS: 90 case EV_ABS:
66 if (hw->nread == DIM_FINGER)
67 break;
68 switch (ev->code) { 91 switch (ev->code) {
69 case ABS_MT_TOUCH_MAJOR: 92 case ABS_MT_TOUCH_MAJOR:
70 hw->finger[hw->nread].touch_major = ev->value; 93 set_value(hw, BIT_MT_TOUCH_MAJOR, ev->value);
71 break; 94 break;
72 case ABS_MT_TOUCH_MINOR: 95 case ABS_MT_TOUCH_MINOR:
73 hw->finger[hw->nread].touch_minor = ev->value; 96 set_value(hw, BIT_MT_TOUCH_MINOR, ev->value);
74 break; 97 break;
75 case ABS_MT_WIDTH_MAJOR: 98 case ABS_MT_WIDTH_MAJOR:
76 hw->finger[hw->nread].width_major = ev->value; 99 set_value(hw, BIT_MT_WIDTH_MAJOR, ev->value);
77 break; 100 break;
78 case ABS_MT_WIDTH_MINOR: 101 case ABS_MT_WIDTH_MINOR:
79 hw->finger[hw->nread].width_minor = ev->value; 102 set_value(hw, BIT_MT_WIDTH_MINOR, ev->value);
80 break; 103 break;
81 case ABS_MT_ORIENTATION: 104 case ABS_MT_ORIENTATION:
82 hw->finger[hw->nread].orientation = ev->value; 105 set_value(hw, BIT_MT_ORIENTATION, ev->value);
83 break; 106 break;
84 case ABS_MT_PRESSURE: 107 case ABS_MT_PRESSURE:
85 hw->finger[hw->nread].pressure = ev->value; 108 set_value(hw, BIT_MT_PRESSURE, ev->value);
86 break; 109 break;
87 case ABS_MT_POSITION_X: 110 case ABS_MT_POSITION_X:
88 hw->finger[hw->nread].position_x = ev->value; 111 set_value(hw, BIT_MT_POSITION_X, ev->value);
89 break; 112 break;
90 case ABS_MT_POSITION_Y: 113 case ABS_MT_POSITION_Y:
91 hw->finger[hw->nread].position_y = ev->value; 114 set_value(hw, BIT_MT_POSITION_Y, ev->value);
92 break; 115 break;
93 } 116 }
94 break; 117 break;
diff --git a/src/hwdata.h b/src/hwdata.h
index 38ffc6b..aa589e0 100644
--- a/src/hwdata.h
+++ b/src/hwdata.h
@@ -34,6 +34,16 @@
34#define MT_BUTTON_HWHEEL_LEFT 5 34#define MT_BUTTON_HWHEEL_LEFT 5
35#define MT_BUTTON_HWHEEL_RIGHT 6 35#define MT_BUTTON_HWHEEL_RIGHT 6
36 36
37#define BIT_MT_TOUCH_MAJOR 0
38#define BIT_MT_TOUCH_MINOR 1
39#define BIT_MT_WIDTH_MAJOR 2
40#define BIT_MT_WIDTH_MINOR 3
41#define BIT_MT_ORIENTATION 4
42#define BIT_MT_PRESSURE 5
43#define BIT_MT_POSITION_X 6
44#define BIT_MT_POSITION_Y 7
45#define BIT_MT_CNT 8
46
37struct FingerData { 47struct FingerData {
38 int touch_major, touch_minor; 48 int touch_major, touch_minor;
39 int width_major, width_minor; 49 int width_major, width_minor;
@@ -41,8 +51,20 @@ struct FingerData {
41 int position_x, position_y; 51 int position_x, position_y;
42}; 52};
43 53
54/**
55 * struct HWData - hardware reads
56 *
57 * @finger: finger data
58 * @mask: bits corresponding to data actually read (readonly)
59 * @mread: bits corresponding to data in progress (writeonly)
60 * @button: bitmask of buttons
61 * @nfinger: number of fingers actually read (readonly)
62 * @nread: number of fingers in progress (writeonly)
63 *
64 */
44struct HWData { 65struct HWData {
45 struct FingerData finger[DIM_FINGER]; 66 struct FingerData finger[DIM_FINGER];
67 unsigned mask[DIM_FINGER], mread[DIM_FINGER];
46 unsigned button; 68 unsigned button;
47 int nfinger, nread; 69 int nfinger, nread;
48}; 70};
diff --git a/src/state.c b/src/state.c
index 774828a..31eca70 100644
--- a/src/state.c
+++ b/src/state.c
@@ -36,16 +36,9 @@ static int fincmp(const void *a, const void *b)
36 return ((struct FingerState *)a)->id - ((struct FingerState *)b)->id; 36 return ((struct FingerState *)a)->id - ((struct FingerState *)b)->id;
37} 37}
38 38
39/* seander@cs.stanford.edu */
40inline unsigned abs32(int x)
41{
42 int const m = x >> 31;
43 return (x + m) ^ m;
44}
45
46inline int abs15(int x) 39inline int abs15(int x)
47{ 40{
48 return 32767 & abs32(x); 41 return 32767 & (x < 0 ? -x : x);
49} 42}
50 43
51/* abslute scale is assumed to fit in 15 bits */ 44/* abslute scale is assumed to fit in 15 bits */