[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