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}