234 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			234 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
{
 | 
						|
  name:'My Simulation World',
 | 
						|
  classes : {
 | 
						|
    node: {
 | 
						|
      behaviour:open('node.js'),
 | 
						|
      visual:{
 | 
						|
          shape:'circle',
 | 
						|
          width:10,
 | 
						|
          height:10,
 | 
						|
          x:0,y:0,
 | 
						|
          fill: {
 | 
						|
            color:'red',
 | 
						|
            opacity: 0.5
 | 
						|
          }
 | 
						|
        }
 | 
						|
    },
 | 
						|
    world : {
 | 
						|
      behaviour:open('world.js'),
 | 
						|
      visual:{
 | 
						|
          shape:'circle',
 | 
						|
          width:50,
 | 
						|
          height:50,
 | 
						|
          center:{x:0,y:0},
 | 
						|
          fill: {
 | 
						|
            color:'green',
 | 
						|
            opacity: 0.0
 | 
						|
          }
 | 
						|
        }    
 | 
						|
    }
 | 
						|
 | 
						|
  },
 | 
						|
  // Simulation parameter that can be changed by run-time configuration
 | 
						|
  parameter : {
 | 
						|
    ip1:'localhost',
 | 
						|
    ipport1:10002,
 | 
						|
  },
 | 
						|
  world : {
 | 
						|
    init: {
 | 
						|
      // Initial agent creation on each node
 | 
						|
      agents: {
 | 
						|
        node:function (nodeId,position,parameter) {
 | 
						|
          // Create on each node a node agent, return respective
 | 
						|
          // agent parameters! If no agent should be created on the 
 | 
						|
          // respective node, undefined must be returned!
 | 
						|
          // level 3: agents with full access to simulation world
 | 
						|
          // parameter is either {} or given by world.nodes <desc>.parameter (see below)
 | 
						|
          if (nodeId.indexOf('beacon')==0 || nodeId.indexOf('mobile')==0)
 | 
						|
            return {level:3,args:[{x:position.x,y:position.y,parameter:parameter}]}
 | 
						|
        },
 | 
						|
        world: function(nodeId) {
 | 
						|
          if (nodeId=='world') return {level:3,args:[{}]};
 | 
						|
        }
 | 
						|
      }
 | 
						|
    },
 | 
						|
    // Create nodes 
 | 
						|
    nodes: function () {
 | 
						|
        function makeNode(x,y,id) {
 | 
						|
          var phy;
 | 
						|
          if (id=='mobile device 1') r=80; else r=200;
 | 
						|
          return {
 | 
						|
            id:id,
 | 
						|
            x:x,
 | 
						|
            y:y,
 | 
						|
            // node/agent parameter object for agent initialization (agent class node, see world.init.agents.node)
 | 
						|
            // is stored in node.options.parameter, too
 | 
						|
            parameter : {
 | 
						|
              mysecret:(Math.random()*1000000)|0,
 | 
						|
              dir : Aios.DIR.NORTH,
 | 
						|
            },
 | 
						|
            // create virtual communication ports
 | 
						|
            ports: {
 | 
						|
              wlan : {
 | 
						|
                type:'multicast',
 | 
						|
                status: function (nodes) {
 | 
						|
                  // Filter out nodes, e.g., beacons only?
 | 
						|
                  return nodes;
 | 
						|
                },
 | 
						|
                visual: {
 | 
						|
                  shape:'circle',
 | 
						|
                  width: r,
 | 
						|
                  height: r,
 | 
						|
                  line: {
 | 
						|
                    color: 'grey'
 | 
						|
                  }
 | 
						|
                }
 | 
						|
              },
 | 
						|
              phy : phy
 | 
						|
            },
 | 
						|
          
 | 
						|
            visual : {
 | 
						|
              shape:'rect',
 | 
						|
              width:30,
 | 
						|
              height:30,
 | 
						|
              fill: {
 | 
						|
                color:'green',
 | 
						|
                opacity: 0.5
 | 
						|
              }
 | 
						|
            }
 | 
						|
          }
 | 
						|
        }
 | 
						|
        function makeBeacon(x,y,id) {
 | 
						|
          var phy;
 | 
						|
          if (id == 'beacon 1') 
 | 
						|
            // Physical connection to outside of simulation (another JAM node)
 | 
						|
            phy={type:'physical',
 | 
						|
                ip:'*',
 | 
						|
                to:model.parameter.ip1+':'+model.parameter.ipport1,
 | 
						|
                proto:'udp'};
 | 
						|
 | 
						|
          return {
 | 
						|
            id:id,
 | 
						|
            x:x,
 | 
						|
            y:y,
 | 
						|
            ports: {
 | 
						|
              wlan : {
 | 
						|
                type:'multicast',
 | 
						|
                status: function (nodes) {
 | 
						|
                  // Filter out nodes, e.g., beacons only?
 | 
						|
                  return nodes;
 | 
						|
                },
 | 
						|
                visual: {
 | 
						|
                  shape:'circle',
 | 
						|
                  width: 80,
 | 
						|
                  height: 80,
 | 
						|
                  line: {
 | 
						|
                    color: 'grey'
 | 
						|
                  }
 | 
						|
                }
 | 
						|
              },
 | 
						|
              phy:phy
 | 
						|
            },
 | 
						|
            visual : {
 | 
						|
              shape:'triangle',
 | 
						|
              width:50,
 | 
						|
              height:50,
 | 
						|
              fill: {
 | 
						|
                color:'yellow',
 | 
						|
                opacity: 0.5
 | 
						|
              }
 | 
						|
            }
 | 
						|
          }
 | 
						|
        }
 | 
						|
        function makeWorld(x,y) {
 | 
						|
          return {
 | 
						|
            id:'world',
 | 
						|
            x:x,
 | 
						|
            y:y,
 | 
						|
            visual : {
 | 
						|
              shape:'icon',
 | 
						|
              icon:'world',
 | 
						|
              label:{
 | 
						|
                text:'World',
 | 
						|
                fontSize:20
 | 
						|
              },
 | 
						|
              width:50,
 | 
						|
              height:50,
 | 
						|
              fill: {
 | 
						|
                color:'black',
 | 
						|
                opacity: 0.5
 | 
						|
              },
 | 
						|
              line:{
 | 
						|
                width:1,
 | 
						|
              }
 | 
						|
            }
 | 
						|
          }
 | 
						|
        }
 | 
						|
        function onstreet() {
 | 
						|
          // 1. Select one street segment x,y,w,h,
 | 
						|
          var x,y,s=Math.random(),r;
 | 
						|
          if (s < 0.3) r=[10,10,1000,100];
 | 
						|
          else if (s < 0.6) r=[450,110,100,500];
 | 
						|
          else r=[10,610,1000,100];
 | 
						|
          // 2. Select x/y position in segment
 | 
						|
          x=r[0]+Math.random()*r[2];
 | 
						|
          y=r[1]+Math.random()*r[3];
 | 
						|
          return {x:x,y:y}
 | 
						|
        }
 | 
						|
        var more=[];
 | 
						|
        // Create much more mobile devices on the streets ...
 | 
						|
        for(var i=3;i<50;i++) {
 | 
						|
          var pos=onstreet();
 | 
						|
          more.push(makeNode(pos.x,pos.y,'mobile device '+i))
 | 
						|
        }
 | 
						|
        // Create much more beacons on the streets ...
 | 
						|
        for(var i=5;i<15;i++) {
 | 
						|
          var pos=onstreet();
 | 
						|
          more.push(makeBeacon(pos.x,pos.y,'beacon '+i))
 | 
						|
        }
 | 
						|
        return [
 | 
						|
          makeWorld(600,500),
 | 
						|
          makeNode(50,50,'mobile device 1'),
 | 
						|
          makeNode(70,140,'mobile device 2'),
 | 
						|
          makeBeacon(120,140,'beacon 1'),
 | 
						|
          makeBeacon(600,270,'beacon 2'),
 | 
						|
          makeBeacon(410,370,'beacon 3'),
 | 
						|
          makeBeacon(300,210,'beacon 4'),
 | 
						|
        ].concat(more);
 | 
						|
    },  
 | 
						|
    // Auxiliary passive resources (buildings, streets)
 | 
						|
    resources: function () {
 | 
						|
      // Streets
 | 
						|
      function makeArea(id,x,y,w,h,color) {
 | 
						|
        return {
 | 
						|
          id:id,
 | 
						|
          visual: {
 | 
						|
            shape:'rect',
 | 
						|
            x:x,
 | 
						|
            y:y,
 | 
						|
            width:w,
 | 
						|
            height:h,
 | 
						|
            fill: {
 | 
						|
              color: 'grey',
 | 
						|
              opacity:0.1,
 | 
						|
            },
 | 
						|
            line: {
 | 
						|
              color: color||'blue',
 | 
						|
              width:2
 | 
						|
            }
 | 
						|
          }
 | 
						|
        };
 | 
						|
      }
 | 
						|
      return [
 | 
						|
        makeArea('Street 1',10,10,1000,100),
 | 
						|
        makeArea('Street 2',450,110,100,500),
 | 
						|
        makeArea('Street 3',10,610,1000,100),  
 | 
						|
        makeArea('Building 1',300,210,100,100,'red'),
 | 
						|
        makeArea('Building 2',600,270,100,100,'red'),     
 | 
						|
        makeArea('Building 3',310,370,100,100,'red'),     
 | 
						|
        makeArea('Building 4',50,120,100,100,'red'),     
 | 
						|
      ]
 | 
						|
    },
 | 
						|
  }
 | 
						|
}
 |