REFACTORING : move tstamp into real scanner object
[wifihood] / wifiscanner / wifimap / replay.py
1
2 import db
3
4 import gobject
5
6 import os
7
8 class ReplayScanner ( gobject.GObject ) :
9
10     def __init__ ( self , conf , ifname="wlan0" ) :
11         gobject.GObject.__init__( self )
12         self.scan_timeout = 0
13         self.db = db.database( os.path.join( conf.homedir , "wifireplay.db" ) )
14
15         # Values specific to replaying
16         self._file = os.path.join( conf.homedir , "wiscan_gui.info" )
17         self._fd = None
18         self._current = None
19         self._speed = 10
20
21         # Values to be set by GPSDevice changed events
22         self.info = None, 0, 0, None, None, None, None
23         self.satellites = None
24         self.cells = None
25         self.ngps = 0
26
27         # Values to be set by wireless scans
28         self.scanlist = {}
29         self.nscan = 0
30         self.nfp = 0
31
32         # Values from the Scanner object
33         self.tstamp = 0
34         self.newap = 0
35         self.newaps = False
36         self.aps = {}
37         self.oldpos = {}
38
39     def start ( self , timeout=5000 , writelog=False ) :
40         self.scan_timeout = timeout
41         self.db.open()
42         self._fd = open( self._file )
43         self._current = self._fd.readline().split()
44
45     def stop ( self ) :
46         self.scan_timeout = 0
47         self.db.close()
48         self._fd.close()
49
50     def scan ( self ) :
51
52         if not self.scan_timeout :
53             return
54
55         next = self._fd.readline().split()
56         if not next :
57             return
58         delta = float(next[0]) - float(self._current[0])
59         gobject.timeout_add( int(1000 / self._speed * delta) , self.scan )
60
61         self.info = [ self._current[1] ]
62         self.info.extend( map( lambda x : float(x) , self._current[2:8] ) )
63         if self.info[0] == "FIX" :
64             self.ngps += 1
65
66         self.nscan +=1
67         self.scanlist.clear()
68         self.tstamp = float(self._current[0])
69         for n in range(10, len(self._current), 2) :
70             self.nfp += 1
71             self.scanlist[ self._current[n] ] = int(self._current[n+1])
72
73         newap = 0
74         self.newaps = False
75         for mac,max_rss in self.scanlist.iteritems() :
76             stored = self.db.db.execute( "SELECT rss, n, lat, lon FROM ap WHERE mac='%s'" % mac ).fetchone()
77             if stored :
78                 if not self.aps.has_key( mac ) :
79                     self.aps[ mac ] = list(stored[1:])
80                 if stored[0] > max_rss :
81                     max_rss = stored[0]
82                 self.db.update( mac , max_rss , self.tstamp , self.info[4:] )
83             else :
84                 newap += 1
85                 if not self.aps.has_key( mac ) :
86                     self.aps[ mac ] = [ 0 , 0 , 0 ]
87                 self.db.add( mac , max_rss , self.tstamp , self.info[4:] )
88             if self.aps[mac][0] != 0 :
89                 self.oldpos[mac] = self.aps[mac][1] / self.aps[mac][0] , self.aps[mac][2] / self.aps[mac][0]
90             self.aps[mac][0] += 1
91             self.aps[mac][1] += self.info[4]
92             self.aps[mac][2] += self.info[5]
93         if newap :
94             self.newap += newap
95             self.newaps = True
96
97         self._current = next
98
99     def report ( self ) :
100         return "%d gps\t%d scan\t%d fp\t%d ap\t%d total ap" % ( self.ngps , self.nscan , self.nfp , self.newap , self.db.nrows() )
101
102
103 gobject.type_register(ReplayScanner)
104
105 if __name__ == "__main__" :
106     loop = gobject.MainLoop()
107     sample = ReplayScanner()
108     def show_scan(wifiscanner):
109         gobject.timeout_add( 5000 , show_scan , sample )
110         print "scan results %s" % wifiscanner.report()
111         print "  tstamp %s" % wifiscanner.tstamp
112         c = 0
113         for k,v in wifiscanner.scanlist.iteritems() :
114            c += 1
115            print "    %s %s" % ( k , v )
116            if c > 5 :
117                print "    ..."
118                break
119         print
120     sample.start()
121     sample.scan()
122     gobject.timeout_add( 5100 , show_scan , sample )
123     loop.run()                                       
124     sample.stop()                                 
125