[pkg-fso-commits] [SCM] framworkd debian packageing branch, master, updated. milestone2-89-geb27523
Daniel Willmann
daniel at totalueberwachung.de
Sat Aug 23 14:06:21 UTC 2008
The following commit has been merged in the master branch:
commit 776f7035636f6d33eabe487584af6ca1f5954047
Author: Daniel Willmann <daniel at totalueberwachung.de>
Date: Sun Aug 10 19:09:19 2008 +0200
ogpsd: Apply warmstart.patch (thanks quickdev!)
This allows us to save almanac, ephemeris, etc. before powering
off the gps chip and load the data back afterwards, thus greatly
reducing time to first fix.
diff --git a/framework/subsystems/ogpsd/om.py b/framework/subsystems/ogpsd/om.py
index 6f49b16..9e9f675 100644
--- a/framework/subsystems/ogpsd/om.py
+++ b/framework/subsystems/ogpsd/om.py
@@ -15,7 +15,10 @@ import dbus
import dbus.service
import os
import sys
+import marshal
+import time
from ubx import UBXDevice
+from ubx import CLIDPAIR
import logging
logger = logging.getLogger('ogpsd')
@@ -25,14 +28,99 @@ class GTA02Device( UBXDevice ):
def __init__( self, bus, gpschannel ):
self.power = False
+ self.aidingFile = "aiding.dat"
+ self.aidingData = {}
+
super( GTA02Device, self ).__init__( bus, gpschannel )
def configure(self):
# Reset the device
#self.send("CFG-RST", 4, {"nav_bbr" : 0xffff, "Reset" : 0x01})
+ # Load aiding data
+ self.loadAidingData()
+
super( GTA02Device, self ).configure()
+ # Enable NAV-POSECEF, AID-REQ (AID-DATA), AID-ALM, AID-EPH messages
+ self.send("CFG-MSG", 3, {"Class" : CLIDPAIR["NAV-POSECEF"][0] , "MsgID" : CLIDPAIR["NAV-POSECEF"][1] , "Rate": 8 })
+ self.send("CFG-MSG", 3, {"Class" : CLIDPAIR["AID-REQ"][0] , "MsgID" : CLIDPAIR["AID-REQ"][1] , "Rate": 1 })
+ self.send("CFG-MSG", 3, {"Class" : CLIDPAIR["AID-ALM"][0] , "MsgID" : CLIDPAIR["AID-ALM"][1] , "Rate": 1 })
+ self.send("CFG-MSG", 3, {"Class" : CLIDPAIR["AID-EPH"][0] , "MsgID" : CLIDPAIR["AID-EPH"][1] , "Rate": 1 })
+
+ def deconfigure(self):
+ # Save collected aiding data
+ self.saveAidingData()
+
+ super( GTA02Device, self ).deconfigure()
+
+ # Disable NAV-POSECEF, AID-REQ (AID-DATA), AID-ALM, AID-EPH messages
+ self.send("CFG-MSG", 3, {"Class" : CLIDPAIR["NAV-POSECEF"][0] , "MsgID" : CLIDPAIR["NAV-POSECEF"][1] , "Rate" : 0 })
+ self.send("CFG-MSG", 3, {"Class" : CLIDPAIR["AID-REQ"][0] , "MsgID" : CLIDPAIR["AID-REQ"][1] , "Rate" : 0 })
+ self.send("CFG-MSG", 3, {"Class" : CLIDPAIR["AID-ALM"][0] , "MsgID" : CLIDPAIR["AID-ALM"][1] , "Rate" : 0 })
+ self.send("CFG-MSG", 3, {"Class" : CLIDPAIR["AID-EPH"][0] , "MsgID" : CLIDPAIR["AID-EPH"][1] , "Rate" : 0 })
+
+ def loadAidingData( self ):
+ logger.info("Loading aiding data")
+ try:
+ self.aidingData = marshal.load(open(self.aidingFile, "r"))
+ except:
+ self.aidingData = { "almanac": {}, "ephemeris": {}, "position": {} }
+
+ def saveAidingData( self ):
+ logger.info("Saving aiding data")
+ FILE = open(self.aidingFile, 'w+')
+ marshal.dump(self.aidingData, FILE)
+ FILE.close()
+
+ def handle_NAV_POSECEF( self, data ):
+ data = data[0]
+ self.aidingData["position"]["x"] = data["ECEF_X"]
+ self.aidingData["position"]["y"] = data["ECEF_Y"]
+ self.aidingData["position"]["z"] = data["ECEF_Z"]
+
+ def handle_AID_DATA( self, data ):
+ pos = self.aidingData["position"]
+
+ # Position accuracy needs to rough, because device may have been moved
+ pacc = 30000000 # in cm (300 KM)
+
+ # GPS week number
+ wn = int((time.time() - time.mktime(time.strptime("5 Jan 1980", "%d %b %Y"))) / (86400 * 7))
+
+ # GPS time of week
+ tow = int(time.time() - (time.mktime(time.strptime("5 Jan 1980", "%d %b %Y")) + wn * 86400 * 7)) * 1000
+
+ # Time accuracy needs to be changed, because the RTC is imprecise
+ tacc = 120000 # in ms (2 minutes)
+
+ # Feed GPS with position and time
+ self.send("AID-INI", 48, {"X" : pos["x"] , "Y" : pos["y"] , "Z" : pos["z"], "POSACC" : pos["accuracy"], \
+ "TM_CFG" : 0 , "WN" : wn , "TOW" : tow , "TOW_NS" : 0 , "TACC_MS" : tacc , "TACC_NS" : 0 , \
+ "CLKD" : 0 , "CLKDACC" : 0 , "FLAGS" : 0x3 })
+
+ # Feed gps with almanac
+ for k, a in self.aidingData["almanac"].iteritems():
+ logger.debug("Loaded almanac for SV %d" % a["SVID"])
+ self.send("AID-ALM", 40, a);
+
+ # Feed gps with ephemeris
+ for k, a in self.aidingData["ephemeris"].iteritems():
+ logger.debug("Loaded ephemeris for SV %d" % a["SVID"])
+ self.send("AID-EPH", 104, a);
+
+ def handle_AID_ALM( self, data ):
+ data = data[0]
+ # Save only, if there are values
+ if "DWRD0" in data:
+ self.aidingData["almanac"][ data["SVID"] ] = data
+
+ def handle_AID_EPH( self, data ):
+ data = data[0]
+ # Save only, if there are values
+ if "SF1D0" in data:
+ self.aidingData["ephemeris"][ data["SVID"] ] = data
+
#
# dbus methods
#
diff --git a/framework/subsystems/ogpsd/ubx.py b/framework/subsystems/ogpsd/ubx.py
index e2909a3..10cec86 100644
--- a/framework/subsystems/ogpsd/ubx.py
+++ b/framework/subsystems/ogpsd/ubx.py
@@ -233,7 +233,9 @@ MSGFMT = {
["<IIIIHHHBB", ["TSKRUN", "TSKSCHD", "TSKOVRR", "TSKREG", "STACK", "STACKSIZE", "CPUIDLE", "FLYSLY", "PTLSLY"]],
# MON - GPS system statistics
("AID-INI", 48) :
- ["<iiiIHHIiIIiII", ["X", "Y", "Z", "POSACC", "TM_CFG", "WM", "TOW", "TOW_NS", "TACC_MS", "TACC_NS", "CLKD", "CLKDACC", "FLAGS"]],
+ ["<iiiIHHIiIIiII", ["X", "Y", "Z", "POSACC", "TM_CFG", "WN", "TOW", "TOW_NS", "TACC_MS", "TACC_NS", "CLKD", "CLKDACC", "FLAGS"]],
+ ("AID-DATA", 0) :
+ ["", []],
("AID-HUI", 72) :
["<IddiHHHHHHffffffffI", ["HEALTH", "UTC_A1", "UTC_A0", "UTC_TOT", "UTC_WNT",
"UTC_LS", "UTC_WNF", "UTC_DN", "UTC_LSF", "UTC_SPARE", "KLOB_A0", "KLOB_A1",
@@ -267,7 +269,6 @@ class UBXDevice( GPSDevice ):
self.ack = {"CFG-PRT" : 0}
self.ubx = {}
- self.configure()
def configure( self ):
# Use high sensitivity mode
--
framworkd debian packageing
More information about the pkg-fso-commits
mailing list