blob: c2eba36ca9fbd262803a5cb9fe3f1f62b19b64d2 [file] [log] [blame]
/*
* 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.
*/
package org.apache.felix.upnp.sample.tv;
import java.awt.Component;
import java.util.ArrayList;
import java.util.Date;
import java.util.Dictionary;
import java.util.HashSet;
import java.util.Properties;
import java.util.Random;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceEvent;
import org.osgi.framework.ServiceListener;
import org.osgi.framework.ServiceReference;
import org.osgi.service.upnp.UPnPDevice;
import org.osgi.service.upnp.UPnPEventListener;
import org.osgi.service.upnp.UPnPIcon;
import org.osgi.service.upnp.UPnPService;
import org.apache.felix.upnp.extra.util.UPnPEventNotifier;
import org.apache.felix.upnp.extra.util.UPnPSubscriber;
public class TvDevice implements UPnPDevice,UPnPEventListener,ServiceListener {
final private String DEVICE_ID = "uuid:Felix-TV+" +Integer.toHexString(new Random(System.currentTimeMillis()).nextInt());
private final static String CLOCK_DEVICE_TYPE = "urn:schemas-upnp-org:device:clock:1";
private final static String TIME_SERVICE_TYPE = "urn:schemas-upnp-org:service:timer:1";
private final static String LIGHT_DEVICE_TYPE = "urn:schemas-upnp-org:device:light:1";
private final static String POWER_SERVICE_TYPE = "urn:schemas-upnp-org:service:power:1";
private final static String AIRCON_DEVICE_TYPE = "urn:schemas-upnp-org:device:aircon:1";
private final static String TEMP_SERVICE_TYPE = "urn:schemas-upnp-org:service:temp:1";
private final static String WASHER_DEVICE_TYPE = "urn:schemas-upnp-org:device:washer:1";
private final static String STATUS_SERVICE_TYPE = "urn:schemas-upnp-org:service:state:1";
private final String devicesFilter =
"(&"+
"("+Constants.OBJECTCLASS+"="+UPnPDevice.class.getName()+"))";
/*"(|("+UPnPDevice.TYPE+"="+ CLOCK_SERVICE_TYPE+")"+
"("+UPnPDevice.TYPE+"="+ LIGHT_SERVICE_TYPE+")"+
"("+UPnPDevice.TYPE+"="+ AIRCON_SERVICE_TYPE+")"+
"("+UPnPDevice.TYPE+"="+ WASHER_SERVICE_TYPE+")))";*/
private BundleContext context;
private PowerService powerService;
private UPnPService[] services;
private Dictionary dictionary;
private UPnPEventNotifier notifier;
private PowerStateVariable powerState;
public TvDevice() {
powerService = new PowerService();
services = new UPnPService[]{powerService};
powerState = (PowerStateVariable) powerService.getStateVariable("Power");
setupDeviceProperties();
buildEventNotifyer();
try {
Activator.context.addServiceListener(this,devicesFilter);
} catch (InvalidSyntaxException e) {
System.out.println(e);
}
}
/**
*
*/
private void buildEventNotifyer() {
notifier = new UPnPEventNotifier(Activator.context,this,powerService);
powerState.setNotifier(notifier);
}
private void setupDeviceProperties(){
dictionary = new Properties();
dictionary.put(UPnPDevice.UPNP_EXPORT,"");
dictionary.put(
org.osgi.service.device.Constants.DEVICE_CATEGORY,
new String[]{UPnPDevice.DEVICE_CATEGORY}
);
dictionary.put(UPnPDevice.FRIENDLY_NAME,"Felix Sample Tv");
dictionary.put(UPnPDevice.MANUFACTURER,"Apache Software Foundation");
dictionary.put(UPnPDevice.MANUFACTURER_URL,"http://felix.apache.org");
dictionary.put(UPnPDevice.MODEL_DESCRIPTION,"A CyberLink Tv device clone to test OSGi to UPnP service import");
dictionary.put(UPnPDevice.MODEL_NAME,"BimbiTv");
dictionary.put(UPnPDevice.MODEL_NUMBER,"1.0");
dictionary.put(UPnPDevice.MODEL_URL,"http://felix.apache.org/site/upnp-examples.html");
dictionary.put(UPnPDevice.SERIAL_NUMBER,"123456789");
dictionary.put(UPnPDevice.TYPE,"urn:schemas-upnp-org:device:tv:1");
dictionary.put(UPnPDevice.UDN,DEVICE_ID);
dictionary.put(UPnPDevice.UPC,"1213456789");
HashSet types = new HashSet(services.length+5);
String[] ids = new String[services.length];
for (int i = 0; i < services.length; i++) {
ids[i]=services[i].getId();
types.add(services[i].getType());
}
dictionary.put(UPnPService.TYPE, types.toArray(new String[]{}));
dictionary.put(UPnPService.ID, ids);
}
/* (non-Javadoc)
* @see org.osgi.service.upnp.UPnPDevice#getService(java.lang.String)
*/
public UPnPService getService(String serviceId) {
if (serviceId.equals(powerService.getId())) return powerService;
return null;
}
/* (non-Javadoc)
* @see org.osgi.service.upnp.UPnPDevice#getServices()
*/
public UPnPService[] getServices() {
return services;
}
/* (non-Javadoc)
* @see org.osgi.service.upnp.UPnPDevice#getIcons(java.lang.String)
*/
public UPnPIcon[] getIcons(String locale) {
UPnPIcon icon = new TvIcon();
return new UPnPIcon[]{icon} ;
}
/* (non-Javadoc)
* @see org.osgi.service.upnp.UPnPDevice#getDescriptions(java.lang.String)
*/
public Dictionary getDescriptions(String locale) {
return dictionary;
}
////////////////////////////////////////////////
// Component
////////////////////////////////////////////////
private Component comp;
public void setComponent(Component comp)
{
this.comp = comp;
}
public Component getComponent()
{
return comp;
}
////////////////////////////////////////////////
// on/off
////////////////////////////////////////////////
private boolean onFlag = false;
public void on()
{
powerState.setPower(Boolean.TRUE);
doSubscribe();
}
public boolean isOn()
{
return powerState.getCurrentPower().booleanValue();
}
public void off()
{
powerState.setPower(Boolean.FALSE);
undoSubscribe();
}
////////////////////////////////////////////////
// Clock
////////////////////////////////////////////////
private String clockTime = "";
public String getClockTime()
{
return clockTime;
}
////////////////////////////////////////////////
// Aircon
////////////////////////////////////////////////
private String airconTemp = "";
public String getAirconTempture()
{
return airconTemp;
}
////////////////////////////////////////////////
// Message
////////////////////////////////////////////////
private String message = "";
public void setMessage(String msg)
{
message = msg;
}
public String getMessage()
{
return message;
}
////////////////////////////////////////////////
// Subscribe
////////////////////////////////////////////////
private UPnPSubscriber subscriber;
public void doSubscribe()
{
subscriber = new UPnPSubscriber(Activator.context,this);
subscriber.subscribeEveryServiceType(CLOCK_DEVICE_TYPE, TIME_SERVICE_TYPE);
subscriber.subscribeEveryServiceType(AIRCON_DEVICE_TYPE, TEMP_SERVICE_TYPE);
subscriber.subscribeEveryServiceType(LIGHT_DEVICE_TYPE, POWER_SERVICE_TYPE);
subscriber.subscribeEveryServiceType(WASHER_DEVICE_TYPE, STATUS_SERVICE_TYPE);
}
public void undoSubscribe(){
subscriber.unsubscribeAll();
}
ArrayList LinkedDevices = new ArrayList();
/* (non-Javadoc)
* @see org.osgi.service.upnp.UPnPEventListener#notifyUPnPEvent(java.lang.String, java.lang.String, java.util.Dictionary)
*/
public void notifyUPnPEvent(String deviceId, String serviceId, Dictionary events) {
if( !LinkedDevices.contains(deviceId))
LinkedDevices.add(deviceId);
if (deviceId.indexOf("Clock") != -1){
Date date = (Date) events.get("Time");
clockTime = date.toString();
}
else if (deviceId.indexOf("AirCon") != -1)
airconTemp = (String) events.get("Temp");
else if (deviceId.indexOf("Washer") != -1)
message = (String) events.get("State");
else if (deviceId.indexOf("Light") != -1)
message = (String) events.get("Power");
comp.repaint();
}
////////////////////////////////////////////////
// start/stop
////////////////////////////////////////////////
public void start()
{
on();
}
public void stop()
{
((PowerStateVariable) powerService.getStateVariable("Power")).setNotifier(null);
notifier.destroy();
off();
}
/* (non-Javadoc)
* @see org.osgi.framework.ServiceListener#serviceChanged(org.osgi.framework.ServiceEvent)
*/
public void serviceChanged(ServiceEvent event) {
switch(event.getType()){
case ServiceEvent.REGISTERED:{
};break;
case ServiceEvent.MODIFIED:{
};break;
case ServiceEvent.UNREGISTERING:{
ServiceReference sr = event.getServiceReference();
String UDN = (String)sr.getProperty(UPnPDevice.ID);
if (UDN != null){
if (LinkedDevices.contains(UDN)) {
if (UDN.indexOf("Clock") != -1)
clockTime = "";
else if (UDN.indexOf("AirCon") != -1)
airconTemp = "";
else if (UDN.indexOf("Washer") != -1)
message = "";
else if (UDN.indexOf("Light") != -1)
message = "";
}
}
comp.repaint();
};break;
}
}
}