REFACTORING : move tstamp into real scanner object
[wifihood] / wifiscanner / wifimap / replay.py
index d40bfb6..a0ccd46 100644 (file)
@@ -1,17 +1,16 @@
 
-import config
+import db
 
 import gobject
 
 import os
 
-conf = config.Configuration()
-
 class ReplayScanner ( gobject.GObject ) :
 
-    def __init__ ( self ) :
+    def __init__ ( self , conf , ifname="wlan0" ) :
         gobject.GObject.__init__( self )
         self.scan_timeout = 0
+        self.db = db.database( os.path.join( conf.homedir , "wifireplay.db" ) )
 
         # Values specific to replaying
         self._file = os.path.join( conf.homedir , "wiscan_gui.info" )
@@ -27,20 +26,25 @@ class ReplayScanner ( gobject.GObject ) :
 
         # Values to be set by wireless scans
         self.scanlist = {}
-        self.tstamp = 0
         self.nscan = 0
         self.nfp = 0
 
         # Values from the Scanner object
+        self.tstamp = 0
         self.newap = 0
+        self.newaps = False
+        self.aps = {}
+        self.oldpos = {}
 
-    def start ( self , timeout=5000 ) :
+    def start ( self , timeout=5000 , writelog=False ) :
         self.scan_timeout = timeout
+        self.db.open()
         self._fd = open( self._file )
         self._current = self._fd.readline().split()
 
     def stop ( self ) :
         self.scan_timeout = 0
+        self.db.close()
         self._fd.close()
 
     def scan ( self ) :
@@ -49,24 +53,51 @@ class ReplayScanner ( gobject.GObject ) :
             return
 
         next = self._fd.readline().split()
+        if not next :
+            return
         delta = float(next[0]) - float(self._current[0])
         gobject.timeout_add( int(1000 / self._speed * delta) , self.scan )
 
-        self.info = self._current[1:8]
+        self.info = [ self._current[1] ]
+        self.info.extend( map( lambda x : float(x) , self._current[2:8] ) )
         if self.info[0] == "FIX" :
             self.ngps += 1
 
         self.nscan +=1
         self.scanlist.clear()
         self.tstamp = float(self._current[0])
-        for n in range(11, len(self._current), 2) :
+        for n in range(10, len(self._current), 2) :
             self.nfp += 1
             self.scanlist[ self._current[n] ] = int(self._current[n+1])
 
+        newap = 0
+        self.newaps = False
+        for mac,max_rss in self.scanlist.iteritems() :
+            stored = self.db.db.execute( "SELECT rss, n, lat, lon FROM ap WHERE mac='%s'" % mac ).fetchone()
+            if stored :
+                if not self.aps.has_key( mac ) :
+                    self.aps[ mac ] = list(stored[1:])
+                if stored[0] > max_rss :
+                    max_rss = stored[0]
+                self.db.update( mac , max_rss , self.tstamp , self.info[4:] )
+            else :
+                newap += 1
+                if not self.aps.has_key( mac ) :
+                    self.aps[ mac ] = [ 0 , 0 , 0 ]
+                self.db.add( mac , max_rss , self.tstamp , self.info[4:] )
+            if self.aps[mac][0] != 0 :
+                self.oldpos[mac] = self.aps[mac][1] / self.aps[mac][0] , self.aps[mac][2] / self.aps[mac][0]
+            self.aps[mac][0] += 1
+            self.aps[mac][1] += self.info[4]
+            self.aps[mac][2] += self.info[5]
+        if newap :
+            self.newap += newap
+            self.newaps = True
+
         self._current = next
 
     def report ( self ) :
-        return "%d gps\t%d scan\t%d fp\t%d ap\t%d total ap" % ( self.ngps , self.nscan , self.nfp , self.newap , -1 )
+        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() )
 
 
 gobject.type_register(ReplayScanner)