Guest User

Untitled

a guest
Aug 21st, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.05 KB | None | 0 0
  1. import serial
  2. import threading, Queue
  3. import time
  4. import math
  5.  
  6.  
  7. class SensorData:
  8. maximum = 1023
  9.  
  10. def __init__(self, line):
  11. self.x = -1
  12. self.y = -1
  13. self.z = -1
  14. self.time = time.time()
  15. if line:
  16. split = line.strip().split(',')
  17. if len(split) >= 3 and split[0]:
  18. try:
  19. self.x = float(split[0]) / self.maximum
  20. self.y = float(split[1]) / self.maximum
  21. self.z = float(split[2]) / self.maximum
  22. except ValueError, e:
  23. print e
  24.  
  25. def round(self, digits):
  26. return round(self.x, digits), round(self.y, digits), round(self.z, digits)
  27.  
  28. def __str__(self):
  29. return '%.2f x:%.2f y:%.2f z:%.2f' % (self.time, self.x, self.y, self.z)
  30.  
  31. def __sub__(self, other):
  32. # subtracting one from another returns
  33. # the velocity in each dimension
  34. duration = self.time - other.time
  35. return (self.x - other.x)/duration, (self.y - other.y)/duration, (self.z - other.z)/duration
  36.  
  37.  
  38. class SerialReader(threading.Thread):
  39. def __init__(self, serial_port):
  40. threading.Thread.__init__(self)
  41. self.serial_port = serial_port
  42. self.output = Queue.Queue()
  43.  
  44. def read(self):
  45. return self.output.get()
  46.  
  47. def run(self):
  48. port = serial.Serial(self.serial_port, 9600)
  49. time.sleep(1)
  50. while 1:
  51. try:
  52. line = port.readline()
  53. except OSError:
  54. break
  55. if not line:
  56. break
  57. s = SensorData(line)
  58. self.output.put(s)
  59. port.close()
  60. self.output.put(None)
  61.  
  62.  
  63. class Processor(threading.Thread):
  64. def __init__(self):
  65. threading.Thread.__init__(self)
  66. self.setDaemon(True)
  67. self.data_queue = Queue.Queue()
  68.  
  69. def process(self, data):
  70. self.data_queue.put(data)
  71.  
  72. def run(self):
  73. self._setup()
  74. get = self.data_queue.get
  75. handle = self._handle
  76. while 1:
  77. data = get()
  78. if data is None: break
  79. handle(data)
  80.  
  81. def _setup(self):
  82. pass
  83.  
  84. def _handle(self):
  85. raise NotImplementedError
  86.  
  87.  
  88. class BeatFinder(Processor):
  89. threshold = 2300
  90.  
  91. def _setup(self):
  92. self.first = SensorData('')
  93. self.beat = 0
  94.  
  95. def _handle(self, data):
  96. xdiff = (data.y - self.first.y)*100000
  97. if abs(xdiff) >= self.threshold and data.time - self.beat >= .5:
  98. if xdiff >= self.threshold:
  99. print ' X'
  100. else:
  101. print 'O '
  102. self.beat = data.time
  103. self.first = data
  104.  
  105.  
  106. class PewPew(Processor):
  107. notes = {(.5,.5,.5): 'PEW!',
  108. (.6,.6,.6): 'BOOM!',
  109. }
  110.  
  111. def _handle(self, data):
  112. note_to_play = self.notes.get(data.round(1),None)
  113. if note_to_play:
  114. print note_to_play
  115.  
  116.  
  117.  
  118.  
  119. class Printer(Processor):
  120. def _handle(self, data):
  121. print data
  122.  
  123.  
  124. def read_serial(serial_port):
  125. reader = SerialReader(serial_port)
  126. reader.setDaemon(True)
  127. reader.start()
  128.  
  129. processors = []
  130.  
  131. processors.append(BeatFinder())
  132. processors.append(PewPew())
  133. #processors.append(Printer())
  134.  
  135. # start listening
  136. for p in processors:
  137. p.start()
  138.  
  139. while 1:
  140. try:
  141. data = reader.read()
  142. except KeyboardInterrupt:
  143. break
  144. if data is None: break
  145.  
  146. for p in processors:
  147. p.process(data)
  148.  
  149.  
  150.  
  151. if __name__ == '__main__':
  152. import sys
  153. read_serial(sys.argv[1])
Add Comment
Please, Sign In to add comment