S&B Volcano vaporizer remote control with Pi Pico W
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

state_scan.py 2.7KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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.results = []
  10. self.current = None
  11. self.scanner = asyncio.create_task(self.scan())
  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. for n in new:
  21. name = n.name()
  22. mac = n.device.addr_hex()
  23. rssi = n.rssi
  24. value = [name, mac, rssi]
  25. async with self.lock:
  26. found = False
  27. for i in range(0, len(self.results)):
  28. if self.results[i][1] == mac:
  29. found = True
  30. self.results[i][0] = name
  31. self.results[i][2] = rssi
  32. break
  33. if found == False:
  34. self.results.append(value)
  35. def draw_list(self):
  36. for i, d in enumerate(self.results):
  37. name, mac, rssi = self.results[i]
  38. s1 = "{}: {}".format(i + 1, name)
  39. s2 = "[{}] {}".format(mac, rssi)
  40. off = i * 25 + 30
  41. if off >= self.lcd.height:
  42. break
  43. c1 = self.lcd.white
  44. if name == "S&B VOLCANO H":
  45. c1 = self.lcd.green
  46. if self.current == None:
  47. self.current = i
  48. elif self.current == i:
  49. c1 = self.lcd.red
  50. c2 = self.lcd.white
  51. if self.current == i:
  52. c2 = self.lcd.red
  53. self.lcd.hline(0, off, self.lcd.width, self.lcd.blue)
  54. self.lcd.text(s1, 0, off + 2, c1)
  55. self.lcd.text(s2, 0, off + 12, c2)
  56. async def draw(self):
  57. self.lcd.text("Scanning for Bluetooth devices", 0, 10, self.lcd.red)
  58. keys = self.lcd.buttons()
  59. async with self.lock:
  60. if keys.once("enter"):
  61. if self.current < len(self.results):
  62. return 2
  63. elif keys.once("up"):
  64. if self.current == None:
  65. self.current = len(self.results) - 1
  66. elif self.current > 0:
  67. self.current -= 1
  68. elif keys.once("down"):
  69. if self.current == None:
  70. self.current = 0
  71. elif self.current < (len(self.results) - 1):
  72. self.current += 1
  73. self.draw_list()
  74. return -1