#!/usr/bin/tclsh8.3
# usage:
-# eventrun <config filename> <command to run evdev-manip>
+# eventrun [<options>] <config filename> <command to run evdev-manip>
-wip wip
-
-proc do_scancode {sc} {
- upvar #0 evmap($sc) em
+proc do_key {key} {
+ upvar #0 evmap($key) em
if {[info exists em]} {
- puts "=$sc $em"
+ puts "+ $key $em"
uplevel #0 $em
} else {
- puts "=$sc ???"
+ puts "- $key"
}
}
-proc onevtest {} {
- global evtest evmap state scancode
- if {[gets $evtest l] < 0} {
- if {![eof $evtest]} return
+proc onevgen {} {
+ global evgen evmap state scancode
+ if {[gets $evgen l] < 0} {
+ if {![eof $evgen]} return
exit 0
}
- set sl $state-$l
- if {[regexp {^I-Testing.*interrupt to exit} $sl]} {
- puts "* $sl"
- set state 0
- upvar #0 evmap(INIT) em
- if {[info exists em]} {
- uplevel #0 $em
- }
+ if {[regexp {^\S+ (?:opened|0) } $l]} return
+ if {![regexp {^\S+ 1 (.*)$} $l dummy key]} {
+ puts stderr "unknown >$l<"
return
}
- if {[regexp {^I.*} $sl]} {
- puts " $sl"
- return
- }
- if {![regexp {^Event\: time \d+\.\d+,( .*)} $l dummy r]} {
- puts " $sl"
- return
- }
- set sr [string trimright $state-$r]
- if {[regexp {^[01]- type 4 \(Misc\)\, code 4 \(ScanCode\), value (\w+)$} \
- $sr dummy scancode]} {
- puts ">$scancode $sl"
- set state 1
- } elseif {[regexp {^1- type 1 \(Key\), code \d+ \(\w+\), value (\w+)$}\
- $sr dummy updown]} {
- if {[regexp {[^0]} $updown]} {
- do_scancode $scancode
- } else {
- puts "!$scancode $sl"
- }
- set scancode ??
- set state 0
- } elseif {[regexp {^0- type 20 \(Repeat\),} $sr]} {
- puts " $sl"
- return
- } elseif {[regexp {^0\- \-\-+ Report Sync \-\-+$} $sr]} {
- puts " $sl"
- return
- } elseif {[regexp {^1\- \-\-+ Report Sync \-\-+$} $sr]} {
- if {![regexp {0000$} $scancode]} { do_scancode _$scancode }
- puts "_ $sl"
- set scancode ??
- set state 0
- } else {
- puts stderr "unknown >$sl|$sr<"
- }
+ do_key $key
}
-proc setup {} {
- global evtest state scancode
- set kbdinput [exec /etc/find-kbd-event < /proc/bus/input/devices]
- set cmdl [list /u/ian/things/Bessar/evtest /dev/input/$kbdinput]
- lappend cmdl 2>@ stderr
- set evtest [open |$cmdl r]
- set state I
- set scancode ??
- fconfigure $evtest -blocking no
- fileevent $evtest readable onevtest
+proc setup {cmdl} {
+ global evgen state
+ lappend cmdl 2>@ stderr --stdin-monitor
+ set evgen [open |$cmdl r+]
+ fconfigure $evgen -blocking no
+ fileevent $evgen readable onevgen
}
proc bgerror {m} {
set f [open $fn r]
while {[gets $f l] >= 0} {
set l [string trim $l]
- if {[regexp {^_?(\w+)\s+(.*)$} $l dummy scancode action]} {
- set evmap($scancode) $action
-
-wip wip
- } elseif {[regexp {^\#} $l] || ![regexp {\S} $l]} {
- } else {
+ if {[regexp {^\#} $l]} {
+ continue
+ } elseif {![regexp {\S} $l]} {
+ continue
+ } elseif {![regexp {^(\S+)\s*(.*)$} $l dummy k action]} {
error "bad spec line $l"
}
+ if {[regexp {^([A-Z][A-Z0-9_]+)$} $k dummy key]} {
+ set key "EV KEY KEY $key"
+ } elseif {[regexp {^([A-Z]+)\-([A-Z][A-Z0-9_]+)} $k dummy type key]} {
+ set key "EV KEY $type $key"
+ } elseif {[regexp {^([0-9a-f]+)-(\w+)-(\w*)-(\w+)} $k dummy \
+ ap au fp fu]} {
+ if {![string length $fp]} { set fp $ap }
+ set key "0x$ap $au 0x$fp $fu"
+ } elseif {[regexp {^0x|^[A-Z]} $k] && [llength [split $k -]] > 2} {
+ set key [join [split $k -] " "]
+ } elseif {[regexp {^\@init$} $k]} {
+ uplevel #0 $action
+ continue
+ } else {
+ error "unknown key syntax $l"
+ }
+ set evmap($key) $action
}
}
-parsespecinput [lindex $argv 0]
-setup
+set specfile [lindex $argv 0]
+if {[string match -* $specfile]} { error "no options understood" }
+set evgenerator [lrange $argv 1 end]
+if {![llength $evgenerator]} { error "no event generator specified" }
+
+parsespecinput $specfile
+setup $evgenerator
vwait end