class BusPirateStream(threading.Thread):
  def __init__(self, port='COM1', sinks=None, autoStart=True):
    threading.Thread.__init__(self)
    self.daemon = True
    
    self.dispatcher=AsynchDispatch(sinks=sinks,
      callbacks={'serial_data':[self.send]})
    
    try:
      self.bp = UART(port,115200)
    except:
      print 'Failed to start BusPirate'
      self.bp = None
    
    if autoStart:
      self.start()
    
  def run(self):
    if self.bp is not None:
      while(True):
        rx_bytes = self.bp.response(1000,True)
        if rx_bytes != '':
          self.dispatcher.dispatch(Message('serial_data',rx_bytes))
        
  def send(self, message):
    if self.bp is not None:
      self.bp.bulk_trans(len(message.data),map(ord,list(message.data)))
if uart.enter_UART():
    print "OK."
else:
    print "failed."
    sys.exit()

print "Reset display (toggle AUX): ",
uart.cfg_pins(0x00)
uart.cfg_pins(PinCfg.POWER | PinCfg.AUX | PinCfg.PULLUPS)
print "OK."

print "Setting UART speed to 38400",
if uart.set_speed(UARTSpeed._38400):
    print "OK."
else:
    print "failed"
    sys.exit()

# Last, cross fingers and send the bitmap
# Command is: 1F 28 66 11 xL xH yL yH 01 [bitmap]
# We assume width is < 256, so xH is 0x00. Likewise, yH is always 0x00 on a 140x32 display
initstring = [
    0x0C, 0x1F, 0x28, 0x66, 0x11, im.size[0], 0x00, im.size[1] // 8, 0x00, 0x01
]
uart.bulk_trans(len(initstring), initstring)

print "send Bitmap"
for i in range((len(picturebitmap) / 16)):
    print ".",
    uart.bulk_trans(16, picturebitmap[i * 16:i * 16 + 16])
print "Entering binary UART mode: ",
if uart.enter_UART():
    print "OK."
else:
    print "failed."
    sys.exit()

print "Reset display (toggle AUX): ",
uart.cfg_pins(0x00)
uart.cfg_pins(PinCfg.POWER | PinCfg.AUX | PinCfg.PULLUPS)
print "OK."

print "Setting UART speed to 38400",
if uart.set_speed(UARTSpeed._38400):
    print "OK."
else:
    print "failed"
    sys.exit()

# Last, cross fingers and send the bitmap
# Command is: 1F 28 66 11 xL xH yL yH 01 [bitmap]
# We assume width is < 256, so xH is 0x00. Likewise, yH is always 0x00 on a 140x32 display
initstring = [0x0C, 0x1F, 0x28, 0x66, 0x11, im.size[0], 0x00, im.size[1] // 8, 0x00, 0x01]
uart.bulk_trans(len(initstring), initstring)

print "send Bitmap"
for i in range((len(picturebitmap) / 16)):
    print ".",
    uart.bulk_trans(16, picturebitmap[i * 16 : i * 16 + 16])