1
git-svn-id: svn://db.shs.com.ru/libs@1 a8b55f48-bf90-11e4-a774-851b48703e85
This commit is contained in:
144
mbricks/brick_base.cpp
Normal file
144
mbricks/brick_base.cpp
Normal file
@@ -0,0 +1,144 @@
|
||||
#include "brick_base.h"
|
||||
|
||||
/*
|
||||
double randomn(double dv, double sv) {
|
||||
double s = 2., v0, v1;
|
||||
while (s > 1. || s == 0.) {
|
||||
v0 = randomd();
|
||||
v1 = randomd();
|
||||
s = v0*v0 + v1*v1;
|
||||
}
|
||||
v0 = v0 * sqrt(-2 * log(s) / s);
|
||||
return v0 * sv + dv;
|
||||
}
|
||||
*/
|
||||
|
||||
void BrickBase::Parameter::setValue(const PIVariant & v, bool withType) {
|
||||
value = v;
|
||||
if (withType) {
|
||||
switch (v.type()) {
|
||||
case PIVariant::Bool: type = BrickBase::Bool; return;
|
||||
case PIVariant::Char: type = BrickBase::Integer; return;
|
||||
case PIVariant::Short: type = BrickBase::Integer; return;
|
||||
case PIVariant::Int: type = BrickBase::Integer; return;
|
||||
case PIVariant::Long: type = BrickBase::Integer; return;
|
||||
case PIVariant::LLong: type = BrickBase::Integer; return;
|
||||
case PIVariant::UChar: type = BrickBase::Integer; return;
|
||||
case PIVariant::UShort: type = BrickBase::Integer; return;
|
||||
case PIVariant::UInt: type = BrickBase::Integer; return;
|
||||
case PIVariant::ULong: type = BrickBase::Integer; return;
|
||||
case PIVariant::ULLong: type = BrickBase::Integer; return;
|
||||
case PIVariant::Float: type = BrickBase::Float; return;
|
||||
case PIVariant::Double: type = BrickBase::Float; return;
|
||||
case PIVariant::LDouble: type = BrickBase::Float; return;
|
||||
case PIVariant::String: type = BrickBase::String; return;
|
||||
case PIVariant::StringList: type = BrickBase::String; return;
|
||||
default: break;
|
||||
};
|
||||
}/* else {
|
||||
switch (v.type()) {
|
||||
case PIVariant::Bool: value.vBool = v.vBool; return;
|
||||
case PIVariant::Char: value.vInt = v.vChar; return;
|
||||
case PIVariant::Short: value.vInt = v.vShort; return;
|
||||
case PIVariant::Int: value.vInt = v.vInt; return;
|
||||
case PIVariant::Long: value.vInt = v.vLong; return;
|
||||
case PIVariant::LLong: value.vInt = v.vLLong; return;
|
||||
case PIVariant::UChar: value.vInt = v.vUChar; return;
|
||||
case PIVariant::UShort: value.vInt = v.vUShort; return;
|
||||
case PIVariant::UInt: value.vInt = v.vUInt; return;
|
||||
case PIVariant::ULong: value.vInt = v.vULong; return;
|
||||
case PIVariant::ULLong: value.vInt = v.vULLong; return;
|
||||
case PIVariant::Float: value.vDouble = v.vFloat; return;
|
||||
case PIVariant::Double: value.vDouble = v.vDouble; return;
|
||||
case PIVariant::LDouble: value.vDouble = v.vLDouble; return;
|
||||
case PIVariant::String: value.vString = v.vString; return;
|
||||
case PIVariant::StringList: value.vString = v.vStringList.join(", "); return;
|
||||
};
|
||||
}*/
|
||||
}
|
||||
|
||||
|
||||
BrickBase::BrickBase(int inputs_num, int outputs_num, int parameters_num) {
|
||||
inputs_count = inputs_num;
|
||||
outputs_count = outputs_num;
|
||||
parameters_count = parameters_num;
|
||||
inputs.resize(inputs_num, 0.);
|
||||
outputs.resize(outputs_num, 0.);
|
||||
defInputs.resize(inputs_num, 0.);
|
||||
parameters.resize(parameters_num, 0.);
|
||||
inNames.resize(inputs_num);
|
||||
outNames.resize(outputs_num);
|
||||
paramNames.resize(parameters_num);
|
||||
if (inputs_num > 0) inNames[0] = "Input";
|
||||
if (outputs_num > 0) outNames[0] = "Output";
|
||||
parametersName_ = "Parameters";
|
||||
pt = dt = 0;
|
||||
freqDivider_ = freqCurrent_ = 1;
|
||||
time_ = 0.;
|
||||
level_ = -666;
|
||||
io_Type = Fixed;
|
||||
initial = composite = buffered = interactive = rtOnly = false;
|
||||
}
|
||||
|
||||
|
||||
bool BrickBase::tick(double time) {
|
||||
if (freqDivider_ > 1) {
|
||||
if (freqCurrent_ < freqDivider_) {
|
||||
++freqCurrent_;
|
||||
lastTick = false;
|
||||
return false;
|
||||
}
|
||||
freqCurrent_ = 1;
|
||||
}
|
||||
time_ = time;
|
||||
dt = time - pt;
|
||||
lastTick = tick_body(time);
|
||||
pt = time;
|
||||
return lastTick;
|
||||
}
|
||||
|
||||
|
||||
void BrickBase::proceedConnections(bool) {
|
||||
for (uint i = 0; i < connections.size(); ++i)
|
||||
connections[i].brick_to->setInputValue(connections[i].in_num, output(connections[i].out_num));
|
||||
}
|
||||
|
||||
|
||||
bool BrickBase::connect(BrickBase * b_from, int out_num, BrickBase * b_to, int in_num) {
|
||||
if (out_num < 0 || out_num >= b_from->outputsCount()) {
|
||||
piCout << "Connect error: no such output" << out_num << "in \"" << b_from->name() << "\"!";
|
||||
return false;
|
||||
}
|
||||
if (in_num < 0 || in_num >= b_to->inputsCount()) {
|
||||
piCout << "Connect error: no such input" << in_num << "in \"" << b_to->name() << "\"!";
|
||||
return false;
|
||||
}
|
||||
b_from->addConnection(BrickBase::Connection(out_num, b_to, in_num));
|
||||
//string fn = b_from->name().stdString(), tn = b_to->name().stdString();
|
||||
//cout << "Connect \"" << fn << "\": " << out_num << " to \"" << tn << "\": " << in_num << endl;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool BrickBase::disconnect(BrickBase * b_from, int out_num, BrickBase * b_to, int in_num) {
|
||||
/*if (out_num < 0 || out_num >= b_from->outCount()) {
|
||||
cout << "Disconnect error: no such output " << out_num << " in \"" << b_from->name() << "\"!" << endl;
|
||||
return false;
|
||||
}
|
||||
if (in_num < 0 || in_num >= b_to->inCount()) {
|
||||
cout << "Disconnect error: no such input " << in_num << " in \"" << b_to->name() << "\"!" << endl;
|
||||
return false;
|
||||
}*/
|
||||
BrickBase::Connection conn;
|
||||
for (int i = 0; i < b_from->connectionsCount(); ++i) {
|
||||
conn = b_from->connection(i);
|
||||
if (out_num != conn.out_num || b_to != conn.brick_to || in_num != conn.in_num)
|
||||
continue;
|
||||
b_from->removeConnection(i);
|
||||
//string fn = b_from->name().stdString(), tn = b_to->name().stdString();
|
||||
//cout << "Disconnect \"" << fn << "\": " << out_num << " from \"" << tn << "\": " << in_num << endl;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user