#!/usr/bin/python import wifimap import gtk , pango try : import hildon except : hildon = False def global_start(button, scanner, config): scanner.start( config.scan_period , config.store_log ) if button._id : button.disconnect( button._id ) button._id = button.connect("clicked", global_stop, scanner, config) button.set_label("Switch GPS Off") def global_stop(button, scanner, config): scanner.stop() if button._id : button.disconnect( button._id ) button._id = button.connect("clicked", global_start, scanner, config) button.set_label("Switch GPS On") def enable_agps(button): if button.get_active() : print "%s state is active" % button def start_scan(button, scanner): # BUG : If gps is not started in advance, database is not opened and an exception happens scanner.scan() if button._id : button.disconnect( button._id ) button._id = button.connect("clicked", stop_scan, scanner) button.set_label("Stop scanning") def stop_scan(button, scanner): # FIXME : This method do not clear the scheduled scan scanner.scan_timeout = 0 if button._id : button.disconnect( button._id ) button._id = button.connect("clicked", start_scan, scanner) button.set_label("Start scanning") class scanner ( wifimap.ReplayScanner ) : def scan ( self ) : wifimap.ReplayScanner.scan( self ) self.report() def report ( self ) : self.status.set_label( wifimap.ReplayScanner.report(self) ) start, end = self.buffer.get_bounds() self.buffer.delete( start , end ) for mac,rss in self.scanlist.iteritems() : self.buffer.insert_at_cursor( "%s %5d\n" % ( mac , rss ) ) if self.info[0] == "FIX" : self.map.hide() self.map.recenter( self.info[4:6] ) pixmap,mask = self.map.get_pixbuf().render_pixmap_and_mask() pointsize = 2 if self.newaps : pointsize += 2 self.map.plot( pixmap , ( float(self.info[4]) , float(self.info[5]) ) , "red" , pointsize ) for mac,ap in self.aps.iteritems() : if self.oldpos.get( mac ) : self.map.line( pixmap , self.oldpos[mac] , ( ap[1]/ap[0] , ap[2]/ap[0] ) , "green" ) self.map.plot( pixmap , ( ap[1]/ap[0] , ap[2]/ap[0] ) , "green" , 2 ) self.map.get_pixbuf().get_from_drawable( pixmap , pixmap.get_colormap() , 0, 0 , 0 , 0 , self.map.win_x, self.map.win_y ) self.map.show() class AbstractWifiscanner : def __init__ ( self ) : config = wifimap.config.Configuration( 'scanner' ) _scanner = scanner( config , "wlan0" ) self.connect("delete_event", gtk.main_quit, None) self.vbox = gtk.VBox(homogeneous=False, spacing=0) # Top frame creation top_frame = gtk.Frame() hbox = gtk.HBox(homogeneous=False, spacing=0) top_frame.add(hbox) # Bottom frame creation bottom_frame = gtk.Frame() self.vbox.pack_end(bottom_frame, expand=False) self.vbox.pack_end(top_frame) bottom_box = gtk.HBox(homogeneous=False, spacing=0) bottom_frame.add( bottom_box ) # Top frame population notebook = gtk.Notebook() hbox.pack_start( notebook ) scrollview = gtk.ScrolledWindow() notebook.append_page( scrollview , gtk.Label("Scanning") ) self.map = MapWindow( config ) notebook.append_page( self.map , gtk.Label("Map") ) buttons = gtk.VBox(homogeneous=False, spacing=0) hbox.pack_end(buttons, expand=False) textview = self.TextView( "Scan results ..." ) scrollview.add( textview ) scrollview.set_policy( gtk.POLICY_NEVER , gtk.POLICY_AUTOMATIC ) # Buttons creation button = self.Button( "Switch GPS On") button._id = button.connect("clicked", global_start, _scanner, config) buttons.pack_start(button, expand=False) button_scan = self.Button( "Start scanning") button_scan._id = button_scan.connect("clicked", start_scan, _scanner) buttons.pack_start(button_scan, expand=False) toggle_button = self.CheckButton( "Use Assisted GPS" ) toggle_button.connect("toggled", enable_agps) buttons.pack_start(toggle_button, expand=False) # Bottom frame population status = gtk.Label( "status bar ..." ) _scanner.status = status _scanner.buffer = textview.get_buffer() _scanner.map = self.map.child bottom_box.pack_start( status , expand=False , padding=20 ) def run ( self ) : gtk.main() def settings_cb ( widget , map ) : window = wifimap.config.SettingsWindow( map.config , map.child.SetZoom ) if hildon : class MapWindow ( gtk.Frame ) : def __init__(self): gtk.Frame.__init__( self , config ) self.config = config self.add( wifimap.simpleMapWidget( self.config ) ) class Wifiscanner ( AbstractWifiscanner , hildon.StackableWindow ) : def __init__ ( self ) : hildon.StackableWindow.__init__( self ) self.set_title( "Wifihood Scanner" ) program = hildon.Program.get_instance() program.add_window(self) AbstractWifiscanner.__init__( self ) self.add(self.vbox) self.create_menu( ) self.show_all() def TextView ( self , placeholder=None ) : textview = hildon.TextView() if placeholder : textview.set_placeholder( placeholder ) textview.set_editable( False ) textview.set_cursor_visible( False ) textview.modify_font( pango.FontDescription("Courier 12") ) return textview def Button ( self , label="" ) : button = hildon.Button(gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT, hildon.BUTTON_ARRANGEMENT_VERTICAL, label) return button def CheckButton ( self , label=None ) : toggle_button = hildon.CheckButton( gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT ) if label : toggle_button.set_label( label ) return toggle_button def create_menu ( self ) : menubar = hildon.AppMenu() self.set_app_menu( menubar ) settings = hildon.Button(gtk.HILDON_SIZE_AUTO, hildon.BUTTON_ARRANGEMENT_VERTICAL, "Settings", None) settings.connect( "clicked", settings_cb , self.map ) menubar.append( settings ) menubar.show_all() else : class MapWindow ( gtk.Frame ) : def __init__(self): gtk.Frame.__init__( self , config ) self.config = config self.add( wifimap.simpleMapWidget( self.config , (640,400) ) ) class Wifiscanner ( AbstractWifiscanner , gtk.Window ) : def __init__ ( self ) : gtk.Window.__init__( self ) self.resize(640,400) AbstractWifiscanner.__init__( self ) self.add(self.vbox) self.create_menu() self.show_all() def TextView ( self , placeholder=None ) : textview = gtk.TextView() if placeholder : textview.get_buffer().set_text( placeholder ) textview.set_editable( False ) textview.set_cursor_visible( False ) textview.modify_font( pango.FontDescription("Courier 12") ) return textview def Button ( self , label="" ) : button = gtk.Button( label ) return button def CheckButton ( self , label=None ) : toggle_button = gtk.CheckButton() if label : toggle_button.set_label( label ) return toggle_button def create_menu ( self ) : menubar = gtk.MenuBar() self.vbox.pack_start( menubar ) settings = gtk.MenuItem( "Settings" ) settings.connect( "activate", settings_cb , self.map ) menubar.append( settings ) menubar.show_all() window = Wifiscanner() window.run()