[PATCH evemu 11/12] python: move event string parsing over to the python bits
Peter Hutterer
peter.hutterer at who-t.net
Tue Jul 22 16:42:49 PDT 2014
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
python/evemu/__init__.py | 55 +++++++++++++++++++++++++++++++++++++++++
src/convert-old-dumps-to-1.1.py | 26 ++-----------------
2 files changed, 57 insertions(+), 24 deletions(-)
diff --git a/python/evemu/__init__.py b/python/evemu/__init__.py
index ea0901d..eae8c35 100644
--- a/python/evemu/__init__.py
+++ b/python/evemu/__init__.py
@@ -30,6 +30,12 @@ import evemu.event_names
__all__ = ["Device"]
+class InvalidEventStringError(Exception):
+ def __init__(self, s):
+ self.s = s
+ def __str__(self):
+ return self.s
+
class InputEvent(object):
__slots__ = 'sec', 'usec', 'type', 'code', 'value'
@@ -40,6 +46,55 @@ class InputEvent(object):
self.code = code
self.value = value
+ def __str__(self):
+ type, code, value = self.type, self.code, self.value
+
+ s = "E: %d.%d %04x %04x %04d\t" % (self.sec, self.usec, type, code, value)
+ if type == event_names.ev_map["EV_SYN"]:
+ if code == event_names.syn_map["SYN_MT_REPORT"]:
+ s += "# ++++++++++++ %s (%d) ++++++++++" % (event_names.event_get_code_name(type, code), value)
+ else:
+ s += "# ------------ %s (%d) ----------" % (event_names.event_get_code_name(type, code), value)
+ else:
+ s += "# %s / %-20s %d" % (event_names.event_get_type_name(type), event_names.event_get_code_name(type, code), value)
+ return s
+
+ @classmethod
+ def from_string(cls, s):
+ m = re.match(r"E: (\d+)\.(\d*) ([a-fA-f0-9]+) ([a-fA-f0-9]+) (-?\d+)", s)
+ if not m:
+ raise InvalidEventStringError(s)
+
+ sec, usec, type, code, value = m.groups()
+ sec = int(sec)
+ usec = int(usec)
+ type = int(type, 16)
+ code = int(code, 16)
+ value = int(value)
+ return InputEvent(sec, usec, type, code, value)
+
+ @classmethod
+ def events(cls, data):
+ """
+ Return a list of events, parsed from the input data
+
+ Attributes:
+ - data list of strings, string, or file-like object containing the events
+ """
+
+ if type(data) == str:
+ lines = StringIO.StringIO(data).readlines()
+ elif hasattr(data, "readlines"):
+ lines = data.readlines()
+ else:
+ lines = data
+
+ for line in lines:
+ try:
+ yield InputEvent.from_string(line)
+ except InvalidEventStringError:
+ pass
+
class Device(object):
"""
Encapsulates a raw kernel input event device, either an existing one as
diff --git a/src/convert-old-dumps-to-1.1.py b/src/convert-old-dumps-to-1.1.py
index 4caf4df..7b773af 100755
--- a/src/convert-old-dumps-to-1.1.py
+++ b/src/convert-old-dumps-to-1.1.py
@@ -17,33 +17,10 @@ import sys
import evemu
import evemu.event_names
-def convert_events(lines):
- event_re = re.compile(r"E: (\d+\.\d*) ([a-fA-f0-9]+) ([a-fA-f0-9]+) (-?\d*)\n")
-
- for line in lines:
- m = event_re.match(line)
- if m:
- t, type, code, value = m.groups()
- type = int(type, 16)
- code = int(code, 16)
- value = int(value, 0)
- print("E: %s %04x %04x %04d\t" % (t, type, code, value))
- desc = ""
- if type == event_names.ev_map["EV_SYN"]:
- if code == syn_map["SYN_MT_REPORT"]:
- print("# ++++++++++++ %s (%d) ++++++++++" % (event_names.event_get_code_name(type, code), value))
- else:
- print("# ------------ %s (%d) ----------" % (event_names.event_get_code_name(type, code), value))
- else:
- print("# %s / %-20s %d" % (event_names.event_get_type_name(type), event_names.event_get_code_name(type, code), value))
- else:
- print(line)
-
def usage(args):
print("%s mydev.desc [mydev.events]" % os.path.basename(args[0]))
return 1
-
if __name__ == "__main__":
if len(sys.argv) < 2:
exit(usage(sys.argv))
@@ -53,4 +30,5 @@ if __name__ == "__main__":
d = None
if len(sys.argv) > 2:
with open(sys.argv[2]) as f:
- convert_events(f.readlines())
+ for e in evemu.InputEvent.events(f):
+ print(e)
--
1.9.3
More information about the Input-tools
mailing list