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