blob: 9d0628f6654775cc890fe73f55a6c6429f70c7a5 [file] [log] [blame]
var _ = require('lodash');
/*
* Args:
* rules - object with the monitoring param to simulator function mapping
* see data/simmp.json
*/
SimMp = function(rules) {
this.rules = _.clone(rules, true);
};
//SimMp.prototype.map_rule = function(mp_id) {
// return this.rules['mp-mapper'][mp_id];
//}
// Use the monitoring param id for now
SimMp.prototype.createSimMonitorFunc = function(mp) {
// Define our core simulation function here
//
// min, max inclusive
var rand_func = function(min, max) {
return Math.floor(Math.random() * (max-min+1)) + min;
}
var funcs = {
// transmit and receive rate
tx_rc_rate: function(value, elapsed_seconds) {
// Ignore elapsed time for first implementation of transmit and
// receive rate simulation.
// This is just a quick and dirty and simple implementation to make
// the monitoring params change, stay within bounds, and not swing
// wildly.
var min_val = mp.min_value;
var max_val = mp.max_value;
// Set an outer bound of maxmium change from current value
// Tweak bin_count to set how much the value can swing from the
// last value
var bin_count = 10;
// Set the range we can generate the new value based on a function
// of the difference of the max and min values
var max_delta = (max_val - min_val) / bin_count;
console.log('Setting max_delta = %s', max_delta);
var new_val = rand_func(
Math.max(min_val, value-max_delta),
Math.min(max_val, value+max_delta));
//console.log("Generated value: %s", new_val);
return new_val;
},
packet_size: function(value, elapsed_seconds) {
// Stub method just returns value unchanged
// TODO: Figure out how we want to vary packet sizes
return value;
},
accumulate: function(value, elapsed_seconds) {
// NOT TESTED. Basic idea. Will want to add variablility
// how fast we accumulate
var accumulate_rate = 0.1;
var new_value = value + (elapsed_seconds * accumulate_rate);
return new_value;
}
// add growth function
};
// Declare our monitoring param id to sim function mapping here
// TODO: Move out to a yaml/json file and make this function belong to
// a 'Class'
//var mapper = {
// 'tx-rate-pp1': funcs['tx_rc_rate'],
// 'rc-rate-pp1': funcs['tx_rc_rate']
//};
var sim_func_name = this.rules['mp-mapper'][mp.id];
if (sim_func_name) {
return funcs[sim_func_name];
} else {
console.log('No time step sim function found for monitoring param with id "%s", using constant value', mp.id);
return function(value, elapsed_seconds) {
return value;
}
}
}
module.exports = {
SimMp: SimMp
};