bluetooth_page.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891
  1. package Bluetooth
  2. import (
  3. "fmt"
  4. "os"
  5. "log"
  6. "strings"
  7. //"errors"
  8. "github.com/fatih/structs"
  9. "github.com/veandco/go-sdl2/ttf"
  10. "github.com/cuu/gogame/draw"
  11. "github.com/cuu/gogame/surface"
  12. "github.com/cuu/gogame/rect"
  13. "github.com/cuu/gogame/event"
  14. "github.com/cuu/gogame/time"
  15. "github.com/cuu/gogame/color"
  16. "github.com/cuu/gogame/font"
  17. //"github.com/godbus/dbus"
  18. bleapi "github.com/muka/go-bluetooth/api"
  19. //"github.com/muka/go-bluetooth/bluez"
  20. // "github.com/muka/go-bluetooth/bluez/profile"
  21. "github.com/muka/go-bluetooth/bluez/profile/device"
  22. "github.com/clockworkpi/LauncherGoDev/sysgo/UI"
  23. )
  24. func showDeviceInfo(dev *device.Device1) {
  25. if dev == nil {
  26. return
  27. }
  28. props, err := dev.GetProperties()
  29. if err != nil {
  30. fmt.Printf("%s: Failed to get properties: %s\n", dev.Path, err.Error())
  31. return
  32. }
  33. fmt.Printf("name=%s addr=%s rssi=%d\n", props.Name, props.Address, props.RSSI)
  34. }
  35. type BleForgetConfirmPage struct {
  36. UI.ConfirmPage
  37. }
  38. func NewBleForgetConfirmPage() *BleForgetConfirmPage {
  39. p := &BleForgetConfirmPage{}
  40. p.ListFont = UI.Fonts["veramono20"]
  41. p.FootMsg = [5]string{"Nav","","","Cancel","Yes"}
  42. p.ConfirmText = "Confirm Forget?"
  43. p.ConfirmPage.ConfirmText = p.ConfirmText
  44. return p
  45. }
  46. func (self *BleForgetConfirmPage) KeyDown(ev *event.Event) {
  47. if ev.Data["Key"] == UI.CurKeys["A"] || ev.Data["Key"] == UI.CurKeys["Menu"] {
  48. self.ReturnToUpLevelPage()
  49. self.Screen.Draw()
  50. self.Screen.SwapAndShow()
  51. }
  52. if ev.Data["Key"] == UI.CurKeys["B"] {
  53. self.SnapMsg("Deleting")
  54. self.Screen.Draw()
  55. self.Screen.SwapAndShow()
  56. time.BlockDelay(400)
  57. self.ReturnToUpLevelPage()
  58. self.Screen.Draw()
  59. self.Screen.SwapAndShow()
  60. }
  61. }
  62. func (self *BleForgetConfirmPage) Draw() {
  63. self.DrawBG()
  64. for _,v := range self.MyList{
  65. v.Draw()
  66. }
  67. }
  68. type BleInfoPageSelector struct {
  69. UI.InfoPageSelector
  70. }
  71. func NewBleInfoPageSelector() *BleInfoPageSelector{
  72. p := &BleInfoPageSelector{}
  73. p.Width = UI.Width
  74. p.BackgroundColor = &color.Color{131,199,219,255} //SkinManager().GiveColor('Front')
  75. return p
  76. }
  77. func (self *BleInfoPageSelector) Draw() {
  78. idx := self.Parent.GetPsIndex()
  79. mylist := self.Parent.GetMyList()
  80. if idx < len(mylist) {
  81. _,y := mylist[idx].Coord()
  82. _,h := mylist[idx].Size()
  83. x := self.PosX+2
  84. self.PosY = y+1
  85. self.Height = h-3
  86. canvas_ := self.Parent.GetCanvasHWND()
  87. rect_ := rect.Rect(x,self.PosY,self.Width-4, self.Height)
  88. draw.AARoundRect(canvas_,&rect_,self.BackgroundColor,4,0,self.BackgroundColor)
  89. }
  90. }
  91. type BleInfoPage struct {
  92. UI.Page
  93. ListFontObj *ttf.Font
  94. ListSmFontObj *ttf.Font
  95. ListSm2FontObj *ttf.Font
  96. AList map[string]interface{}
  97. Scroller *UI.ListScroller
  98. ConfirmPage1 *BleForgetConfirmPage
  99. MyDevice *device.Device1 // from NetItem-> from BluetoothPage
  100. Props *device.Device1Properties
  101. Path string
  102. }
  103. func NewBleInfoPage() *BleInfoPage {
  104. p :=&BleInfoPage{}
  105. p.FootMsg = [5]string{"Nav","Disconnect","Forget","Back","" }
  106. p.ListFontObj = UI.Fonts["varela15"]
  107. p.ListSmFontObj = UI.Fonts["varela12"]
  108. p.ListSm2FontObj = UI.Fonts["varela11"]
  109. return p
  110. }
  111. func (self *BleInfoPage) Init() {
  112. if self.Screen != nil {
  113. if self.Screen.CanvasHWND != nil && self.CanvasHWND == nil {
  114. self.CanvasHWND = self.Screen.CanvasHWND
  115. }
  116. }
  117. self.PosX = self.Index*self.Screen.Width
  118. self.Width = self.Screen.Width // equals to screen width
  119. self.Height = self.Screen.Height
  120. ps := NewBleInfoPageSelector()
  121. ps.Parent = self
  122. self.Ps = ps
  123. self.PsIndex = 0
  124. //self.GenList()
  125. self.Scroller = UI.NewListScroller()
  126. self.Scroller.Parent = self
  127. self.Scroller.PosX = 2
  128. self.Scroller.PosY = 2
  129. self.Scroller.Init()
  130. self.ConfirmPage1 = NewBleForgetConfirmPage()
  131. self.ConfirmPage1.Screen = self.Screen
  132. self.ConfirmPage1.Name = "Confirm Forget"
  133. self.ConfirmPage1.Init()
  134. }
  135. func (self *BleInfoPage) GenList() {
  136. self.AList = structs.Map(self.Props) //map[string]interface{}
  137. self.MyList = nil
  138. self.PsIndex = 0
  139. start_x := 0
  140. start_y := 0
  141. i := 0
  142. skip_arrays := []string{"ManufacturerData","AdvertisingFlags","ServiceData"}
  143. for k,v := range self.AList {
  144. skip2 := false
  145. for _,u := range skip_arrays {
  146. if strings.HasPrefix(k,u) {
  147. skip2 = true
  148. break
  149. }
  150. }
  151. if skip2 {
  152. continue
  153. }
  154. li := UI.NewInfoPageListItem()
  155. li.Parent = self
  156. li.PosX = start_x
  157. li.PosY = start_y +i*NetItemDefaultHeight
  158. li.Width = UI.Width
  159. li.Fonts["normal"] = self.ListFontObj
  160. if k =="UUIDs" {
  161. li.Fonts["small"] = self.ListSm2FontObj
  162. }else{
  163. li.Fonts["small"] = self.ListSmFontObj
  164. }
  165. li.Init(k)
  166. li.Flag = k
  167. sm_text := ""
  168. if k == "UUIDs" {
  169. if len(v.([]string))> 1 {
  170. sm_text = v.([]string)[0]
  171. }else{
  172. sm_text = "<empty>"
  173. }
  174. }else {
  175. sm_text = fmt.Sprintf("%v",v)
  176. }
  177. if len(sm_text) > 20 {
  178. sm_text = sm_text[:20]
  179. }
  180. li.SetSmallText(sm_text)
  181. li.PosX = 2
  182. self.MyList = append(self.MyList,li)
  183. i+=1
  184. }
  185. }
  186. func (self *BleInfoPage) ScrollUp() {
  187. if len(self.MyList) == 0 {
  188. return
  189. }
  190. self.PsIndex -= 1
  191. if self.PsIndex < 0 {
  192. self.PsIndex = 0
  193. }
  194. cur_li := self.MyList[self.PsIndex]
  195. x,y := cur_li.Coord()
  196. if y < 0 {
  197. for i,v := range self.MyList {
  198. x,y = v.Coord()
  199. _,h := v.Size()
  200. self.MyList[i].NewCoord(x,y+h)
  201. }
  202. }
  203. }
  204. func (self *BleInfoPage) ScrollDown() {
  205. if len(self.MyList) == 0 {
  206. return
  207. }
  208. self.PsIndex += 1
  209. if self.PsIndex >= len(self.MyList) {
  210. self.PsIndex = len(self.MyList)-1
  211. }
  212. cur_li := self.MyList[self.PsIndex]
  213. x,y := cur_li.Coord()
  214. _,h := cur_li.Size()
  215. if y + h > self.Height {
  216. for i,v := range self.MyList {
  217. x,y = v.Coord()
  218. _,h = v.Size()
  219. self.MyList[i].NewCoord(x,y-h)
  220. }
  221. }
  222. }
  223. func (self *BleInfoPage) TryToForget() {
  224. //muka Adapter1 RemoveDevice Path
  225. adapter,err := bleapi.GetAdapter(adapterID)
  226. if err == nil {
  227. self.Screen.MsgBox.SetText("Forgeting")
  228. self.Screen.MsgBox.Draw()
  229. self.Screen.SwapAndShow()
  230. err = adapter.RemoveDevice(self.MyDevice.Path())
  231. if err != nil {
  232. fmt.Println("BleInfoPage TryToForget: ",err)
  233. }
  234. time.BlockDelay(400)
  235. self.ReturnToUpLevelPage()
  236. self.Screen.Draw()
  237. self.Screen.SwapAndShow()
  238. }else {
  239. fmt.Println("BleInfoPage TryToForget GetAdapter: ",err)
  240. }
  241. }
  242. func (self *BleInfoPage) TryToDisconnect() {
  243. is_connected,_ := self.MyDevice.GetConnected();
  244. if is_connected {
  245. self.Screen.FootBar.UpdateNavText("Disconnecting")
  246. self.Screen.MsgBox.SetText("Disconnecting")
  247. self.Screen.MsgBox.Draw()
  248. self.Screen.SwapAndShow()
  249. self.MyDevice.Disconnect()
  250. time.BlockDelay(350)
  251. self.ReturnToUpLevelPage()
  252. self.Screen.Draw()
  253. self.Screen.SwapAndShow()
  254. self.Screen.FootBar.ResetNavText()
  255. }
  256. }
  257. func (self *BleInfoPage) Click() {
  258. if self.PsIndex >= len(self.MyList) {
  259. return
  260. }
  261. cur_li := self.MyList[self.PsIndex]
  262. fmt.Println(cur_li.(*UI.InfoPageListItem).Flag)
  263. }
  264. func (self *BleInfoPage) OnLoadCb() {
  265. if self.Props.Connected == true {
  266. self.FootMsg[1] = "Disconnect"
  267. }else {
  268. self.FootMsg[1] = ""
  269. }
  270. self.GenList()
  271. }
  272. func (self *BleInfoPage) KeyDown(ev *event.Event) {
  273. if ev.Data["Key"] == UI.CurKeys["A"] || ev.Data["Key"] == UI.CurKeys["Menu"] {
  274. self.ReturnToUpLevelPage()
  275. self.Screen.Draw()
  276. self.Screen.SwapAndShow()
  277. }
  278. if ev.Data["Key"] == UI.CurKeys["Up"] {
  279. self.ScrollUp()
  280. self.Screen.Draw()
  281. self.Screen.SwapAndShow()
  282. }
  283. if ev.Data["Key"] == UI.CurKeys["Down"] {
  284. self.ScrollDown()
  285. self.Screen.Draw()
  286. self.Screen.SwapAndShow()
  287. }
  288. if ev.Data["Key"] == UI.CurKeys["Enter"]{
  289. self.Click()
  290. }
  291. if ev.Data["Key"] == UI.CurKeys["X"] {
  292. self.TryToDisconnect()
  293. }
  294. if ev.Data["Key"] == UI.CurKeys["Y"] {
  295. self.TryToForget()
  296. }
  297. }
  298. func (self *BleInfoPage) Draw() {
  299. if len(self.MyList) == 0 {
  300. return
  301. }
  302. self.ClearCanvas()
  303. if len(self.MyList) * UI.DefaultInfoPageListItemHeight > self.Height {
  304. self.Ps.(*BleInfoPageSelector).Width = self.Width - 10
  305. self.Ps.(*BleInfoPageSelector).PosX = 9
  306. self.Ps.Draw()
  307. for _,v := range self.MyList {
  308. v.Draw()
  309. }
  310. self.Scroller.UpdateSize(len(self.MyList)*UI.DefaultInfoPageListItemHeight,
  311. self.PsIndex*UI.DefaultInfoPageListItemHeight)
  312. self.Scroller.Draw()
  313. }else {
  314. self.Ps.(*BleInfoPageSelector).Width = self.Width
  315. self.Ps.Draw()
  316. for _,v := range self.MyList {
  317. v.Draw()
  318. }
  319. }
  320. }
  321. type BleListMessageBox struct {
  322. UI.Label
  323. Parent UI.PageInterface
  324. }
  325. func NewBleListMessageBox() *BleListMessageBox {
  326. p := &BleListMessageBox{}
  327. p.Color = &color.Color{83,83,83,255}
  328. return p
  329. }
  330. func (self *BleListMessageBox) Draw() {
  331. my_text := font.Render(self.FontObj,self.Text, true, self.Color, nil)
  332. w := surface.GetWidth(my_text)
  333. h := surface.GetHeight(my_text)
  334. pw,ph := self.Parent.Size()
  335. x := (pw-w)/2
  336. y := (ph-h)/2
  337. padding := 10
  338. rect_ := rect.Rect(x-padding,y-padding,w+padding*2,h+padding*2)
  339. draw.Rect(self.CanvasHWND,&color.Color{255,255,255,255}, &rect_,0)
  340. draw.Rect(self.CanvasHWND,&color.Color{0, 0, 0, 255}, &rect_,1)
  341. rect2_ := rect.Rect(x,y,w,h)
  342. surface.Blit(self.CanvasHWND,my_text,&rect2_,nil)
  343. my_text.Free()
  344. }
  345. type BluetoothPage struct{
  346. UI.Page
  347. Devices []*device.Device1
  348. BlePassword string
  349. Connecting bool
  350. Scanning bool
  351. ListFontObj *ttf.Font
  352. Scroller *UI.ListScroller
  353. InfoPage *BleInfoPage
  354. PrevState int
  355. ShowingMessageBox bool
  356. MsgBox *BleListMessageBox
  357. ConnectTry int
  358. //BlockCb ??
  359. LastStatusMsg string
  360. ADAPTER_DEV string // == adapterID
  361. Offline bool
  362. Leader *BluetoothPlugin
  363. }
  364. func NewBluetoothPage() *BluetoothPage {
  365. p := &BluetoothPage{}
  366. p.PageIconMargin = 20
  367. p.SelectedIconTopOffset = 20
  368. p.EasingDur = 10
  369. p.Align = UI.ALIGN["SLeft"]
  370. p.ADAPTER_DEV = adapterID
  371. p.FootMsg = [5]string { "Nav","Scan","Info","Back","TryConnect" }
  372. p.ListFontObj = UI.Fonts["notosanscjk15"]
  373. return p
  374. }
  375. func (self *BluetoothPage) ShowBox(msg string) {
  376. self.MsgBox.Text = msg
  377. self.ShowingMessageBox = true
  378. self.Screen.Draw()
  379. self.MsgBox.Draw()
  380. self.Screen.SwapAndShow()
  381. }
  382. func (self *BluetoothPage) HideBox() {
  383. self.Draw()
  384. self.ShowingMessageBox = false
  385. self.Screen.SwapAndShow()
  386. }
  387. func (self *BluetoothPage) Init() {
  388. self.PosX = self.Index * self.Screen.Width
  389. self.Width = self.Screen.Width
  390. self.Height = self.Screen.Height
  391. self.CanvasHWND = self.Screen.CanvasHWND
  392. ps := NewBleInfoPageSelector()
  393. ps.Parent = self
  394. ps.Width = UI.Width - 12
  395. self.Ps = ps
  396. self.PsIndex = 0
  397. msgbox := NewBleListMessageBox()
  398. msgbox.CanvasHWND = self.CanvasHWND
  399. msgbox.Init(" ",UI.Fonts["veramono12"],nil)
  400. msgbox.Parent = self
  401. self.MsgBox = msgbox
  402. self.Scroller = UI.NewListScroller()
  403. self.Scroller.Parent = self
  404. self.Scroller.PosX = 2
  405. self.Scroller.PosY = 2
  406. self.Scroller.Init()
  407. self.GenNetworkList()
  408. self.InfoPage = NewBleInfoPage()
  409. self.InfoPage.Screen = self.Screen
  410. self.InfoPage.Name = "BluetoothInfo"
  411. self.InfoPage.Init()
  412. }
  413. func (self *BluetoothPage) AbortedAndReturnToUpLevel() {
  414. self.HideBox()
  415. self.Screen.FootBar.ResetNavText()
  416. self.ReturnToUpLevelPage()
  417. self.Screen.Draw()
  418. self.Screen.SwapAndShow()
  419. }
  420. func (self *BluetoothPage) TryConnect() {
  421. if self.PsIndex >= len(self.MyList) {
  422. return
  423. }
  424. cur_li := self.MyList[self.PsIndex]
  425. if cur_li.(*NetItem).Props.Connected {
  426. return
  427. }
  428. self.Screen.FootBar.UpdateNavText("Connecting")
  429. self.ShowBox("Connecting")
  430. self.Leader.PairPage.DevObj = cur_li.(*NetItem).Device
  431. err := cur_li.(*NetItem).Device.Pair()
  432. if err != nil {
  433. fmt.Println(err)
  434. err_msg := ""
  435. s := err.Error()
  436. err_msg = "Pair error"
  437. if strings.Contains(s,"ConnectionAttemptFailed") {
  438. err_msg = "Page Timeout"
  439. }
  440. if strings.Contains(s,"NoReply") {
  441. err_msg = "NoReply,Cancelling"
  442. dev1 := cur_li.(*NetItem).Device
  443. dev1.CancelPairing()
  444. }
  445. if strings.Contains(s,"Exists") {
  446. err_msg = "Already Exists"
  447. adapter,err := bleapi.GetAdapter(adapterID)
  448. if err == nil {
  449. err = adapter.RemoveDevice(cur_li.(*NetItem).Device.Path())
  450. if err != nil {
  451. fmt.Println(err)
  452. }
  453. }else {
  454. fmt.Println(err)
  455. }
  456. }
  457. self.Leader.PairPage.PairErrorCb( err_msg )
  458. self.Leader.PairPage.DevObj= nil
  459. }else{
  460. self.Leader.PairPage.PairOKCb()
  461. dev1 := cur_li.(*NetItem).Device
  462. err = dev1.SetTrusted(true)
  463. if err != nil {
  464. fmt.Println(err)
  465. }
  466. cur_li.(*NetItem).Device.Connect()
  467. }
  468. self.HideBox()
  469. self.Screen.FootBar.ResetNavText()
  470. }
  471. //GetDevices returns a list of bluetooth discovered Devices
  472. func (self *BluetoothPage) GetDevices() ([]*device.Device1, error) {
  473. adapter,err := bleapi.GetAdapter(adapterID)
  474. if err != nil {
  475. return nil,err
  476. }
  477. list, err := adapter.GetDevices()
  478. return list,err
  479. }
  480. func (self *BluetoothPage) RefreshDevices() {
  481. // sync the cached devices
  482. self.Devices = nil
  483. devices, err := self.GetDevices()
  484. if err != nil {
  485. panic(err)
  486. os.Exit(1)
  487. }
  488. self.Devices = devices
  489. }
  490. func (self *BluetoothPage) GenNetworkList() {
  491. self.MyList = nil
  492. start_x := 0
  493. start_y := 0
  494. for i, v := range self.Devices { // v == bleapi.Device
  495. props, err := v.GetProperties()
  496. if err != nil {
  497. log.Fatalf("%s: Failed to get properties: %s", v.Path, err.Error())
  498. return
  499. }
  500. ni := NewNetItem()
  501. ni.Parent = self
  502. ni.PosX = start_x
  503. ni.PosY = start_y + i*NetItemDefaultHeight
  504. ni.Width = UI.Width
  505. ni.FontObj = self.ListFontObj
  506. ni.Props = props
  507. ni.Parent = self
  508. ni.Device = v
  509. if props.Name != "" {
  510. ni.Init(props.Name)
  511. }else {
  512. ni.Init(props.Address)
  513. }
  514. self.MyList = append(self.MyList,ni)
  515. }
  516. self.PsIndex = 0
  517. }
  518. func (self *BluetoothPage) Rescan() {
  519. self.Scanning = true
  520. self.ShowBox("Bluetooth scanning")
  521. self.Screen.FootBar.UpdateNavText("Scanning")
  522. a,nil := bleapi.GetAdapter(adapterID)
  523. err := a.StopDiscovery()
  524. if err != nil {
  525. fmt.Println(err)
  526. }
  527. err = a.StartDiscovery()
  528. if err != nil {
  529. fmt.Println(err)
  530. }
  531. fmt.Println("Started discovery")
  532. }
  533. func (self *BluetoothPage) OnLoadCb() {
  534. self.Offline = false
  535. if self.Screen.TitleBar.InAirPlaneMode == false {
  536. out := UI.System("hcitool dev | grep hci0 |cut -f3")
  537. if len(out) < 17 {
  538. self.Offline = true
  539. fmt.Println("Bluetooth OnLoadCb ,can not find hci0 alive,try to reboot")
  540. }else {
  541. self.RefreshDevices()
  542. self.GenNetworkList()
  543. }
  544. }else {
  545. self.Offline = true
  546. }
  547. }
  548. func (self *BluetoothPage) ScrollUp() {
  549. if len(self.MyList) == 0 {
  550. return
  551. }
  552. self.PsIndex -= 1
  553. if self.PsIndex < 0 {
  554. self.PsIndex=0
  555. }
  556. cur_ni := self.MyList[self.PsIndex]//*NetItem
  557. if cur_ni.(*NetItem).PosY < 0 {
  558. for i:=0;i<len(self.MyList);i++ {
  559. self.MyList[i].(*NetItem).PosY += self.MyList[i].(*NetItem).Height
  560. }
  561. }
  562. }
  563. func (self *BluetoothPage) ScrollDown() {
  564. if len(self.MyList) == 0 {
  565. return
  566. }
  567. self.PsIndex += 1
  568. if self.PsIndex >= len(self.MyList) {
  569. self.PsIndex = len(self.MyList) - 1
  570. }
  571. cur_ni := self.MyList[self.PsIndex]
  572. if cur_ni.(*NetItem).PosY + cur_ni.(*NetItem).Height > self.Height {
  573. for i:=0;i<len(self.MyList);i++ {
  574. self.MyList[i].(*NetItem).PosY -= self.MyList[i].(*NetItem).Height
  575. }
  576. }
  577. }
  578. func (self *BluetoothPage) KeyDown(ev *event.Event) {
  579. if ev.Data["Key"] == UI.CurKeys["A"] || ev.Data["Key"] == UI.CurKeys["Menu"] {
  580. if self.Offline == true {
  581. self.AbortedAndReturnToUpLevel()
  582. return
  583. }
  584. a, nil := bleapi.GetAdapter(adapterID)
  585. err := a.StopDiscovery()
  586. if err != nil {
  587. fmt.Println(err)
  588. }
  589. self.HideBox()
  590. self.ReturnToUpLevelPage()
  591. self.Screen.Draw()
  592. self.Screen.SwapAndShow()
  593. self.Screen.FootBar.ResetNavText()
  594. }
  595. if ev.Data["Key"] == UI.CurKeys["Up"] {
  596. self.ScrollUp()
  597. self.Screen.Draw()
  598. self.Screen.SwapAndShow()
  599. }
  600. if ev.Data["Key"] == UI.CurKeys["Down"] {
  601. self.ScrollDown()
  602. self.Screen.Draw()
  603. self.Screen.SwapAndShow()
  604. }
  605. if ev.Data["Key"] == UI.CurKeys["X"] {
  606. if self.Offline == false{
  607. self.Rescan()
  608. }
  609. }
  610. if ev.Data["Key"] == UI.CurKeys["Y"] {
  611. if len(self.MyList) == 0 {
  612. return
  613. }
  614. if self.Offline == true {
  615. return
  616. }
  617. self.InfoPage.Props = self.MyList[self.PsIndex].(*NetItem).Props
  618. self.InfoPage.Path = self.MyList[self.PsIndex].(*NetItem).Path
  619. self.InfoPage.MyDevice = self.MyList[self.PsIndex].(*NetItem).Device
  620. self.Screen.PushPage(self.InfoPage)
  621. self.Screen.Draw()
  622. self.Screen.SwapAndShow()
  623. }
  624. if ev.Data["Key"] == UI.CurKeys["B"] {
  625. if self.Offline == false {
  626. self.TryConnect()
  627. }
  628. }
  629. }
  630. func (self *BluetoothPage) Draw() {
  631. self.ClearCanvas()
  632. if len(self.MyList) == 0 {
  633. return
  634. }
  635. if len(self.MyList) * NetItemDefaultHeight > self.Height {
  636. self.Ps.(*BleInfoPageSelector).Width = self.Width - 11
  637. self.Ps.Draw()
  638. for _,v := range self.MyList {
  639. v.Draw()
  640. }
  641. self.Scroller.UpdateSize(len(self.MyList)*NetItemDefaultHeight,self.PsIndex*NetItemDefaultHeight)
  642. self.Scroller.Draw()
  643. }else {
  644. self.Ps.(*BleInfoPageSelector).Width = self.Width
  645. self.Ps.Draw()
  646. for _,v := range self.MyList {
  647. v.Draw()
  648. }
  649. }
  650. }