#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; }