/*
* Copyright (C) 2013-2014 Sony Computer Science Laboratories, Inc. All Rights Reserved.
* Copyright (C) 2014 Sony Corporation. All Rights Reserved.
*/
package com.sonycsl.Kadecot.wamp.echonetlite;
import com.sonycsl.echo.Echo;
import com.sonycsl.echo.eoj.EchoObject;
import com.sonycsl.echo.eoj.device.DeviceObject;
import com.sonycsl.echo.eoj.profile.NodeProfile;
import com.sonycsl.echo.node.EchoNode;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.util.Collections;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class ECHONETLiteDiscovery {
public static final String LOCAL_ADDRESS = "127.0.0.1";
private final Set<DeviceObject> mActiveDevices;
// <deviceId, deviceData>
private Map<Long, ECHONETLiteDeviceData> mDeviceMap;
private OnEchoDeviceInfoListener mListener;
public interface OnEchoDeviceInfoListener {
public void onDeviceAdded(JSONObject data);
public void onDeviceStateChanged(JSONObject data);
}
public ECHONETLiteDiscovery() {
mActiveDevices = Collections.synchronizedSet(new HashSet<DeviceObject>());
mListener = null;
}
public void setListener(OnEchoDeviceInfoListener listener) {
mListener = listener;
}
private JSONObject convertToJSONObject(DeviceObject device) throws JSONException {
String address;
if (device.isProxy()) {
address = device.getNode().getAddress().getHostAddress();
} else {
address = LOCAL_ADDRESS;
}
String uuid = address + ":" + device.getEchoClassCode();
String nickname = uuid;
return ECHONETLiteDeviceData.createJSONObject(ECHONETLiteManager.PROTOCOL_TYPE_ECHO,
uuid, uuid, true, nickname, address, (short) (device.getEchoClassCode() & 0xFFFF),
(byte) (device.getInstanceCode() & 0xFF), null);
}
protected synchronized void onDiscoverNewActiveDevice(DeviceObject device) {
try {
JSONObject data = convertToJSONObject(device);
if (mListener != null) {
mListener.onDeviceAdded(data);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
public 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) {
ECHONETLiteDeviceData data = mDeviceMap.get(deviceId);
EchoObject eoj = getEchoObject(data.getAddress(), data.getClassCode(),
data.getInstanceCode());
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);
}
}