[openfirmware] [commit] r2169 - cpu/arm/olpc/1.75

repository service svn at openfirmware.info
Fri Feb 4 02:42:30 CET 2011


Author: wmb
Date: Fri Feb  4 02:42:30 2011
New Revision: 2169
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/2169

Log:
XO-1.75 touchscreen demo - zooms and pans the screen image with gestures.

Added:
   cpu/arm/olpc/1.75/pinch.fth
Modified:
   cpu/arm/olpc/1.75/fw.bth

Modified: cpu/arm/olpc/1.75/fw.bth
==============================================================================
--- cpu/arm/olpc/1.75/fw.bth	Thu Feb  3 21:05:52 2011	(r2168)
+++ cpu/arm/olpc/1.75/fw.bth	Fri Feb  4 02:42:30 2011	(r2169)
@@ -164,6 +164,9 @@
 fload ${BP}/cpu/x86/pc/olpc/via/copynand.fth
 fload ${BP}/cpu/arm/olpc/1.75/exc7200-touchscreen.fth    \ Touchscreen driver and diagnostic
 
+fload ${BP}/cpu/arm/olpc/1.75/pinch.fth  \ Touchscreen gestures
+: pinch  " pinch" screen-ih $call-method  ;
+
 fload ${BP}/cpu/arm/mmp2/keypad.fth
 [ifndef] cl2-a1
 stand-init: keypad

