[openfirmware] [commit] r1910 - dev/olpc/keyboard
repository service
svn at openfirmware.info
Wed Aug 4 10:37:50 CEST 2010
Author: wmb
Date: Wed Aug 4 10:37:50 2010
New Revision: 1910
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/1910
Log:
OLPC keyboard selftest - fixed all-keys bitmap for the mechanical keyboard and added a test for stuck keys, as requested by manufacturing.
Modified:
dev/olpc/keyboard/selftest.fth
Modified: dev/olpc/keyboard/selftest.fth
==============================================================================
--- dev/olpc/keyboard/selftest.fth Wed Aug 4 07:05:19 2010 (r1909)
+++ dev/olpc/keyboard/selftest.fth Wed Aug 4 10:37:50 2010 (r1910)
@@ -23,6 +23,7 @@
/n field >key-y
/n field >key-w
/n field >key-h
+ /n field >key-time
constant /key
/key d# 128 * buffer: keys
@@ -54,7 +55,8 @@
: add-key-gap ( -- ) key-gap ++key-x ;
: (make-key) ( x y w h -- )
#keys key-adr >r
- r@ >key-h ! r@ >key-w ! r@ >key-y ! r> >key-x !
+ r@ >key-h ! r@ >key-w ! r@ >key-y ! r@ >key-x !
+ 0 r> >key-time !
#keys++
;
: make-key ( w -- ) dup key-x key-y rot single-key-h (make-key) ++key-x ;
@@ -194,6 +196,18 @@
;
[then]
+: key-stuck? ( -- flag )
+ ukey? if debug-me then
+ #keys 0 do
+ i key-adr >key-time @ ?dup if ( msecs )
+ d# 3,000 + get-msecs - 0< if ( )
+ true unloop exit
+ then
+ then
+ loop
+ false
+;
+
d# 128 8 / constant #key-bytes
#key-bytes buffer: key-bitmap
: set-key-bit ( key# -- )
@@ -223,9 +237,9 @@
\ The mechanical keyboard has no slider keys. All displayed button locations are
\ activated by pressing single keystrokes, so the map is dense
-h# ffffff constant funny-map2
+h# ffffffff constant funny-map2
create all-keys-bitmap2
-ff c, ff c, ff c, 00 c, ff c, ff c, ff c, ff c,
+ff c, ff c, ff c, ff c, ff c, ff c, ff c, ff c,
ff c, ff c, 3f c, 00 c, 00 c, 00 c, 00 c, 00 c,
: all-tested?0 ( -- flag ) \ Just buttons
@@ -502,19 +516,29 @@
ibm#>key#
;
-: draw-key ( key# color -- )
- swap
- key-adr >r ( color# r: key-adr )
- r@ >key-w @ hidden-key-w = if
- r> 2drop
+: set-key-time ( timestamp key-adr -- )
+ over 0<> over >key-time @ 0<> and if ( timestamp key-adr )
+ \ If both timestamp and old key time are nonzero, then we preserve the old key time
+ 2drop
else
- r@ >key-x @ r@ >key-y @ r@ >key-w @ r> >key-h @
- " fill-rectangle" $call-screen
+ \ If either timestamp or old key time is 0, we set the key time
+ >key-time !
+ then
+;
+
+: draw-key ( key# color timestamp -- )
+ rot key-adr >r ( color# timestamp r: key-adr )
+ r@ set-key-time ( color# r: key-adr )
+ r@ >key-w @ hidden-key-w = if ( color# r: key-adr )
+ r> 2drop ( )
+ else ( color# r: key-adr )
+ r@ >key-x @ r@ >key-y @ r@ >key-w @ r> >key-h @ ( color# x y w h )
+ " fill-rectangle" $call-screen ( )
then
;
-: key-tested ( key# -- ) tested-key-color draw-key ;
-: key-down ( key# -- ) down-key-color draw-key ;
-: key-up ( key# -- ) idle-key-color draw-key ;
+: key-tested ( key# -- ) tested-key-color 0 draw-key ;
+: key-down ( key# -- ) down-key-color get-msecs draw-key ;
+: key-up ( key# -- ) idle-key-color 0 draw-key ;
: fill-screen ( color -- )
0 0 " dimensions" $call-screen " fill-rectangle" $call-screen
@@ -567,6 +591,9 @@
clear-key-bitmap
get-msecs to last-timestamp
begin
+ final-test? smt-test? or if
+ key-stuck? if exit then
+ then
get-data? if ( scancode )
process-raw ( exit? )
get-msecs to last-timestamp
@@ -623,8 +650,17 @@
close
final-test? smt-test? or if
- all-tested? 0=
- dup if ." Some keys were not pressed" cr then
+ key-stuck? if
+ ." Stuck key" cr
+ true exit
+ then
+
+ all-tested? if
+ false
+ else
+ ." Some keys were not pressed" cr
+ true
+ then
else
confirm-selftest?
then
More information about the openfirmware
mailing list