001package jmri.jmrit.sensorgroup;
002
003import java.util.ArrayList;
004
005import jmri.InstanceManager;
006import jmri.Route;
007import jmri.RouteManager;
008import jmri.Sensor;
009import jmri.implementation.DefaultRoute;
010
011/**
012 * Object for representing, creating and editing sensor groups.
013 * <p>
014 * Sensor groups are implemented by (groups) of Routes, not by any other object.
015 * <p>
016 * They are not (currently) NamedBean objects.
017 *
018 * @author Bob Jacobsen Copyright (C) 2007
019 */
020public class SensorGroup {
021
022    /**
023     * Nobody can build an anonymous object
024     */
025    //private SensorGroup() {
026    //}
027    private static final String NAME_PREFIX = "SENSOR GROUP:";  // should be upper case
028    private static final String NAME_DIVIDER = ":";
029
030    private final String name;
031    private final ArrayList<String> sensorList;
032
033    /**
034     * Create one, looking up an existing one if present
035     * @param name Name of the group
036     */
037    SensorGroup(String name) {
038        this.name = name;
039        // find suitable 
040        RouteManager rm = InstanceManager.getDefault(jmri.RouteManager.class);
041        String group = name;
042        String prefix = (NAME_PREFIX + group + NAME_DIVIDER);
043
044        sensorList = new ArrayList<>();
045        for (Route route : rm.getNamedBeanSet()) {
046            String routeName = route.getSystemName();
047            if (routeName.startsWith(prefix)) {
048                String sensor = routeName.substring(prefix.length());
049                // remember that sensor
050                sensorList.add(sensor);
051            }
052        }
053    }
054
055    void addPressed() {
056        log.debug("start with {} lines", sensorList.size());
057        RouteManager rm = InstanceManager.getDefault(jmri.RouteManager.class);
058        String group = name;
059
060        // remove the old routes
061        String prefix = (NAME_PREFIX + group + NAME_DIVIDER);
062
063        for (Route r : rm.getNamedBeanSet()) {
064            String routeName = r.getSystemName();
065            if (routeName.startsWith(prefix)) {
066                // OK, kill this one
067                r.deActivateRoute();
068                rm.deleteRoute(r);
069            }
070        }
071
072        // add the new routes
073        for (int i = 0; i < sensorList.size(); i++) {
074            String sensor = sensorList.get(i);
075            String routeName = NAME_PREFIX + group + NAME_DIVIDER + sensor;
076            Route r = new DefaultRoute(routeName);
077            // add the control sensor
078            r.addSensorToRoute(sensor, Route.ONACTIVE);
079            // add the output sensors
080            for (int j = 0; j < sensorList.size(); j++) {
081                String outSensor = sensorList.get(j);
082                int mode = Sensor.INACTIVE;
083                if (i == j) {
084                    mode = Sensor.ACTIVE;
085                }
086                r.addOutputSensor(outSensor, mode);
087            }
088            // make it persistant & activate
089            r.activateRoute();
090            rm.register(r);
091        }
092    }
093
094    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(SensorGroup.class);
095
096}