/**
* Implement the logic of an AutoGraph component
* @module BaseComponent
*/
define(['models/PositionedModel', 'models/OutputTerminalModel', 'models/InputTerminalModel'],
function (PositionedModel, OutputTerminalModel, InputTerminalModel) {
/**
* @constructor
*/
return PositionedModel.extend({
label:"component",
inputs:{
input:{name:"input"}
},
outputs:{
output:{name:"output"}
},
defaults:{
},
/**
* @method
*/
initialize:function () {
this.buildInputs(this.inputs);
this.buildOutputs(this.outputs);
},
/**
* @method
*/
receiveBang:function () {
var inputTerminalValues = this.readInputValues();
var self = this;
this.process(inputTerminalValues, function (results) {
console.log("process results for "+self.label);
console.log(results);
self.updateOutputTerminals(results);
self.sendBang();
});
},
/**
* @method
*/
readInputValues:function () {
var ins = {};
for (var key in this.inputs) {
var input = this.inputs[key].model;
if (input.get("value")) {
ins[key] = input.get("value");
}
}
return ins;
},
/**
* @method
*/
updateOutputTerminals:function (values) {
for (var key in values) {
var output = this.outputs[key];
if (output) {
output.model.set("value", values[key]);
}
}
},
/**
* @method
*/
process:function (args, callback) {
callback(args);
},
/**
* @method
*/
sendBang:function () {
this.trigger("bang");
},
/**
* @method
*/
buildInputs:function (inputs) {
var cnt = 0;
for (var i in inputs) {
var input = inputs[i];
var im = new InputTerminalModel({
autograph:this.get("autograph"),
component:this,
x:cnt * 20,
y:0,
name:input.name
});
this.listenTo(im, "bang", this.receiveBang);
this.listenTo(im, "change:value", function () {
console.log("basecomp setting " + input.name + " to " + im.get("value"));
this.set(input.name, im.get("value"))
});
input.model = im;
this.get("autograph").Terminals.add(im);
cnt++;
}
},
/**
* @method
*/
buildOutputs:function (outputs) {
var cnt = 0;
for (var i in outputs) {
var output = outputs[i];
var om = new OutputTerminalModel({
autograph:this.get("autograph"),
component:this,
x:cnt * 20,
y:0,
name:output.name
});
output.model = om;
this.get("autograph").Terminals.add(om);
cnt++;
}
}
});
});