Added: cpu/arm/olpc/1.75/pinch.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/arm/olpc/1.75/pinch.fth	Fri Feb  4 02:42:30 2011	(r2169)
@@ -0,0 +1,188 @@
+\ See license at end of file
+purpose: Zoom and pan the text scroller with touchscreen gestures
+
+dev screen
+: dst-size@  ( -- w h )  h# 108 lcd@  lwsplit  ;
+: dst-size!  ( w h -- )  wljoin h# 108 lcd!  ;
+: dst-offset@  ( -- x y )  h# 100 lcd@  lwsplit  ;
+: dst-offset!  ( x y -- )  wljoin h# 100 lcd!  ;
+: scr-size@  ( -- w h )  h# 104 lcd@  lwsplit  ;
+: half-size  ( -- w h )  dst-size@ swap 2/ swap 2/  ;
+: image-center-xy  ( -- x y )  half-size  dst-offset@ xy+  ;
+
+: xy-max  ( x1 y1 x2 y2 -- xmax ymax  )  rot max  >r  max r>  ;
+: xy-min  ( x1 y1 x2 y2 -- xmin ymin  )  rot min  >r  min r>  ;
+d# 60 d# 80 2constant min-wh
+: set-dst-size  ( w h -- )
+   scr-size@ xy-min  min-wh xy-max  dst-size!
+;
+\ This is an attempt to delay the operation until "retrace", but
+\ it doesn't work very well; it's currently worse than nothing.
+: wait-frame  ( -- )
+   0 h# 1c4 lcd!  begin  h# 1c4 lcd@  until 
+;
+: set-dst-offset  ( x y -- )
+   \ Keep the full image on-screen
+   0 0  xy-max          ( x' y' )
+
+   2dup dst-size@ xy+   ( x y  extent-x extent-y )
+   scr-size@ 2swap xy-  ( x y  margin-x margin-y )
+   \ A negative margin means part of the image is off the screen
+   \ Positive margin is okay; we only adjust if margin is negative.
+   0 0  xy-min          ( x y  adjust-x adjust-y )
+   xy+                  ( x' y' )
+
+   dst-offset!          ( )
+;
+: resize-image  ( xnum ynum xdenom ydenom old-w old-h -- )
+   2>r             ( xnum xdenom  ynum ydenom  r: w h )
+   rot swap        ( xnum xdenom  ynum ydenom  r: w h )
+   2r>             ( xnum xdenom  ynum ydenom  w h )
+   swap >r         ( xnum xdenom  ynum ydenom  h  r: w )
+   -rot */         ( xnum xdenom  h'  r: w )
+   r> swap >r      ( xnum xdenom  w   r: h' )
+   -rot */         ( w'  r: h' )
+   r>              ( w' h' )
+   set-dst-size    ( )
+;
+: rx  ( 6*n -- 6*n )  0 5  do i pick .d -1 +loop  cr resize-image  ;
+: arx ." A "  rx resize-image  ;
+: brx ." B "  rx resize-image  ;
+
+0 0 2value p0
+0 0 2value p1
+0 0 2value base-distance
+0 0 2value base-wh
+0 0 2value base-touch-xy
+0 0 2value base-center-xy
+
+\ Try to keep the center of the image in the same place after resizing
+: recenter-image  ( -- )
+   base-center-xy  half-size xy-
+   set-dst-offset
+;
+
+0 value down0?
+0 value down1?
+
+: distance  ( -- x y )   p1 p0 xy-  ;
+
+: xy-abs  ( x y -- abs-x abs-y )  swap abs  swap abs  ;
+
+0 value touch-ih
+: open-touch  ( -- )
+   touch-ih 0=  if
+      " /touchscreen" open-dev to touch-ih
+   then
+   touch-ih 0=  abort" Can't open touchscreen"
+;
+: close-touch  ( -- )  touch-ih  ?dup  if  close-dev  0 to touch-ih  then  ;
+
+: mark-touch  ( -- )
+   p0 to base-touch-xy
+   image-center-xy to base-center-xy
+;
+: mark-size  ( -- )
+   dst-size@ to base-wh
+   distance xy-abs  to base-distance
+;
+: move-image  ( newx,y -- )
+\  wait-frame
+   base-touch-xy xy-  base-center-xy half-size xy-  xy+  set-dst-offset
+;
+: resize&recenter  ( -- )
+\  wait-frame
+   distance xy-abs base-distance base-wh resize-image \ brx 
+   recenter-image
+;
+: do-touch0  ( x y down? -- )
+   -rot to p0  if      ( )    \ Down
+      down1?  if              \ Double-touch - resize
+         down0?  if           \ Not the initial touch pair - resize the screen image
+            resize&recenter
+         else                 \ Initial touch pair - establish the baseline size
+            mark-size
+         then
+      else                    \ The second finger is up, so this is a move
+         down0?  if           \ Not the initial touch - move the image
+            p0 move-image
+         else                 \ Initial touch - establish the base position
+            mark-touch
+         then
+      then
+
+      true to down0?
+   else                       \ Up
+      false to down0?
+   then
+;
+: do-touch1  ( x y down? -- )
+   -rot to p1  if    ( )      \ Down
+      down0?  if              \ Double-touch - resize
+         down1?  if           \ Not the initial touch pair - resize the window
+            resize&recenter
+         else                 \ Initial touch pair - establish the baseline size
+            mark-size
+
+            \ Initial touch of second finger - reestablish the base position
+            \ in case the image was moved after the first finger when down
+            mark-touch
+         then
+      else                    \ The first finger is now up - do nothing in this case
+      then
+
+      true to down1?
+   else                       \ Up
+      \ When the second finger goes up, we again must reestablish the base position
+      \ so subsequent movement of the first finger will cause stable image movement
+      mark-touch
+      false to down1?
+   then
+;
+: touch>screen  ( x y -- x' y' )
+   scr-size@ 1 1 xy-  xy*
+   swap d# 15 rshift  swap d# 15 rshift
+;
+: do-gesture  ( -- )
+   " get-touch?" touch-ih $call-method  0=  if  exit  then  ( x y z down? touch# )
+   2>r      ( x y z  r: down? touch# )
+   drop     ( x y  r: down? touch# )
+   \ Convert from touchscreen to pixel coordinates
+   touch>screen     ( x y  r: down? touch# )
+   2r>      ( x y  down? touch# )
+   case
+      0 of  do-touch0  endof
+      1 of  do-touch1  endof
+      ( default ) >r 3drop r>
+   endcase
+;
+: pinch
+   open-touch
+   begin do-gesture key? until
+   close-touch
+;
+dend
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2011 FirmWorks
+\ 
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\ 
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\ 
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END



More information about the openfirmware mailing list