* Add Status Screen
authorStephan Reichholf <sreichholf@users.schwerkraft.elitedvb.net>
Thu, 3 May 2007 16:49:37 +0000 (16:49 +0000)
committerStephan Reichholf <sreichholf@users.schwerkraft.elitedvb.net>
Thu, 3 May 2007 16:49:37 +0000 (16:49 +0000)
* Add Signal Strength to Scan
* many smaller fixes

wirelesslan/CONTROL/control
wirelesslan/src/Wlan.py
wirelesslan/src/iwlibs.py
wirelesslan/src/plugin.py

index 0af7ce7..93c1330 100644 (file)
@@ -1,5 +1,5 @@
 Package: enigma2-plugin-systemplugins-wirelesslan
-Version: 1.05-20070320-r0
+Version: 1.2-20070503-r0
 Description: Wireless LAN Configuration Tool
 Architecture: mipsel
 Section: extra
index ddce165..31204ea 100644 (file)
@@ -5,6 +5,8 @@ from Components.GUIComponent import GUIComponent
 from Components.HTMLComponent import HTMLComponent
 from Components.config import config, ConfigYesNo, ConfigIP, NoSave, ConfigSubsection, ConfigMAC, ConfigEnableDisable, ConfigText, ConfigSelection
 
+from types import *
+
 import iwlibs
 
 import os, string
