bluetooth_page.go 18 KB

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