serial-led.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #!/bin/python3
  2. import sys
  3. import time
  4. import math
  5. import serial
  6. N_ROWS = 5
  7. N_COLS = 10
  8. class SerialConnection:
  9. def __init__(self):
  10. self._ser = None
  11. self.port = None
  12. def connect(self, port = None):
  13. if port == None:
  14. port = self.port
  15. if port == None:
  16. for port in ["/dev/ttyUSB{}".format(p) for p in range(4)]:
  17. try:
  18. self._ser = serial.Serial(port, 38400)
  19. print("connected to " + port)
  20. self.port = port
  21. break
  22. except serial.SerialException:
  23. pass
  24. if port == None:
  25. for port in ["COM{}".format(p) for p in range(3,20)]:
  26. try:
  27. self._ser = serial.Serial(port, 38400)
  28. print("connected to " + port)
  29. self.port = port
  30. break
  31. except serial.SerialException:
  32. pass
  33. else:
  34. try:
  35. self._ser = serial.Serial(port, 38400)
  36. print("connected to " + port)
  37. self.port = port
  38. except serial.SerialException:
  39. pass
  40. if self._ser:
  41. self._ser.write(b'A' + b'\15' * N_ROWS*N_COLS)
  42. else:
  43. print("connection to port {} failed".format(port))
  44. def send(self, pixels):
  45. if not self._ser:
  46. return
  47. try:
  48. self._ser.write(b'A')
  49. self._ser.write(bytes(pixels))
  50. except serial.SerialException:
  51. self._ser = None
  52. def isConnected(self):
  53. return self._ser != None
  54. oldTime = time.time()
  55. oldPing = time.time()
  56. def getBytes():
  57. pixels = [0] * (N_ROWS * N_COLS)
  58. for row in range(N_ROWS):
  59. for col in range(N_COLS):
  60. pixels[row*N_COLS + col] = int(math.sin(row + col + time.time()*15) * 8 + 8)
  61. pixels[49] = int(pixels[49]/2)
  62. return bytes([0x41] + pixels)
  63. client_address = None
  64. try:
  65. while True:
  66. if not client_address:
  67. data, addr = sock.recvfrom(16)
  68. print('received {} from {}'.format(data, addr))
  69. client_address = addr
  70. else:
  71. sock.sendto(getBytes(), client_address)
  72. if time.time() - oldPing > 30:
  73. data, addr = sock.recvfrom(16)
  74. print('received {} from {}'.format(data, addr))
  75. client_address = addr
  76. oldPing = time.time()
  77. oldTime = time.time()
  78. time.sleep(1/40)
  79. finally:
  80. print('closing socket')
  81. sock.close()