Tue 27 Aug 00:13:11 CEST 2024
This commit is contained in:
parent
281d2699dd
commit
47fd3b5ce3
233
demo/sejam2/simple/simulation.js
Normal file
233
demo/sejam2/simple/simulation.js
Normal file
|
@ -0,0 +1,233 @@
|
|||
{
|
||||
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'),
|
||||
]
|
||||
},
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user