int offset_y;
int report_rate;
int max_support_points;
+ unsigned int known_ids;
char name[EDT_NAME_LEN];
int i, type, x, y, id;
int offset, tplen, datalen, crclen;
int error;
+ unsigned int active_ids = 0, known_ids = tsdata->known_ids;
+ long released_ids;
+ int b = 0;
switch (tsdata->version) {
case EDT_M06:
input_mt_slot(tsdata->input, id);
if (input_mt_report_slot_state(tsdata->input, MT_TOOL_FINGER,
- type != TOUCH_EVENT_UP))
+ type != TOUCH_EVENT_UP)) {
touchscreen_report_pos(tsdata->input, &tsdata->prop,
x, y, true);
+ active_ids |= BIT(id);
+ } else {
+ known_ids &= ~BIT(id);
+ }
+ }
+
+ /* One issue with the device is the TOUCH_UP message is not always
+ * returned. Instead track which ids we know about and report when they
+ * are no longer updated
+ */
+ released_ids = known_ids & ~active_ids;
+ for_each_set_bit_from(b, &released_ids, tsdata->max_support_points) {
+ input_mt_slot(tsdata->input, b);
+ input_mt_report_slot_inactive(tsdata->input);
}
+ tsdata->known_ids = active_ids;
input_mt_report_pointer_emulation(tsdata->input, true);
input_sync(tsdata->input);