/**
* BlueCove - Java library for Bluetooth
* Copyright (C) 2006-2007 Vlad Skarzhevskyy
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
* @author vlads
* @version $Id$
*/
package net.sf.bluecove;
import java.util.Hashtable;
import javax.bluetooth.RemoteDevice;
import javax.bluetooth.ServiceRecord;
import net.sf.bluecove.util.TimeStatistic;
/**
*
*/
public class RemoteDeviceInfo {
public static Hashtable devices = new Hashtable();
public static Hashtable services = new Hashtable();
public String name;
public RemoteDevice remoteDevice;
public int discoveredCount;
public long discoveredFirstTime;
public long discoveredLastTime;
private TimeStatistic deviceDiscovery = new TimeStatistic();
public static TimeStatistic deviceInquiryDuration = new TimeStatistic();
public TimeStatistic serviceSearch = new TimeStatistic();
public static TimeStatistic allServiceSearch = new TimeStatistic();
public long serviceDiscoveredFirstTime;
public long serviceDiscoveredLastTime;
public TimeStatistic serviceDiscovered = new TimeStatistic();
public long variableData;
public long variableDataCheckLastTime;
public boolean variableDataUpdated = false;
public static synchronized void clear() {
devices = new Hashtable();
services = new Hashtable();
allServiceSearch.clear();
deviceInquiryDuration.clear();
}
public static synchronized RemoteDeviceInfo getDevice(RemoteDevice remoteDevice) {
String addr = remoteDevice.getBluetoothAddress().toUpperCase();
RemoteDeviceInfo devInfo = getDevice(addr);
devInfo.remoteDevice = remoteDevice;
return devInfo;
}
public static synchronized RemoteDeviceInfo getDevice(String remoteDeviceAddress) {
RemoteDeviceInfo devInfo = (RemoteDeviceInfo) devices.get(remoteDeviceAddress);
if (devInfo == null) {
devInfo = new RemoteDeviceInfo();
devInfo.name = TestResponderClient.niceDeviceName(remoteDeviceAddress);
devices.put(remoteDeviceAddress, devInfo);
}
return devInfo;
}
public static synchronized void deviceFound(RemoteDevice remoteDevice) {
RemoteDeviceInfo devInfo = getDevice(remoteDevice);
long now = System.currentTimeMillis();
if (devInfo.discoveredCount == 0) {
devInfo.discoveredFirstTime = now;
devInfo.deviceDiscovery.add(0);
} else {
devInfo.deviceDiscovery.add(now - devInfo.discoveredLastTime);
}
devInfo.remoteDevice = remoteDevice;
devInfo.discoveredCount++;
devInfo.discoveredLastTime = now;
}
public static synchronized void deviceServiceFound(RemoteDevice remoteDevice, long variableData) {
RemoteDeviceInfo devInfo = getDevice(remoteDevice);
long now = System.currentTimeMillis();
if (devInfo.serviceDiscovered.count == 0) {
devInfo.serviceDiscoveredFirstTime = now;
devInfo.serviceDiscovered.add(0);
} else {
devInfo.serviceDiscovered.add(now - devInfo.serviceDiscoveredLastTime);
}
devInfo.remoteDevice = remoteDevice;
devInfo.serviceDiscoveredLastTime = now;
// if (variableData != 0) {
// long frequencyMSec = now - devInfo.variableDataCheckLastTime;
// if ((devInfo.variableData != 0) && (frequencyMSec > 1000 * 120)) {
// devInfo.variableDataCheckLastTime = now;
// boolean er = false;
// if (variableData == devInfo.variableData) {
// Logger.warn("not updated " + variableData);
// TestResponderClient.failure.addFailure("not updated " + variableData
// + " on " + devInfo.name);
// er = true;
// }
// if (!er) {
// devInfo.variableDataUpdated = true;
// Logger.info("Var info updated, " + variableData);
// }
// } else if (devInfo.variableData != variableData) {
// if (devInfo.variableData == 0) {
// Logger.info("Var info set, " + variableData);
// } else {
// Logger.info("Var info updated, " + variableData);
// }
// devInfo.variableData = variableData;
// devInfo.variableDataCheckLastTime = now;
// devInfo.variableDataUpdated = true;
// }
// }
}
public static synchronized void searchServices(RemoteDevice remoteDevice, boolean found, long servicesSearch) {
RemoteDeviceInfo devInfo = getDevice(remoteDevice);
devInfo.serviceSearch.add(servicesSearch);
allServiceSearch.add(servicesSearch);
}
public static void discoveryInquiryFinished(long discoveryInquiry) {
deviceInquiryDuration.add(discoveryInquiry);
}
public static long allAvgDeviceInquiryDurationSec() {
return deviceInquiryDuration.avgSec();
}
public static long allAvgServiceSearchDurationSec() {
return allServiceSearch.avgSec();
}
public long avgDiscoveryFrequencySec() {
return deviceDiscovery.avgSec();
}
public long avgServiceDiscoveryFrequencySec() {
return serviceDiscovered.avgSec();
}
public long avgServiceSearchDurationSec() {
return serviceSearch.durationMaxSec();
}
public long serviceSearchSuccessPrc() {
if ((serviceSearch.count) == 0) {
return 0;
}
return (100 * serviceDiscovered.count) / (serviceSearch.count);
}
public static void saveServiceURL(ServiceRecord serviceRecord) {
services.put(serviceRecord.getConnectionURL(Configuration.getRequiredSecurity(), false), serviceRecord);
}
}