|
@@ -0,0 +1,217 @@
|
|
|
+# -*- coding: utf-8 -*-
|
|
|
+
|
|
|
+import pygame
|
|
|
+#import math
|
|
|
+#import commands
|
|
|
+import dbus
|
|
|
+#from beeprint import pp
|
|
|
+from libs.roundrects import aa_round_rect
|
|
|
+from UI.page import Page,PageSelector
|
|
|
+from UI.keys_def import CurKeys
|
|
|
+from libs.DBUS import bus, adapter,devices
|
|
|
+
|
|
|
+
|
|
|
+BUS_NAME = 'org.bluez'
|
|
|
+AGENT_INTERFACE = 'org.bluez.Agent1'
|
|
|
+AGENT_PATH = "/gameshell/bleagent"
|
|
|
+
|
|
|
+class Rejected(dbus.DBusException):
|
|
|
+ _dbus_error_name = "org.bluez.Error.Rejected"
|
|
|
+
|
|
|
+class BleAgent(dbus.service.Object):
|
|
|
+ device_obj = None
|
|
|
+ _Leader = None
|
|
|
+ dev_path = ""
|
|
|
+
|
|
|
+ def set_trusted(self,path):
|
|
|
+ global BUS_NAME
|
|
|
+ props = dbus.Interface(bus.get_object(BUS_NAME, path),
|
|
|
+ "org.freedesktop.DBus.Properties")
|
|
|
+ props.Set("org.bluez.Device1", "Trusted", True)
|
|
|
+
|
|
|
+ def dev_connect(self,path):
|
|
|
+ global BUS_NAME
|
|
|
+ dev = dbus.Interface(bus.get_object(BUS_NAME, path),
|
|
|
+ "org.bluez.Device1")
|
|
|
+ dev.Connect()
|
|
|
+
|
|
|
+ @dbus.service.method(AGENT_INTERFACE,in_signature="", out_signature="")
|
|
|
+ def Release(self):
|
|
|
+ print("Agent release")
|
|
|
+
|
|
|
+
|
|
|
+ @dbus.service.method(AGENT_INTERFACE,in_signature="os", out_signature="")
|
|
|
+ def AuthorizeService(self, device, uuid):
|
|
|
+ print("AuthorizeService (%s, %s)" % (device, uuid)) ## directly authrized
|
|
|
+ return
|
|
|
+
|
|
|
+ @dbus.service.method(AGENT_INTERFACE,in_signature="o", out_signature="s")
|
|
|
+ def RequestPinCode(self, device):
|
|
|
+ print("RequestPinCode (%s)" % (device))
|
|
|
+ set_trusted(device)
|
|
|
+ return "0000"
|
|
|
+
|
|
|
+ @dbus.service.method(AGENT_INTERFACE,in_signature="o", out_signature="u")
|
|
|
+ def RequestPasskey(self, device):
|
|
|
+ print("RequestPasskey (%s)" % (device))
|
|
|
+ set_trusted(device)
|
|
|
+ passkey = "000000"
|
|
|
+ return dbus.UInt32(passkey)
|
|
|
+
|
|
|
+ @dbus.service.method(AGENT_INTERFACE,in_signature="ouq", out_signature="")
|
|
|
+ def DisplayPasskey(self, device, passkey, entered):
|
|
|
+ print("DisplayPasskey (%s, %06u entered %u)" % (device, passkey, entered))
|
|
|
+ self._Leader._PairPage.ShowPassKey(device,passkey,entered)
|
|
|
+
|
|
|
+ @dbus.service.method(AGENT_INTERFACE,in_signature="os", out_signature="")
|
|
|
+ def DisplayPinCode(self, device, pincode):
|
|
|
+ print("DisplayPinCode (%s, %s)" % (device, pincode))
|
|
|
+ self._Leader._PairPage.ShowPinCode(device,pincode)
|
|
|
+
|
|
|
+ @dbus.service.method(AGENT_INTERFACE,in_signature="ou", out_signature="")
|
|
|
+ def RequestConfirmation(self, device, passkey):
|
|
|
+ print("RequestConfirmation (%s, %06d)" % (device, passkey))
|
|
|
+ set_trusted(device)
|
|
|
+ return
|
|
|
+
|
|
|
+ @dbus.service.method(AGENT_INTERFACE,in_signature="o", out_signature="")
|
|
|
+ def RequestAuthorization(self, device):
|
|
|
+ print("RequestAuthorization (%s)" % (device))
|
|
|
+
|
|
|
+ return
|
|
|
+
|
|
|
+ @dbus.service.method(AGENT_INTERFACE,in_signature="", out_signature="")
|
|
|
+ def Cancel(self):
|
|
|
+ print("Cancel")
|
|
|
+
|
|
|
+
|
|
|
+ def pair_reply(self):
|
|
|
+ print("Device paired under Agent")
|
|
|
+ self.set_trusted(self.dev_path)
|
|
|
+ self.dev_connect(self.dev_path)
|
|
|
+
|
|
|
+ self._Leader._PairPage._dev_obj = self.device_obj
|
|
|
+ self._Leader._PairPage.PairReplyCb()
|
|
|
+
|
|
|
+ def pair_error(self,error):
|
|
|
+ global adapter
|
|
|
+ err_msg = ""
|
|
|
+ err_name = error.get_dbus_name()
|
|
|
+ print(err_name)
|
|
|
+ if err_name == "org.freedesktop.DBus.Error.NoReply" and self.device_obj:
|
|
|
+ err_msg = "Timed out. Cancelling pairing"
|
|
|
+ print(err_msg)
|
|
|
+ self.device_obj.CancelPairing()
|
|
|
+ elif err_name == "org.bluez.Error.AuthenticationCanceled":
|
|
|
+ err_msg = "Authentication Canceled"
|
|
|
+ elif err_name == "org.bluez.Error.ConnectionAttemptFailed":
|
|
|
+ err_msg = "Page Timeout"
|
|
|
+ elif err_name == "org.bluez.Error.AlreadyExists":
|
|
|
+ err_msg ="Already Exists"
|
|
|
+ try:
|
|
|
+ adapter.RemoveDevice(self.device_obj)
|
|
|
+ except Exception,e:
|
|
|
+ print("pair_error forget err:",str(e))
|
|
|
+
|
|
|
+ elif err_name == "org.bluez.Error.AuthenticationFailed":
|
|
|
+ err_msg = "Authentication Failed"
|
|
|
+ else:
|
|
|
+ err_msg = "Pair error"
|
|
|
+ print( err_name,str(error) )
|
|
|
+
|
|
|
+ self.device_obj = None
|
|
|
+ self._Leader._PairPage.PairErrorCb(err_msg)
|
|
|
+
|
|
|
+class BleAgentPairPage(Page):
|
|
|
+
|
|
|
+ ##show pin/password
|
|
|
+ ##show prompt
|
|
|
+ _Pin = ""
|
|
|
+ _Pass = ""
|
|
|
+ _dev_obj = 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
|
|
|
+
|
|
|
+ def ShowPinCode(self,device,pincode):
|
|
|
+ print("ShowPinCode %s %d" % (pincode))
|
|
|
+ if self._Screen.CurPage() != self:
|
|
|
+ self._Screen.PushPage(self)
|
|
|
+ self.ClearCanvas()
|
|
|
+ self._Screen.Draw()
|
|
|
+ self._Screen.SwapAndShow()
|
|
|
+
|
|
|
+ self._Pin = "%s" % pincode
|
|
|
+ if len(self._Pin) > 0:
|
|
|
+ txt = "Pin code: %s" % self._Pin
|
|
|
+ self._Screen._MsgBox.SetText(txt)
|
|
|
+ self._Screen._MsgBox.Draw()
|
|
|
+ self._Screen.SwapAndShow()
|
|
|
+
|
|
|
+ def ShowPassKey(self,device,passkey,entered):
|
|
|
+ print("ShowPassKey %s %d" % (passkey,entered))
|
|
|
+ if self._Screen.CurPage() != self:
|
|
|
+ self._Screen.PushPage(self)
|
|
|
+ self.ClearCanvas()
|
|
|
+ self._Screen.Draw()
|
|
|
+ self._Screen.SwapAndShow()
|
|
|
+
|
|
|
+ self._Pass = "%s" % passkey
|
|
|
+ if len(self._Pass) > 0:
|
|
|
+ txt = "Pair code: %s" % self._Pass
|
|
|
+ self._Screen._MsgBox.SetText(txt)
|
|
|
+ self._Screen._MsgBox.Draw()
|
|
|
+ self._Screen.SwapAndShow()
|
|
|
+
|
|
|
+ def PairReplyCb(self):
|
|
|
+ self.ClearCanvas()
|
|
|
+ self._Screen.Draw()
|
|
|
+ self._Screen.SwapAndShow()
|
|
|
+
|
|
|
+ self._Screen._MsgBox.SetText("Device paired")
|
|
|
+ self._Screen._MsgBox.Draw()
|
|
|
+ self._Screen.SwapAndShow()
|
|
|
+ pygame.time.delay(1500)
|
|
|
+ self.ReturnToUpLevelPage()
|
|
|
+ self._Screen.Draw()
|
|
|
+ self._Screen.SwapAndShow()
|
|
|
+ self._Screen._FootBar.ResetNavText()
|
|
|
+
|
|
|
+ def PairErrorCb(self,error=None):
|
|
|
+ self.ClearCanvas()
|
|
|
+ self._Screen.Draw()
|
|
|
+ self._Screen.SwapAndShow()
|
|
|
+
|
|
|
+ self._Screen._MsgBox.SetText(error)
|
|
|
+ self._Screen._MsgBox.Draw()
|
|
|
+ self._Screen.SwapAndShow()
|
|
|
+ pygame.time.delay(1500)
|
|
|
+ self.ReturnToUpLevelPage()
|
|
|
+ self._Screen.Draw()
|
|
|
+ self._Screen.SwapAndShow()
|
|
|
+ self._Screen._FootBar.ResetNavText()
|
|
|
+
|
|
|
+ def KeyDown(self,event):
|
|
|
+ if event.key == CurKeys["A"] or event.key == CurKeys["Menu"]:
|
|
|
+ if self._dev_obj != None:
|
|
|
+ try:
|
|
|
+ self._dev_obj.CancelPairing()
|
|
|
+ except Exception,e:
|
|
|
+ print(str(e))
|
|
|
+
|
|
|
+ self.ReturnToUpLevelPage()
|
|
|
+ self._Screen.Draw()
|
|
|
+ self._Screen.SwapAndShow()
|
|
|
+
|
|
|
+
|
|
|
+ def Draw(self):
|
|
|
+ pass
|
|
|
+ #self.ClearCanvas()
|
|
|
+
|
|
|
+
|
|
|
+
|