/*******************************************************************************
* Copyright (c) 2011, 2016 Eurotech and/or its affiliates
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Eurotech
*******************************************************************************/
package org.eclipse.kura.usb;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.eclipse.kura.net.modem.ModemDevice;
/**
* Representation of USB modem devices
*/
public class UsbModemDevice extends AbstractUsbDevice implements ModemDevice {
/** The TTY devices associated with modem **/
private final ArrayList<String> m_ttyDevs;
/** The block devices associated with the modem **/
private final ArrayList<String> m_blockDevs;
public UsbModemDevice(String vendorId, String productId, String manufacturerName, String productName,
String usbBusNumber, String usbDevicePath) {
super(vendorId, productId, manufacturerName, productName, usbBusNumber, usbDevicePath);
this.m_ttyDevs = new ArrayList<String>();
this.m_blockDevs = new ArrayList<String>();
}
public UsbModemDevice(AbstractUsbDevice usbDevice) {
super(usbDevice);
this.m_ttyDevs = new ArrayList<String>();
this.m_blockDevs = new ArrayList<String>();
}
@Override
public List<String> getSerialPorts() {
return Collections.unmodifiableList(this.m_ttyDevs);
}
/**
* @return sorted list of tty devs
*/
public List<String> getTtyDevs() {
return Collections.unmodifiableList(this.m_ttyDevs);
}
/**
* @return sorted list of block devs
*/
public List<String> getBlockDevs() {
return Collections.unmodifiableList(this.m_blockDevs);
}
public void addTtyDev(String ttyDev) {
if (!this.m_ttyDevs.contains(ttyDev)) {
this.m_ttyDevs.add(ttyDev);
Collections.sort(this.m_ttyDevs, new DevNameComparator());
}
}
public void addBlockDev(String blockDev) {
if (!this.m_blockDevs.contains(blockDev)) {
this.m_blockDevs.add(blockDev);
Collections.sort(this.m_blockDevs, new DevNameComparator());
}
}
public boolean removeTtyDev(String ttyDev) {
return this.m_ttyDevs.remove(ttyDev);
}
public boolean removeBlockDev(String blockDev) {
return this.m_blockDevs.remove(blockDev);
}
@Override
public int hashCode() {
final int prime = 37;
int result = super.hashCode();
result = prime * result + (this.m_ttyDevs == null ? 0 : this.m_ttyDevs.hashCode());
result = prime * result + (this.m_blockDevs == null ? 0 : this.m_blockDevs.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!super.equals(obj)) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
UsbModemDevice other = (UsbModemDevice) obj;
if (this.m_ttyDevs == null) {
if (other.m_ttyDevs != null) {
return false;
}
} else if (!this.m_ttyDevs.equals(other.m_ttyDevs)) {
return false;
}
if (this.m_blockDevs == null) {
if (other.m_blockDevs != null) {
return false;
}
} else if (!this.m_blockDevs.equals(other.m_blockDevs)) {
return false;
}
return true;
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("UsbModem [");
sb.append("vendorId=").append(getVendorId());
sb.append(", productId=").append(getProductId());
sb.append(", manufName=").append(getManufacturerName());
sb.append(", productName=").append(getProductName());
sb.append(", usbPort=").append(getUsbPort());
sb.append(", ttyDevs=").append(this.m_ttyDevs.toString());
sb.append(", blockDevs=").append(this.m_blockDevs.toString());
sb.append("]");
return sb.toString();
}
private class DevNameComparator implements Comparator<String> {
@Override
/**
* Split the device name into the digit and non-digit portions and compare separately
* i.e. for "/dev/ttyUSB9" and "/dev/ttyUSB10", the "/dev/ttyUSB" parts are first compared
* then the "9" and "10" are compared numerically.
*/
public int compare(String dev1, String dev2) {
int digitPos1 = getDigitPosition(dev1);
int digitPos2 = getDigitPosition(dev2);
String text1 = dev1.substring(0, digitPos1);
String text2 = dev2.substring(0, digitPos2);
String num1 = dev1.substring(digitPos1, dev1.length());
String num2 = dev2.substring(digitPos2, dev2.length());
// Compare text portion
int textCompare = text1.compareTo(text2);
if (textCompare != 0) {
return textCompare;
}
// Compare numerical portion
if (num1 == null || num1.isEmpty()) {
if (num2 == null || num2.isEmpty()) {
return 0;
} else {
return -1;
}
} else if (num2 == null || num2.isEmpty()) {
return 1;
}
Integer int1 = Integer.parseInt(num1);
Integer int2 = Integer.parseInt(num2);
return int1.compareTo(int2);
}
private int getDigitPosition(String devName) {
int pos = devName.length();
for (int i = devName.length() - 1; i >= 0; i--) {
if (Character.isDigit(devName.charAt(i))) {
pos = i;
} else {
break;
}
}
return pos;
}
}
}