@@ -24,7 +26,8 @@ config.plugins.wlan.encryption.type = NoSave(ConfigSelection(list, default = _("
 config.plugins.wlan.encryption.psk = NoSave(ConfigText(default = "mysecurewlan", fixed_size = False))
 
 class Wlan:
-       def __init__(self):
+
+       def __init__(self, iface):
                a = ''; b = ''
                
                for i in range(0, 255):
@@ -34,10 +37,12 @@ class Wlan:
                    else:
                        b = b + chr(i)
                
+               self.iface = iface
                self.asciitrans = string.maketrans(a, b)
 
        def asciify(self, str):
                return str.translate(self.asciitrans)
+
        
        def getWirelessInterfaces(self):
                iwifaces = None
@@ -47,16 +52,17 @@ class Wlan:
                        print "[Wlan.py] No Wireless Networkcards could be found"
                
                return iwifaces
+
        
-       def getNetworkList(self, iface):
+       def getNetworkList(self):
 
-               ifobj = iwlibs.Wireless(iface) # a Wireless NIC Object
+               ifobj = iwlibs.Wireless(self.iface) # a Wireless NIC Object
                print "ifobj.getStatistics(): ", ifobj.getStatistics()
                
                #Association mappings
                stats, quality, discard, missed_beacon = ifobj.getStatistics()
                snr = quality.signallevel - quality.noiselevel
-               os.system("ifconfig "+iface+" up")
+               os.system("ifconfig "+self.iface+" up")
                
                try:
                        scanresults = ifobj.scan()
@@ -81,30 +87,72 @@ class Wlan:
                                for element in result.custom:
                                        element = element.encode()
                                        extra.append( string.strip(self.asciify(element)) )
+                               
+                               print result.quality.getSignallevel()
+                               
+                               if result.quality.sl is 0:
+                                       begin = extra[0].find('SignalStrength=')+15
+                                                                               
+                                       done = False
+                                       end = begin+1
+                                       
+                                       while not done:
+                                               if extra[0][begin:end].isdigit():
+                                                       end += 1
+                                               else:
+                                                       done = True
+                                                       end -= 1
+                                       
+                                       signal = extra[0][begin:end]
+                                       print "[Wlan.py] signal is:" + str(signal)
 
+                               else:
+                                       signal = str(result.quality.sl)
+                               
                                aps[bssid] = {
                                        'active' : True,
                                        'bssid': result.bssid,
-                                       'channel': result.frequency.getChannel(result.frequency.getFrequency(), result.range),
+                                       'channel': result.frequency.getChannel(result.frequency.getFrequency()),
                                        'encrypted': encryption,
                                        'essid': string.strip(self.asciify(result.essid)),
-                                       'iface': iface,
+                                       'iface': self.iface,
                                        'maxrate' : result.rate[-1],
                                        'noise' : result.quality.getNoiselevel(),
-                                       'quality' : result.quality.quality,
-                                       'signal' : result.quality.getSignallevel(),
+                                       'quality' : str(result.quality.quality),
+                                       'signal' : signal,
                                        'custom' : extra,
                                }
-                               
+                               print aps[bssid]
                        return aps
+
+               
+       def getStatus(self):
+               ifobj = iwlibs.Wireless(self.iface)
+               fq = iwlibs.Iwfreq()
+               
+               status = {
+                                 'BSSID': str(ifobj.getAPaddr()),
+                                 'ESSID': str(ifobj.getEssid()),
+                                 'quality': str(ifobj.getStatistics()[1].quality),
+                                 'signal': str(ifobj.getStatistics()[1].sl),
+                                 'bitrate': str(ifobj.getBitrate()),
+                                 'channel': str(fq.getChannel(str(ifobj.getFrequency()[0:-3]))),
+               }
+               
+               for (key, item) in status.items():
+                       if item is "None" or item is "":
+                                       status[key] = _("N/A")
                                
+               return status
+
+
 
 class WlanList(HTMLComponent, GUIComponent):
        
        def __init__(self, session, iface):
                
                GUIComponent.__init__(self)
-               self.w = Wlan()
+               self.w = Wlan(iface)
                self.iface = iface
                
                self.length = 0
@@ -119,7 +167,8 @@ class WlanList(HTMLComponent, GUIComponent):
                                
                self.reload()
        
-       def buildWlanListEntry(self, essid, bssid, encrypted, iface, maxrate):                                                                                                 
+       
+       def buildWlanListEntry(self, essid, bssid, encrypted, iface, maxrate, signal):                                                                                                 
                
                res = [ (essid, encrypted, iface) ]
                
@@ -127,21 +176,23 @@ class WlanList(HTMLComponent, GUIComponent):
                        essid = bssid
                
                e = encrypted and _("Yes") or _("No")
-               res.append( MultiContentEntryText(pos=(0, 0), size=(570, 35), font=0, flags=RT_HALIGN_LEFT, text=essid) )
+               res.append( MultiContentEntryText(pos=(0, 0), size=(470, 35), font=0, flags=RT_HALIGN_LEFT, text=essid) )
+               res.append( MultiContentEntryText(pos=(480, 0), size=(90, 35), font=0, flags=RT_HALIGN_RIGHT, text=signal+"%") )
                res.append( MultiContentEntryText(pos=(0, 40), size=(180, 20), font=1, flags=RT_HALIGN_LEFT, text=_("Max. Bitrate: ")+maxrate) )
                res.append( MultiContentEntryText(pos=(190, 40), size=(180, 20), font=1, flags=RT_HALIGN_CENTER, text=_("Encrypted: ")+e) )
                res.append( MultiContentEntryText(pos=(380, 40), size=(190, 20), font=1, flags=RT_HALIGN_RIGHT, text=_("Interface: ")+iface) )
                return res
+               
                        
        def reload(self):
-               aps = self.w.getNetworkList(self.iface)
+               aps = self.w.getNetworkList()
                list = []
                if aps is not None:
                        print "[Wlan.py] got Accespoints!"
                        for ap in aps:
                                a = aps[ap]
                                if a['active']:
-                                       list.append((a['essid'], a['bssid'], a['encrypted'], a['iface'], a['maxrate']))
+                                       list.append( (a['essid'], a['bssid'], a['encrypted'], a['iface'], a['maxrate'], a['signal']) )
                
                self.length = len(list)
                self.l.setList([])
@@ -149,19 +200,25 @@ class WlanList(HTMLComponent, GUIComponent):
                        
        GUI_WIDGET = eListbox
 
+
        def getCurrent(self):
                return self.l.getCurrentSelection()
        
+       
        def postWidgetCreate(self, instance):
                instance.setContent(self.l)
                instance.setItemHeight(60)
        
+       
        def getLength(self):
                return self.length
 
+
+
 class wpaSupplicant:
        def __init__(self):
                pass
+       
                
        def writeConfig(self):  
                        
@@ -221,7 +278,13 @@ class wpaSupplicant:
                                        if split[1] == "WPA RSN" : split[1] = 'WPA2'
                                        config.plugins.wlan.encryption.type.value = split[1]
                                        print "[Wlan.py] Got Encryption "+split[1]
-                               
+                                       
+                               elif split[0] == 'wep_key0':
+                                       config.plugins.wlan.encryption.enabled.value = True
+                                       config.plugins.wlan.encryption.type.value = 'WEP'
+                                       config.plugins.wlan.encryption.psk.value = split[1][1:-1]
+                                       print "[Wlan.py] Got Encryption WEP key0 is: "+split[1][1:-1]
+                                       
                                elif split[0] == 'psk':
                                        config.plugins.wlan.encryption.psk.value = split[1][1:-1]
                                        print "[Wlan.py] Got PSK "+split[1][1:-1]
@@ -231,6 +294,7 @@ class wpaSupplicant:
                except:
                        print "[Wlan.py] Error parsing /etc/wpa_supplicant.conf"
        
+       
        def restart(self, iface):
                import os
                os.system("start-stop-daemon -K -x /usr/sbin/wpa_supplicant")
index 9f4a60a..49a2530 100644 (file)
@@ -123,7 +123,7 @@ class Wireless(object):
                                              SIOCGIWAP,
                                              data=s)
         if i > 0:
-            return (i, result)
+            return result
 
         return self.iwstruct.getMAC(result)
    
@@ -138,7 +138,7 @@ class Wireless(object):
         i, result = self.iwstruct.iw_get_ext(self.ifname, 
                                             SIOCGIWRATE)
         if i > 0:
-            return (i, result)
+            return result
         iwfreq = Iwfreq(result)
         return iwfreq.getBitrate()
     
@@ -185,7 +185,7 @@ class Wireless(object):
                                              SIOCGIWESSID, 
                                              data=s)
         if i > 0:
-            return (i, result)
+            return result
         str = buff.tostring()
         return str.strip('\x00')
 
@@ -199,7 +199,7 @@ class Wireless(object):
                                              SIOCSIWESSID, 
                                              data=s)
         if i > 0:
