/*---------------------------------------------------------------------------------------------------------------- * CupCarbon: A Smart City & IoT Wireless Sensor Network Simulator * www.cupcarbon.com * ---------------------------------------------------------------------------------------------------------------- * Copyright (C) 2016 CupCarbon * ---------------------------------------------------------------------------------------------------------------- * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. *----------------------------------------------------------------------------------------------------------------*/ package device; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import action.CupAction; import action.CupActionAddSensor; import action.CupActionBlock; import action.CupActionDeleteDevice; import action.CupActionDeleteSensor; import action.CupActionStack; import buildings.Building; import buildings.BuildingList; import geometry.SNEdge; import javafx.application.Platform; import map.MapLayer; import markers.Marker; import markers.MarkerList; //import markers.Marker; import natural_events.Gas; import natural_events.Meteo; import project.Project; import solver.SensorGraph; import utilities.MapCalc; import wisen_simulation.WisenSimulation; /** * @author Ahcene Bounceur * @author Molham Darwish * @version 1.0 */ public class DeviceList { public static Meteo meteo = null; //public static List<SensorNode> sensors = Collections.synchronizedList(new ArrayList<SensorNode>()); //public static List<Device> devices = Collections.synchronizedList(new ArrayList<Device>()); public static List<SensorNode> sensors = new ArrayList<SensorNode>(); public static List<Device> devices = new ArrayList<Device>(); public static List<SNEdge> markedEdges = new ArrayList<SNEdge>(); public static boolean drawLinks = true; public static LinkedList<LinkedList<Integer>> hulls = new LinkedList<LinkedList<Integer>>(); public static int number = 1; public static boolean propagationsCalculated = false; public DeviceList() { reset(); } public static void reset() { meteo = null; sensors = Collections.synchronizedList(new ArrayList<SensorNode>()); //devices = Collections.synchronizedList(new ArrayList<Device>()); //sensors = new ArrayList<SensorNode>(); devices = new ArrayList<Device>(); drawLinks = true; hulls = new LinkedList<LinkedList<Integer>>(); markedEdges = new ArrayList<SNEdge>(); DeviceList.propagationsCalculated = false; } /** * @return a node by its id */ public static Device getNodeById(int id) { for(SensorNode sensor : sensors) { if(sensor.getId() == id) return sensor; } for(Device device : devices) { if(device.getId() == id) return device; } return null; } /** * @return a node by its name */ public static Device getNodeByName(String name) { for(SensorNode sensor : sensors) { if(sensor.getName().equals(name)) return sensor; } for(Device device : devices) { if(device.getName().equals(name)) return device; } return null; } /** * @return a sensor node by its id */ public static SensorNode getSensorNodeById(int id) { for (SensorNode sensor : sensors) { if(sensor.getId() == id) return sensor; } return null; } /** * @return a sensor node by its my */ public static SensorNode getSensorNodeByMy(int my) { for(SensorNode device : sensors) { if(device.getCurrentRadioModule().getMy() == my) return device; } return null; } /** * @return the sensor and mobile nodes */ public static List<Device> getSensorAndMobileNodes() { List<Device> nodes = new ArrayList<Device>(); for(Device node : nodes) { if((node.getType() == Device.SENSOR) || node.getType() == Device.MEDIA_SENSOR || (node.getType() == Device.MOBILE)) nodes.add((SensorNode) node); } return nodes; } /** * @return the mobile nodes */ public static List<Device> getMobileNodes() { List<Device> snodes = new ArrayList<Device>(); for(Device node : devices) { if(node.getType() == Device.MOBILE) snodes.add(node); } return snodes; } /** * @return the mobile sensor nodes */ public static List<SensorNode> getMobileSensorNodes() { List<SensorNode> snodes = new ArrayList<SensorNode>(); for(SensorNode sensor : sensors) { if(!sensor.getGPSFileName().equals("")) snodes.add(sensor); } return snodes; } /** * @param fileName */ public static void saveDevicesAndSensors(String fileName) { Device device; for (Iterator<Device> iterator = devices.iterator(); iterator.hasNext();) { device = iterator.next(); device.save(fileName); } SensorNode sensor; for (Iterator<SensorNode> iterator = sensors.iterator(); iterator.hasNext();) { sensor = iterator.next(); sensor.save(""+sensor.getId()); } } /** * @param fileName */ public static void open() { try { SensorNode sensor; File nodeFolder = new File(Project.getProjectNodePath()); File [] nodeFiles = nodeFolder.listFiles(); int deviceType = -1; String line; int idMax = 0 ; for(int i=0; i<nodeFiles.length; i++){ if(!(nodeFiles[i].getName().split("_")[0].startsWith("."))) { BufferedReader br = new BufferedReader(new FileReader(nodeFiles[i])); line = br.readLine(); line = br.readLine(); line = br.readLine(); deviceType = Integer.parseInt(line.split(":")[1]); switch (deviceType) { case MapObject.SENSOR: sensor = loadSensor(nodeFiles[i].getAbsolutePath()); add(sensor); break; case MapObject.GAS: add(loadGas(nodeFiles[i].getAbsolutePath())); break; case MapObject.BASE_STATION: sensor = loadBaseStation(nodeFiles[i].getAbsolutePath()); add(sensor); break; case MapObject.MEDIA_SENSOR: sensor = loadMediaSensor(nodeFiles[i].getAbsolutePath()); add(sensor); break; case MapObject.MOBILE: add(loadMobile(nodeFiles[i].getAbsolutePath())); break; case MapObject.METEO: add(loadMeteo(nodeFiles[i].getAbsolutePath())); break; } int v = Integer.valueOf(nodeFiles[i].getName().split("_")[1]); if (v>idMax) idMax = v ; MapLayer.repaint(); br.close(); } } if(nodeFiles.length != 0) DeviceList.number = idMax+1 ; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static SensorNode loadSensor(String fileName) { SensorNode sensor = null; try { String[] str = null; String line; String [] parameters = {"","","","","","","","","","","","","","","","","","","",""}; BufferedReader br = new BufferedReader(new FileReader(fileName)); line = br.readLine(); line = br.readLine(); line = br.readLine(); while ((line = br.readLine()) != null) { str = line.split(":"); switch (str[0]) { case "device_longitude": parameters[0] = str[1]; break; case "device_latitude": parameters[1] = str[1]; break; case "device_elevation": parameters[2] = str[1]; break; case "device_radius": parameters[3] = str[1]; break; case "device_sensor_unit_radius": parameters[4] = str[1]; break; case "device_gps_file_name": parameters[5] = str[1]; break; case "device_script_file_name": parameters[6] = str[1]; break; case "device_type": parameters[7] = str[1]; break; case "device_id": parameters[8] = str[1]; break; case "device_hide": parameters[9] = str[1]; break; case "device_draw_battery": parameters[10] = str[1]; break; case "spreading_factor": parameters[11] = str[1]; break; } } sensor = new StdSensorNode(parameters[8], parameters[0], parameters[1], parameters[2], parameters[3], "0", parameters[4], parameters[5], parameters[6]); sensor.setHide(Integer.parseInt(parameters[9])); sensor.setDrawBatteryLevel(Boolean.parseBoolean(parameters[10])); br.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } openRadioModule(Project.getProjectRadioPath()+File.separator+"sensor_"+sensor.getId(), sensor); return sensor; } public static SensorNode loadMediaSensor(String fileName) { SensorNode sensor = null; try { String[] str = null; String line; String [] parameters = {"","","","","","","","","","","","","","","","","","","",""}; String [] mparameters = {"","","","","","","","","",""}; BufferedReader br = new BufferedReader(new FileReader(fileName)); line = br.readLine(); line = br.readLine(); line = br.readLine(); while ((line = br.readLine()) != null) { str = line.split(":"); switch (str[0]) { case "device_longitude": parameters[0] = str[1]; break; case "device_latitude": parameters[1] = str[1]; break; case "device_elevation": parameters[2] = str[1]; break; case "device_radius": parameters[3] = str[1]; break; case "device_sensor_unit_radius": parameters[4] = str[1]; break; case "device_gps_file_name": parameters[5] = str[1]; break; case "device_script_file_name": parameters[6] = str[1]; break; case "device_type": parameters[7] = str[1]; break; case "device_id": parameters[8] = str[1]; break; case "device_hide": parameters[9] = str[1]; break; case "device_draw_battery": parameters[10] = str[1]; break; case "media_parameters": String [] media = str[1].split(" "); for (int j = 0; j< media.length; j++) mparameters[j] = media[j]; break; } } sensor = new MediaSensorNode(parameters[8], parameters[0], parameters[1], parameters[2], parameters[3], "0", parameters[4], parameters[5], parameters[6], mparameters[0], mparameters[1], mparameters[2]); sensor.setHide(Integer.parseInt(parameters[9])); sensor.setDrawBatteryLevel(Boolean.parseBoolean(parameters[10])); br.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } openRadioModule(Project.getProjectRadioPath()+File.separator+"mediasensor_"+sensor.getId(), sensor); return sensor; } public static SensorNode loadBaseStation(String fileName) { SensorNode sensor = null; try { String[] str = null; String line; String [] parameters = {"","","","","","","","","","","","","","","","","","","",""}; BufferedReader br = new BufferedReader(new FileReader(fileName)); line = br.readLine(); line = br.readLine(); line = br.readLine(); while ((line = br.readLine()) != null) { str = line.split(":"); switch (str[0]) { case "device_longitude": parameters[0] = str[1]; break; case "device_latitude": parameters[1] = str[1]; break; case "device_elevation": parameters[2] = str[1]; break; case "device_radius": parameters[3] = str[1]; break; case "device_sensor_unit_radius": parameters[4] = str[1]; break; case "device_gps_file_name": parameters[5] = str[1]; break; case "device_script_file_name": parameters[6] = str[1]; break; case "device_type": parameters[7] = str[1]; break; case "device_id": parameters[8] = str[1]; break; case "device_hide": parameters[9] = str[1]; break; } } sensor = new BaseStation(parameters[8], parameters[0], parameters[1], parameters[2], parameters[3], "0", parameters[4], parameters[5], parameters[6]); sensor.setHide(Integer.parseInt(parameters[9])); br.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } openRadioModule(Project.getProjectRadioPath()+File.separator+"basestation_"+sensor.getId(), sensor); return sensor; } public static Device loadMobile(String fileName) { Device device = null; try { String[] str = null; String line; String [] parameters = {"","","","","","","","","","","","","","","","","","","",""}; BufferedReader br = new BufferedReader(new FileReader(fileName)); line = br.readLine(); line = br.readLine(); line = br.readLine(); while ((line = br.readLine()) != null) { str = line.split(":"); switch (str[0]) { case "device_longitude": parameters[0] = str[1]; break; case "device_latitude": parameters[1] = str[1]; break; case "device_elevation": parameters[2] = str[1]; break; case "device_radius": parameters[3] = str[1]; break; case "device_gps_file_name": parameters[4] = str[1]; break; case "device_type": parameters[5] = str[1]; break; case "device_id": parameters[6] = str[1]; break; case "device_hide": parameters[7] = str[1]; break; } } device = new Mobile(parameters[0], parameters[1], parameters[2], parameters[3],parameters[4], Integer.parseInt(parameters[6])); device.setHide(Integer.parseInt(parameters[7])); br.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return device; } public static Device loadGas(String fileName) { Device device = null; try { String[] str = null; String line; String [] parameters = {"","","","","","","","","","","","","","","","","","","",""}; BufferedReader br = new BufferedReader(new FileReader(fileName)); line = br.readLine(); line = br.readLine(); line = br.readLine(); while ((line = br.readLine()) != null) { str = line.split(":"); switch (str[0]) { case "device_longitude": parameters[0] = str[1]; break; case "device_latitude": parameters[1] = str[1]; break; case "device_elevation": parameters[2] = str[1]; break; case "device_radius": parameters[3] = str[1]; break; case "device_id": parameters[4] = str[1]; break; case "device_gps_file_name": parameters[5] = str[1]; break; case "device_hide": parameters[6] = str[1]; break; case "natural_event_file_name": parameters[7] = str[1]; break; } } device = new Gas(parameters[0], parameters[1], parameters[2], parameters[3], parameters[5], Integer.parseInt(parameters[4])); device.setHide(Integer.parseInt(parameters[6])); device.setNatEventFileName(parameters[7]); br.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return device; } public static Device loadMeteo(String fileName) { Meteo device = null; try { String[] str = null; String line; String [] parameters = {"","","","","","","","","","","","","","","","","","","",""}; BufferedReader br = new BufferedReader(new FileReader(fileName)); line = br.readLine(); line = br.readLine(); line = br.readLine(); while ((line = br.readLine()) != null) { str = line.split(":"); switch (str[0]) { case "device_longitude": parameters[0] = str[1]; break; case "device_latitude": parameters[1] = str[1]; break; case "device_elevation": parameters[2] = str[1]; break; case "device_radius": parameters[3] = str[1]; break; case "device_id": parameters[4] = str[1]; break; case "device_gps_file_name": parameters[5] = str[1]; break; case "device_hide": parameters[6] = str[1]; break; case "natural_event_file_name": parameters[7] = str[1]; break; } } device = new Meteo(parameters[0], parameters[1], parameters[2], parameters[3], parameters[5], Integer.parseInt(parameters[4])); device.setHide(Integer.parseInt(parameters[6])); device.setNatEventFileName(parameters[7]); DeviceList.meteo = device; br.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return device; } //old version public static void open1(String fileName) { fileName = Project.projectPath + File.separator + "config/nodes.cfg"; reset(); try { BufferedReader br = new BufferedReader(new FileReader(fileName)); String line; String[] str=null; int idMax = 0 ; line = br.readLine(); line = br.readLine(); line = br.readLine(); while ((line = br.readLine()) != null) { str = line.split(" "); switch (str.length) { case 0: break; case 6: addNodeByType(str[0], str[1], str[2], str[3], str[4], str[5]); break; case 7: addNodeByType(str[0], str[1], str[2], str[3], str[4], str[5], str[6]); break; case 8: addNodeByType(str[0], str[1], str[2], str[3], str[4], str[5], str[6], str[7]); break; case 9: addNodeByType(str[0], str[1], str[2], str[3], str[4], str[5], str[6], str[7], str[8]); break; case 10: addNodeByType(str[0], str[1], str[2], str[3], str[4], str[5], str[6], str[7], str[8], str[8]); break; case 11: addNodeByType(str[0], str[1], str[2], str[3], str[4], str[5], str[6], str[7], str[8], str[9], str[10]); break; case 14: addNodeByType(str[0], str[1], str[2], str[3], str[4], str[5], str[6], str[7], str[8], str[9], str[10], str[11], str[12], str[13]); break; } int v = Integer.valueOf(str[1]); if (v>idMax) idMax = v ; } if(str!=null) DeviceList.number = idMax+1 ;//Integer.valueOf(str[1])+1; br.close(); //for(Device device : DeviceList.getNodes()) device.calculateNeighbours(); MapLayer.repaint(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * @return the number of the sensor sensors */ public static int sensorListSize() { return sensors.size(); } /** * @return the number of the devices */ public static int deviceListSize() { return devices.size(); } /** * @return the number of the nodes */ public static int getSize() { return sensors.size()+devices.size(); } /** * Create a node from a set of values (table type) * * @param type * table that contains information about a node to add */ public static void addNodeByType(String... type) { int id = Integer.valueOf(type[1]); switch (Integer.valueOf(type[0])) { case Device.SENSOR: if(type.length==10) add(new StdSensorNode(type[1], type[2], type[4], type[3], "0.0", type[5], type[6], type[7], type[8])); else add(new StdSensorNode(type[1], type[2], type[3], type[4], type[5], type[6], type[7], type[8], type[9])); break; case Device.GAS: add(new Gas(type[3], type[4], type[5], type[6], type[7], id)); break; case Device.BASE_STATION: add(new BaseStation(type[1], type[3], type[4], type[5], type[6], type[7], type[8], type[9], type[10])); break; case Device.MEDIA_SENSOR: add(new MediaSensorNode(type[1], type[2], type[3], type[4], type[5], type[6], type[7], type[8], type[9], type[10], type[11], type[12])); break; case Device.MOBILE: add(new Mobile(type[3], type[4], type[5], type[6], type[7], id)); break; // case Device.MARKER: // add(new Marker(type[3], type[4], type[5], type[6])); // break; } } /** * @param Sensor node */ public static void add(SensorNode sensor) { sensors.add(sensor); if(DeviceList.propagationsCalculated) DeviceList.calculatePropagations(); } /** * @param device */ public static void add(Device device) { devices.add(device); } /** * Draw devices * * @param g * Graphics */ public void draw(Graphics g) { SensorNode sensor = null; for (int i=0; i<sensors.size(); i++) { sensor = sensors.get(i); if(sensor.isInside() && sensor.isSelected()) { MapLayer.numberOfInsideAndSelected++; } if(sensor.isSelected() || sensor.isInside()) MapLayer.mapViewer.setPanEnabled(false); sensors.get(i).drawRadioRange(g); } for (int i=0; i<sensors.size(); i++) { sensors.get(i).drawSensorUnit(g); } int k1=0; for (int i=0; i<sensors.size(); i++) { if(propagationsCalculated) sensors.get(i).drawRadioPropagations(g); else sensors.get(i).drawRadioLinks(k1, g); k1++; } for (int i=0; i<sensors.size(); i++) { sensor = sensors.get(i); sensor.drawMarked(g); sensor.draw(g); } Device device = null; for (int i=0; i<devices.size(); i++) { device = devices.get(i); if(device.isInside() && device.isSelected()) { MapLayer.numberOfInsideAndSelected++; } if(device.isSelected() || device.isInside()) MapLayer.mapViewer.setPanEnabled(false); device.drawMarked(g); device.draw(g); } for (int i=0; i<sensors.size(); i++) { sensor = sensors.get(i); if(sensor.displayInfos()) sensor.drawInfos(g); } for (int i=0; i<devices.size(); i++) { device = devices.get(i); if(device.displayInfos()) device.drawInfos(g); } for (int i=0; i<sensors.size(); i++) { sensors.get(i).drawRadioLinkArrows(g); } MultiChannels.drawChannelLinks(g); } public Device getDevice(int idx) { return devices.get(idx); } public Device getSensor(int idx) { return sensors.get(idx); } public void setDrawLinks(boolean b) { drawLinks = b; } public boolean getDrawLinks() { return drawLinks; } public static void deleteAll() { sensors.removeAll(sensors); devices.removeAll(devices); } public static void deleteNodeByName(String name) { Device node; for (Iterator<Device> iterator = devices.iterator(); iterator.hasNext();) { node = iterator.next(); System.out.println(node.getName()); if (node.getName().equals(name)) { iterator.remove(); node = null; } } SensorNode sensor; for (Iterator<SensorNode> iterator = sensors.iterator(); iterator.hasNext();) { sensor = iterator.next(); if (sensor.getName().equals(name)) { //MapLayer.mapViewer.removeMouseListener(sensor); //MapLayer.mapViewer.removeMouseMotionListener(sensor); //MapLayer.mapViewer.removeKeyListener(sensor); iterator.remove(); sensor = null; } } } public static void deleteAllDevices() { Device node; for (Iterator<Device> iterator = devices.iterator(); iterator.hasNext();) { node = iterator.next(); if (node.getHide()==0) { iterator.remove(); node = null; } } } public static void deleteAllSensors() { SensorNode sensor; for (Iterator<SensorNode> iterator = sensors.iterator(); iterator.hasNext();) { sensor = iterator.next(); if (sensor.getHide()==0) { iterator.remove(); sensor = null; } } } public static void deleteAllNaturalEvents() { Device node; for (Iterator<Device> iterator = devices.iterator(); iterator.hasNext();) { node = iterator.next(); if (node.getHide()==0 && node.getType()==Device.GAS) { //MapLayer.mapViewer.removeMouseListener(node); //MapLayer.mapViewer.removeMouseMotionListener(node); //MapLayer.mapViewer.removeKeyListener(node); iterator.remove(); node = null; } } } public static void deleteAllBuildings() { Building node; for (Iterator<Building> iterator = BuildingList.buildings.iterator(); iterator.hasNext();) { node = iterator.next(); MapLayer.mapViewer.removeMouseListener(node); MapLayer.mapViewer.removeKeyListener(node); iterator.remove(); node = null; } } public static void deleteAllMobiles() { Device node; for (Iterator<Device> iterator = devices.iterator(); iterator.hasNext();) { node = iterator.next(); if (node.getType() == MapObject.MOBILE) { //MapLayer.mapViewer.removeMouseListener(node); //MapLayer.mapViewer.removeMouseMotionListener(node); //MapLayer.mapViewer.removeKeyListener(node); iterator.remove(); node = null; } } } public static void deleteSensor(int idx) { //SensorNode node = sensors.get(idx); //MapLayer.mapViewer.removeMouseListener(node); //MapLayer.mapViewer.removeMouseMotionListener(node); //MapLayer.mapViewer.removeKeyListener(node); sensors.remove(idx); //node = null; if(DeviceList.propagationsCalculated) DeviceList.calculatePropagations(); } public static void deleteDevice(int idx) { //Device node = devices.get(idx); //MapLayer.mapViewer.removeMouseListener(node); //MapLayer.mapViewer.removeMouseMotionListener(node); //MapLayer.mapViewer.removeKeyListener(node); devices.remove(idx); //node = null; } public void simulateMobiles() { for (Device node : devices) { if(node.getType()==Device.MOBILE) { node.setSelected(true); node.start(); } } } public static StringBuilder displaySensorGraph() { return SensorGraph.toSensorGraph(sensors, sensors.size()).displayNames(); } public static StringBuilder displaySensorTargetGraph() { return SensorGraph.toSensorTargetGraph(sensors, sensors.size()).displayNames(); } public void selectInsideRectangle(int cadreX1, int cadreY1, int cadreX2, int cadreY2) { for (SensorNode node : sensors) { node.setSelected(false); if (MapLayer.insideSelection(node.getLongitude(), node.getLatitude(), cadreX1, cadreX2, cadreY1, cadreY2)) { node.setSelected(true); } } for (Device node : devices) { node.setSelected(false); if (MapLayer.insideSelection(node.getLongitude(), node.getLatitude(), cadreX1, cadreX2, cadreY1, cadreY2)) { node.setSelected(true); } } } public void deleteIfSelected() { CupActionBlock block = new CupActionBlock(); SensorNode sensor; for (Iterator<SensorNode> iterator = sensors.iterator(); iterator.hasNext();) { sensor = iterator.next(); if (sensor.isSelected()) { CupActionDeleteSensor action = new CupActionDeleteSensor(sensor); block.addAction(action); } } Device device; for (Iterator<Device> iterator = devices.iterator(); iterator.hasNext();) { device = iterator.next(); if (device.isSelected()) { CupActionDeleteDevice action = new CupActionDeleteDevice(device); block.addAction(action); } } if(block.size()>0) { CupActionStack.add(block); CupActionStack.execute(); } if(DeviceList.propagationsCalculated) DeviceList.calculatePropagations(); } public static void setGpsFileName(String gpsFileName) { Device node; for (Iterator<SensorNode> iterator = sensors.iterator(); iterator.hasNext();) { node = iterator.next(); if (node.isSelected()) { node.setGPSFileName(gpsFileName); } } for (Iterator<Device> iterator = devices.iterator(); iterator.hasNext();) { node = iterator.next(); if (node.isSelected()) { node.setGPSFileName(gpsFileName); } } MapLayer.repaint(); } public static void setScriptFileName(String scriptFileName) { Device node; for (Iterator<SensorNode> iterator = sensors.iterator(); iterator.hasNext();) { node = iterator.next(); if (node.isSelected()) { node.setScriptFileName(scriptFileName); } } for (Iterator<Device> iterator = devices.iterator(); iterator.hasNext();) { node = iterator.next(); if (node.isSelected()) { node.setScriptFileName(scriptFileName); } } MapLayer.repaint(); } public static void initMarkedEdges() { markedEdges = new ArrayList<SNEdge>(); } public static void initAll() { hulls = new LinkedList<LinkedList<Integer>>(); markedEdges = new ArrayList<SNEdge>(); WisenSimulation.sTime = 0; for (SensorNode sensor : sensors) { sensor.init(); sensor.initGeoZoneList(); } for (Device device : devices) { device.init(); } } public static void initAllGeoZones() { for (SensorNode device : sensors) { device.initGeoZoneList(); } MapLayer.repaint(); } public static void initAlgoSelectedNodes() { for (SensorNode device : sensors) { if (device.isSelected()) { device.setMarked(false); device.setVisited(false); device.setLedColor(0); } } for (Device device : devices) { if (device.isSelected()) { device.setMarked(false); device.setVisited(false); device.setLedColor(0); } } MapLayer.repaint(); } public void setSelectionOfAllNodes(boolean selection, int type, boolean addSelect) { // for (Marker marker : MarkerList.markers) { // if (!addSelect) // marker.setSelected(false); // } for (SensorNode dev : sensors) { if (!addSelect) dev.setSelected(false); if (dev.getType() == type || type == -1) dev.setSelected(selection); } for (Device dev : devices) { if (!addSelect) dev.setSelected(false); if (dev.getType() == type || type == -1) dev.setSelected(selection); } MapLayer.repaint(); } public void setSelectionOfAllMobileNodes(boolean selection, int type, boolean addSelect) { // for (Building building : BuildingList.buildings) { // if (!addSelect) // building.setSelected(false); // } // for (Marker marker : MarkerList.markers) { // if (!addSelect) // marker.setSelected(false); // } for (SensorNode dev : sensors) { if (!addSelect) dev.setSelected(false); if (!dev.getGPSFileName().equals("")) dev.setSelected(selection); } for (Device dev : devices) { if (!addSelect) dev.setSelected(false); if (!dev.getGPSFileName().equals("")) dev.setSelected(selection); } MapLayer.repaint(); } public void invertSelection() { for (SensorNode sensor : sensors) { sensor.invSelection(); } for (Device device : devices) { device.invSelection(); } MapLayer.repaint(); } public Point[] getCouple(Device n1, Device n2) { int[] coord = MapCalc.geoToPixelMapA(n1.getLongitude(), n1.getLatitude()); int lx1 = coord[0]; int ly1 = coord[1]; coord = MapCalc.geoToPixelMapA(n2.getLongitude(), n2.getLatitude()); int lx2 = coord[0]; int ly2 = coord[1]; Point[] p = new Point[2]; p[0] = new Point(lx1, ly1); p[1] = new Point(lx2, ly2); return p; } public void initId() { int k = 0; Device.initNumber() ; for(SensorNode d : sensors) { d.setId(k++); Device.incNumber(); } for(Device d : devices) { d.setId(k++); Device.incNumber(); } MapLayer.repaint(); } //--------- public void loadRoutesFromFiles() { for(SensorNode d : sensors) { d.loadRouteFromFile(); } for(Device d : devices) { d.loadRouteFromFile(); } } public void simulate() { Device node; for (Iterator<SensorNode> iterator = sensors.iterator(); iterator.hasNext();) { node = iterator.next(); if (node.isSelected()) node.start(); } for (Iterator<Device> iterator = devices.iterator(); iterator.hasNext();) { node = iterator.next(); if (node.isSelected()) node.start(); } } public void simulateAll() { for (SensorNode node : sensors) { node.setSelected(true); node.start(); } for (Device node : devices) { node.setSelected(true); node.start(); } } public void simulateSensors() { for (SensorNode node : sensors) { node.setSelected(true); node.start(); } } public static void stopAgentSimulation() { for (SensorNode node : sensors) { node.setSelected(false); node.stopAgentSimulation(); } for (Device node : devices) { node.setSelected(false); node.stopAgentSimulation(); } } //------ public static void addEdge(SensorNode sn1, SensorNode sn2) { markedEdges.add(new SNEdge(sn1, sn2)); } public static void removeEdge(SensorNode sn1, SensorNode sn2) { for(SNEdge edge : markedEdges) { if((sn1==edge.getSN1() && sn2==edge.getSN2()) || (sn1==edge.getSN2() && sn2==edge.getSN1())) { markedEdges.remove(edge); return; } } } public void drawMarkedEdges(Graphics2D g) { if(markedEdges.size()>0) { for(int i=0; i<markedEdges.size(); i++) { markedEdges.get(i).draw(g); } } } public static int getLastHullSize() { return hulls.getLast().size(); } public static void initLastHull() { hulls.getLast().clear(); } public static void addHull() { hulls.add(new LinkedList<Integer>()); } public static void addToLastHull(Integer d) { hulls.getLast().add(d); } public static LinkedList<Integer> getLastHull() { return hulls.getLast(); } public void drawHull(LinkedList<Integer> hull, Graphics2D g) { g.setStroke(new BasicStroke(2.0f)); if(hull.size()>0) { double x = sensors.get(hull.get(0)).getLatitude(); double y = sensors.get(hull.get(0)).getLongitude(); int lx1=0; int ly1=0; int lx2=0; int ly2=0; int[] coord ; for(int i=1; i<hull.size(); i++) { coord = MapCalc.geoToPixelMapA(x, y); lx1 = coord[0]; ly1 = coord[1]; coord = MapCalc.geoToPixelMapA(sensors.get(hull.get(i)).getLatitude(), sensors.get(hull.get(i)).getLongitude()); lx2 = coord[0]; ly2 = coord[1]; g.setColor(Color.BLUE); g.drawLine(lx1, ly1, lx2, ly2); x = sensors.get(hull.get(i)).getLatitude(); y = sensors.get(hull.get(i)).getLongitude(); } } } public void drawHulls(Graphics2D g) { for(LinkedList<Integer> hull : hulls) { drawHull(hull, g); } } public static void selectWitoutScript() { for(SensorNode d : sensors) { if(d.getScriptFileName().equals("")) { d.setSelected(true); } } MapLayer.repaint(); } public static void selectWitoutGps() { for(SensorNode d : sensors) { if(d.getGPSFileName().equals("")) { d.setSelected(true); } } MapLayer.repaint(); } public static void selectMarkedSensors() { for(SensorNode d : sensors) { if(d.isMarked()) { d.setSelected(true); } } MapLayer.repaint(); } public static void setId(String id) { for (SensorNode d : sensors) { if (d.isSelected()) { d.setId(Integer.valueOf(id)); } } for (Device d : devices) { if (d.isSelected()) { d.setId(Integer.valueOf(id)); } } MapLayer.repaint(); } public static void setLongitude(String value) { for (SensorNode d : sensors) { if (d.isSelected()) { d.setLongitude(Double.valueOf(value)); } } MapLayer.repaint(); } public static void setLatitude(String value) { for (SensorNode d : sensors) { if (d.isSelected()) { d.setLatitude(Double.valueOf(value)); } } MapLayer.repaint(); } public static void setElevation(String value) { for (SensorNode d : sensors) { if (d.isSelected()) { d.setElevation(Double.valueOf(value)); } } MapLayer.repaint(); } public static void setRadius(String value) { for (SensorNode d : sensors) { if (d.isSelected()) { d.setRadius(Double.valueOf(value)); } } for (Device d : devices) { if (d.isSelected()) { d.setRadius(Double.valueOf(value)); } } MapLayer.repaint(); } public static void setSensorUnitRadius(String value) { for (SensorNode d : sensors) { if (d.isSelected()) d.setSensorUnitRadius(Double.valueOf(value)); } MapLayer.repaint(); } public static void setEMax(String value) { for (SensorNode d : sensors) { if (d.isSelected()) d.getBattery().setEMax(Double.valueOf(value)); } MapLayer.repaint(); } public static void selectById(String id) { String [] ids = id.split(" "); int k=0; for (SensorNode d : sensors) { d.setSelected(false); if(k<ids.length) if (d.getId()==Integer.valueOf(ids[k])) { d.setSelected(true); k++; } } k=0; for (Device d : devices) { d.setSelected(false); if(k<ids.length) if (d.getId()==Integer.valueOf(ids[k])) { d.setSelected(true); k++; } } MapLayer.repaint(); } public static void selectByMy(String my) { String [] mys = my.split(" "); for (SensorNode d : sensors) { d.setSelected(false); for(int k=0; k<mys.length; k++) { if (d.getCurrentRadioModule().getMy()==Integer.valueOf(mys[k])) { d.setSelected(true); } } } MapLayer.repaint(); } public static void selectOneFromSelected() { for(SensorNode d : sensors) { if(d.isSelected()) { deselectAll(); d.setSelected(true); return; } } for(Device d : devices) { if(d.isSelected()) { deselectAll(); d.setSelected(true); return; } } } public static void deselectAll() { // for(Marker marker : MarkerList.markers) { // marker.setSelected(false); // } // for(Building building : BuildingList.buildings) { // building.setSelected(false); // } for(SensorNode d : sensors) { d.setSelected(false); } for(Device d : devices) { d.setSelected(false); } } public static void deselectAllObjects() { for(SensorNode d : sensors) { d.setSelected(false); } for(Device d : devices) { if(d.getType() != Device.GAS) d.setSelected(false); } } public static void deselectAllEvents() { for(Device d : devices) { if(d.getType() == Device.GAS) d.setSelected(false); } } public static void calculatePropagations() { propagationsCalculated = true; Platform.runLater(new Runnable() { @Override public void run() { try { for(SensorNode device : sensors) { device.calculatePropagations(); } } catch(Exception e) {} } }); } // public static void calculatePropagations(SensorNode sensor) { // propagationsCalculated = true; // Platform.runLater(new Runnable() { // @Override // public void run() { // try { // sensor.calculatePropagations(); // } // catch(Exception e) {} // } // }); // } public static void resetPropagations() { propagationsCalculated = false; for(SensorNode device : sensors) { device.resetPropagations(); } } public static void setUartDataRate(String selectedItem) { for (SensorNode device : sensors) { if (device.isSelected()) { if (selectedItem.equals("-")) device.setUartDataRate(Long.MAX_VALUE); else device.setUartDataRate(Long.parseLong(selectedItem)); } } MapLayer.repaint(); } public static void setSigmaOfDriftTime(double drift) { for (SensorNode device : sensors) { if (device.isSelected()) { device.setSigmaOfDriftTime(drift); } } } public static void openRadioModule(String fileName, SensorNode sensor) { try { BufferedReader br = new BufferedReader(new FileReader(fileName)); String line; String name = ""; String str = null; line = br.readLine(); line = br.readLine(); while ((line = br.readLine()) != null) { str = line.split(":")[0]; if (str.equals("current_radio_name")){ name = line.split(":")[1]; line = br.readLine(); str = line.split(":")[0]; if (str.equals("radio_standard")){ String std = line.split(":")[1]; sensor.addRadioModule(name, std); sensor.selectCurrentRadioModule(name); } } if (str.equals("radio_name")){ name = line.split(":")[1]; line = br.readLine(); str = line.split(":")[0]; if (str.equals("radio_standard")){ String std = line.split(":")[1]; sensor.addRadioModule(name, std); } } else switch (str) { case "radio_my": sensor.getRadioModuleByName(name).setMy(Integer.parseInt(line.split(":")[1])); break; case "radio_channel": sensor.getRadioModuleByName(name).setCh(Integer.parseInt(line.split(":")[1])); break; case "radio_network_id": sensor.getRadioModuleByName(name).setNId(Integer.parseInt(line.split(":")[1])); break; case "radio_radius": sensor.getRadioModuleByName(name).setRadioRangeRadius(Double.parseDouble(line.split(":")[1])); break; case "radio_etx": sensor.getRadioModuleByName(name).setETx(Double.parseDouble(line.split(":")[1])); break; case "radio_erx": sensor.getRadioModuleByName(name).setERx(Double.parseDouble(line.split(":")[1])); break; case "radio_esleep": sensor.getRadioModuleByName(name).setESleep(Double.parseDouble(line.split(":")[1])); break; case "radio_elisten": sensor.getRadioModuleByName(name).setEListen(Double.parseDouble(line.split(":")[1])); break; case "radio_data_rate": sensor.getRadioModuleByName(name).setRadioDataRate(Integer.parseInt(line.split(":")[1])); break; case "spreading_factor": sensor.getRadioModuleByName(name).setSpreadingFactor(Integer.parseInt(line.split(":")[1])); break; } } br.close(); MapLayer.repaint(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static int getNumberOfSelectedObjects() { int n = 0; for(SensorNode d : sensors) { if (d.isSelected()) n++; } for(Device d : devices) { if (d.isSelected()) n++; } return n; } public static int getNumberOfInside() { int n = 0; for(SensorNode d : sensors) { if (d.isInside()) n++; } for(Device d : devices) { if (d.isInside()) n++; } return n; } public static void delete(SensorNode sensor) { sensors.remove(sensor); if(DeviceList.propagationsCalculated) DeviceList.calculatePropagations(); } public static void delete(Device device) { if(device.getClass().equals(Meteo.class)) meteo = null; devices.remove(device); if(DeviceList.propagationsCalculated) DeviceList.calculatePropagations(); } public static void addRandomSensors(int n) { CupActionBlock block = new CupActionBlock(); if(MarkerList.markers.size()==2) { Marker marker1 = MarkerList.markers.get(0); Marker marker2 = MarkerList.markers.get(1); double m1x = marker1.getLongitude(); double m1y = marker1.getLatitude(); double m2x = marker2.getLongitude(); double m2y = marker2.getLatitude(); double r1 ; double r2 ; double x ; double y ; for (int i = 0; i < n; i++) { r1 = Math.random(); r2 = Math.random(); x = ((m2x-m1x)*r1)+m1x; y = ((m2y-m1y)*r2)+m1y; double magnetic_step = 0.000227984; double delta = 0.0; if (MapLayer.magnetic) { x = x - (x % magnetic_step) - (delta % magnetic_step); y = y - (y % magnetic_step) - (delta % magnetic_step); } CupAction action = new CupActionAddSensor(new StdSensorNode(x, y, 0, 0, 100, 20, -1)); block.addAction(action); } } if(block.size()>0) { CupActionStack.add(block); CupActionStack.execute(); if(DeviceList.propagationsCalculated) DeviceList.calculatePropagations(); } MapLayer.repaint(); } }