/*
* Copyright (C) 2013-2014 Sony Computer Science Laboratories, Inc. All Rights Reserved.
* Copyright (C) 2014 Sony Corporation. All Rights Reserved.
*/
package com.sonycsl.Kadecot.device.echo;
import android.content.Context;
import com.sonycsl.Kadecot.call.Notification;
import com.sonycsl.Kadecot.device.DeviceManager;
import com.sonycsl.Kadecot.device.DeviceProperty;
import com.sonycsl.Kadecot.log.Logger;
import com.sonycsl.echo.Echo;
import com.sonycsl.echo.eoj.EchoObject;
import com.sonycsl.echo.eoj.device.DeviceObject;
import com.sonycsl.echo.eoj.device.housingfacilities.PowerDistributionBoardMetering;
import com.sonycsl.echo.eoj.device.sensor.HumiditySensor;
import com.sonycsl.echo.eoj.device.sensor.TemperatureSensor;
import com.sonycsl.echo.eoj.profile.NodeProfile;
import com.sonycsl.echo.node.EchoNode;
import java.io.IOException;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
public class EchoDiscovery {
private final Context mContext;
private final Set<DeviceObject> mActiveDevices;
private final EchoDeviceDatabase mEchoDeviceDatabase;
private final Logger mLogger;
public EchoDiscovery(Context context) {
mContext = context.getApplicationContext();
mActiveDevices = Collections.synchronizedSet(new HashSet<DeviceObject>());
mEchoDeviceDatabase = EchoDeviceDatabase.getInstance(mContext);
mLogger = Logger.getInstance(mContext);
}
protected synchronized void onDiscoverNewActiveDevice(DeviceObject device) {
EchoDeviceData data;
if (mEchoDeviceDatabase.containsDeviceData(device)) {
data = mEchoDeviceDatabase.getDeviceData(device);
// Log.d(TAG,"already " + data.nickname);
} else {
data = mEchoDeviceDatabase.addDeviceData(device);
// Log.d(TAG,"new " + data.nickname);
}
// Log.d(TAG,DeviceManager.getInstance(mContext).getDeviceInfo(data,
// 0).toString());
// onDiscover(device);
/**
* TODO: delete when completed wamp implementation.
*/
Notification.informAllOnDeviceFound(
DeviceManager.getInstance(mContext).getDeviceInfo(data, 0), EchoManager
.getInstance(mContext).getAllowedPermissionLevel());
// logger
HashSet<DeviceProperty> propertySet = new HashSet<DeviceProperty>();
long delay =
(Logger.DEFAULT_INTERVAL_MILLS)
- (System.currentTimeMillis() % (Logger.DEFAULT_INTERVAL_MILLS));
switch (device.getEchoClassCode()) {
case PowerDistributionBoardMetering.ECHO_CLASS_CODE:
try {
device.get().reqGetGetPropertyMap().send();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
case TemperatureSensor.ECHO_CLASS_CODE:
propertySet.add(new DeviceProperty(EchoManager
.toPropertyName(TemperatureSensor.EPC_MEASURED_TEMPERATURE_VALUE), null));
mLogger.watch(data.nickname, propertySet, Logger.DEFAULT_INTERVAL_MILLS, delay);
break;
case HumiditySensor.ECHO_CLASS_CODE:
propertySet.add(new DeviceProperty(EchoManager
.toPropertyName(HumiditySensor.EPC_MEASURED_VALUE_OF_RELATIVE_HUMIDITY),
null));
mLogger.watch(data.nickname, propertySet, Logger.DEFAULT_INTERVAL_MILLS, delay);
break;
}
}
protected void startDiscovering() {
if (Echo.isStarted()) {
// TODO:Why need this?
EchoNode[] nodes = Echo.getNodes();
for (EchoNode n : nodes) {
DeviceObject[] devices = n.getDevices();
for (DeviceObject d : devices) {
onDiscover(d);
}
}
try {
NodeProfile.getG().reqGetSelfNodeInstanceListS().send();
} catch (IOException e) {
}
}
}
public void onDiscover(DeviceObject device) {
if (!mActiveDevices.contains(device)) {
mActiveDevices.add(device);
onDiscoverNewActiveDevice(device);
}
}
protected synchronized void stopDiscovering() {
}
protected synchronized void clearActiveDevices() {
for (DeviceObject d : mActiveDevices) {
if (d.isProxy()) {
d.getNode().removeDevice(d);
}
}
mActiveDevices.clear();
}
protected synchronized void removeActiveDevices(long deviceId) {
EchoDeviceData data = mEchoDeviceDatabase.getDeviceData(deviceId);
EchoObject eoj = getEchoObject(data.address, data.echoClassCode, data.instanceCode);
if (eoj == null) {
return;
}
// if(!eoj.isProxy()) {
// Echo.getNode().removeDevice((DeviceObject)eoj);
eoj.getNode().removeDevice((DeviceObject) eoj);
// }
mActiveDevices.remove(eoj);
}
private EchoObject getEchoObject(String address, short echoClassCode, byte instanceCode) {
EchoNode en = Echo.getNode(address);
if (en == null)
return null;
return en.getInstance(echoClassCode, instanceCode);
}
public synchronized boolean isActiveDevice(String address, short echoClassCode,
byte instanceCode) {
EchoObject eoj = getEchoObject(address, echoClassCode, instanceCode);
if (eoj == null) {
return false;
}
return mActiveDevices.contains(eoj);
}
}