From d9ab75cb25bfb93fa53962fea9aa9afc986649a3 Mon Sep 17 00:00:00 2001 From: sbosse Date: Mon, 21 Jul 2025 23:17:55 +0200 Subject: [PATCH] Mon 21 Jul 22:43:21 CEST 2025 --- js/top/main.js | 172 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 172 insertions(+) create mode 100644 js/top/main.js diff --git a/js/top/main.js b/js/top/main.js new file mode 100644 index 0000000..73992a3 --- /dev/null +++ b/js/top/main.js @@ -0,0 +1,172 @@ +/** + ** ================================== + ** OOOO OOOO OOOO O O OOOO + ** O O O O O O O O O + ** O O O O O O O O O + ** OOOO OOOO OOOO O OOO OOOO + ** O O O O O O O O O + ** O O O O O O O O O + ** OOOO OOOO OOOO OOOO O O OOOO + ** ================================== + ** BSSLAB, Dr. Stefan Bosse http://www.bsslab.de + ** + ** COPYRIGHT: THIS SOFTWARE, EXECUTABLE AND SOURCE CODE IS OWNED + ** BY THE AUTHOR. + ** THIS SOURCE CODE MAY NOT BE COPIED, EXTRACTED, + ** MODIFIED, OR OTHERWISE USED IN A CONTEXT + ** OUTSIDE OF THE SOFTWARE SYSTEM. + ** + ** $AUTHORS: Stefan Bosse + ** $INITIAL: (C) 2006-2016 BSSLAB + ** $CREATED: 10/3/16 by sbosse. + ** $VERSION: 1.1.2 + ** + ** $INFO: + ** + ** JAM Standalone Node VM + ** + ** $ENDOFINFO + */ +var onexit=false; +var start=false; +var options = { + verbose:0 +}; + +global.config={simulation:false}; + +var Io = Require('com/io'); +var Comp = Require('com/compat'); +var Db = Require('db/db'); +var Aios = Require('jam/aios'); + +var out = function (msg) { Io.out('[JAM] '+msg)}; + +var jam = function (options) { + var self=this; + this.options = options||{}; + if (!this.options.id) this.options.id=Aios.aidgen(); + this.world = Aios.World.World([],{id:this.options.id,classes:options.classes||[]}); + this.node = Aios.Node.Node({id:this.options.id,position:{x:0,y:0}}); + this.world.add(this.node); + this.run=false; + this.looprun=none; + this.loop = function () { + var loop = function () { + var nexttime=Aios.scheduler(); + if (self.options.verbose>1) self.out('loop: nexttime='+nexttime); + if (nexttime>0) self.looprun=setTimeout(loop,nexttime); + else if (nexttime<0) self.looprun=setTimeout(loop,0); + else self.looprun=setTimeout(loop,1000); + }; + self.looprun = setTimeout(loop,1); + }; + out=function (msg) { Io.out('[JAM '+self.options.id+'] '+msg)}; + this.out=out; +} + +/** Add an agent class template {:} to the JAM world + * + */ +jam.prototype.addclass = function (ac) { + for (var p in ac) { + this.world.classes[p]=ac[p]; + } +}; + +/** Create and start an agent from class ac with arguments. + * + */ +jam.prototype.create = function (ac,args) { + var node=this.node; + var agent=none; + if (this.world.classes[ac]) + agent = Aios.Code.createOn(node,this.world.classes[ac],args); + else this.out('create: Cannot find agent class '+ac); + if (agent) { + agent.agent.ac=ac; + return agent.agent.id; + } else return none; +} + +/** Read agent class templates from file + * + */ +jam.prototype.readclass = function (file) { + var ac; + if (this.options.verbose>0) this.out('Looking up agent class template(s) from '+file); + var modu=Require(file); + if (Comp.obj.isEmpty(modu)) { + if (this.options.verbose>0) this.out('Reading agent class template(s) from file '+file); + if (Comp.string.get(file,0)!='/') file = './'+file; + modu=require(file); + } + for (var p in modu) { + ac={}; + ac[p]=modu[p]; + if (this.options.verbose>0) this.out('Adding agent class template '+p); + this.addclass(ac); + } +}; + +/** Start the JAM scheduler + * + */ +jam.prototype.start=function () { + this.run=true; + this.out('Starting ..'); + this.loop(); +} + +/** Stop the JAM scheduler + * + */ +jam.prototype.stop=function () { + this.run=false; + this.out('Stopping ..'); + if (this.looprun) + clearTimeout(this.looprun); +} + + +var Jam = function(options) { + var obj = new jam(options); + return obj; +}; + +function usage() { + var msg=''; + msg += ' jam [options]'+NL; + msg += ' -c .js : Load an agent class template from file'+NL; + msg += ' -r [,,..] : Create an agent from a class template'+NL; + msg += ' -s : Start scheduler loop'+NL; + msg += ' -v : Increase verbosity level'+NL; + msg += ' -h -help --help : Print this help'+NL; + Io.out('[JAM] Usage: '+msg); + onexit=true; +} + +Comp.args.parse(Io.getargs(),[ + [['-h','-help','--help'],0,function () {usage()}], + ['-v',0,function () {options.verbose++; out('Setting verbosity to level '+options.verbose); config.verbose=true;}], + ['-s',0,function () {start=true;}] +]); + +var myJam = Jam(options); + +Comp.args.parse(Io.getargs(),[ + ['-c',1,function (file) {myJam.readclass(file)}], + ['-r',2,function (ac,args) { + try { + if (args.length < 2) args='[]'; + var _args = Comp.array.map(Comp.string.split(',',Comp.string.trim(args,1,1)),function (arg) { + try {var num=Number(arg); if (isNaN(num)) return arg; else return num;} + catch (e) {return arg } + }); + myJam.create(ac,_args) + } catch (e) { + myJam.out('Failed to start agent '+ac+' '+args); + } + }] +]); +if (!onexit && start) myJam.start();