ok I will take a look later.
another question, the devices are all exported devices running on the same felix platform with the listener routine too, aren't? In this case the BaseDriver is not involved in the delivery of the UPnPNotifyEvents.
So the bug should be either in the UPnPEventNotifier or in your code.

francesco


Daniel Felsing wrote:
Yes i'm using them in every exported device type...
Wait - i paste you some code of a whole device type implementation :-)

Note that there is also a upnpdimmabledevice which is reusing the status
things of switchabledevice
It just provides an additional level....my class hierarchy of my own
basedriver is also built like that - so i could reduce "copy paste" code




Ok every upnp device is extending my upnp general device:

public abstract class UPnPGeneralDevice {

        // device identifiers
        final protected String DEVICE_ID_PREFIX = "uuid:AT-SM-";
        protected String DEVICE_ID;
        
        // model and context
        protected BundleContext context;
        
        // device category and description
        protected String deviceCat;
        protected String description;
        protected String hubId;
        protected String identity;
        
        // localhost information
        protected String ipAddress;
        protected String portNumber;
        
        // path to presentation servlet
        protected String presServlet;
        
        // device properties
        protected Dictionary devprops;
        
        
        public void generateHostInfo() {
                
        try {
            Enumeration interfaces =
NetworkInterface.getNetworkInterfaces();
            while (interfaces.hasMoreElements()) {
                NetworkInterface networkInterface =
(NetworkInterface)interfaces.nextElement();
Enumeration addresses = networkInterface.getInetAddresses();
                while (addresses.hasMoreElements()) {
                    InetAddress inetAddress =
(InetAddress)addresses.nextElement();
                    // ignore loopback ip
                    if (!inetAddress.isLoopbackAddress() &&
!inetAddress.isLinkLocalAddress()) {
                       this.ipAddress = inetAddress.getHostAddress();
                    }
                }
            }
        } catch (SocketException e) {
            e.printStackTrace();
        }               
                
                this.portNumber = "80";
                if(context.getProperty("org.osgi.service.http.port") !=
null) {
                        this.portNumber =
context.getProperty("org.osgi.service.http.port");
                }
        }
        
        public void setupProperties() {
                devprops = new Properties();
                // indicate for UPnP Export and set proper device category
                devprops.put(UPnPDevice.UPNP_EXPORT,"");
        
devprops.put(org.osgi.service.device.Constants.DEVICE_CATEGORY, new
String[]{UPnPDevice.DEVICE_CATEGORY});
        
                // device specific properties
                devprops.put(UPnPDevice.FRIENDLY_NAME, deviceCat);
                devprops.put(UPnPDevice.MANUFACTURER, "Daniel Felsing");
                devprops.put(UPnPDevice.MANUFACTURER_URL,
"http://www.maven.at";);
                devprops.put(UPnPDevice.MODEL_DESCRIPTION, description);
                devprops.put(UPnPDevice.MODEL_NAME, deviceCat);
                devprops.put(UPnPDevice.MODEL_NUMBER,"2.0");
                if (this.ipAddress != null && this.portNumber != null &&
this.presServlet != null) {
                        devprops.put(UPnPDevice.PRESENTATION_URL,"http://"; +
this.ipAddress + ":" + this.portNumber + presServlet + "?identity=" +
identity);
                }
                //dictionary.put(UPnPDevice.SERIAL_NUMBER,"123456789");
                devprops.put(UPnPDevice.TYPE,"urn:schemas-upnp-org:device:"
+ deviceCat + ":1");
                devprops.put(UPnPDevice.ID, DEVICE_ID);
                devprops.put(UPnPDevice.UPC,"SMARTHOME_" +
hubId.toUpperCase() + "_" + deviceCat.toUpperCase());         
        }       
        
        public Dictionary getDevprops() {
                return devprops;
        }


        public void setDevprops(Dictionary devprops) {
                this.devprops = devprops;
        }               
        
}


My switchabledevice (e.g. a plug or a light)

public class UPnPSwitchableDevice extends UPnPGeneralDevice implements
UPnPDevice, Destroyable {       
        
        // upnp services
        private SwitchableDevSwitchService switchdevswitchservice;
        private GeneralDevNameService switchdevnameservice;
        private UPnPService[] upnpservices;
        
        // event notifier
        private UPnPEventNotifier notify_switch;
        
        // device
        private SwitchableDevice switchDev;
        
        public UPnPSwitchableDevice(SwitchableDevice switchDev,
BundleContext context, String hubId, String deviceCat, String description,
String presServlet) {
                super();
                this.switchDev = switchDev;
                this.context = context;
                this.presServlet = presServlet;
                this.deviceCat = deviceCat;
                this.description = description;
                this.hubId = hubId;
                this.identity = switchDev.getIdentity();                
                
                if(hubId != null) {
                        this.DEVICE_ID = DEVICE_ID_PREFIX + hubId + "-" +
switchDev.getIdentity();
                } else {
                        this.DEVICE_ID = DEVICE_ID_PREFIX +
switchDev.getIdentity();        
                }
                
                // create services of the device
                this.switchdevswitchservice = new
SwitchableDevSwitchService(switchDev);
                this.switchdevnameservice = new
GeneralDevNameService(switchDev, hubId);
                this.upnpservices = new UPnPService[]{switchdevnameservice,
switchdevswitchservice};
                this.generateHostInfo();
                this.setupProperties();
                
                // setup event notifier
                notify_switch = new UPnPEventNotifier(context, this,
switchdevswitchservice, switchDev);
        }
        
        public Dictionary getDescriptions(String locale) {
                return devprops;
        }

        public UPnPIcon[] getIcons(String locale) {
                UPnPIcon icon = new DeviceIcon(switchDev);
                return new UPnPIcon[]{icon} ;
        }

        public UPnPService getService(String serviceId) {
if (serviceId.equals(switchdevswitchservice.getId())) return switchdevswitchservice; else if (serviceId.equals(switchdevnameservice.getId())) return switchdevnameservice;
                else
                        return null;
        }

        public UPnPService[] getServices() {
                return upnpservices;
        }
        
        public void destroy() {
                // destroy listeners...
                notify_switch.destroy();
        }       

}


