agent.py 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. # -*- coding: utf-8 -*-
  2. import pygame
  3. #import math
  4. #import commands
  5. import dbus
  6. #from beeprint import pp
  7. from libs.roundrects import aa_round_rect
  8. from UI.page import Page,PageSelector
  9. from UI.keys_def import CurKeys, IsKeyMenuOrB
  10. from libs.DBUS import bus, adapter,devices
  11. BUS_NAME = 'org.bluez'
  12. AGENT_INTERFACE = 'org.bluez.Agent1'
  13. AGENT_PATH = "/gameshell/bleagent"
  14. class Rejected(dbus.DBusException):
  15. _dbus_error_name = "org.bluez.Error.Rejected"
  16. class BleAgent(dbus.service.Object):
  17. device_obj = None
  18. _Leader = None
  19. dev_path = ""
  20. def set_trusted(self,path):
  21. global BUS_NAME
  22. props = dbus.Interface(bus.get_object(BUS_NAME, path),
  23. "org.freedesktop.DBus.Properties")
  24. props.Set("org.bluez.Device1", "Trusted", True)
  25. def dev_connect(self,path):
  26. global BUS_NAME
  27. dev = dbus.Interface(bus.get_object(BUS_NAME, path),
  28. "org.bluez.Device1")
  29. print("dev_connect %s" % path)
  30. try:
  31. dev.Connect()
  32. except Exception,e:
  33. print(str(e))
  34. @dbus.service.method(AGENT_INTERFACE,in_signature="", out_signature="")
  35. def Release(self):
  36. print("Agent release")
  37. @dbus.service.method(AGENT_INTERFACE,in_signature="os", out_signature="")
  38. def AuthorizeService(self, device, uuid):
  39. print("AuthorizeService (%s, %s)" % (device, uuid)) ## directly authrized
  40. return
  41. @dbus.service.method(AGENT_INTERFACE,in_signature="o", out_signature="s")
  42. def RequestPinCode(self, device):
  43. print("RequestPinCode (%s)" % (device))
  44. set_trusted(device)
  45. return "0000"
  46. @dbus.service.method(AGENT_INTERFACE,in_signature="o", out_signature="u")
  47. def RequestPasskey(self, device):
  48. print("RequestPasskey (%s)" % (device))
  49. set_trusted(device)
  50. passkey = "000000"
  51. return dbus.UInt32(passkey)
  52. @dbus.service.method(AGENT_INTERFACE,in_signature="ouq", out_signature="")
  53. def DisplayPasskey(self, device, passkey, entered):
  54. print("DisplayPasskey (%s, %06u entered %u)" % (device, passkey, entered))
  55. self._Leader._PairPage.ShowPassKey(device,passkey,entered)
  56. @dbus.service.method(AGENT_INTERFACE,in_signature="os", out_signature="")
  57. def DisplayPinCode(self, device, pincode):
  58. print("DisplayPinCode (%s, %s)" % (device, pincode))
  59. self._Leader._PairPage.ShowPinCode(device,pincode)
  60. @dbus.service.method(AGENT_INTERFACE,in_signature="ou", out_signature="")
  61. def RequestConfirmation(self, device, passkey):
  62. print("RequestConfirmation (%s, %06d)" % (device, passkey))
  63. set_trusted(device)
  64. return
  65. @dbus.service.method(AGENT_INTERFACE,in_signature="o", out_signature="")
  66. def RequestAuthorization(self, device):
  67. print("RequestAuthorization (%s)" % (device))
  68. return
  69. @dbus.service.method(AGENT_INTERFACE,in_signature="", out_signature="")
  70. def Cancel(self):
  71. print("Cancel")
  72. def pair_reply(self):
  73. print("Device paired under Agent")
  74. self.set_trusted(self.dev_path)
  75. self.dev_connect(self.dev_path)
  76. self._Leader._PairPage._dev_obj = self.device_obj
  77. self._Leader._PairPage.PairReplyCb()
  78. def pair_error(self,error):
  79. global adapter
  80. err_msg = ""
  81. err_name = error.get_dbus_name()
  82. print(err_name)
  83. if err_name == "org.freedesktop.DBus.Error.NoReply" and self.device_obj:
  84. err_msg = "Timed out. Cancelling pairing"
  85. print(err_msg)
  86. self.device_obj.CancelPairing()
  87. elif err_name == "org.bluez.Error.AuthenticationCanceled":
  88. err_msg = "Authentication Canceled"
  89. elif err_name == "org.bluez.Error.ConnectionAttemptFailed":
  90. err_msg = "Page Timeout"
  91. elif err_name == "org.bluez.Error.AlreadyExists":
  92. err_msg ="Already Exists"
  93. try:
  94. adapter.RemoveDevice(self.device_obj)
  95. except Exception,e:
  96. print("pair_error forget err:",str(e))
  97. elif err_name == "org.bluez.Error.AuthenticationFailed":
  98. err_msg = "Authentication Failed"
  99. else:
  100. err_msg = "Pair error"
  101. print( err_name,str(error) )
  102. self.device_obj = None
  103. self._Leader._PairPage.PairErrorCb(err_msg)
  104. class BleAgentPairPage(Page):
  105. ##show pin/password
  106. ##show prompt
  107. _Pin = ""
  108. _Pass = ""
  109. _dev_obj = None
  110. _FootMsg = ["Nav","","","Back",""]
  111. def Init(self):
  112. self._PosX = self._Index * self._Screen._Width
  113. self._Width = self._Screen._Width
  114. self._Height = self._Screen._Height
  115. #self._CanvasHWND = pygame.Surface((self._Width,self._Height))
  116. self._CanvasHWND = self._Screen._CanvasHWND
  117. def ShowPinCode(self,device,pincode):
  118. print("ShowPinCode %s %s" % (device,pincode))
  119. if self._Screen.CurPage() != self:
  120. self._Screen.PushPage(self)
  121. self.ClearCanvas()
  122. self._Screen.Draw()
  123. self._Screen.SwapAndShow()
  124. self._Pin = "%s" % pincode
  125. txt = self.Pin
  126. if len(self._Pin) > 0:
  127. txt = "Pin code: %s" % self._Pin
  128. self._Screen._MsgBox.SetText(txt)
  129. self._Screen._MsgBox.Draw()
  130. self._Screen.SwapAndShow()
  131. def ShowPassKey(self,device,passkey,entered):
  132. print("ShowPassKey %06u %u" % (passkey,entered))
  133. if self._Screen.CurPage() != self:
  134. self._Screen.PushPage(self)
  135. self.ClearCanvas()
  136. self._Screen.Draw()
  137. self._Screen.SwapAndShow()
  138. self._Pass = "%06u" % passkey
  139. if len(self._Pass) > 0:
  140. txt = "Pair code: %s" % self._Pass
  141. self._Screen._MsgBox.SetText(txt)
  142. self._Screen._MsgBox.Draw()
  143. self._Screen.SwapAndShow()
  144. def PairReplyCb(self):
  145. self.ClearCanvas()
  146. self._Screen.Draw()
  147. self._Screen.SwapAndShow()
  148. self._Screen._MsgBox.SetText("Device paired")
  149. self._Screen._MsgBox.Draw()
  150. self._Screen.SwapAndShow()
  151. pygame.time.delay(1500)
  152. self.ReturnToUpLevelPage()
  153. self._Screen.Draw()
  154. self._Screen.SwapAndShow()
  155. self._Screen._FootBar.ResetNavText()
  156. def PairErrorCb(self,error=None):
  157. self.ClearCanvas()
  158. self._Screen.Draw()
  159. self._Screen.SwapAndShow()
  160. self._Screen._MsgBox.SetText(error)
  161. self._Screen._MsgBox.Draw()
  162. self._Screen.SwapAndShow()
  163. pygame.time.delay(1500)
  164. self.ReturnToUpLevelPage()
  165. self._Screen.Draw()
  166. self._Screen.SwapAndShow()
  167. self._Screen._FootBar.ResetNavText()
  168. def KeyDown(self,event):
  169. if IsKeyMenuOrB(event.key):
  170. if self._dev_obj != None:
  171. try:
  172. self._dev_obj.CancelPairing()
  173. except Exception,e:
  174. print(str(e))
  175. self.ReturnToUpLevelPage()
  176. self._Screen.Draw()
  177. self._Screen.SwapAndShow()
  178. def Draw(self):
  179. pass
  180. #self.ClearCanvas()