/*
* ============================================================================
* GNU General Public License
* ============================================================================
*
* Copyright (C) 2006-2011 Serotonin Software Technologies Inc. http://serotoninsoftware.com
* @author Matthew Lohbihler
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* When signing a commercial license with Serotonin Software Technologies Inc.,
* the following extension to GPL is made. A special exception to the GPL is
* included to allow you to distribute a combined work that includes BAcnet4J
* without being obliged to provide the source code for any proprietary components.
*/
package com.serotonin.bacnet4j;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.serotonin.bacnet4j.type.constructed.Address;
import com.serotonin.bacnet4j.type.constructed.ServicesSupported;
import com.serotonin.bacnet4j.type.enumerated.ObjectType;
import com.serotonin.bacnet4j.type.enumerated.Segmentation;
import com.serotonin.bacnet4j.type.primitive.ObjectIdentifier;
import com.serotonin.bacnet4j.type.primitive.OctetString;
import com.serotonin.bacnet4j.type.primitive.UnsignedInteger;
public class RemoteDevice implements Serializable {
private static final long serialVersionUID = 6338537708566242078L;
private final int instanceNumber;
private final Address address;
private final OctetString linkService;
private int maxAPDULengthAccepted;
private Segmentation segmentationSupported;
private int vendorId;
private String vendorName;
private String name;
private String modelName;
private UnsignedInteger protocolVersion;
private UnsignedInteger protocolRevision;
private ServicesSupported servicesSupported;
private final Map<ObjectIdentifier, RemoteObject> objects = new HashMap<ObjectIdentifier, RemoteObject>();
private Object userData;
private int maxReadMultipleReferences = -1;
public RemoteDevice(int instanceNumber, Address address, OctetString linkService) {
this.instanceNumber = instanceNumber;
this.address = address;
this.linkService = linkService;
}
public ObjectIdentifier getObjectIdentifier() {
return new ObjectIdentifier(ObjectType.device, instanceNumber);
}
@Override
public String toString() {
return "RemoteDevice(instanceNumber=" + instanceNumber + ", address=" + address + ", linkServiceAddress="
+ linkService + ")";
}
public String toExtendedString() {
return "RemoteDevice(instanceNumber=" + instanceNumber + ", address=" + address + ", linkServiceAddress="
+ linkService + ", maxAPDULengthAccepted=" + maxAPDULengthAccepted + ", segmentationSupported="
+ segmentationSupported + ", vendorId=" + vendorId + ", vendorName=" + vendorName + ", name=" + name
+ ", servicesSupported=" + servicesSupported + ", objects=" + objects + ")";
}
public void setObject(RemoteObject o) {
objects.put(o.getObjectIdentifier(), o);
}
public RemoteObject getObject(ObjectIdentifier oid) {
return objects.get(oid);
}
public List<RemoteObject> getObjects() {
return new ArrayList<RemoteObject>(objects.values());
}
public void clearObjects() {
objects.clear();
}
public Address getAddress() {
return address;
}
public OctetString getLinkService() {
return linkService;
}
public int getMaxAPDULengthAccepted() {
return maxAPDULengthAccepted;
}
public void setMaxAPDULengthAccepted(int maxAPDULengthAccepted) {
this.maxAPDULengthAccepted = maxAPDULengthAccepted;
}
public Segmentation getSegmentationSupported() {
return segmentationSupported;
}
public void setSegmentationSupported(Segmentation segmentationSupported) {
this.segmentationSupported = segmentationSupported;
}
public int getVendorId() {
return vendorId;
}
public void setVendorId(int vendorId) {
this.vendorId = vendorId;
}
public String getVendorName() {
return vendorName;
}
public void setVendorName(String vendorName) {
this.vendorName = vendorName;
}
public int getInstanceNumber() {
return instanceNumber;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getModelName() {
return modelName;
}
public void setModelName(String modelName) {
this.modelName = modelName;
}
public UnsignedInteger getProtocolVersion() {
return protocolVersion;
}
public void setProtocolVersion(UnsignedInteger protocolVersion) {
this.protocolVersion = protocolVersion;
}
public UnsignedInteger getProtocolRevision() {
return protocolRevision;
}
public void setProtocolRevision(UnsignedInteger protocolRevision) {
this.protocolRevision = protocolRevision;
}
public ServicesSupported getServicesSupported() {
return servicesSupported;
}
public void setServicesSupported(ServicesSupported servicesSupported) {
this.servicesSupported = servicesSupported;
}
public Object getUserData() {
return userData;
}
public void setUserData(Object userData) {
this.userData = userData;
}
public int getMaxReadMultipleReferences() {
if (maxReadMultipleReferences == -1)
maxReadMultipleReferences = segmentationSupported.hasTransmitSegmentation() ? 200 : 20;
return maxReadMultipleReferences;
}
public void reduceMaxReadMultipleReferences() {
if (maxReadMultipleReferences > 1)
maxReadMultipleReferences = (int) (maxReadMultipleReferences * 0.75);
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((address == null) ? 0 : address.hashCode());
result = prime * result + instanceNumber;
result = prime * result + ((linkService == null) ? 0 : linkService.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final RemoteDevice other = (RemoteDevice) obj;
if (address == null) {
if (other.address != null)
return false;
}
else if (!address.equals(other.address))
return false;
if (instanceNumber != other.instanceNumber)
return false;
if (linkService == null) {
if (other.linkService != null)
return false;
}
else if (!linkService.equals(other.linkService))
return false;
return true;
}
}