The OpenMoko Freerunner ( and its predecessor the NEO1973 ) is a GSM smartphone with a 480x640 touchscreen, a GSM Modem, WLAN, BlueTooth and a GPS Receiver.
Hardware specs and schematics have been published. There are a couple of software stacks ( all based on a recent Linux kernel ) available. This includes a version of tck/tk ( in the 2007.2 stack this is version 8.4.11 )
For further information go to http://openmoko.org
The FreeRunner has two 3 axis accelerometers integrated. This script uses one to display attitude similar to a Spirit Level.
Offsets are at this stage hardcoded.
#!/usr/bin/wish set acc [open /dev/input/event3 ] fconfigure $acc -encoding binary -translation binary -buffering none puts pastopen set ::X1 0 set ::Y1 0 set ::Z1 0 set cnt 0 set int 20 fileevent $acc readable { # puts preread set buf [read $acc 16] # puts postread binary scan $buf iissi tvsec tvusec type code value set ctime [expr {$tvsec + ($tvusec / 1e6)} ] # puts [format "% 8.1f %02x %02x % 8d" $ctime $type $code $value ] switch -glob -- $type,$code \ 2,0 { incr ::X1 $value } 2,1 { incr ::Y1 $value } 2,2 { incr ::Z1 $value } 0,* { if {([incr cnt] % $int)==0} { set ::X [expr {(0.0098 * $::X1 / $int) -0.58}] ; set ::X1 0 set ::Y [expr {(0.0098 * $::Y1 / $int) +0.17}] ; set ::Y1 0 set ::Z [expr {(0.0098 * $::Z1 / $int) +0.72}] ; set ::Z1 0 libelle xy $::X $::Y $::Z libelle xz $::X $::Z $::Y libelle zy $::Z $::Y $::X puts -nonewline [format "% 8.2f %8.2f % 8.2f cnt:% 8d \r" $::X $::Y $::Z $cnt] flush stdout # after 500 set cont 1 # vwait cont } } default { puts unknown:$type,$code/$value } } frame .f -width 480 -height 480 pack .f -expand 1 -fill both set range 10.50 scale .f.y -orient vertical -from -$range -to +$range -resolution 0.01 -variable ::Y -label Y -tickinterval 0.5 scale .f.x -orient horizontal -from +$range -to -$range -resolution 0.01 -variable ::X -label X -tickinterval 0.5 canvas .f.c -width 380 -height 380 -bg darkgray button .f.b -command exit -text Exit grid .f.x -column 0 -row 1 -sticky ew grid .f.y -column 1 -row 0 -sticky ns grid .f.c -column 0 -row 0 -sticky nsew grid .f.b -column 1 -row 1 -sticky nsew .f.c create oval {0 0 0 0} -fill red -tag xy .f.c create oval {0 0 0 0} -fill blue -tag xz .f.c create oval {0 0 0 0} -fill green -tag zy .f.c create line {170 0 170 390} -fill black .f.c create line {210 0 210 390} -fill black .f.c create line { 0 170 380 170} -fill black .f.c create line { 0 210 380 210} -fill black .f.c create line {150 0 150 390} -fill black .f.c create line {230 0 230 390} -fill black .f.c create line { 0 150 380 150} -fill black .f.c create line { 0 230 380 230} -fill black proc libelle {tag X Y Z} { set scale 20.0 set zscale 1.0 set xc [ expr {190 - (int(0.5+ ($X * $scale ))) }] set yc [ expr {190 + (int(0.5+ ($Y * $scale ))) }] set zc [ expr {20 + (int(0.5+ (($Z+10.0) * $zscale ))) }] set coords [ list [expr {$xc - $zc}] [expr {$yc - $zc}] [expr {$xc + $zc}] [expr {$yc + $zc}] ] .f.c coords $tag $coords } # working