Example #1
0
 def writer(self):
     """\
     Loop and copy console->serial until EXITCHARCTER character is
     found. When MENUCHARACTER is found, interpret the next key
     locally.
     """
     menu_active = False
     try:
         while self.alive:
             try:
                 b = console.getkey()
             except KeyboardInterrupt:
                 b = makerbot_pyserial.to_bytes([3])
             c = character(b)
             if menu_active:
                 if c == MENUCHARACTER or c == EXITCHARCTER: # Menu character again/exit char -> send itself
                     self.serial.write(b)                    # send character
                     if self.echo:
                         sys.stdout.write(c)
                 elif c == '\x15':                       # CTRL+U -> upload file
                     sys.stderr.write('\n--- File to upload: ')
                     sys.stderr.flush()
                     console.cleanup()
                     filename = sys.stdin.readline().rstrip('\r\n')
                     if filename:
                         try:
                             file = open(filename, 'r')
                             sys.stderr.write('--- Sending file %s ---\n' % filename)
                             while True:
                                 line = file.readline().rstrip('\r\n')
                                 if not line:
                                     break
                                 self.serial.write(line)
                                 self.serial.write('\r\n')
                                 # Wait for output buffer to drain.
                                 self.serial.flush()
                                 sys.stderr.write('.')   # Progress indicator.
                             sys.stderr.write('\n--- File %s sent ---\n' % filename)
                         except IOError, e:
                             sys.stderr.write('--- ERROR opening file %s: %s ---\n' % (filename, e))
                     console.setup()
                 elif c in '\x08hH?':                    # CTRL+H, h, H, ? -> Show help
                     sys.stderr.write(get_help_text())
                 elif c == '\x12':                       # CTRL+R -> Toggle RTS
                     self.rts_state = not self.rts_state
                     self.serial.setRTS(self.rts_state)
                     sys.stderr.write('--- RTS %s ---\n' % (self.rts_state and 'active' or 'inactive'))
                 elif c == '\x04':                       # CTRL+D -> Toggle DTR
                     self.dtr_state = not self.dtr_state
                     self.serial.setDTR(self.dtr_state)
                     sys.stderr.write('--- DTR %s ---\n' % (self.dtr_state and 'active' or 'inactive'))
                 elif c == '\x02':                       # CTRL+B -> toggle BREAK condition
                     self.break_state = not self.break_state
                     self.serial.setBreak(self.break_state)
                     sys.stderr.write('--- BREAK %s ---\n' % (self.break_state and 'active' or 'inactive'))
                 elif c == '\x05':                       # CTRL+E -> toggle local echo
                     self.echo = not self.echo
                     sys.stderr.write('--- local echo %s ---\n' % (self.echo and 'active' or 'inactive'))
                 elif c == '\x09':                       # CTRL+I -> info
                     self.dump_port_settings()
                 elif c == '\x01':                       # CTRL+A -> cycle escape mode
                     self.repr_mode += 1
                     if self.repr_mode > 3:
                         self.repr_mode = 0
                     sys.stderr.write('--- escape data: %s ---\n' % (
                         REPR_MODES[self.repr_mode],
                     ))
                 elif c == '\x0c':                       # CTRL+L -> cycle linefeed mode
                     self.convert_outgoing += 1
                     if self.convert_outgoing > 2:
                         self.convert_outgoing = 0
                     self.newline = NEWLINE_CONVERISON_MAP[self.convert_outgoing]
                     sys.stderr.write('--- line feed %s ---\n' % (
                         LF_MODES[self.convert_outgoing],
                     ))
                 elif c in 'pP':                         # P -> change port
                     sys.stderr.write('\n--- Enter port name: ')
                     sys.stderr.flush()
                     console.cleanup()
                     try:
                         port = sys.stdin.readline().strip()
                     except KeyboardInterrupt:
                         port = None
                     console.setup()
                     if port and port != self.serial.port:
                         # reader thread needs to be shut down
                         self._stop_reader()
                         # save settings
                         settings = self.serial.getSettingsDict()
                         try:
                             try:
                                 new_serial = makerbot_pyserial.serial_for_url(port, do_not_open=True)
                             except AttributeError:
                                 # happens when the installed pyserial is older than 2.5. use the
                                 # Serial class directly then.
                                 new_serial = makerbot_pyserial.Serial()
                                 new_serial.port = port
                             # restore settings and open
                             new_serial.applySettingsDict(settings)
                             new_serial.open()
                             new_serial.setRTS(self.rts_state)
                             new_serial.setDTR(self.dtr_state)
                             new_serial.setBreak(self.break_state)
                         except Exception, e:
                             sys.stderr.write('--- ERROR opening new port: %s ---\n' % (e,))
                             new_serial.close()
                         else:
                             self.serial.close()
                             self.serial = new_serial
                             sys.stderr.write('--- Port changed to: %s ---\n' % (self.serial.port,))
                         # and restart the reader thread
                         self._start_reader()
                 elif c in 'bB':                         # B -> change baudrate
                     sys.stderr.write('\n--- Baudrate: ')
                     sys.stderr.flush()
                     console.cleanup()
                     backup = self.serial.baudrate
                     try:
                         self.serial.baudrate = int(sys.stdin.readline().strip())
                     except ValueError, e:
                         sys.stderr.write('--- ERROR setting baudrate: %s ---\n' % (e,))
                         self.serial.baudrate = backup
                     else:
