/*
* RHQ Management Platform
* Copyright (C) 2005-2008 Red Hat, Inc.
* All rights reserved.
*
* 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 version 2 of the License.
*
* 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, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.rhq.plugins.onewire;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Set;
import com.dalsemi.onewire.OneWireException;
import com.dalsemi.onewire.adapter.DSPortAdapter;
import com.dalsemi.onewire.adapter.OneWireIOException;
import com.dalsemi.onewire.adapter.PDKAdapterUSB;
import com.dalsemi.onewire.container.OneWireContainer;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
/**
* @author Heiko W. Rupp
*
*/
public class OneWireAdapterDiscovery implements ResourceDiscoveryComponent<OneWireAdapterComponent> {
private static final Log log = LogFactory.getLog(OneWireAdapterDiscovery.class);
/* (non-Javadoc)
* @see org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent#discoverResources(org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext)
*/
public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<OneWireAdapterComponent> context)
throws InvalidPluginConfigurationException, Exception {
Configuration pluginConfig = context.getDefaultPluginConfiguration();
String port = pluginConfig.getSimple("port").getStringValue();
DSPortAdapter adapter = new PDKAdapterUSB();
adapter.selectPort(port);
boolean found = false;
adapter.beginExclusive(true);
found = adapter.adapterDetected();
adapter.endExclusive();
Set<DiscoveredResourceDetails> ret = new HashSet<DiscoveredResourceDetails>();
if (found) {
String key = getIdForAdapter(adapter);
String name = adapter.getAdapterName() + " on " + adapter.getPortName();
log.info("Found " + name + "@[" + key + "]");
String descr = "OneWire adapter (" + name + ") with key (" + key + ")";
DiscoveredResourceDetails detail = new DiscoveredResourceDetails(context.getResourceType(), key, name, "",
descr, pluginConfig, null);
ret.add(detail);
adapter.freePort();
}
return ret;
}
/**
* Get the specific address of the USB to OneWire adapter. This is a special
* DS1990 or compatible chip in the adapter itself. It belongs to special family 0x81
* @param adapter Our USB port adapter
* @return the unique ID of the adapter
* @throws OneWireIOException
* @throws OneWireException
*/
@SuppressWarnings("unchecked")
private String getIdForAdapter(DSPortAdapter adapter) throws OneWireIOException, OneWireException {
Enumeration<OneWireContainer> devices = adapter.getAllDeviceContainers();
while (devices.hasMoreElements()) {
OneWireContainer cont = devices.nextElement();
String name = cont.getName();
if ("DS1990A".equals(name) || "DS2401".equals(name) || "DS2411".equals(name)) {
// TODO check for family code of 0x81 in case we have more then one of those devices on the bus
return cont.getAddressAsString();
}
}
log.warn("Was not able to get a unique adapter name");
return adapter.getAdapterName();
}
}