123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731 |
- # -*- coding: utf-8 -*-
- import re
- import pygame
- #import math
- import commands
- import dbus
- 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 MySkinManager
- from UI.confirm_page import ConfirmPage
- from UI.info_page_list_item import InfoPageListItem
- from UI.multilabel import MultiLabel
- from UI.lang_manager import MyLangManager
- from net_item import NetItem
- class BleForgetConfirmPage(ConfirmPage):
- _ConfirmText = MyLangManager.Tr("ConfirmForgetQ")
-
- def KeyDown(self,event):
- if event.key == CurKeys["Menu"] or event.key == CurKeys["A"]:
- self.ReturnToUpLevelPage()
- self._Screen.Draw()
- self._Screen.SwapAndShow()
-
- if event.key == CurKeys["B"]:
- self.SnapMsg(MyLangManager.Tr("Deleting"))
- self._Screen.Draw()
- self._Screen.SwapAndShow()
-
- try:
- #self._Parent._Adapter.RemoveDevice()
- print("try to RemoveDevice")
- except Exception,e:
- print(str(e))
-
- pygame.time.delay(400)
-
- self.ReturnToUpLevelPage()
- self._Screen.Draw()
- self._Screen.SwapAndShow()
-
-
- def Draw(self):
- #self.ClearCanvas()
- self.DrawBG()
- for i in self._MyList:
- i.Draw()
-
- self.Reset()
- class BleInfoPageSelector(PageSelector):
- _BackgroundColor = MySkinManager.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._MyList):
- x = self._PosX+2
- y = self._Parent._MyList[idx]._PosY+1
- h = self._Parent._MyList[idx]._Height -3
-
- self._PosX = x
- self._PosY = y
- self._Height = h
- aa_round_rect(self._Parent._CanvasHWND,
- (x,y,self._Width-4,h),self._BackgroundColor,4,0,self._BackgroundColor)
- class BleInfoPage(Page):
- _FootMsg = ["Nav","Disconnect","Forget","Back",""]
- _MyList = []
- _ListFontObj = MyLangManager.TrFont("varela15")
- _ListSmFontObj = fonts["varela12"] # small font
- _ListSm2FontObj= fonts["varela11"]
-
- _AList = {}
- _Path = ""
- def Init(self):
- if self._Screen != None:
- if self._Screen._CanvasHWND != None and self._CanvasHWND == None:
- self._CanvasHWND = self._Screen._CanvasHWND
- self._PosX = self._Index*self._Screen._Width
- self._Width = self._Screen._Width ## equal to screen width
- self._Height = self._Screen._Height
-
- ps = BleInfoPageSelector()
- ps._Parent = self
- self._Ps = ps
- self._PsIndex = 0
-
- #_AList is an object
- self.GenList()
- self._Scroller = ListScroller()
- self._Scroller._Parent = self
- self._Scroller._PosX = 2
- self._Scroller._PosY = 2
- self._Scroller.Init()
-
- self._ConfirmPage1 = BleForgetConfirmPage()
- self._ConfirmPage1._Screen = self._Screen
- self._ConfirmPage1._Name = "ConfirmForget"
- self._ConfirmPage1._Parent = self
- self._ConfirmPage1.Init()
-
- def GenList(self):
- if self._AList== None:
- return
- self._MyList = []
- self._PsIndex = 0
- start_x = 0
- start_y = 0
-
- for i,v in enumerate( self._AList):
- #print(i,v) # (0, dbus.String(u'AddressType'))
-
- li = InfoPageListItem()
- li._Parent = self
- li._PosX = start_x
- li._PosY = start_y + i*InfoPageListItem._Height
- li._Width = Width
- li._Fonts["normal"] = self._ListFontObj
-
- if v == "UUIDs":
- li._Fonts["small"] = self._ListSm2FontObj
- else:
- li._Fonts["small"] = self._ListSmFontObj
-
- li.Init( str(v) )
- li._Flag = v
-
- if v =="UUIDs":
- if len(self._AList[v]) > 1:
- pp(self._AList[v][0])
- sm_text = str(self._AList[v][0])
- else:
- sm_text = "<empty>"
- else:
- sm_text = str(self._AList[v])
-
- if sm_text == "0":
- sm_text="No"
- elif sm_text == "1":
- sm_text="Yes"
-
- sm_text = sm_text[:20]
- li.SetSmallText(sm_text)
-
- li._PosX = 2
- self._MyList.append(li)
- def TryToForget(self):
- global adapter
- proxy_obj = bus.get_object("org.bluez", self._Path)
- dev = dbus.Interface(proxy_obj, "org.bluez.Device1")
-
- self._Screen._MsgBox.SetText("Forgeting")
- self._Screen._MsgBox.Draw()
- self._Screen.SwapAndShow()
-
- try:
- adapter.RemoveDevice(dev)
- except Exception,e:
- print(str(e))
-
- pygame.time.delay(400)
-
- self.ReturnToUpLevelPage()
- self._Screen.Draw()
- self._Screen.SwapAndShow()
-
- def TryToDisconnect(self):
- global bus
-
- if "Connected" in self._AList:
- if self._AList["Connected"] == 0:
- return
-
- proxy_obj = bus.get_object("org.bluez", self._Path)
- dev = dbus.Interface(proxy_obj, "org.bluez.Device1")
-
- self._Screen._FootBar.UpdateNavText("Disconnecting")
- self._Screen._MsgBox.SetText("Disconnecting")
- self._Screen._MsgBox.Draw()
- self._Screen.SwapAndShow()
-
- try:
- dev.Disconnect()
- except Exception,e:
- print(str(e))
-
- pygame.time.delay(300)
- self.ReturnToUpLevelPage()
- self._Screen.Draw()
- self._Screen.SwapAndShow()
-
- self._Screen._FootBar.ResetNavText()
-
-
- def Click(self):
- if self._PsIndex >= len(self._MyList):
- return
-
- cur_li = self._MyList[self._PsIndex]
- print(cur_li._Flag)
- if cur_li._Flag in self._AList:
- print(self._AList[ cur_li._Flag ])
-
- def OnLoadCb(self):
- if self._AList != None:
- if "Connected" in self._AList:
- if self._AList["Connected"] == 1:
- self._FootMsg[1] = "Disconnect"
- else:
- self._FootMsg[1] = ""
-
- self.GenList()
- def OnReturnBackCb(self):
- self.ReturnToUpLevelPage()
- self._Screen.Draw()
- self._Screen.SwapAndShow()
- def KeyDown(self,event):
- if event.key == CurKeys["A"] or event.key == CurKeys["Menu"]:
- 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["Enter"]:
- self.Click()
-
- if event.key == CurKeys["X"]:
- self.TryToDisconnect()
-
- if event.key == CurKeys["Y"]:
- self.TryToForget()
-
-
- def Draw(self):
- if len(self._MyList) == 0:
- return
-
- self.ClearCanvas()
- if len(self._MyList) * InfoPageListItem._Height > self._Height:
- self._Ps._Width = self._Width - 10
- self._Ps._PosX = 9
- self._Ps.Draw()
- for i in self._MyList:
- i.Draw()
-
- self._Scroller.UpdateSize(len(self._MyList)*InfoPageListItem._Height, self._PsIndex*InfoPageListItem._Height)
- self._Scroller.Draw()
-
- else:
- self._Ps._Width = self._Width
- self._Ps.Draw()
- for i in self._MyList:
- i.Draw()
-
-
- class BleListSelector(PageSelector):
- _BackgroundColor = MySkinManager.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._MyList):
- x = self._Parent._MyList[idx]._PosX+2
- y = self._Parent._MyList[idx]._PosY+1
- h = self._Parent._MyList[idx]._Height -3
-
- self._PosX = x
- self._PosY = y
- self._Height = h
- aa_round_rect(self._Parent._CanvasHWND,
- (x,y,self._Width-4,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,MySkinManager.GiveColor('White'),(x-padding,y-padding, w+padding*2,h+padding*2))
- pygame.draw.rect(self._CanvasHWND,MySkinManager.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):
- _MyList = []
- #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","TryConnect"]
- _Scroller = None
- _ListFontObj = fonts["notosanscjk15"]
- _InfoPage = None
-
- _ADAPTER_DEV = "hci0"
-
- _Offline = False
-
- def __init__(self):
- Page.__init__(self)
- self._MyList = []
- 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
- 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 = BleListMessageBox()
- msgbox._CanvasHWND = self._CanvasHWND
- msgbox.Init(" ",MyLangManager.TrFont("veramono12"))
- msgbox._Parent = self
-
- self._MsgBox = msgbox
- self._Scroller = ListScroller()
- self._Scroller._Parent = self
- self._Scroller._PosX = 2
- self._Scroller._PosY = 2
- self._Scroller.Init()
-
- self.GenNetworkList()
-
- self._InfoPage = BleInfoPage()
- self._InfoPage._Screen = self._Screen
- self._InfoPage._Name = "BluetoothInfo"
- self._InfoPage.Init()
- 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
- print("DbusPropertiesChanged")
- 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 = "<unknown>"
-
- self._Devices = devices
- self.print_normal(address, devices[path])
-
- self.RefreshDevices()
- self.GenNetworkList()
- self._Screen.Draw()
- self._Screen.SwapAndShow()
-
- 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 TryConnect(self):
- global bus
-
- if self._PsIndex >= len(self._MyList):
- return
-
- cur_li = self._MyList[self._PsIndex]
- print(cur_li._Path)
-
- if "Connected" in cur_li._Atts:
- if cur_li._Atts["Connected"] == 1:
- return
-
- proxy_obj = bus.get_object("org.bluez", cur_li._Path)
- dev = dbus.Interface(proxy_obj, "org.bluez.Device1")
-
- self._Screen._FootBar.UpdateNavText("Connecting")
- self.ShowBox(MyLangManager.Tr("Connecting"))
-
- try:
- dev.Connect()
- except Exception,e:
- print(str(e))
-
- self.HideBox()
- self._Screen._FootBar.ResetNavText()
-
- def RefreshDevices(self):
- global devices
- devices = {}
- try:
- 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
- except Exception,e:
- print(str(e))
- devices={}
-
- self._Devices = devices
-
-
- def GenNetworkList(self):
- self._MyList = []
- start_x = 0
- start_y = 0
-
- counter = 0
- for i,v in enumerate(self._Devices):
- if "Name" in self._Devices[v]:
- if len(self._Devices[v]["Name"]) < 2:
- continue
- if re.match("[0-9a-f]{2}([-:]?)[0-9a-f]{2}(\\1[0-9a-f]{2}){4}$", self._Devices[v]["Name"].lower()): ## skip xx:xx:xx:xx:xx
- continue
- else:
- continue
-
- ni = NetItem()
- ni._Parent = self
- ni._PosX = start_x
- ni._PosY = start_y + counter* NetItem._Height
- ni._Width = Width
- ni._FontObj = self._ListFontObj
-
- ni.Init(v,self._Devices[v])
-
- counter += 1
- self._MyList.append(ni)
- self._PsIndex = 0
-
- def Rescan(self):
- if self._Screen._CurrentPage != self:
- return
-
- self._Scanning = True
- self.ShowBox(MyLangManager.Tr("BluetoothScanning"))
- self._Screen._FootBar.UpdateNavText("Scanning")
-
- 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:
- try:
- self._Adapter.StopDiscovery()
- except Exception,e:
- print(str(e))
-
- try:
- self._Adapter.StartDiscovery()
- except Exception,e:
- print(str(e))
-
- def OnReturnBackCb(self):
- self.RefreshDevices()
- self.GenNetworkList()
-
- def OnLoadCb(self):
- self._Offline = False
- if self._Screen._TitleBar._InAirPlaneMode == False:
- out = commands.getstatusoutput("hcitool dev | grep hci0 |cut -f3") ## bluetooth maybe dead after airplane mode
- if len(out[1]) < 17:
- self._Offline = True
- print("Bluetooth OnLoadCb ,can not find hci0 alive,try to reboot")
- else:
- self.RefreshDevices()
- self.GenNetworkList()
- else:
- self._Offline = True
-
- def KeyDown(self,event):
-
- if event.key == CurKeys["A"] or event.key == CurKeys["Menu"]:
- if self._Offline == True:
- self.AbortedAndReturnToUpLevel()
- return
-
- if self._Adapter != None:
- try:
- self._Adapter.StopDiscovery()
- except Exception,e:
- print(str(e))
-
- _connecting = self.CheckIfBluetoothConnecting()
- if _connecting:
- self.ShutDownConnecting()
- self.ShowBox(MyLangManager.Tr("ShutDownConnecting"))
- self.AbortedAndReturnToUpLevel()
- else:
- self.AbortedAndReturnToUpLevel()
- else:
- self.HideBox()
- self.ReturnToUpLevelPage()
- self._Screen.Draw()
- self._Screen.SwapAndShow()
-
- self._Screen._FootBar.ResetNavText()
-
- 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"]:
- if self._Offline == False:
- self.Rescan()
- if event.key == CurKeys["Y"]:
- if len(self._MyList) == 0:
- return
- if self._Offline == True:
- return
-
- self._InfoPage._AList = self._MyList[self._PsIndex]._Atts
- self._InfoPage._Path = self._MyList[self._PsIndex]._Path
- self._Screen.PushPage(self._InfoPage)
- self._Screen.Draw()
- self._Screen.SwapAndShow()
-
- if event.key == CurKeys["B"]:
- if self._Offline == False:
- self.TryConnect()
- def Draw(self):
- self.ClearCanvas()
- if len(self._MyList) == 0:
- return
-
- if len(self._MyList) * NetItem._Height > self._Height:
- self._Ps._Width = self._Width - 11
- self._Ps.Draw()
-
- for i in self._MyList:
- i.Draw()
-
- self._Scroller.UpdateSize( len(self._MyList)*NetItem._Height, self._PsIndex*NetItem._Height)
- self._Scroller.Draw()
- else:
- self._Ps._Width = self._Width
- self._Ps.Draw()
- for i in self._MyList:
- i.Draw()
- 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
- self._Page._Adapter = adapter
-
- self._Page._Screen = main_screen
- self._Page._Name ="Bluetooth"
-
- 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)
- main_screen.Draw()
- main_screen.SwapAndShow()
- OBJ = APIOBJ()
- def Init(main_screen):
- OBJ.Init(main_screen)
- def API(main_screen):
- OBJ.API(main_screen)
|