import re
class getevent_to_sendevent(object):
operation_interval_time = 0
touch_device = "/dev/input/event0"
response_time = 0.05
@staticmethod
def hex_to_signed_dec(value):
bin_str = f"{bin(int(value, 16))[2:]}"
if bin_str[0] == "1":
return -(int('1' * len(bin_str), 2) - int(value, 16) + 1)
else:
return int(value, 16)
@classmethod
def get_sendevent_sh(cls, getevent_file, outfile):
"""
:param outfile: 输出sh文件
:return:
"""
mindiff = cls.operation_interval_time
data = {}
last_event_timestamp = None
with open(getevent_file, mode="r", encoding="utf-8") as f:
for line in f.readlines():
matched = re.findall(r"[\d.a-f]+", line, re.I)
if len(matched) == 4:
event_timestamp, event_type, event_code, event_value = matched
last_event_timestamp = last_event_timestamp or event_timestamp
if event_timestamp < last_event_timestamp:
break
event_type = cls.hex_to_signed_dec(event_type)
event_code = cls.hex_to_signed_dec(event_code)
event_value = cls.hex_to_signed_dec(event_value)
item = [str(event_type), str(event_code), str(event_value)]
if event_timestamp not in data:
data[event_timestamp] = [item]
else:
data[event_timestamp].append(item)
last_event_timestamp = event_timestamp
last_event_timestamp = None
items = []
def sendevent_line(event_list):
line = "\n".join(["" + "sendevent " + f"{cls.touch_device} " + " ".join(items) for items in event_list])
return line
if len(data) == 0:
raise Exception("no event")
with open(outfile, mode="w+", encoding="utf-8") as f:
for event_timestamp, event_list in data.items():
last_event_timestamp = last_event_timestamp or event_timestamp
if last_event_timestamp != event_timestamp:
diff = float(event_timestamp) - float(last_event_timestamp)
wait_time = diff - cls.response_time
if diff > mindiff and wait_time > 0:
line = sendevent_line(items)
f.write(f"{line}\n")
f.write(f"sleep {str(wait_time)[:5]}; ")
items = event_list
else:
items.extend(event_list)
else:
items.extend(event_list)
last_event_timestamp = event_timestamp
line = sendevent_line(items)
f.write(f"{line}\n")
f.write(f"exit")
if __name__ == '__main__':
print(getevent_to_sendevent.hex_to_signed_dec('81'))
"""
adb shell getevent -t /dev/input/event0
"""
"""
[ 2298.604349] 0001 014a 00000001
[ 2298.604349] 0003 0039 00000000
[ 2298.604349] 0003 0035 000003c1
[ 2298.604349] 0003 0036 00000411
[ 2298.604349] 0000 0000 00000000
[ 2298.737526] 0003 0039 ffffffff
"""
getevent_to_sendevent.get_sendevent_sh(getevent_file=r"E:\workspace\self\practice\test.txt", outfile="test.sh")