git-svn-id: svn://db.shs.com.ru/libs@1 a8b55f48-bf90-11e4-a774-851b48703e85
308 lines
6.3 KiB
C++
308 lines
6.3 KiB
C++
#include "brick_digital.h"
|
|
|
|
|
|
bool BrickDigitalTriggerRS::tick_body(double time) {
|
|
if (inputs[R] > 0.) outputs[T] = 0.;
|
|
else if (inputs[S] > 0.) outputs[T] = 1.;
|
|
outputs[To] = 1. - outputs[T];
|
|
return true;
|
|
}
|
|
|
|
|
|
bool BrickDigitalTriggerD::tick_body(double time) {
|
|
if (inputs[C] <= 0.) return true;
|
|
outputs[T] = dbool(inputs[D]);
|
|
outputs[To] = 1. - outputs[T];
|
|
return true;
|
|
}
|
|
|
|
|
|
bool BrickDigitalTriggerJK::tick_body(double time) {
|
|
if (inputs[C] - pc <= 0. || inputs[C] <= 0.) {
|
|
pc = inputs[C];
|
|
return true;
|
|
}
|
|
outputs[T] = dbool((1. - outputs[T]) * inputs[J] + outputs[T] * (1. - inputs[K]));
|
|
outputs[To] = 1. - outputs[T];
|
|
pc = inputs[C];
|
|
return true;
|
|
}
|
|
|
|
|
|
bool BrickDigitalCounter2::tick_body(double time) {
|
|
dv = inputs[C] - v;
|
|
v = inputs[C];
|
|
if (inputs[R] > 0) {
|
|
outputs[0] = outputs[1] = 0.;
|
|
return true;
|
|
}
|
|
if (dv > 0.) {
|
|
outputs[0] = 1. - outputs[0];
|
|
if (outputs[0] == 0.) {
|
|
outputs[1] = 1. - outputs[1];
|
|
if (outputs[1] == 0.)
|
|
outputs[0] = 0.;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
bool BrickDigitalCounter4::tick_body(double time) {
|
|
dv = inputs[C] - v;
|
|
v = inputs[C];
|
|
if (inputs[R] > 0) {
|
|
outputs[0] = outputs[1] = outputs[2] = outputs[3] = 0.;
|
|
return true;
|
|
}
|
|
if (dv > 0.) {
|
|
outputs[0] = 1. - outputs[0];
|
|
if (outputs[0] == 0.) {
|
|
outputs[1] = 1. - outputs[1];
|
|
if (outputs[1] == 0.) {
|
|
outputs[2] = 1. - outputs[2];
|
|
if (outputs[2] == 0.) {
|
|
outputs[3] = 1. - outputs[3];
|
|
if (outputs[3] == 0.)
|
|
outputs[0] = outputs[1] = outputs[2] = 0.;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
bool BrickDigitalCounter8::tick_body(double time) {
|
|
dv = inputs[C] - v;
|
|
v = inputs[C];
|
|
if (inputs[R] > 0) {
|
|
for (int i = 0; i < 8; ++i)
|
|
outputs[i] = 0.;
|
|
return true;
|
|
}
|
|
if (dv > 0.) {
|
|
outputs[0] = 1. - outputs[0];
|
|
if (outputs[0] == 0.) {
|
|
outputs[1] = 1. - outputs[1];
|
|
if (outputs[1] == 0.) {
|
|
outputs[2] = 1. - outputs[2];
|
|
if (outputs[2] == 0.) {
|
|
outputs[3] = 1. - outputs[3];
|
|
if (outputs[3] == 0.) {
|
|
outputs[4] = 1. - outputs[4];
|
|
if (outputs[4] == 0.) {
|
|
outputs[5] = 1. - outputs[5];
|
|
if (outputs[5] == 0.) {
|
|
outputs[6] = 1. - outputs[6];
|
|
if (outputs[6] == 0.) {
|
|
outputs[7] = 1. - outputs[7];
|
|
if (outputs[7] == 0.)
|
|
for (int i = 0; i < 7; ++i)
|
|
outputs[i] = 0.;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
bool BrickDigitalCoder2::tick_body(double time) {
|
|
int cv = 0;
|
|
for (int i = 3; i >= 0; --i)
|
|
if (inputs[i] > 0.) {cv = i; break;}
|
|
outputs[1] = cv / 2;
|
|
outputs[0] = cv % 2;
|
|
return true;
|
|
}
|
|
|
|
|
|
bool BrickDigitalCoder3::tick_body(double time) {
|
|
int cv = 0;
|
|
for (int i = 7; i >= 0; --i)
|
|
if (inputs[i] > 0.) {cv = i; break;}
|
|
outputs[2] = cv / 4;
|
|
outputs[1] = (cv % 4) / 2;
|
|
outputs[0] = cv % 2;
|
|
return true;
|
|
}
|
|
|
|
|
|
bool BrickDigitalCoder4::tick_body(double time) {
|
|
int cv = 0;
|
|
for (int i = 15; i >= 0; --i)
|
|
if (inputs[i] > 0.) {cv = i; break;}
|
|
outputs[3] = cv / 8;
|
|
outputs[2] = (cv % 8) / 4;
|
|
outputs[1] = (cv % 4) / 2;
|
|
outputs[0] = cv % 2;
|
|
return true;
|
|
}
|
|
|
|
|
|
bool BrickDigitalDecoder1::tick_body(double time) {
|
|
outputs[0] = outputs[1] = 0.;
|
|
if (inputs[0] > 0.)
|
|
outputs[1] = 1.;
|
|
else
|
|
outputs[0] = 1.;
|
|
return true;
|
|
}
|
|
|
|
|
|
bool BrickDigitalDecoder2::tick_body(double time) {
|
|
int cv;
|
|
for (int i = 0; i < 4; ++i)
|
|
outputs[i] = 0.;
|
|
cv = dbool(inputs[0]) + dbool(inputs[1]) * 2;
|
|
outputs[cv] = 1.;
|
|
return true;
|
|
}
|
|
|
|
|
|
bool BrickDigitalDecoder3::tick_body(double time) {
|
|
int cv;
|
|
for (int i = 0; i < 8; ++i)
|
|
outputs[i] = 0.;
|
|
cv = dbool(inputs[0]) + dbool(inputs[1]) * 2 + dbool(inputs[2]) * 4;
|
|
outputs[cv] = 1.;
|
|
return true;
|
|
}
|
|
|
|
|
|
bool BrickDigitalDecoder4::tick_body(double time) {
|
|
int cv;
|
|
for (int i = 0; i < 16; ++i)
|
|
outputs[i] = 0.;
|
|
cv = dbool(inputs[0]) + dbool(inputs[1]) * 2 + dbool(inputs[2]) * 4 + dbool(inputs[3]) * 8;
|
|
outputs[cv] = 1.;
|
|
return true;
|
|
}
|
|
|
|
|
|
bool BrickDigitalMux1::tick_body(double time) {
|
|
int cv;
|
|
cv = dbool(inputs[2]);
|
|
outputs[0] = inputs[cv];
|
|
return true;
|
|
}
|
|
|
|
|
|
bool BrickDigitalMux2::tick_body(double time) {
|
|
int cv;
|
|
cv = dbool(inputs[4]) + dbool(inputs[5]) * 2;
|
|
outputs[0] = inputs[cv];
|
|
return true;
|
|
}
|
|
|
|
|
|
bool BrickDigitalMux3::tick_body(double time) {
|
|
int cv;
|
|
cv = dbool(inputs[8]) + dbool(inputs[9]) * 2 + dbool(inputs[10]) * 4;
|
|
outputs[0] = inputs[cv];
|
|
return true;
|
|
}
|
|
|
|
|
|
bool BrickDigitalMux4::tick_body(double time) {
|
|
int cv;
|
|
cv = dbool(inputs[16]) + dbool(inputs[17]) * 2 + dbool(inputs[18]) * 4 + dbool(inputs[19]) * 8;
|
|
outputs[0] = inputs[cv];
|
|
return true;
|
|
}
|
|
|
|
|
|
bool BrickDigitalDemux1::tick_body(double time) {
|
|
outputs[0] = outputs[1] = 0.;
|
|
if (inputs[1] > 0.)
|
|
outputs[1] = inputs[0];
|
|
else
|
|
outputs[0] = inputs[0];
|
|
return true;
|
|
}
|
|
|
|
|
|
bool BrickDigitalDemux2::tick_body(double time) {
|
|
int cv;
|
|
for (int i = 0; i < 4; ++i)
|
|
outputs[i] = 0.;
|
|
cv = dbool(inputs[1]) + dbool(inputs[2]) * 2;
|
|
outputs[cv] = inputs[0];
|
|
return true;
|
|
}
|
|
|
|
|
|
bool BrickDigitalDemux3::tick_body(double time) {
|
|
int cv;
|
|
for (int i = 0; i < 8; ++i)
|
|
outputs[i] = 0.;
|
|
cv = dbool(inputs[1]) + dbool(inputs[2]) * 2 + dbool(inputs[3]) * 4;
|
|
outputs[cv] = inputs[0];
|
|
return true;
|
|
}
|
|
|
|
|
|
bool BrickDigitalDemux4::tick_body(double time) {
|
|
int cv;
|
|
for (int i = 0; i < 16; ++i)
|
|
outputs[i] = 0.;
|
|
cv = dbool(inputs[1]) + dbool(inputs[2]) * 2 + dbool(inputs[3]) * 4 + dbool(inputs[4]) * 8;
|
|
outputs[cv] = inputs[0];
|
|
return true;
|
|
}
|
|
|
|
|
|
bool BrickDigitalDigitalToAnalog4::tick_body(double time) {
|
|
double v = 0;
|
|
for (int i = 0; i < 4; ++i)
|
|
v += pow2(i) * dbool(inputs[i]);
|
|
outputs[0] = inputs[4] * v / 15.;
|
|
return true;
|
|
}
|
|
|
|
|
|
bool BrickDigitalDigitalToAnalog8::tick_body(double time) {
|
|
double v = 0;
|
|
for (int i = 0; i < 8; ++i)
|
|
v += pow2(i) * dbool(inputs[i]);
|
|
outputs[0] = inputs[8] * v / 255.;
|
|
return true;
|
|
}
|
|
|
|
|
|
bool BrickDigitalAnalogToDigital2::tick_body(double time) {
|
|
double v = inputs[Input], t = inputs[Max] / 2.;
|
|
outputs[1] = (v >= t ? 1. : 0.);
|
|
if (outputs[1] > 0.) v -= t;
|
|
t /= 2.;
|
|
outputs[0] = (v >= t ? 1. : 0.);
|
|
return true;
|
|
}
|
|
|
|
|
|
bool BrickDigitalAnalogToDigital4::tick_body(double time) {
|
|
double v = inputs[Input], t = inputs[Max] / 2.;
|
|
for (int i = 3; i >= 0; --i) {
|
|
outputs[i] = (v >= t ? 1. : 0.);
|
|
if (outputs[i] > 0.) v -= t;
|
|
t /= 2.;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
bool BrickDigitalAnalogToDigital8::tick_body(double time) {
|
|
double v = inputs[Input], t = inputs[Max] / 2.;
|
|
for (int i = 7; i >= 0; --i) {
|
|
outputs[i] = (v >= t ? 1. : 0.);
|
|
if (outputs[i] > 0.) v -= t;
|
|
t /= 2.;
|
|
}
|
|
return true;
|
|
}
|