public HacklabSignDriver(String serialPortName) {
		this.portName = serialPortName;
		
		if(numBoards < 1 || numBoards > 12) {
			throw new IllegalArgumentException("numBoards is out of range: " + numBoards);
		}

		// open the serial port
        CommPortIdentifier portIdentifier;
		try {
			portIdentifier = CommPortIdentifier.getPortIdentifier(serialPortName);
	        if(portIdentifier.isCurrentlyOwned()) {
	            System.err.println("Error: Port is currently in use: " +
	            		serialPortName);
	            System.exit(-1);
	        }
	        else {
	            CommPort commPort = portIdentifier.open(this.getClass().getName(),2000);
	            if(commPort instanceof SerialPort) {
	                port = (SerialPort) commPort;
	                port.setSerialPortParams(57600,
	                		SerialPort.DATABITS_8,
	                		SerialPort.STOPBITS_1,
	                		SerialPort.PARITY_NONE);
	                port.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
	                port.disableReceiveFraming();
	                port.disableReceiveTimeout();
	                port.disableReceiveThreshold();
	                in = port.getInputStream();
	                out = port.getOutputStream();
	            } else {
	                System.err.println("Port is not a serial port: " + serialPortName);
	            }
	        }
		} catch (NoSuchPortException e) {
			e.printStackTrace();
			System.exit(-1);
		} catch (PortInUseException e) {
			e.printStackTrace();
			System.exit(-1);
		} catch (UnsupportedCommOperationException e) {
			e.printStackTrace();
			System.exit(-1);
		} catch (IOException e) {
			e.printStackTrace();
			System.exit(-1);
		}
		System.out.println("SignDriver waiting 3s for startup...");
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}