Register with network also on the PIN code path
[gregoa/zavai.git] / plugins / 50_sat_monitor.py
1 # sat_monitor - zavai satellite monitor
2 #
3 # Copyright (C) 2009  Enrico Zini <enrico@enricozini.org>
4 #
5 # This program is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 2 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18
19 import gtk
20 import sys
21 from gettext import gettext as _
22 import zavai
23
24 SAT_QI_NAMES = {
25     0: _("idle"),
26     1: _("searching"),
27     2: _("signal acquired"),
28     3: _("signal unusable"),
29     4: _("code lock"),
30     5: _("code&carrier lock"),
31     6: _("code&carrier lock"),
32     7: _("receiving data")
33 }
34
35 class SatelliteMonitor(zavai.Applet):
36     def __init__(self, registry, **kw):
37         super(SatelliteMonitor, self).__init__(registry,
38                 "menu.main.gps.satellite_monitor",
39                 _("Satellite monitor"))
40
41         self.gps = None
42
43         self.store = gtk.ListStore(str, str, str, str, str, str, str, str, str, str, str)
44         self.view = gtk.TreeView(self.store)
45         renderer = gtk.CellRendererText()
46         for idx, name in enumerate((_("CH"), _("ID"), _("SN"), _("ELE"), _("AZI"),
47                      _("Used"), _("Diff"), _("Alm"), _("Eph"),
48                      _("Bad"), _("Status"))):
49             col = gtk.TreeViewColumn(name)
50             col.pack_start(renderer, False)
51             col.add_attribute(renderer, "text", idx)
52             self.view.append_column(col)
53         self.add(self.view)
54
55     def init(self):
56         self.gps = self.zavai_registry.resource("gps")
57
58     def start(self, *args):
59         if self.gps is None:
60             self.init()
61         self.gps.monitor.connect("satellites", self.on_ubxdebug_packet)
62
63     def stop(self, *args):
64         self.gps.monitor.disconnect("satellites", self.on_ubxdebug_packet)
65
66     def on_ubxdebug_packet(self, clid, length, data):
67         # In zhone it is cbUBXDebugPacket
68         #if clid == "NAV-STATUS" and data:
69         #    i = ["%s: %d" % (k, data[0][k]) for k in sorted(data[0].keys())]
70         #    zavai.info("Status:", " ".join(i))
71         ##    if data[0]['TTFF']:
72         ##        zavai.info("TTFF: %f", data[0]['TTFF']/1000.0)
73         if clid == "NAV-SVINFO":
74             self.handle_ubx_sat_data(data[1:])
75         #else:
76         #    zavai.info("gps got ubxdebug packet", clid)
77         #    zavai.info("DATA:", data)
78
79     def handle_ubx_sat_data(self, ubxinfo):
80         #zavai.info("CH ID SN ELE AZI Used Diff Alm Eph Bad Status")
81         self.store.clear()
82         for sv in ubxinfo:
83             if sv["CNO"] == 0: continue
84             svid = sv["SVID"]
85             used = sv["Flags"] & 0x01
86             diff = sv["Flags"] & 0x02
87             almoreph = sv["Flags"] & 0x04
88             eph = sv["Flags"] & 0x08
89             bad = sv["Flags"] & 0x10
90             qi = ("%i: " % sv["QI"]) + SAT_QI_NAMES.get(sv["QI"], _("Unknown"))
91             self.store.append([
92                 "%2d" % sv["chn"],
93                 "%2d" % sv["SVID"],
94                 "%2d" % sv["CNO"],
95                 "%3d" % sv["Elev"],
96                 "%3d" % sv["Azim"],
97                 used and "used" or "",
98                 diff and "diff" or "",
99                 almoreph and "alm" or "",
100                 eph and "eph" or "",
101                 bad and "bad" or "",
102                 qi])
103
104 def init(conf = None, registry = None, **kw):
105     registry.register(SatelliteMonitor(registry))