-            return (i, result)
+            return result
 
     def getEncryption(self):
         """get encryption information which is probably a string of '*',
@@ -261,7 +261,7 @@ class Wireless(object):
         i, result = self.iwstruct.iw_get_ext(self.ifname, 
                                              SIOCGIWMODE)
         if i > 0:
-            return (i, result)
+            return result
         mode = self.iwstruct.unpack('i', result[:4])[0]
         return modes[mode]
 
@@ -279,7 +279,7 @@ class Wireless(object):
                                              SIOCSIWMODE, 
                                              data=s)
         if i > 0:
-            return (i, result)
+            return result
     
     def getWirelessName(self):
         """ returns wireless name 
@@ -292,7 +292,7 @@ class Wireless(object):
         i, result = self.iwstruct.iw_get_ext(self.ifname, 
                                              SIOCGIWNAME)
         if i > 0:
-            return (i, result)
+            return result
         return result.split('\0')[0]
     
     def getPowermanagement(self):
@@ -621,20 +621,34 @@ class Iwfreq(object):
         # m and don't needs to be recalculated
         return "%i dBm" %self.mw2dbm(self.frequency/10)
     
-    def getChannel(self, freq, iwrange):
+    def getChannel(self, freq):
         """returns channel information given by frequency
            
            returns None if frequency can't be converted
            freq = frequency to convert (int)
            iwrange = Iwrange object
         """
-        if freq < KILO:
+        
+        try:
+            freq = float(freq)
+        except:
             return None
         
-        # XXX
-        # for frequency in iwrange.frequencies
-
+        lut = {}
+        #13 Channels beginning at 2.412GHz and inreasing by 0,005 GHz steps
+        for i in range(0,12):
+            cur = float( 2.412 + ( i * 0.005 ) )
+            lut[str(cur)] = i+1
+        # Channel 14 need special actions ;)
+        lut['2.484'] = 14
         
+        
+        if str(freq) in lut.keys():
+                return lut[str(freq)]
+        
+        return None
+    
+          
     def mw2dbm(self, mwatt):
         """ converts mw to dbm(float) """
         return math.ceil(10.0 * math.log10(mwatt))
index 70c2040..57051a4 100644 (file)
@@ -1,3 +1,5 @@
+from enigma import eTimer
+
 from Screens.Screen import Screen
 from Screens.MessageBox import MessageBox
 
@@ -19,21 +21,137 @@ from Wlan import Wlan, WlanList, wpaSupplicant
 
 plugin_path = "/usr/lib/enigma2/python/Plugins/SystemPlugins/WirelessLan"
 