Example #2
0
 def writer(self):
     """\
     Loop and copy console->serial until EXITCHARCTER character is
     found. When MENUCHARACTER is found, interpret the next key
     locally.
     """
     menu_active = False
     try:
         while self.alive:
             try:
                 b = console.getkey()
             except KeyboardInterrupt:
                 b = makerbot_pyserial.to_bytes([3])
             c = character(b)
             if menu_active:
                 if c == MENUCHARACTER or c == EXITCHARCTER: # Menu character again/exit char -> send itself
                     self.serial.write(b)                    # send character
                     if self.echo:
                         sys.stdout.write(c)
                 elif c == '\x15':                       # CTRL+U -> upload file
                     sys.stderr.write('\n--- File to upload: ')
                     sys.stderr.flush()
                     console.cleanup()
                     filename = sys.stdin.readline().rstrip('\r\n')
                     if filename:
                         try:
                             file = open(filename, 'r')
                             sys.stderr.write('--- Sending file %s ---\n' % filename)
                             while True:
                                 line = file.readline().rstrip('\r\n')
                                 if not line:
                                     break
                                 self.serial.write(line)
                                 self.serial.write('\r\n')
                                 # Wait for output buffer to drain.
                                 self.serial.flush()
                                 sys.stderr.write('.')   # Progress indicator.
                             sys.stderr.write('\n--- File %s sent ---\n' % filename)
                         except IOError, e:
                             sys.stderr.write('--- ERROR opening file %s: %s ---\n' % (filename, e))
                     console.setup()
                 elif c in '\x08hH?':                    # CTRL+H, h, H, ? -> Show help
                     sys.stderr.write(get_help_text())
                 elif c == '\x12':                       # CTRL+R -> Toggle RTS
                     self.rts_state = not self.rts_state
                     self.serial.setRTS(self.rts_state)
                     sys.stderr.write('--- RTS %s ---\n' % (self.rts_state and 'active' or 'inactive'))
                 elif c == '\x04':                       # CTRL+D -> Toggle DTR
                     self.dtr_state = not self.dtr_state
                     self.serial.setDTR(self.dtr_state)
                     sys.stderr.write('--- DTR %s ---\n' % (self.dtr_state and 'active' or 'inactive'))
                 elif c == '\x02':                       # CTRL+B -> toggle BREAK condition
                     self.break_state = not self.break_state
                     self.serial.setBreak(self.break_state)
                     sys.stderr.write('--- BREAK %s ---\n' % (self.break_state and 'active' or 'inactive'))
                 elif c == '\x05':                       # CTRL+E -> toggle local echo
                     self.echo = not self.echo
                     sys.stderr.write('--- local echo %s ---\n' % (self.echo and 'active' or 'inactive'))
                 elif c == '\x09':                       # CTRL+I -> info
                     self.dump_port_settings()
                 elif c == '\x01':                       # CTRL+A -> cycle escape mode
                     self.repr_mode += 1
                     if self.repr_mode > 3:
                         self.repr_mode = 0
                     sys.stderr.write('--- escape data: %s ---\n' % (
                         REPR_MODES[self.repr_mode],
                     ))
                 elif c == '\x0c':                       # CTRL+L -> cycle linefeed mode
                     self.convert_outgoing += 1
                     if self.convert_outgoing > 2:
                         self.convert_outgoing = 0
                     self.newline = NEWLINE_CONVERISON_MAP[self.convert_outgoing]
                     sys.stderr.write('--- line feed %s ---\n' % (
                         LF_MODES[self.convert_outgoing],
                     ))
                 elif c in 'pP':                         # P -> change port
                     sys.stderr.write('\n--- Enter port name: ')
                     sys.stderr.flush()
                     console.cleanup()
                     try:
                         port = sys.stdin.readline().strip()
                     except KeyboardInterrupt:
                         port = None
                     console.setup()
                     if port and port != self.serial.port:
                         # reader thread needs to be shut down
                         self._stop_reader()
                         # save settings
                         settings = self.serial.getSettingsDict()
                         try:
                             try:
                                 new_serial = makerbot_pyserial.serial_for_url(port, do_not_open=True)
                             except AttributeError:
                                 # happens when the installed pyserial is older than 2.5. use the
                                 # Serial class directly then.
                                 new_serial = makerbot_pyserial.Serial()
                                 new_serial.port = port
                             # restore settings and open
                             new_serial.applySettingsDict(settings)
                             new_serial.open()
                             new_serial.setRTS(self.rts_state)
                             new_serial.setDTR(self.dtr_state)
                             new_serial.setBreak(self.break_state)
                         except Exception, e:
                             sys.stderr.write('--- ERROR opening new port: %s ---\n' % (e,))
                             new_serial.close()
                         else:
                             self.serial.close()
                             self.serial = new_serial
                             sys.stderr.write('--- Port changed to: %s ---\n' % (self.serial.port,))
                         # and restart the reader thread
                         self._start_reader()
                 elif c in 'bB':                         # B -> change baudrate
                     sys.stderr.write('\n--- Baudrate: ')
                     sys.stderr.flush()
                     console.cleanup()
                     backup = self.serial.baudrate
                     try:
                         self.serial.baudrate = int(sys.stdin.readline().strip())
                     except ValueError, e:
                         sys.stderr.write('--- ERROR setting baudrate: %s ---\n' % (e,))
                         self.serial.baudrate = backup
                     else:
