From 2a9bb59a355249b8c55dcc712e58d75abfe7bdef Mon Sep 17 00:00:00 2001 From: cuu Date: Thu, 16 Aug 2018 21:20:00 +0800 Subject: [PATCH] start bluetooth --- .../10_Settings/Bluetooth/__init__.py | 228 ++++++++++++++++++ Menu/GameShell/10_Settings/Wifi/pages.py | 2 +- .../Wifi => sys.py/UI}/keyboard.py | 0 sys.py/libs/DBUS/__init__.py | 25 +- 4 files changed, 251 insertions(+), 4 deletions(-) create mode 100644 Menu/GameShell/10_Settings/Bluetooth/__init__.py rename {Menu/GameShell/10_Settings/Wifi => sys.py/UI}/keyboard.py (100%) diff --git a/Menu/GameShell/10_Settings/Bluetooth/__init__.py b/Menu/GameShell/10_Settings/Bluetooth/__init__.py new file mode 100644 index 0000000..79dc7d2 --- /dev/null +++ b/Menu/GameShell/10_Settings/Bluetooth/__init__.py @@ -0,0 +1,228 @@ + +# -*- coding: utf-8 -*- + +import pygame +#import math +import commands + +#from beeprint import pp +from libs.roundrects import aa_round_rect + +from libs.DBUS import bus, adapter,devices + +#import gobject +#from wicd import misc +## local UI import +from UI.constants import Width,Height,ICON_TYPES +from UI.page import Page,PageSelector +from UI.label import Label +from UI.fonts import fonts +from UI.util_funcs import midRect +from UI.keys_def import CurKeys +from UI.scroller import ListScroller +from UI.icon_pool import MyIconPool +from UI.icon_item import IconItem +from UI.multi_icon_item import MultiIconItem +from UI.skin_manager import SkinManager + +from UI.multilabel import MultiLabel + + +class BleListSelector(PageSelector): + _BackgroundColor = SkinManager().GiveColor('Front') + + def __init__(self): + self._PosX = 0 + self._PosY = 0 + self._Height = 0 + + def AnimateDraw(self,x2,y2): + pass + + def Draw(self): + idx = self._Parent._PsIndex + if idx < len( self._Parent._WirelessList): + x = self._Parent._WirelessList[idx]._PosX+11 + y = self._Parent._WirelessList[idx]._PosY+1 + h = self._Parent._WirelessList[idx]._Height -3 + + self._PosX = x + self._PosY = y + self._Height = h + + aa_round_rect(self._Parent._CanvasHWND, + (x,y,self._Width,h),self._BackgroundColor,4,0,self._BackgroundColor) + +class BleListMessageBox(Label): + _Parent = None + + def Draw(self): + my_text = self._FontObj.render( self._Text,True,self._Color) + w = my_text.get_width() + h = my_text.get_height() + x = (self._Parent._Width - w)/2 + y = (self._Parent._Height - h)/2 + padding = 10 + pygame.draw.rect(self._CanvasHWND,SkinManager().GiveColor('White'),(x-padding,y-padding, w+padding*2,h+padding*2)) + + pygame.draw.rect(self._CanvasHWND,SkinManager().GiveColor('Black'),(x-padding,y-padding, w+padding*2,h+padding*2),1) + + self._CanvasHWND.blit(my_text,(x,y,w,h)) + + + +class BluetoothPage(Page): + _WirelessList = [] + #Wicd dbus part + _Adapter = None + _Dbus = None + _Devices = None + + _BlePassword = "" + _Connecting = False + _Scanning = False + + _PrevState = None + _Selector = None + + _ShowingMessageBox = False + _MsgBox = None + _ConnectTry = 0 + _BlockCb = None + + _LastStatusMsg = "" + _FootMsg = ["Nav.","Scan","Info","Back","Enter"] + _Scroller = None + _ListFontObj = fonts["notosanscjk15"] + + _InfoPage = None + + def __init__(self): + Page.__init__(self) + self._WirelessList = [] + self._CanvasHWND = None + + def Init(self): + + self._PosX = self._Index * self._Screen._Width + self._Width = self._Screen._Width + self._Height = self._Screen._Height + + #self._CanvasHWND = pygame.Surface((self._Width,self._Height)) + self._CanvasHWND = self._Screen._CanvasHWND + + ps = BleListSelector() + ps._Parent = self + ps._Width = Width - 12 + + self._Ps = ps + self._PsIndex = 0 + + msgbox = WifiListMessageBox() + msgbox._CanvasHWND = self._CanvasHWND + msgbox.Init(" ",fonts["veramono12"]) + msgbox._Parent = self + + self._MsgBox = msgbox + + def DbusPropertiesChanged:## signal_name = "PropertiesChanged", + pass + + def GenNetworkList(self): + self._WirelessList = [] + start_x = 0 + start_y = 0 + + for network_id,v in enumerate(self._Devices): + ni = NetItem() + ni._Parent = self + ni._PosX = start_x + ni._PosY = start_y + network_id* NetItem._Height + ni._Width = Width + ni._FontObj = self._ListFontObj + ni.Init() + self._WirelessList.append(ni) + + self._PsIndex = 0 + + def Rescan(): + if self._Adapter!= None: + self._Adapter.StopDiscovery() + self._Adapter.StartDiscovery() + + def KeyDown: + + if event.key == CurKeys["A"] or event.key == CurKeys["Menu"]: + if self._Adapter != None: + _connecting = self._Wireless.CheckIfBluetoothConnecting() + if _connecting: + self.ShutDownConnecting() + self.ShowBox("ShutDownConnecting...") + else: + self.AbortedAndReturnToUpLevel() + else: + self.HideBox() + self.ReturnToUpLevelPage() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["Up"]: + self.ScrollUp() + self._Screen.Draw() + self._Screen.SwapAndShow() + if event.key == CurKeys["Down"]: + self.ScrollDown() + self._Screen.Draw() + self._Screen.SwapAndShow() + + if event.key == CurKeys["X"]: + self.Rescan() + + def Draw(): + self.ClearCanvas() + if len(self._WirelessList) == 0: + return + + self._Ps.Draw() + for i in self._WirelessList: + i.Draw() + + self._Scroller.UpdateSize( len(self._WirelessList)*NetItem._Height, self._PsIndex*NetItem._Height) + self._Scroller.Draw() + + + + + + + + + + +class APIOBJ(object): + + _Page = None + def __init__(self): + pass + def Init(self,main_screen): + self._Page = BluetoothPage() + self._Page._Dbus = bus + self._Page._Devices = devices + self._Page._Adapter = adapter + + self._Page._Screen = main_screen + self._Page._Name ="Bluetooth" + + self._Page.Init() + + def API(self,main_screen): + if main_screen !=None: + main_screen.PushPage(self._Page) + main_screen.Draw() + main_screen.SwapAndShow() + +OBJ = APIOBJ() +def Init(main_screen): + OBJ.Init(main_screen) +def API(main_screen): + OBJ.API(main_screen) diff --git a/Menu/GameShell/10_Settings/Wifi/pages.py b/Menu/GameShell/10_Settings/Wifi/pages.py index 63970ae..881eb3f 100644 --- a/Menu/GameShell/10_Settings/Wifi/pages.py +++ b/Menu/GameShell/10_Settings/Wifi/pages.py @@ -16,7 +16,7 @@ ## local UI import from libs.DBUS import bus,daemon,wireless,wired -from keyboard import Keyboard +from UI.keyboard import Keyboard from wifi_list import WifiList import myvars diff --git a/Menu/GameShell/10_Settings/Wifi/keyboard.py b/sys.py/UI/keyboard.py similarity index 100% rename from Menu/GameShell/10_Settings/Wifi/keyboard.py rename to sys.py/UI/keyboard.py diff --git a/sys.py/libs/DBUS/__init__.py b/sys.py/libs/DBUS/__init__.py index 50958df..77949af 100644 --- a/sys.py/libs/DBUS/__init__.py +++ b/sys.py/libs/DBUS/__init__.py @@ -23,11 +23,15 @@ else: from dbus.mainloop.glib import DBusGMainLoop DBusGMainLoop(set_as_default=True) -bus = daemon = wireless = wired = None +bus = daemon = wireless = wired = None +manager = objects = adapter = None +devices = {} def setup_dbus(force=True): global bus,daemon,wireless,wired + global manager,objects,adapter,devices + try: dbusmanager.connect_to_dbus() except dbus.DBusException: @@ -39,11 +43,26 @@ def setup_dbus(force=True): daemon = dbus_ifaces["daemon"] ## @dbus.service.method('org.wicd.daemon') wireless = dbus_ifaces["wireless"] ## @dbus.service.method('org.wicd.daemon.wireless') wired = dbus_ifaces["wired"] ## @ - + + + ### BlueZ + proxy_obj = bus.get_object("org.bluez", "/") + manager = dbus.Interface(proxy_obj,"org.freedesktop.DBus.ObjectManager") + objects = manager.GetManagedObjects() + + for path, interfaces in objects.iteritems(): + if "org.bluez.Device1" in interfaces: + devices[path] = interfaces["org.bluez.Device1"] ## like /org/bluez/hci0/dev_xx_xx_xx_yy_yy_yy + + proxy_obj = bus.get_object("org.bluez", "/org/bluez/hci0") + adapter = dbus.Interface(proxy_obj, "org.bluez.Adapter1") + if not daemon: print("Error connecting to wicd via D-Bus") - + + + return True