From 315a9a12b128909f72e724a9070a5598cb386c07 Mon Sep 17 00:00:00 2001 From: cuu Date: Fri, 17 Aug 2018 11:26:33 +0800 Subject: [PATCH] bluetooth --- .../10_Settings/Bluetooth/__init__.py | 191 +++++++++++++++--- .../10_Settings/Bluetooth/net_item.py | 149 ++++++++++++++ Menu/GameShell/10_Settings/list_page.py | 1 + 3 files changed, 318 insertions(+), 23 deletions(-) create mode 100644 Menu/GameShell/10_Settings/Bluetooth/net_item.py diff --git a/Menu/GameShell/10_Settings/Bluetooth/__init__.py b/Menu/GameShell/10_Settings/Bluetooth/__init__.py index 79dc7d2..729699b 100644 --- a/Menu/GameShell/10_Settings/Bluetooth/__init__.py +++ b/Menu/GameShell/10_Settings/Bluetooth/__init__.py @@ -1,10 +1,9 @@ - # -*- coding: utf-8 -*- import pygame #import math import commands - +import dbus #from beeprint import pp from libs.roundrects import aa_round_rect @@ -27,6 +26,14 @@ from UI.skin_manager import SkinManager from UI.multilabel import MultiLabel +from net_item import NetItem + + +class BleInfoPage(Page): + _FootMsg = ["Nav.","Disconnect","Forget","Back",""] + _MyList = [] + _ListFontObj = fonts["varela15"] + class BleListSelector(PageSelector): _BackgroundColor = SkinManager().GiveColor('Front') @@ -42,7 +49,7 @@ class BleListSelector(PageSelector): def Draw(self): idx = self._Parent._PsIndex if idx < len( self._Parent._WirelessList): - x = self._Parent._WirelessList[idx]._PosX+11 + x = self._Parent._WirelessList[idx]._PosX+2 y = self._Parent._WirelessList[idx]._PosY+1 h = self._Parent._WirelessList[idx]._Height -3 @@ -51,7 +58,7 @@ class BleListSelector(PageSelector): self._Height = h aa_round_rect(self._Parent._CanvasHWND, - (x,y,self._Width,h),self._BackgroundColor,4,0,self._BackgroundColor) + (x,y,self._Width-4,h),self._BackgroundColor,4,0,self._BackgroundColor) class BleListMessageBox(Label): _Parent = None @@ -97,11 +104,26 @@ class BluetoothPage(Page): _InfoPage = None + _ADAPTER_DEV = "hci0" + def __init__(self): Page.__init__(self) self._WirelessList = [] self._CanvasHWND = None + def ShowBox(self,msg): + + self._MsgBox._Text = msg + self._ShowingMessageBox = True + self._Screen.Draw() + self._MsgBox.Draw() + self._Screen.SwapAndShow() + + def HideBox(self): + self.Draw() + self._ShowingMessageBox = False + self._Screen.SwapAndShow() + def Init(self): self._PosX = self._Index * self._Screen._Width @@ -118,46 +140,153 @@ class BluetoothPage(Page): self._Ps = ps self._PsIndex = 0 - msgbox = WifiListMessageBox() + msgbox = BleListMessageBox() msgbox._CanvasHWND = self._CanvasHWND msgbox.Init(" ",fonts["veramono12"]) msgbox._Parent = self self._MsgBox = msgbox - def DbusPropertiesChanged:## signal_name = "PropertiesChanged", - pass + self._Scroller = ListScroller() + self._Scroller._Parent = self + self._Scroller._PosX = 2 + self._Scroller._PosY = 2 + self._Scroller.Init() + + self.GenNetworkList() + + + def print_normal(self,address, properties): + print("[ " + address + " ]") + + for key in properties.keys(): + value = properties[key] + if type(value) is dbus.String: + value = unicode(value).encode('ascii', 'replace') + if (key == "Class"): + print(" %s = 0x%06x" % (key, value)) + else: + print(" %s = %s" % (key, value)) + + print() + + properties["Logged"] = True + + def skip_dev(self,old_dev, new_dev): + if not "Logged" in old_dev: + return False + if "Name" in old_dev: + return True + if not "Name" in new_dev: + return True + return False + + def DbusPropertiesChanged(self, interface, changed, invalidated, path): + global devices + + if interface != "org.bluez.Device1": + return + + if path in devices: + dev = devices[path] + + if self.skip_dev(dev, changed): + return + devices[path] = dict(devices[path].items() + changed.items()) + else: + devices[path] = changed + + if "Address" in devices[path]: + address = devices[path]["Address"] + else: + address = "" + + self.print_normal(address, devices[path]) + + def ShutDownConnecting(self): + print("Shutdownconnecting...") + + def AbortedAndReturnToUpLevel(self): + self.HideBox() + self._Screen._FootBar.ResetNavText() + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + def CheckIfBluetoothConnecting(self): + return True + def GenNetworkList(self): self._WirelessList = [] start_x = 0 start_y = 0 - for network_id,v in enumerate(self._Devices): + for i,v in enumerate(self._Devices): ni = NetItem() ni._Parent = self ni._PosX = start_x - ni._PosY = start_y + network_id* NetItem._Height + ni._PosY = start_y + i* NetItem._Height ni._Width = Width ni._FontObj = self._ListFontObj - ni.Init() + + ni.Init(v,self._Devices[v]) + self._WirelessList.append(ni) self._PsIndex = 0 - def Rescan(): + def Rescan(self): + proxy_obj = self._Dbus.get_object("org.bluez", "/org/bluez/" + self._ADAPTER_DEV) + adapter_props = dbus.Interface(proxy_obj,"org.freedesktop.DBus.Properties") + discoverying = adapter_props.Get("org.bluez.Adapter1", "Discovering") + print(discoverying) + if self._Adapter!= None: - self._Adapter.StopDiscovery() - self._Adapter.StartDiscovery() + try: + self._Adapter.StopDiscovery() + except Exception,e: + print(str(e)) + + try: + self._Adapter.StartDiscovery() + except Exception,e: + print(str(e)) + + + def ScrollUp(self): + if len(self._WirelessList) == 0: + return + self._PsIndex-=1 + if self._PsIndex < 0: + self._PsIndex = 0 + + cur_ni = self._WirelessList[self._PsIndex] + if cur_ni._PosY < 0: + for i in range(0,len(self._WirelessList)): + self._WirelessList[i]._PosY += self._WirelessList[i]._Height + + def ScrollDown(self): + if len(self._WirelessList) == 0: + return + self._PsIndex+=1 + if self._PsIndex >= len(self._WirelessList): + self._PsIndex = len(self._WirelessList) -1 + + cur_ni = self._WirelessList[self._PsIndex] + if cur_ni._PosY + cur_ni._Height > self._Height: + for i in range(0,len(self._WirelessList)): + self._WirelessList[i]._PosY -= self._WirelessList[i]._Height - def KeyDown: + def KeyDown(self,event): if event.key == CurKeys["A"] or event.key == CurKeys["Menu"]: if self._Adapter != None: - _connecting = self._Wireless.CheckIfBluetoothConnecting() + _connecting = self.CheckIfBluetoothConnecting() if _connecting: self.ShutDownConnecting() self.ShowBox("ShutDownConnecting...") + self.AbortedAndReturnToUpLevel() else: self.AbortedAndReturnToUpLevel() else: @@ -178,19 +307,26 @@ class BluetoothPage(Page): if event.key == CurKeys["X"]: self.Rescan() - def Draw(): + def Draw(self): self.ClearCanvas() if len(self._WirelessList) == 0: return - - self._Ps.Draw() - for i in self._WirelessList: - i.Draw() + + if len(self._WirelessList) * NetItem._Height > self._Height: + self._Ps._Width = self._Width - 11 + self._Ps.Draw() - self._Scroller.UpdateSize( len(self._WirelessList)*NetItem._Height, self._PsIndex*NetItem._Height) - self._Scroller.Draw() - + for i in self._WirelessList: + i.Draw() + + self._Scroller.UpdateSize( len(self._WirelessList)*NetItem._Height, self._PsIndex*NetItem._Height) + self._Scroller.Draw() + else: + self._Ps._Width = self._Width + self._Ps.Draw() + for i in self._WirelessList: + i.Draw() @@ -204,7 +340,10 @@ class APIOBJ(object): _Page = None def __init__(self): pass + def Init(self,main_screen): + global bus,devices,adapter + self._Page = BluetoothPage() self._Page._Dbus = bus self._Page._Devices = devices @@ -215,6 +354,12 @@ class APIOBJ(object): self._Page.Init() + bus.add_signal_receiver(self._Page.DbusPropertiesChanged, + dbus_interface = "org.freedesktop.DBus.Properties", + signal_name = "PropertiesChanged", + arg0 = "org.bluez.Device1", + path_keyword = "path") + def API(self,main_screen): if main_screen !=None: main_screen.PushPage(self._Page) diff --git a/Menu/GameShell/10_Settings/Bluetooth/net_item.py b/Menu/GameShell/10_Settings/Bluetooth/net_item.py new file mode 100644 index 0000000..aab2347 --- /dev/null +++ b/Menu/GameShell/10_Settings/Bluetooth/net_item.py @@ -0,0 +1,149 @@ +# -*- coding: utf-8 -*- + +import pygame + +## local UI import +from UI.page import Page +from UI.label import Label +from UI.fonts import fonts +from UI.icon_item import IconItem +from UI.multi_icon_item import MultiIconItem +from UI.icon_pool import MyIconPool +from UI.skin_manager import SkinManager + + +class NetItemMultiIcon(MultiIconItem): + _CanvasHWND = None + _Parent = None + _Width = 18 + _Height = 18 + + def Draw(self): + self._CanvasHWND.blit(self._ImgSurf,(self._PosX,self._PosY+(self._Parent._Height-self._Height)/2,self._Width,self._Height), + (0,self._IconIndex*self._IconHeight,self._IconWidth,self._IconHeight)) + +class NetItemIcon(IconItem): + + _CanvasHWND = None + _Parent = None + _Width = 18 + _Height = 18 + + def Draw(self): + self._CanvasHWND.blit(self._ImgSurf,(self._PosX,self._PosY+(self._Parent._Height-self._Height)/2,self._Width,self._Height)) + + +class NetItem(object): + _PosX = 0 + _PosY = 0 + _Width = 0 + _Height = 30 + + _Atts = {} + + _Channel="" # '10' + _Stren = "" ## 19% + + _Parent = None + _IsActive = False + + _Icons = {} ## wifi strength and security icons + _Labels = {} + _FontObj = None + + _RSSI = 0 + _MacAddr="" + _Path = "" #/org/bluez/hci0/dev_34_88_5D_97_FF_26 + + def __init__(self): + self._Labels = {} + self._Icons = {} + + def SetActive(self,act): + self._IsActive = act + + def Init(self, path, object): + self._Path = path + self._Atts = object + + is_active=False + if "Address" in object: + self._MacAddr = object["Address"] + + if "Connected" in object: + if object["Connected"] == 1: + is_active=True + + if is_active: + theString = ">> "+theString[1:] + self.SetActive(is_active) + + + name_label = Label() + name_label._PosX = 16 + name_label._CanvasHWND = self._Parent._CanvasHWND + + mac_addr = self._MacAddr + + if "Name" in object: + if len(object["Name"]) > 3: + mac_addr = object["Name"] + + if "RSSI" in object: + print(object["RSSI"]) + self._RSSI = int(object["RSSI"]) + + name_label.Init(mac_addr,self._FontObj) + + self._Labels["mac_addr"] = name_label + + done_icon = NetItemIcon() + done_icon._ImgSurf = MyIconPool._Icons["done"] + done_icon._CanvasHWND = self._Parent._CanvasHWND + done_icon._Parent = self + + self._Icons["done"] = done_icon + + + ## reuse the resource from TitleBar + nimt = NetItemMultiIcon() + nimt._ImgSurf = self._Parent._Screen._TitleBar._Icons["wifistatus"]._ImgSurf + nimt._CanvasHWND = self._Parent._CanvasHWND + nimt._Parent = self + self._Icons["wifistatus"] = nimt + + #pp(theString) + + + def Connect(self,notworkentry=None): + """ Execute connection. """ + #dev = dbus.Interface(bus.get_object("org.bluez", "/org/bluez/hci0/dev_"+"34_88_5D_97_FF_26"), "org.bluez.Device1") + proxy_obj = self._Parent._Dbus.get_object("org.bluez",self._Path) + dev = self._Parent._Dbus.Interface(proxy_obj, "org.bluez.Device1") + dev.Connect() + + def Draw(self): + #pygame.draw.line(self._Parent._CanvasHWND,(169,169,169),(self._PosX,self._PosY),(self._PosX+self._Width,self._PosY),1) + for i in self._Labels: + self._Labels[i]._PosY = self._PosY + (self._Height - self._Labels[i]._Height)/2 + self._Labels[i].Draw() + + if self._IsActive: + self._Icons["done"].NewCoord(320-14,self._PosY) + self._Icons["done"].Draw() + + """ + ge = 0 + if ge > 0: + self._Icons["wifistatus"]._IconIndex = ge + self._Icons["wifistatus"].NewCoord(self._Width-23,self._PosY) + self._Icons["wifistatus"].Draw() + + else: + self._Icons["wifistatus"]._IconIndex = 0 + self._Icons["wifistatus"].NewCoord(self._Width-23,self._PosY) + self._Icons["wifistatus"].Draw() + + """ + pygame.draw.line(self._Parent._CanvasHWND,SkinManager().GiveColor('Line'), + (self._PosX,self._PosY+self._Height-1),(self._PosX+self._Width,self._PosY+self._Height-1),1) diff --git a/Menu/GameShell/10_Settings/list_page.py b/Menu/GameShell/10_Settings/list_page.py index 7b3a59e..7321bb4 100644 --- a/Menu/GameShell/10_Settings/list_page.py +++ b/Menu/GameShell/10_Settings/list_page.py @@ -80,6 +80,7 @@ class ListPage(Page): alist = [["","Airplane","Airplane Mode"], ["","PowerOptions","Power Options"], ["","Wifi","Wi-Fi"], + ["","Bluetooth","Bluetooth"], ["","Sound","Sound Volume"], ["","Brightness","BackLight Brightness"], ["","Storage",""],