Example #3
0
    (BYTE*8)(0x9c, 0xe4, 0x08, 0x00, 0x3e, 0x30, 0x1f, 0x73))

DIGCF_PRESENT = 2
DIGCF_DEVICEINTERFACE = 16
INVALID_HANDLE_VALUE = 0
ERROR_INSUFFICIENT_BUFFER = 122
SPDRP_HARDWAREID = 1
SPDRP_FRIENDLYNAME = 12
ERROR_NO_MORE_ITEMS = 259
DICS_FLAG_GLOBAL = 1
DIREG_DEV = 0x00000001
KEY_READ = 0x20019
REG_SZ = 1

# workaround for compatibility between Python 2.x and 3.x
PortName = makerbot_pyserial.to_bytes([80, 111, 114, 116, 78, 97, 109, 101]) # "PortName"

def comports():
    """This generator scans the device registry for com ports and yields port, desc, hwid"""
    g_hdi = SetupDiGetClassDevs(ctypes.byref(GUID_CLASS_COMPORT), None, NULL, DIGCF_PRESENT|DIGCF_DEVICEINTERFACE);
    #~ for i in range(256):
    for dwIndex in range(256):
        did = SP_DEVICE_INTERFACE_DATA()
        did.cbSize = ctypes.sizeof(did)

        if not SetupDiEnumDeviceInterfaces(g_hdi, None, ctypes.byref(GUID_CLASS_COMPORT), dwIndex, ctypes.byref(did)):
            if ctypes.GetLastError() != ERROR_NO_MORE_ITEMS:
                raise ctypes.WinError()
            break

        dwNeeded = DWORD()