[openfirmware] r931 - dev/olpc/touchpad
svn at openfirmware.info
svn at openfirmware.info
Fri Sep 12 02:48:18 CEST 2008
Author: wmb
Date: 2008-09-12 02:48:18 +0200 (Fri, 12 Sep 2008)
New Revision: 931
Modified:
dev/olpc/touchpad/touchpad.fth
Log:
OLPC touchpad selftest - added support for standard mouse mode for
use with Synaptics touchpad.
Modified: dev/olpc/touchpad/touchpad.fth
===================================================================
--- dev/olpc/touchpad/touchpad.fth 2008-09-11 08:57:08 UTC (rev 930)
+++ dev/olpc/touchpad/touchpad.fth 2008-09-12 00:48:18 UTC (rev 931)
@@ -19,6 +19,25 @@
;
+h# f800.f800 constant red
+h# 07e0.07e0 constant green
+h# 001f.001f constant blue
+h# ffe0.ffe0 constant yellow
+h# f81f.f81f constant magenta
+h# 07ff.07ff constant cyan
+h# ffff.ffff constant white
+h# 0000.0000 constant black
+
+variable pixcolor
+
+h# 4 value y-offset
+0 value fbadr
+0 value maxx
+0 value maxy
+0 value /line
+2 value /pixel
+
+
\ This program depends on the following routines from the
\ existing Open Firmware mouse driver:
@@ -70,16 +89,16 @@
\ "identify" command; the response (for a mouse-like device) is 0x00
: alps-prefix ( -- ) 3 0 do h# f2 read1 drop loop ;
-variable mode
+variable mode \ 0 - unknown 1 - GS 2 - PT 3 - mouse
\ Ref: 5.2.10 (3) of Hybrid-GP2B-T-1.pdf
: gs-only ( -- )
- mode @ 1 = if exit then
+ mode @ dup 1 = swap 3 = or if exit then
alps-prefix mouse1:1 \ f2 f2 f2 e6
1 mode !
;
: pt-only ( -- )
- mode @ 2 = if exit then
+ mode @ dup 2 = swap 3 = or if exit then
alps-prefix mouse2:1 \ f2 f2 f2 e7
2 mode !
;
@@ -88,7 +107,14 @@
\ : simultaneous-mode ( -- ) alps-prefix 2 set-resolution ;
\ Put the device into advanced mode and enable it
-: start ( -- ) 0 mode ! setup advanced-mode stream-on ;
+: start ( -- )
+ setup
+ olpc-touchpad? if
+ 0 mode ! advanced-mode stream-on
+ else
+ remote-mode 3 mode !
+ then
+;
\ I have been unable to get this to work. The response is always
\ 64 0 <something>, which doesn't agree with the spec.
@@ -237,7 +263,7 @@
h# ff of decode-gs true exit endof
\ h# eb of decode-simultaneous exit endof
h# aa of
- 0 d# 28 at-xy red-screen white-letters
+ 0 d# 26 at-xy red-screen white-letters
." Unexpected touchpad reset"
white-screen black-letters
cr
@@ -256,10 +282,30 @@
again
;
+variable mouse-x
+variable mouse-y
+
+: clipx ( delta -- x ) mouse-x @ + 0 max maxx min dup mouse-x ! ;
+: clipy ( delta -- y ) mouse-y @ + 0 max maxy min dup mouse-y ! ;
+
\ Try to receive a GS-format packet. If one arrives within
\ 20 milliseconds, return true and the decoded information.
\ Otherwise return false.
: pad? ( -- false | x y z tap? true )
+ mode @ 3 = if
+ poll-event if ( dx dy buttons )
+ >r ( dx dy )
+ swap clipx swap negate clipy 0 ( x y z )
+ 0 r@ 1 and or ( x y z tap )
+ r> 4 and 0<> 2 and or ( x y z tap' )
+ 8 or ( x y z tap' )
+ true
+ else
+ false
+ then
+ exit
+ then
+
poll-touchpad 0= if false exit then
gx @ gy @ gz @ taps @ 2 lshift switches @ or true
@@ -295,31 +341,13 @@
key? until
;
-h# f800.f800 constant red
-h# 07e0.07e0 constant green
-h# 001f.001f constant blue
-h# ffe0.ffe0 constant yellow
-h# f81f.f81f constant magenta
-h# 07ff.07ff constant cyan
-h# ffff.ffff constant white
-h# 0000.0000 constant black
-
-variable pixcolor
-
-h# 4 value y-offset
-0 value fbadr
-0 value maxx
-0 value maxy
-0 value /line
-2 value /pixel
-
: button ( color x -- )
maxy d# 50 - d# 200 d# 30 " fill-rectangle" $call-screen
;
: background ( -- )
fbadr maxy 2+ /line * erase
- 0 d# 30 at-xy ." Touchpad test. Both buttons clears screen. Type a key to exit" cr
- 0 d# 20 at-xy ." Pressure: "
+ 0 d# 27 at-xy ." Touchpad test. Both buttons clears screen. Type a key to exit" cr
+ mode @ 3 <> if 0 d# 20 at-xy ." Pressure: " then
;
: track-init ( -- )
screen-ih package(
@@ -330,7 +358,13 @@
: show-up ( x y z -- ) 3drop d# 10 d# 20 at-xy ." UP " ;
-: show-pressure ( -- ) push-decimal d# 10 d# 20 at-xy 3 u.r pop-base ;
+: show-pressure ( z -- )
+ mode @ 3 = if
+ drop
+ else
+ push-decimal d# 10 d# 20 at-xy 3 u.r pop-base
+ then
+;
: dot ( x y -- )
y-offset + maxy min /line * ( x line-adr )
More information about the openfirmware
mailing list