S&B Volcano vaporizer remote control with Pi Pico W
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

state_scan.py 3.1KB

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