[pkg-fso-commits] [SCM] freesmartphone.org demo GUI branch, debian, updated. debian/0-git20081111-1-18-g695b819
Jan Luebbe
jluebbe at debian.org
Mon Jan 12 19:29:14 UTC 2009
The following commit has been merged in the debian branch:
commit cf48d98b8e994d6a7698fbc6f0689126892895f9
Author: Wilfried Klaebe <w-fso at chaos.in-kiel.de>
Date: Sun Dec 28 16:30:03 2008 +0100
Enhance the display of GPS data in zhone:
- the left page shows GPS time, fix status, course, speed and climb rate too
- the middle page shows its data in a tabular form which is much easier to read and comprehend
- the right page shows satellites with elevation 90 in the middle of the sky instead of at the horizon
diff --git a/src/zhone b/src/zhone
index 1b66e79..02cd6fd 100755
--- a/src/zhone
+++ b/src/zhone
@@ -908,11 +908,13 @@ class pyphone_location( edje_group ):
self.ctx = None
self.generic = None
self.ubxinfo = None
+ self.maxsignal = 50.0
self.current = False
def show( self ):
super( pyphone_location.SignalGraph, self ).show()
self.current = True
+ self.update()
def hide( self ):
super( pyphone_location.SignalGraph, self ).hide()
@@ -954,10 +956,10 @@ class pyphone_location( edje_group ):
almoreph = sv["Flags"] & 0x04
eph = sv["Flags"] & 0x08
bad = sv["Flags"] & 0x10
- qi = {
+ qi = ("%i: " % sv["QI"]) + {
0: "idle",
1: "searching",
- 2: "searching",
+ 2: "signal acquired",
3: "signal unusable",
4: "code lock",
5: "code&carrier lock",
@@ -967,25 +969,44 @@ class pyphone_location( edje_group ):
cno = sv["CNO"]
elev = sv["Elev"]
azim = sv["Azim"]
- text = "CHN %s %s SV %s: SN %i" % ( chn, qi, svid, cno )
- if used: text += " USED"
- if diff: text += " DIFF"
- if almoreph and not eph: text += " ALM"
- if eph: text += " EPH"
- if bad: text += " BAD"
- rows.append( ( cno, used, text ) )
+ text = []
+ text.append( "%i" % chn )
+ text.append( "%i" % svid )
+ text.append( "%i" % cno )
+ if almoreph: text.append( u"\u25CF" )
+ else: text.append( "" )
+ if eph: text.append( u"\u25CF" )
+ else: text.append( "" )
+ if diff: text.append( u"\u25CF" )
+ else: text.append( "" )
+ rows.append( ( cno, used, bad, text, qi ) )
elif self.generic:
for sv, (used, signal) in self.generic.items():
- text = "SV %i: SN %i" % ( sv, signal )
- rows.append( ( signal, used, text ) )
+ text = [ "", "%i" % sv, "%i" % signal, "", "", "" ]
+ rows.append( ( cno, used, 0, text, "" ) )
if rows:
- count = len( rows )
- maxsignal = float( max( [x[0] for x in rows] + [1.0] ) )
+ count = 1 + len( rows )
+ self.maxsignal = float( max( [x[0] for x in rows] + [self.maxsignal] ) )
barwidth = 1.0/count
self.ctx.set_font_size( barwidth*0.6 )
- index = 0
- for signal, used, text in rows:
- barlength = signal/maxsignal
+ self.ctx.set_source_rgba(0, 0, 0, 1)
+ head = [ "CHN", " SV ", "SN", "ALM", "EPH", "DIFF" ]
+ x_bearing, y_bearing, width, height = self.ctx.text_extents( " ".join( head ) )[:4]
+ w = 0.5*self.ctx.text_extents( u"\u25CF" )[2]
+ x = pixel[0]*3
+ cols = []
+ for h in head:
+ width = 0.5*self.ctx.text_extents( h )[2]
+ self.ctx.move_to( x + w, 0.5*barwidth - height / 2 - y_bearing )
+ cols.append( x + w + width )
+ x += w + width + width + w
+ self.ctx.show_text( h )
+ cols.append( x + w)
+ self.ctx.move_to( x + w, 0.5*barwidth - height / 2 - y_bearing )
+ self.ctx.show_text( "Quality" )
+ index = 1
+ for signal, used, bad, text, qi in rows:
+ barlength = signal/self.maxsignal
if used:
self.ctx.set_source_rgba(0.0, 1.0, 0.0, 1.0)
else:
@@ -993,11 +1014,18 @@ class pyphone_location( edje_group ):
self.ctx.rectangle( 0.0, index*barwidth+pixel[1]*2, barlength, barwidth-pixel[1]*4 )
self.ctx.fill()
self.ctx.set_source_rgba(0, 0, 0, 1)
- x_bearing, y_bearing, width, height = self.ctx.text_extents( text )[:4]
- self.ctx.move_to(
- pixel[0]*3, (index+0.5)*barwidth - height / 2 - y_bearing
- )
- self.ctx.show_text( text )
+ x_bearing, y_bearing, width, height = self.ctx.text_extents( " ".join( text ) )[:4]
+ for i in range( len( text ) ):
+ w = 0.5*self.ctx.text_extents( text[i] )[2]
+ self.ctx.move_to( cols[i] - w, (index+0.5)*barwidth - height / 2 - y_bearing )
+ self.ctx.show_text( text[i] )
+ self.ctx.move_to( cols[len( text )], (index+0.5)*barwidth - height / 2 - y_bearing )
+ self.ctx.show_text( qi )
+ if bad:
+ self.ctx.move_to( pixel[0]*2, (index+0.5)*barwidth )
+ self.ctx.rel_line_to( 1-(pixel[0]*4), 0 )
+ self.ctx.close_path()
+ self.ctx.stroke()
index += 1
self.img.image_data_set( self.surface.get_data() )
self.img.pixels_dirty = True
@@ -1018,14 +1046,15 @@ class pyphone_location( edje_group ):
def show( self ):
super( pyphone_location.PositionGraph, self ).show()
self.current = True
+ self.update()
def hide( self ):
super( pyphone_location.PositionGraph, self ).hide()
self.current = False
def proj( self, azim, elev ):
- x = math.sin( math.radians( azim ) )*( elev/90.0 )
- y = math.cos( math.radians( azim ) )*( elev/90.0 )
+ x = math.sin( math.radians( azim ) )*( ( 90.0 - elev )/90.0 )
+ y = math.cos( math.radians( azim ) )*( ( 90.0 - elev )/90.0 )
return ( x, y )
def resize( self, w, h ):
@@ -1098,7 +1127,10 @@ class pyphone_location( edje_group ):
self.page = "left"
self.signal_emit( "activate_button_select_%s" % self.page, "" )
+ self.time = None
+ self.fix = None
self.accuracy = None
+ self.course = None
self.position = None
self.update()
@@ -1107,10 +1139,22 @@ class pyphone_location( edje_group ):
def update( self ):
text = []
+ if self.time:
+ text.append( "GPS Time:<tab>%s" % time.strftime("%H:%M:%S", time.gmtime(self.time)) )
+ else:
+ text.append( "GPS Time:<tab>N/A" )
+ if self.fix:
+ text.append( "Fix:<tab>%s" % { 1: "none", 2: "2D", 3: "3D" }[self.fix] )
+ else:
+ text.append( "Fix:<tab>N/A" )
if self.position:
text.append( "Lat:<tab>%s<br>Lon:<tab>%s<br>Alt:<tab>%s" % self.position )
else:
text.append( "Lat:<tab>N/A<br>Lon:<tab>N/A<br>Alt:<tab>N/A" )
+ if self.course:
+ text.append( "Course:<tab>%s<br>Speed:<tab>%s<br>Climb:<tab>%s" % self.course )
+ else:
+ text.append( "Course:<tab>N/A<br>Speed:<tab>N/A<br>Climb:<tab>N/A" )
if self.accuracy:
text.append( "P/H/V-DOP:<tab>%s/%s/%s" % self.accuracy )
else:
@@ -1135,22 +1179,43 @@ class pyphone_location( edje_group ):
self.part_swallow( "swallow", self.positiongraph )
self.positiongraph.show()
+ def onFixStatusChanged( self, fixstatus ):
+ logger.debug( "gps fix status changed: %s" % fixstatus )
+ self.fix = fixstatus
+ self.update()
+
def onAccuracyChanged( self, fields, pdop, hdop, vdop ):
+ logger.debug( "gps accuracy changed: %s/%s/%s" % ( pdop, hdop, vdop ) )
self.accuracy = ( pdop, hdop, vdop )
self.update()
+ def onCourseChanged( self, fields, timestamp, speed, heading, climb ):
+ logger.debug( "gps course changed: %s/%s/%s" % ( speed, heading, climb ) )
+ self.time = timestamp
+ self.course = ( heading, speed, climb )
+ self.update()
+
def onPositionChanged( self, fields, timestamp, lat, lon, alt ):
+ logger.debug( "gps position changed: %s/%s/%s" % ( lat, lon, alt ) )
+ self.time = timestamp
self.position = ( lat, lon, alt )
self.update()
def onSatellitesChanged( self, satellites ):
+ logger.debug( "gps satellites changed" )
satellites.sort()
signallist = [ (int(sat[0]), sat[1], float(sat[4])) for sat in satellites ]
self.signalgraph.update( generic = signallist )
positionlist = [ (int(sat[0]), sat[1], int(sat[3]), int(sat[2])) for sat in satellites ]
self.positiongraph.update( positionlist )
+ def onTimeChanged( self, timestamp ):
+ logger.debug( "gps time changed: %s (%s)" % (time.strftime("%H:%M:%S", time.gmtime(timestamp))) )
+ self.time = timestamp
+ self.update()
+
def onUBXDebugPacket( self, clid, length, data ):
+ logger.debug( "gps got ubxdebug packet" )
if clid == "NAV-SVINFO":
self.signalgraph.update( ubxinfo = data )
@@ -1945,7 +2010,7 @@ class GPSAgent( Agent ):
super( GPSAgent, self ).__init__( main )
self.name = "GPS"
self.busy = None
- self.want = set( ["NAV-SVINFO"] )
+ self.want = set( ["NAV-STATUS", "NAV-SVINFO"] )
self.have = set()
self.error = set()
@@ -2043,7 +2108,10 @@ class GUI(object):
ecore.idle_enterer_add( self.dbus_objectInit )
+ dbus_object.onFixStatusChanged.append( self.groups["location"].onFixStatusChanged )
+ dbus_object.onTimeChanged.append( self.groups["location"].onTimeChanged )
dbus_object.onAccuracyChanged.append( self.groups["location"].onAccuracyChanged )
+ dbus_object.onCourseChanged.append( self.groups["location"].onCourseChanged )
dbus_object.onPositionChanged.append( self.groups["location"].onPositionChanged )
dbus_object.onSatellitesChanged.append( self.groups["location"].onSatellitesChanged )
dbus_object.onUBXDebugPacket.append( self.groups["location"].onUBXDebugPacket )
@@ -2195,7 +2263,10 @@ class DBusObject( object ):
self.objects = {}
self.onResourceChanged = []
self.onResourceAvailable = []
+ self.onFixStatusChanged = []
+ self.onTimeChanged = []
self.onAccuracyChanged = []
+ self.onCourseChanged = []
self.onPositionChanged = []
self.onSatellitesChanged = []
self.onUBXDebugPacket = []
@@ -2212,9 +2283,12 @@ class DBusObject( object ):
self.usage_iface = None
self.gps_obj = None
+ self.gps_device_iface = None
self.gps_accuracy_iface = None
+ self.gps_course_iface = None
self.gps_position_iface = None
self.gps_satellite_iface = None
+ self.gps_time_iface = None
self.gps_ubx_iface = None
self.gsm_device_obj = None
@@ -2273,15 +2347,24 @@ class DBusObject( object ):
# GPS
self.gps_obj = self.tryGetProxy( 'org.freesmartphone.ogpsd', '/org/freedesktop/Gypsy' )
+ if self.gps_obj and not self.gps_device_iface:
+ self.gps_device_iface = Interface(self.gps_obj, 'org.freedesktop.Gypsy.Device')
+ self.gps_device_iface.connect_to_signal( "FixStatusChanged", self.cbFixStatusChanged )
if self.gps_obj and not self.gps_accuracy_iface:
self.gps_accuracy_iface = Interface(self.gps_obj, 'org.freedesktop.Gypsy.Accuracy')
self.gps_accuracy_iface.connect_to_signal( "AccuracyChanged", self.cbAccuracyChanged )
+ if self.gps_obj and not self.gps_course_iface:
+ self.gps_course_iface = Interface(self.gps_obj, 'org.freedesktop.Gypsy.Course')
+ self.gps_course_iface.connect_to_signal( "CourseChanged", self.cbCourseChanged )
if self.gps_obj and not self.gps_position_iface:
self.gps_position_iface = Interface(self.gps_obj, 'org.freedesktop.Gypsy.Position')
self.gps_position_iface.connect_to_signal( "PositionChanged", self.cbPositionChanged )
if self.gps_obj and not self.gps_satellite_iface:
self.gps_satellite_iface = Interface(self.gps_obj, 'org.freedesktop.Gypsy.Satellite')
self.gps_satellite_iface.connect_to_signal( "SatellitesChanged", self.cbSatellitesChanged )
+ if self.gps_obj and not self.gps_time_iface:
+ self.gps_time_iface = Interface(self.gps_obj, 'org.freedesktop.Gypsy.Time')
+ self.gps_time_iface.connect_to_signal( "TimeChanged", self.cbTimeChanged )
if self.gps_obj and not self.gps_ubx_iface:
self.gps_ubx_iface = Interface(self.gps_obj, 'org.freesmartphone.GPS.UBX')
self.gps_ubx_iface.connect_to_signal( "DebugPacket", self.cbUBXDebugPacket )
@@ -2344,10 +2427,18 @@ class DBusObject( object ):
for cb in self.onResourceAvailable:
cb( resourcename=resourcename, state=state )
+ def cbFixStatusChanged( self, fixstatus ):
+ for cb in self.onFixStatusChanged:
+ cb( fixstatus=fixstatus )
+
def cbAccuracyChanged( self, fields, pdop, hdop, vdop ):
for cb in self.onAccuracyChanged:
cb( fields=fields, pdop=pdop, hdop=hdop, vdop=vdop )
+ def cbCourseChanged( self, fields, timestamp, speed, heading, climb ):
+ for cb in self.onCourseChanged:
+ cb( fields=fields, timestamp=timestamp, speed=speed, heading=heading, climb=climb )
+
def cbPositionChanged( self, fields, timestamp, lat, lon, alt ):
for cb in self.onPositionChanged:
cb( fields=fields, timestamp=timestamp, lat=lat, lon=lon, alt=alt )
@@ -2356,6 +2447,10 @@ class DBusObject( object ):
for cb in self.onSatellitesChanged:
cb( satellites )
+ def cbTimeChanged( self, timestamp ):
+ for cb in self.onTimeChanged:
+ cb( timestamp )
+
def cbUBXDebugPacket( self, clid, length, data ):
try:
for cb in self.onUBXDebugPacket:
--
freesmartphone.org demo GUI
More information about the pkg-fso-commits
mailing list