chiark / gitweb /
gui: gamepad dead spot logic etc, can set direction
authorIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sun, 13 Feb 2011 18:48:36 +0000 (18:48 +0000)
committerIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sun, 13 Feb 2011 18:48:36 +0000 (18:48 +0000)
hostside/gui

index 47a0e87464d5d023c2de8d2914053fd12364f8fe..b88cf8c34487837cb00d369752f0d7cf847dae81 100755 (executable)
@@ -858,24 +858,65 @@ proc ib-evcmd/wheelmouse {devid target} {
 proc ib-create/gamepad {devid wunique desc} {
     ib-speedw-new $devid $wunique $desc
     upvar #0 input/$devid in
-    set in(tractbrake_deadzone) 0.2
+    set in(main_deadzone_y) 0.2
+    set in(main_deadzone_x) 0.5
+    set in(main_x) 0
+    set in(main_y) 0
+    set in(main_active) {}
 }
 
-proc ib-ev/tractbrake/init {devid} {
-    upvar #0 input-params/$devid pa
+proc ib-ev/gamepad/EV_ABS/ABS_THROTTLE {devid value} {
+    ib-gamepad-main $devid y $value
+}
+proc ib-ev/gamepad/EV_ABS/ABS_RUDDER {devid value} {
+    ib-gamepad-main $devid x $value
 }
 
-proc ib-ev/gamepad/EV_ABS/ABS_THROTTLE {devid value} {
+proc ib-gamepad-main {devid xy value} {
     upvar #0 input/$devid in
-    if {abs($value) < $in(tractbrake_deadzone)} {
-       speedw-userinput-tractbrake $in(speedw) 0 0
-       return
+    if { abs($value) < $in(main_deadzone_$xy) } { set value 0 }
+    set last $in(main_$xy)
+    set in(main_$xy) $value
+
+    set active {}
+    foreach txy {x y} {
+       if { $in(main_$txy) } {
+           if {[string length $active]} return
+           set active $txy
+       }
     }
-    if {$value < 0} {
-       speedw-userinput-tractbrake $in(speedw) [expr {-$value}] 0
-    } {
-       speedw-userinput-tractbrake $in(speedw) 0 $value
+    debug [format "ib-gamepad-main %s %s %6.4f,%6.4f %s %s" \
+              $devid $xy $in(main_x) $in(main_y) $in(main_active) $active]
+    if {![string length $active]} {
+       if {[string length $in(main_active)]} {
+           speedw-userinput-tractbrake $in(speedw) 0 0
+       }
+    } else {
+       if {[string length $in(main_active)] &&
+           [string compare $active $in(main_active)]} {
+           return
+       }
+       set value $in(main_$active)
+       switch -exact $active {
+           y {
+               if {$value < 0} {
+                   speedw-userinput-tractbrake $in(speedw) [expr {-$value}] 0
+               } {
+                   speedw-userinput-tractbrake $in(speedw) 0 $value
+               }
+           }
+           x {
+               if { abs($value) < 0.75 } return
+               if {[string length $in(main_active)]} return
+               speedw-train-direction $in(speedw) \
+                   [expr { $value < 0 ? "backwards" : "forwards" }]
+           }
+           default {
+               error "$active ?"
+           }
+       }
     }
+    set in(main_active) $active
 }
 
 #----- ebuyer wireless keyboard