UI Elements do not go through register_factory
[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(gtk.VBox, zavai.Applet):
36     def __init__(self, registry, name, **kw):
37         zavai.Applet.__init__(self, registry, name)
38         gtk.VBox.__init__(self)
39
40         self.registry = registry
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
54         self.pack_start(self.view, True, True)
55         self.pack_start(self.make_parent_link(), False, False)
56
57
58     def init(self):
59         self.gps = self.registry.resource("gps")
60
61     def start(self, *args):
62         if self.gps is None:
63             self.init()
64         self.gps.monitor.connect(self.on_ubxdebug_packet)
65
66     def stop(self, *args):
67         self.gps.monitor.disconnect(self.on_ubxdebug_packet)
68
69     def on_ubxdebug_packet(self, clid, length, data):
70         # In zhone it is cbUBXDebugPacket
71         #if clid == "NAV-STATUS" and data:
72         #    i = ["%s: %d" % (k, data[0][k]) for k in sorted(data[0].keys())]
73         #    zavai.info("Status:", " ".join(i))
74         ##    if data[0]['TTFF']:
75         ##        zavai.info("TTFF: %f", data[0]['TTFF']/1000.0)
76         if clid == "NAV-SVINFO":
77             self.handle_ubx_sat_data(data[1:])
78         #else:
79         #    zavai.info("gps got ubxdebug packet", clid)
80         #    zavai.info("DATA:", data)
81
82     def handle_ubx_sat_data(self, ubxinfo):
83         #zavai.info("CH ID SN ELE AZI Used Diff Alm Eph Bad Status")
84         self.store.clear()
85         for sv in ubxinfo:
86             if sv["CNO"] == 0: continue
87             svid = sv["SVID"]
88             used = sv["Flags"] & 0x01
89             diff = sv["Flags"] & 0x02
90             almoreph = sv["Flags"] & 0x04
91             eph = sv["Flags"] & 0x08
92             bad = sv["Flags"] & 0x10
93             qi = ("%i: " % sv["QI"]) + SAT_QI_NAMES.get(sv["QI"], _("Unknown"))
94             self.store.append([
95                 "%2d" % sv["chn"],
96                 "%2d" % sv["SVID"],
97                 "%2d" % sv["CNO"],
98                 "%3d" % sv["Elev"],
99                 "%3d" % sv["Azim"],
100                 used and "used" or "",
101                 diff and "diff" or "",
102                 almoreph and "alm" or "",
103                 eph and "eph" or "",
104                 bad and "bad" or "",
105                 qi])
106
107 def init(conf = None, registry = None, **kw):
108     name = "menu.main.gps.satellite_monitor"
109     registry.register(name, SatelliteMonitor(registry, name), _("Satellite monitor"))