-class WlanSelection(Screen):
+class WlanSelectScreen(Screen):
+       skin = """
+       <screen position="185,238" size="350,100" title="Wireless Network Tools" >
+               <widget name="menu" position="10,10" size="330,80" scrollbarMode="showOnDemand" />
+       </screen>
+       """
+       
+       def __init__(self, session, iface):
+               Screen.__init__(self, session)
+               self.session = session
+               
+               self.skin = WlanSelectScreen.skin
+               self.skin_path = plugin_path            
+               
+               self.iface = iface
+               
+               list = []
+               list.append(_("Scan for Wireless Networks")) 
+               list.append(_("Show WLAN Status"))
+               list.append(_("Edit Wireless Settings"))
+               
+               
+               self["menu"] = MenuList(list)
+               
+               self["actions"] = NumberActionMap(["WizardActions", "InputActions", "EPGSelectActions"],
+               {
+                       "ok": self.ok,
+                       "back": self.exit,
+               }, -1)
+               
+       def ok(self):
+               idx = self["menu"].getSelectedIndex()
+               if idx is 0:
+                       self.session.openWithCallback(EntryChosen, WlanScan, self.iface)
+                       print "[plugin.py:Wireless] Starting WlanScan"
+               elif idx is 1:
+                       self.session.open(WlanStatus, self.iface)
+                       print "[plugin.py:Wireless] Starting WlanStatus"
+
+               elif idx is 2:
+                       self.session.open(WlanConfiguration, self.iface)
+                       print "[plugin.py:Wireless] Starting Manual Configuration"
+
+               else:
+                       print "[plugin.py:Wireless] Unkown Menupoint"
+                               
+       def exit(self):
+               self.close()
+               
+                       
+class WlanStatus(Screen):
+       skin = """
+       <screen position="185,188" size="350,223" title="Wireless Network Status" >
+               <widget name="LabelBSSID" position="10,10" size="150,25" valign="left" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+               <widget name="LabelESSID" position="10,38" size="150,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+               <widget name="LabelQuality" position="10,66" size="150,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+               <widget name="LabelSignal" position="10,94" size="150,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+               <widget name="LabelBitrate" position="10,122" size="150,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+               <widget name="LabelChannel" position="10,150" size="150,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+               
+               <widget name="BSSID" position="170,10" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+               <widget name="ESSID" position="170,38" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+               <widget name="quality" position="170,66" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+               <widget name="signal" position="170,94" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+               <widget name="bitrate" position="170,122" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+               <widget name="channel" position="170,150" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+       </screen>
+       """
+       
+       def __init__(self, session, iface):
+               
+               Screen.__init__(self, session)
+               
+               self.session = session
+               self.iface = iface
+               self.skin = WlanStatus.skin
+               
+               self.timer = eTimer()
+               self.timer.timeout.get().append(self.resetList) 
+               self.onShown.append(lambda: self.timer.start(5000))
+                                                   
+               self["LabelBSSID"] = Label(_('Accesspoint:'))
+               self["LabelESSID"] = Label(_('SSID:'))
+               self["LabelQuality"] = Label(_('Link Quality:'))
+               self["LabelSignal"] = Label(_('Signal Strength:'))
+               self["LabelBitrate"] = Label(_('Bitrate:'))
+               self["LabelChannel"] = Label(_('Channel:'))
+                       
+               self["BSSID"] = Label()
+               self["ESSID"] = Label()
+               self["quality"] = Label()
+               self["signal"] = Label()
+               self["bitrate"] = Label()
+               self["channel"] = Label()
+               
+               self.resetList()
+               
+               self["actions"] = NumberActionMap(["WizardActions", "InputActions", "EPGSelectActions"],
+               {
+                       "ok": self.exit,
+                       "back": self.exit,
+               }, -1)
+               
+       def resetList(self):
+               w = Wlan(self.iface)
+               stats = w.getStatus()
+                
+               self["BSSID"].setText(stats['BSSID'])
+               self["ESSID"].setText(stats['ESSID'])
+               self["quality"].setText(stats['quality']+"%")
+               self["signal"].setText(stats['signal']+"%")
+               self["bitrate"].setText(stats['bitrate'])
+               self["channel"].setText(stats['channel'])
+                       
+       def exit(self):
+               self.timer.stop()
+               self.close()    
+
+class WlanScan(Screen):
        skin = """
        <screen position="70,138" size="610,300" title="Choose a Wireless Network" >
                <widget name="info" position="10,10" size="580,30" font="Regular;24" transparent="1" foregroundColor="#FFFFFF" />
                <widget name="list" position="10,60" size="580,200" scrollbarMode="showOnDemand" />
                
-               <widget name="cancel" position="10,255" size="140,40" pixmap="~/key-red.png" zPosition="1" transparent="1" alphatest="on" />
-               <widget name="select" position="160,255" size="140,40" pixmap="~/key-green.png" zPosition="1" transparent="1" alphatest="on" />
-               <widget name="rescan" position="310,255" size="140,40" pixmap="~/key-yellow.png" zPosition="1" transparent="1" alphatest="on" />
-               <widget name="skip" position="460,255" size="140,40" pixmap="~/key-blue.png" zPosition="1" transparent="1" alphatest="on" />
+               <widget name="cancel" position="80,255" size="140,40" pixmap="~/key-red.png" zPosition="1" transparent="1" alphatest="on" />
+               <widget name="select" position="230,255" size="140,40" pixmap="~/key-green.png" zPosition="1" transparent="1" alphatest="on" />
+               <widget name="rescan" position="380,255" size="140,40" pixmap="~/key-yellow.png" zPosition="1" transparent="1" alphatest="on" />
                
-               <widget name="canceltext" position="10,255" size="140,40" valign="center" halign="center" zPosition="2" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />          
-               <widget name="selecttext" position="160,255" size="140,40" valign="center" halign="center" zPosition="2" font="Regular;20" transparent="1"  foregroundColor="#FFFFFF" />
-               <widget name="rescantext" position="310,255" size="140,40" valign="center" halign="center" zPosition="2" font="Regular;20" transparent="1"  foregroundColor="#FFFFFF" />
-               <widget name="skiptext" position="460,255" size="140,40" valign="center" halign="center" zPosition="2" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+               <widget name="canceltext" position="80,255" size="140,40" valign="center" halign="center" zPosition="2" font="Regular;20" transparent="1"  foregroundColor="#FFFFFF" />         
+               <widget name="selecttext" position="230,255" size="140,40" valign="center" halign="center" zPosition="2" font="Regular;20" transparent="1"  foregroundColor="#FFFFFF" />
+               <widget name="rescantext" position="380,255" size="140,40" valign="center" halign="center" zPosition="2" font="Regular;20" transparent="1"  foregroundColor="#FFFFFF" />
        </screen>
        """
        def __init__(self, session, iface):
