REFACTORING : move tstamp into real scanner object
[wifihood] / wifiscanner / wifimap / scanner.py
1
2 try :
3     import osso
4 except :
5     import hildongtk.osso as osso
6
7 import time
8
9 import db
10 import gps , wifiscan
11
12 import gobject
13
14 import os
15
16 class Scanner ( gps.GPSObject , wifiscan.WifiScanner ) :
17
18     def __init__ ( self , conf , ifname="wlan0" ) :
19         gps.GPSObject.__init__( self )
20         wifiscan.WifiScanner.__init__( self , ifname )
21         self.db = db.database( os.path.join( conf.homedir , conf.dbname ) )
22         self.homedir = conf.homedir
23
24         self.write = False
25
26         # Values to be set by wireless scans
27         self.tstamp = 0
28         self.newap = 0
29         self.newaps = False
30         self.aps = {}
31         self.oldpos = {}
32
33     def start ( self , timeout=5000 , writelog=False ) :
34         gps.GPSObject.start( self )
35         wifiscan.WifiScanner.start( self , timeout )
36         self.db.open()
37         self.write = writelog
38
39     def stop ( self ) :
40         gps.GPSObject.stop( self )
41         wifiscan.WifiScanner.stop( self )
42         self.db.close()
43         self.write = False
44
45     def scan ( self ) :
46         self.tstamp = time.time()
47         wifiscan.WifiScanner.scan( self )
48         newap = 0
49         self.newaps = False
50         for mac,max_rss in self.scanlist.iteritems() :
51             stored = self.db.db.execute( "SELECT rss, n, lat, lon FROM ap WHERE mac='%s'" % mac ).fetchone()
52             if stored :
53                 if not self.aps.has_key( mac ) :
54                     self.aps[ mac ] = list(stored[1:])
55                 if stored[0] > max_rss :
56                     max_rss = stored[0]
57                 self.db.update( mac , max_rss , self.tstamp , self.info[4:] )
58             else :
59                 newap += 1
60                 if not self.aps.has_key( mac ) :
61                     self.aps[ mac ] = [ 0 , 0 , 0 ]
62                 self.db.add( mac , max_rss , self.tstamp , self.info[4:] )
63             if self.aps[mac][0] != 0 :
64                 self.oldpos[mac] = self.aps[mac][1] / self.aps[mac][0] , self.aps[mac][2] / self.aps[mac][0]
65             self.aps[mac][0] += 1
66             self.aps[mac][1] += self.info[4]
67             self.aps[mac][2] += self.info[5]
68         if newap :
69             self.newap += newap
70             self.newaps = True
71         if self.write :
72             self.write_logs()
73
74     def write_logs ( self ) :
75             fd = open( os.path.join( self.homedir , "wiscan_gui.info" ) , 'a' )
76             fd.write( "%s %s\n" % ( self.tstamp , self ) )
77             fd.close()
78             if self.satellites :
79                 loclist = open( os.path.join( self.homedir , "location.info" ) , 'a' )
80                 loclist.write ( "%s\n" % ( self.satellites ,) )
81                 loclist.close()
82             if self.cells :
83                 celllist = open( os.path.join( self.homedir , "cell.info" ) , 'a' )
84                 celllist.write ( "%s\n" % ( self.cells ,) )
85                 celllist.close()
86
87     def __str__ ( self ) :
88         return "%s %s" % ( gps.GPSObject.__str__(self) , wifiscan.WifiScanner.__str__(self) )
89
90     def report ( self ) :
91         # BUG : if report is called after close, db.nrows() will produce an exception
92         return "%s\t%s\t%d ap\t%d total ap" % ( gps.GPSObject.report(self) , wifiscan.WifiScanner.report(self) , self.newap , self.db.nrows() )
93
94
95 gobject.type_register(Scanner)
96
97 if __name__ == "__main__" :
98     loop = gobject.MainLoop()
99     sample = Scanner()
100     def on_stop(control, mainloop):
101         mainloop.quit()
102     sample.control.connect("gpsd-stopped", on_stop, loop)
103     def show_scan(wifiscanner):
104         gobject.timeout_add( 5000 , show_scan , sample )
105         print "scan results %s" % wifiscanner.report()
106         print "  tstamp %s" % wifiscanner.tstamp
107         c = 0
108         for k,v in wifiscanner.scanlist.iteritems() :
109            c += 1
110            print "    %s %s" % ( k , v )
111            if c > 5 :
112                print "    ..."
113                break
114         print
115     sample.start()
116     sample.scan()
117     gobject.timeout_add( 5100 , show_scan , sample )
118     loop.run()                                       
119     sample.stop()                                 
120