My Switch Service:

public class SwitchableDevSwitchService implements UPnPService {
        final private String SERVICE_ID =
"urn:upnp-org:serviceId:SwitchDevice:1";
        final private String SERVICE_TYPE =
"urn:schemas-upnp-org:service:SwitchDevice:1";
        final private String VERSION ="2.0";
        
        private HashMap actions = new HashMap();
        
        private UPnPStateVariable statusstate;
        private UPnPStateVariable[] states;

        public SwitchableDevSwitchService(SwitchableDevice switchDev) {
                super();
                this.statusstate = new
SwitchableDevStatusStateVariable(switchDev);
                this.states = new UPnPStateVariable[]{statusstate};
                
                UPnPAction setUPnPStatus = new
SwitchableDevSetStatusAction(statusstate, switchDev);
                UPnPAction getUPnPStatus = new
SwitchableDevGetStatusAction(statusstate, switchDev);
                actions.put(getUPnPStatus.getName(), getUPnPStatus);
                actions.put(setUPnPStatus.getName(), setUPnPStatus);
        }

        public UPnPAction getAction(String name) {
                return (UPnPAction)actions.get(name);
        }

        public UPnPAction[] getActions() {
                return (UPnPAction[])(actions.values()).toArray(new
UPnPAction[]{});
        }

        public String getId() {
                return SERVICE_ID;
        }

        public UPnPStateVariable getStateVariable(String id) {
                if (id.equals("Status"))
                        return statusstate;
                else return null;
        }

        public UPnPStateVariable[] getStateVariables() {
                return states;
        }

        public String getType() {
                return SERVICE_TYPE;
        }

        public String getVersion() {
                return VERSION;
        }       
}


The switchdev state variable:

public class SwitchableDevStatusStateVariable implements
UPnPLocalStateVariable {

        final private String NAME = "Status";
        final private String DEFAULT_VALUE = "off";
        
        private SwitchableDevice switchDev;
        
        public SwitchableDevStatusStateVariable(SwitchableDevice switchDev){
                this.switchDev = switchDev;
        }       
        
        public String[] getAllowedValues() {
                return null;
        }

        public Object getDefaultValue() {
                return DEFAULT_VALUE;
        }

        public Class getJavaDataType() {
                return String.class;
        }

        public Number getMaximum() {
                return null;
        }

        public Number getMinimum() {
                return null;
        }

        public String getName() {
                return NAME;
        }

        public Number getStep() {
                return null;
        }

        public String getUPnPDataType() {
                return org.osgi.service.upnp.UPnPStateVariable.TYPE_STRING;
        }

        public boolean sendsEvents() {
                return true;
        }

        public Object getCurrentValue() {
                return switchDev.getStatus();
        }

}



SetStatusAction:

public class SwitchableDevSetStatusAction implements UPnPAction {

        final private String NAME = "SetStatus";
        final private String NEW_STATUS_VALUE = "NewStatusValue";
        final private String[] IN_ARG_NAMES = new
String[]{NEW_STATUS_VALUE};
        private UPnPStateVariable state;
        private SwitchableDevice switchDev;     
        
        public SwitchableDevSetStatusAction(UPnPStateVariable state,
SwitchableDevice switchDev) {
                super();
                this.state = state;
                this.switchDev = switchDev;
        }

        public String[] getInputArgumentNames() {
                return IN_ARG_NAMES;
        }

        public String getName() {
                return NAME;
        }

        public String[] getOutputArgumentNames() {
                return null;
        }

        public String getReturnArgumentName() {
                return null;
        }

        public UPnPStateVariable getStateVariable(String argumentName) {
                return state;
        }

        public Dictionary invoke(Dictionary args) throws Exception {
                String value = (String) args.get(NEW_STATUS_VALUE);
                this.switchDev.setStatus(value);
                return null;
        }

}



And finally getstatusaction:

public class SwitchableDevGetStatusAction implements UPnPAction {

        final private String NAME = "GetStatus";
        final private String RESULT_STATUS = "ResultStatus";
        final private String[] OUT_ARG_NAMES = new String[]{RESULT_STATUS};
        private UPnPStateVariable state;
        private SwitchableDevice switchDev;     
        
        public SwitchableDevGetStatusAction(UPnPStateVariable state,
SwitchableDevice switchDev) {
                super();
                this.state = state;
                this.switchDev = switchDev;
        }

        public String[] getInputArgumentNames() {
                return null;
        }

        public String getName() {
                return NAME;
        }

        public String[] getOutputArgumentNames() {
                return OUT_ARG_NAMES;
        }

        public String getReturnArgumentName() {
                return null;
        }

        public UPnPStateVariable getStateVariable(String argumentName) {
                return state;
        }

        public Dictionary invoke(Dictionary args) throws Exception {
                String status = switchDev.getStatus();
                Hashtable result = new Hashtable();
                result.put(RESULT_STATUS, status);
                return result;
        }

}


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to