S&B Volcano vaporizer remote control with Pi Pico W
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

state_scan.py 2.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #!/usr/bin/env python
  2. import uasyncio as asyncio
  3. from scan import ble_scan
  4. class StateScan:
  5. def __init__(self, lcd):
  6. self.lcd = lcd
  7. self.lock = asyncio.Lock()
  8. def enter(self, val = None):
  9. self.scanner = asyncio.create_task(self.scan())
  10. self.results = []
  11. self.current = None
  12. def exit(self):
  13. self.scanner.cancel()
  14. if self.lock.locked():
  15. self.lock.release()
  16. return self.results[self.current]
  17. async def scan(self):
  18. while True:
  19. new = await ble_scan(None, None, 0.25)
  20. async with self.lock:
  21. for n in new:
  22. found = False
  23. for r in self.results:
  24. if r.device.addr_hex() == n.device.addr_hex():
  25. found = True
  26. r = n
  27. break
  28. if not found:
  29. self.results.append(n)
  30. def draw_list(self):
  31. for i, d in enumerate(self.results):
  32. s1 = "{}".format(d.name())
  33. s2 = "{}: [{}] {}".format(i + 1, d.device.addr_hex(), d.rssi)
  34. off = i * 25 + 30
  35. if off >= self.lcd.height:
  36. break
  37. c1 = self.lcd.white
  38. if s1 == "S&B VOLCANO H":
  39. c1 = self.lcd.green
  40. if self.current == None:
  41. self.current = i
  42. elif self.current == i:
  43. c1 = self.lcd.red
  44. c2 = self.lcd.white
  45. if self.current == i:
  46. c2 = self.lcd.red
  47. self.lcd.hline(0, off, self.lcd.width, self.lcd.blue)
  48. self.lcd.text(s1, 0, off + 2, c1)
  49. self.lcd.text(s2, 0, off + 12, c2)
  50. async def draw(self):
  51. self.lcd.fill(self.lcd.black)
  52. self.lcd.text("Volcano Remote Control App", 0, 0, self.lcd.green)
  53. self.lcd.text("Scanning for Bluetooth devices", 0, 10, self.lcd.red)
  54. keys = self.lcd.buttons()
  55. async with self.lock:
  56. if keys.once("enter"):
  57. if self.current < len(self.results):
  58. return 1 # connect
  59. elif keys.once("up"):
  60. if self.current == None:
  61. self.current = len(self.results) - 1
  62. elif self.current > 0:
  63. self.current -= 1
  64. elif keys.once("down"):
  65. if self.current == None:
  66. self.current = 0
  67. elif self.current < (len(self.results) - 1):
  68. self.current += 1
  69. self.draw_list()
  70. self.lcd.show()
  71. return -1 # stay in this state