@@ -41,7 +159,7 @@ class WlanSelection(Screen):
                Screen.__init__(self, session)
                self.session = session
                
-               self.skin = WlanSelection.skin
+               self.skin = WlanScan.skin
                self.skin_path = plugin_path 
                
                
@@ -52,13 +170,12 @@ class WlanSelection(Screen):
                self["cancel"] = Pixmap()
                self["select"] = Pixmap()
                self["rescan"] = Pixmap()
-               self["skip"] = Pixmap()
                
                self.setInfo()
                
                self["canceltext"] = Label(_("Cancel"))
-               self["selecttext"] = Label(_("Select"))
-               self["rescantext"] = Label(_("Rescan"))
+               self["selecttext"] = Label(_("OK"))
+               self["rescantext"] = Label(_("Refresh"))
                self["skiptext"] = Label(_("Skip"))
                        
                self["actions"] = NumberActionMap(["WizardActions", "InputActions", "EPGSelectActions"],
@@ -74,7 +191,6 @@ class WlanSelection(Screen):
                        "red": self.exit,
                        "green": self.select,
                        "yellow": self.rescan,
-                       "blue": self.skip,
                })
        
        def select(self):
@@ -89,9 +205,6 @@ class WlanSelection(Screen):
                self["list"].reload()
                self.setInfo()
        
-       def skip(self):
-               self.close( (self.session, None) )
-       
        def exit(self):
                self.close( (None ,) )
        
@@ -111,7 +224,7 @@ class WlanConfiguration(ConfigListScreen, Screen):
                </screen>
        """
        
-       def __init__(self, session, essid = None, encrypted = False, iface = "wlan0"):
+       def __init__(self, session, iface = "wlan0", essid = None, encrypted = False):
                
                Screen.__init__(self, session)          
                self.skin = WlanConfiguration.skin
@@ -177,23 +290,23 @@ def EntryChosen(parms):
                        essid = val[0]
                        encrypted = val[2]
                        iface = val[3]
-                       session.open(WlanConfiguration, essid, encrypted, iface)
+                       session.open(WlanConfiguration, iface, essid, encrypted)
                else:
                        session.open(WlanConfiguration)
 
-def WlanSelectionMain(session, iface):
-       session.openWithCallback(EntryChosen, WlanSelection, iface)
+def WlanSelectScreenMain(session, iface):
+       session.open(WlanSelectScreen, iface)
 
-def WlanConfigurationMain(session, **kwargs):
-       session.open(WlanConfiguration)
+def WlanScanMain(session, iface):
+       session.openWithCallback(EntryChosen, WlanScan, iface)
 
 def callFunction(iface):
        
-       w = Wlan()
+       w = Wlan(iface)
        i = w.getWirelessInterfaces()
        if i:
                if iface in i:
-                       return WlanSelectionMain        
+                       return WlanSelectScreenMain     
        
        return None