[openfirmware] [commit] r3601 - cpu/arm/olpc
repository service
svn at openfirmware.info
Tue Mar 12 08:47:45 CET 2013
Author: wmb
Date: Tue Mar 12 08:47:44 2013
New Revision: 3601
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/3601
Log:
OLPC touchscreen test - linearity test improvements requested by manufacturing team.
Modified:
cpu/arm/olpc/nn-touchscreen.fth
Modified: cpu/arm/olpc/nn-touchscreen.fth
==============================================================================
--- cpu/arm/olpc/nn-touchscreen.fth Fri Mar 8 21:43:38 2013 (r3600)
+++ cpu/arm/olpc/nn-touchscreen.fth Tue Mar 12 08:47:44 2013 (r3601)
@@ -900,6 +900,8 @@
until drop ( )
;
+d# 50 value #skip \ Number of initial points to ignore for line
+0 value skipping? \ Current skip count
: ev(
configure
cursor-off
@@ -908,6 +910,7 @@
blacken
.tsmsg
-1 to remaining
+ #skip to skipping?
;
: )ev
@@ -940,7 +943,7 @@
: +w@ ( adr index -- w ) wa+ w@ ;
: +w! ( w adr index -- ) wa+ w! ;
-: add-pt ( w.x w.y -- )
+: add-pt ( w.x w.y -- )
#pts #pts-max u< if
ybuf #pts +w!
xbuf #pts +w!
@@ -1024,7 +1027,10 @@
swap - -rot ( intercept num den )
;
-: do-point ( x y -- ) 2dup add-pt dot ;
+: do-point ( x y -- )
+ skipping? ?dup if 1- to skipping? 2drop exit then
+ 2dup add-pt dot
+;
\ draw line across screen from left to right
: line-in-x ( intercept num den -- )
@@ -1044,7 +1050,7 @@
screen-h 0 do ( den num intercept )
3dup i swap - ( den num intercept den num y-b )
-rot */ ( den num intercept point-x )
- dup 1 screen-w within if ( den num intercept point-y )
+ dup 1 screen-w within if ( den num intercept point-x )
i dot ( den num intercept )
else ( den num intercept point-y )
drop ( den num intercept )
@@ -1058,6 +1064,7 @@
;
0 value err2
+0 [if]
: nonlinearity ( intercept num den -- mean-sq-nonlinearity )
0 to err2 ( intercept num den )
#pts 0 ?do ( intercept num den )
@@ -1071,6 +1078,66 @@
3drop ( )
err2 #pts / ( Serror2/#pts )
;
+[then]
+
+0 value this-#pts
+: short-nonlinearity ( intercept num den index #pts -- mean-sq-nonlinearity )
+ dup to this-#pts ( intercept num den index #pts )
+ 0 to err2 ( intercept num den index #pts )
+ bounds ?do ( intercept num den )
+ 3dup ( intercept num den intercept num den )
+ xbuf i +w@ ( intercept num den intercept num den x )
+ -rot */ + ( intercept num den predicted-y )
+ ybuf i +w@ - ( intercept num den error )
+ dup * ( intercept num den error^2 )
+ err2 + to err2 ( intercept num den )
+ loop ( intercept num den )
+ 3drop ( )
+ err2 this-#pts / ( Serror2/#pts )
+;
+
+: overall-nonlinearity ( intercept num den -- mean-sq )
+ 0 #pts short-nonlinearity
+;
+
+0 value nl-max 0 value nl-loc
+d# 60 value nl-span
+d# 30 value nl-stride
+: max-nonlinearity ( intercept num den -- nl )
+ 0 to nl-max ( intercept num den )
+ 0 to nl-loc
+ #pts 0 do ( intercept num den )
+ i nl-span + #pts > ?leave ( intercept num den )
+ 3dup i nl-span short-nonlinearity ( intercept num den nl )
+ dup nl-max > if ( intercept num den nl )
+ to nl-max i to nl-loc ( intercept num den )
+ else ( intercept num den nl )
+ drop ( intercept num den )
+ then ( intercept num den )
+ nl-stride +loop ( intercept num den )
+ 3drop nl-max ( nl )
+;
+: color-nl ( color -- )
+ pixcolor !
+ nl-loc nl-span bounds ?do
+ xbuf i +w@ ybuf i +w@ dot
+ loop
+;
+: erase-remainder ( -- )
+ #pts 0 do
+ i nl-loc dup nl-span + within 0= if
+ black pixcolor !
+ xbuf i +w@ ybuf i +w@ dot
+ then
+ loop
+;
+: show-nonlinearity ( -- )
+ erase-remainder
+ d# 8 0 do
+ yellow color-nl d# 500 ms
+ magenta color-nl d# 500 ms
+ loop
+;
\ TODO:
\ 1) Message and retry if slope and intercept not approximately correct
@@ -1082,14 +1149,19 @@
: scribble
alloc-bufs
- ev(
- 0 d# 27 at-xy ." Follow the line. Type a key to exit" cr
- screen-h 6 - screen-h negate screen-w blue draw-line
- ['] do-point ev
+ begin ev(
+ 0 to #pts
+ 0 d# 27 at-xy ." Follow the line. Type a key to exit " cr
+ screen-h 6 - screen-h negate screen-w blue draw-line
+ ['] do-point ev
+ #pts d# 500 < while
+ 0 d# 27 at-xy ." Too few points. Draw the line slowly" cr
+ d# 2000 ms
+ repeat
linear-least-squares ( intercept num den )
3dup red draw-line ( intercept num den )
- ." Nonlinearity: " nonlinearity .d cr
- d# 5000 ms
+ ." Nonlinearity: " max-nonlinearity .d cr
+ show-nonlinearity
)ev
free-bufs
;
More information about the openfirmware
mailing list