/* * Created on 1/1/2010 * * Projet EnergySavingApplicationService */ package com.francetelecom.m2m.gateway.bundle.application; import java.util.ArrayList; import java.util.Enumeration; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import java.util.Vector; import org.osgi.framework.BundleContext; import org.osgi.service.component.ComponentContext; import org.osgi.service.event.Event; import org.osgi.service.event.EventHandler; import org.osgi.service.http.HttpService; import org.osgi.service.log.LogService; import org.osgi.x3d.IX3DDevice; import com.francetelecom.m2m.gateway.service.machine.zcl.element.ClusterService; import com.francetelecom.m2m.gateway.service.machine.zcl.element.EndPointService; import com.francetelecom.m2m.gateway.service.machine.zcl.element.exception.ClusterCommandeException; import com.francetelecom.m2m.gateway.service.machine.zcl.standard.cluster.IASZoneServerService; import com.francetelecom.m2m.gateway.service.machine.zcl.standard.cluster.OnOff; import com.francetelecom.m2m.gateway.service.machine.zcl.standard.cluster.OnOffServerService; import com.orange.openthebox.hab.HueLightDevice; import com.st.greennet.service.Device; /** * @author Fabrice Blache */ public class FireApplicationService_Impl implements EventHandler { /* * Reference sur le service de log */ protected LogService logService = null; private Vector zones = new Vector(); private Vector wds = new Vector(); private Vector pumps = new Vector(); private Vector x3dLightDimmers = new Vector(); private Vector hueLights = new Vector(); private Vector greennetSwitchs = new Vector(); private boolean isEnabled = false; private HttpService httpService; private FireApplicationServlet servlet; private boolean hasToBeTreated = true;; private ApplicationStatus status; private boolean onFire = false; /** * Constructeur * * @param componentContext */ public FireApplicationService_Impl() { status = new ApplicationStatus(); } /** * Methode de l'interface LifeCycle Appelle apres le constructeur et apres * les set des services requis */ public void activate() { System.out.println("Activate M2M Fire Application"); enable(); } public void handleEvent(final Event event) { printMessage(LogService.LOG_DEBUG, this.getClass().getName() + "________________________" + event.toString()); String topic = event.getTopic(); Long zoneStatus = (Long) event.getProperty("Zone Status"); if ("zcl/command/received/ZoneStatusChangeNotification".equals(topic)) { if ((new Long(4452).equals(zoneStatus))) { // alarm if (hasToBeTreated && isEnabled) { onFire = true; hasToBeTreated = false; synchronized (wds) { for (Enumeration e = wds.elements(); e .hasMoreElements();) { WarningDeviceThread adt = new WarningDeviceThread( (EndPointService) e.nextElement()); adt.start(); } } synchronized (pumps) { for (Enumeration e = pumps.elements(); e.hasMoreElements();) { PumpThread pt = new PumpThread( (EndPointService) e.nextElement(), true); pt.start(); } } synchronized (x3dLightDimmers) { for(Iterator it = x3dLightDimmers.iterator(); it.hasNext();) { X3DLightDimmer shutter = (X3DLightDimmer) it.next(); X3DLightThread xt = new X3DLightThread(shutter, 10000); xt.start(); } } synchronized (hueLights) { for(Iterator it = hueLights.iterator(); it.hasNext();) { HueLightDevice hueLight = (HueLightDevice) it.next(); HueLightThread hlt = new HueLightThread(hueLight, 10000); hlt.start(); } } synchronized (greennetSwitchs) { for(Iterator it = greennetSwitchs.iterator(); it.hasNext();) { Device greennetSwitch = (Device) it.next(); GreenNetSwitchThread gst = new GreenNetSwitchThread(greennetSwitch, true); gst.start(); } } } else { System.out .println("event is not treated as it has been treated previously"); return; } } else if (new Long(4196).equals(zoneStatus)) { // reset alarm System.out.println("receive 4196"); hasToBeTreated = true; for (Enumeration e = pumps.elements(); e.hasMoreElements();) { PumpThread pt = new PumpThread( (EndPointService) e.nextElement(), false); pt.start(); } // stop breathing synchronized (greennetSwitchs) { for(Iterator it = greennetSwitchs.iterator(); it.hasNext();) { Device greennetSwitch = (Device) it.next(); GreenNetSwitchThread gst = new GreenNetSwitchThread(greennetSwitch, false); gst.start(); } } onFire = false; } } // Thread traiteEvent = new Thread() { // // public void run() { // // // PostEvent command : On {bundle.symbolicName=command, // // clusterId=6, // // endpointId=2, technoId=58020000007A1300, // // timestamp=1268225001399, // // mtomId=22:58020000007A1300, // // // service.objectClass=com.francetelecom.m2m.gateway.bundle.machine.zigbee.standard.cluster.proxysides.OnOffClient} // try { // EndPointService endPointService = null; // IASWDServerService iaswd = null; // OnOffServerService onOffPump = null; // // String[] propertyNames = event.getPropertyNames(); // if (propertyNames.length == 0) { // System.out.println("no property"); // } else { // for (int i = 0; i < propertyNames.length; i++) { // String propertyName = propertyNames[i]; // Object propertyValue = event // .getProperty(propertyName); // System.out.println("propertyName = " + propertyName // + ", propertyValue = " + propertyValue); // } // } // String topic = event.getTopic(); // Long zoneStatus = (Long) event.getProperty("Zone Status"); // // // if ("zcl/command/received/ZoneStatusChangeNotification" // .equals(topic) && (new Long(4452).equals(zoneStatus))) { // // if ("Fire indication".equals((String) // // event.getProperty("Alarm")) || // // "CO indication".equals((String) // // event.getProperty("Alarm"))) { // printMessage(LogService.LOG_DEBUG, this.getClass() // .getName() // + "________________________" // + (String) event.getProperty("Alarm")); // // // // for (Enumeration e = wds.elements(); e // .hasMoreElements();) { // endPointService = (EndPointService) e.nextElement(); // iaswd = (IASWDServerService) endPointService // .getServerSideCluster(IASWD.CLUSTER_NAME); // // System.out.println("start warning"); // iaswd.startWarning(new Long(2), new Long(10)); // System.out.println("end warning"); // // iaswd.armed(IASWD.HIGH_LEVEL_SOUND, true); // // iaswd.fire(10, true); // } // for (Enumeration e = pumps.elements(); e // .hasMoreElements();) { // System.out.println("send pump off"); // endPointService = (EndPointService) e.nextElement(); // onOffPump = (OnOffServerService) endPointService // .getServerSideCluster(OnOff.CLUSTER_NAME); // onOffPump.off(); // System.out.println("pump off end"); // } // } // // } catch (Exception ex) { // printMessage(LogService.LOG_ERROR, "handleEvent", ex); // // ex.printStackTrace(); // } // } // }; if (isEnabled) { // traiteEvent.setName("Incendie"); // traiteEvent.start(); // try { // traiteEvent.join(); // } catch (InterruptedException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } } } /** * Cette methode est appellee par le framwork osgi sur demande du * servicebinder quand le service de log apparait * * @param reference * de service */ public void setLogServiceReference(LogService refLogService) { this.logService = refLogService; } /** * Cette methode est appellee par le framwork osgi sur demande du * servicebinder quand le service de log disparait * * @param reference * de service */ protected void unsetLogServiceReference(LogService refLogService) { this.logService = null; } protected void setZoneDetectorService(EndPointService refEndPointService) { printMessage(LogService.LOG_DEBUG, this.getClass().getName() + "________________________Dectecteur"); Hashtable clusters = refEndPointService.getServerSideClusters(); for (Iterator it = clusters.keySet().iterator(); it.hasNext();) { // System.out.println("cluster key = " + it.next()); ClusterService cs = refEndPointService .getServerSideCluster((Integer) it.next()); // A revoir !!!!!!!!!!!!!!!!!!!!!! if (cs.getName().startsWith("IAS")) { IASZoneServerService izss = (IASZoneServerService) cs; try { izss.zoneEnrollResponse(new Long(0), new Long(0)); } catch (ClusterCommandeException e) { e.printStackTrace(); } break; } } synchronized (zones) { zones.add(refEndPointService); } status.setSmokeDetectorsAvailable(true); } protected void unsetZoneDetectorService(EndPointService refEndPointService) { synchronized (zones) { zones.remove(refEndPointService); if (zones.isEmpty()) { status.setSmokeDetectorsAvailable(false); } } } protected void setWarningDeviceService(EndPointService refEndPointService) { printMessage(LogService.LOG_DEBUG, this.getClass().getName() + "________________________Sirene"); synchronized (wds) { wds.add(refEndPointService); } status.setWarningDevicesAvailable(true); } protected void unsetWarningDeviceService(EndPointService refEndPointService) { synchronized (wds) { wds.remove(refEndPointService); if (wds.isEmpty()) { status.setWarningDevicesAvailable(false); } } } protected void setPumpDeviceService(EndPointService refEndPointService) { printMessage(LogService.LOG_DEBUG, this.getClass().getName() + "________________________Pump"); synchronized (pumps) { pumps.add(refEndPointService); } status.setPumpDevicesAvailable(true); openPump(refEndPointService); } protected void unsetPumpDeviceService(EndPointService refEndPointService) { synchronized (pumps) { pumps.remove(refEndPointService); if (pumps.isEmpty()) { status.setPumpDevicesAvailable(false); } } } /** * set the http service. Cardinality = 1..1 * * @param pHttpService */ protected void setHttpService(HttpService pHttpService) { httpService = pHttpService; servlet = new FireApplicationServlet(httpService, this); servlet.registerRestServlet(); servlet.registerResourceServlet(); } /** * Unset http service * * @param pHttpService */ protected void unsetHttpService(HttpService pHttpService) { servlet.unregisterRestServlet(); servlet.unregisterResourceServlet(); servlet = null; httpService = null; } protected void setX3DLightDimmer(IX3DDevice lightDimmer) { System.out.println("set new X3D shutter"); X3DLightDimmer x3dLight = new X3DLightDimmer(lightDimmer); synchronized (x3dLightDimmers) { x3dLightDimmers.add(x3dLight); } } protected void unsetX3DLightDimmer(IX3DDevice lightDimmer) { synchronized (x3dLightDimmers) { for(Iterator it = x3dLightDimmers.iterator(); it.hasNext();) { X3DLightDimmer x3dLight = (X3DLightDimmer)it.next(); if (lightDimmer.equals(x3dLight.getX3DDevice())) { it.remove(); } } } } protected void setHueLight(HueLightDevice hueLight) { synchronized (hueLights) { hueLights.add(hueLight); } } protected void unsetHueLight(HueLightDevice hueLight) { synchronized (hueLights) { hueLights.remove(hueLight); } } protected void setGreenetSwitch(Device greenNetSwitch) { System.out.println("add new switch " + greenNetSwitch); synchronized (greennetSwitchs) { greennetSwitchs.add(greenNetSwitch); } } protected void unsetGreenetSwitch(Device greenNetSwitch) { synchronized (greennetSwitchs) { greennetSwitchs.remove(greenNetSwitch); } } /** * print message by using the LogService. * * @param level * @param message */ public void printMessage(int level, String message) { printMessage(level, message, null); } /** * print message by using the LogService. * * @param level * @param message * @param t */ public void printMessage(int level, String message, Throwable t) { if (logService != null) { synchronized (logService) { if (t != null) { logService.log(level, message, t); } else { logService.log(level, message); } } } else { if (t != null) { System.out.println(message); t.printStackTrace(); } else { System.out.println(message); } } } protected void initService() { for (Enumeration e = pumps.elements(); e.hasMoreElements();) { EndPointService pumpEndpointService = (EndPointService) e .nextElement(); openPump(pumpEndpointService); } } /** * Enable the service. From now, when a Warning event is received from the * smoke detectors, the pumps are going to be closed and the warning device * are squarking. */ protected void enable() { isEnabled = true; status.setServiceEnabled(true); } /** * Disable the service. Warning device and pumps are deactivated. */ protected void disable() { isEnabled = false; status.setServiceEnabled(false); } /** * Get all pumps * * @return pumps */ protected List getPumps() { List l = new ArrayList(); synchronized (pumps) { l.addAll(pumps); } return l; } /** * Get all warning devices. * * @return warning devices. */ protected List getWarningDevices() { List l = new ArrayList(); synchronized (wds) { l.addAll(wds); } return l; } /** * Get all zone device. * * @return zone devices */ protected List getZoneDevices() { List l = new ArrayList(); synchronized (zones) { l.addAll(zones); } return l; } /** * Get all x3d dimmers. * @return x3d dimmers */ protected List getX3DDimmers() { List l = new ArrayList(); synchronized (x3dLightDimmers) { l.addAll(x3dLightDimmers); } return l; } /** * Get all hue ligths * @return hue lights */ protected List getHueLights() { List l = new ArrayList(); synchronized (hueLights) { l.addAll(hueLights); } return l; } /** * Get all GreenNet switches * @return greennet switches */ protected List getGreenNetSwitches() { List l = new ArrayList(); synchronized (greennetSwitchs) { l.addAll(greennetSwitchs); } return l; } /** * Returns true if the Fire service is activated. * * @return */ protected ApplicationStatus getStatus() { ApplicationStatus as = null; try { as = (ApplicationStatus) status.clone(); } catch (CloneNotSupportedException e) { } return as; } /** * Open a pump * * @param pumpEndpointService */ private void openPump(EndPointService pumpEndpointService) { System.out.println("open pump"); OnOffServerService onOffPump = null; onOffPump = (OnOffServerService) pumpEndpointService .getServerSideCluster(OnOff.CLUSTER_NAME); try { onOffPump.on(); } catch (ClusterCommandeException e) { printMessage(LogService.LOG_ERROR, "unable to open the pump"); } } }