Commit 9b3a7f26 authored by Pavel Vainerman's avatar Pavel Vainerman

(IOBase): дописал тесты обработки калибровки, исправил ошибки (!)

parent 1e64d5c3
......@@ -219,7 +219,7 @@ void IOBase::processingFasAI( IOBase* it, float fval, const std::shared_ptr<SMIn
val = 0;
memcpy(&val,&fval, std::min(sizeof(val),sizeof(fval)));
}
else if( it->cal.precision > 0 )
else if( it->cal.precision > 0 && !it->noprecision )
val = lroundf( fval * pow10(it->cal.precision) );
// проверка на обрыв
......@@ -326,18 +326,17 @@ long IOBase::processingAsAO( IOBase* it, const std::shared_ptr<SMInterface>& shm
}
else
{
// сперва "убираем степень", потом калибруем.. (это обратная последовательность для AsAI)
if( !it->noprecision && it->cal.precision > 0 )
val = lroundf( (float)it->value / pow10(it->cal.precision) );
IOController_i::CalibrateInfo* cal( &(it->cal) );
if( cal && cal->maxRaw!=cal->minRaw ) // задана калибровка
{
// Калибруем в обратную сторону!!!
val = UniSetTypes::lcalibrate(it->value,
val = UniSetTypes::lcalibrate(val,
cal->minCal, cal->maxCal, cal->minRaw, cal->maxRaw, it->calcrop );
}
else
val = it->value;
if( !it->noprecision && it->cal.precision > 0 )
return lroundf( (float)it->value / pow10(it->cal.precision) );
}
}
......@@ -372,7 +371,7 @@ float IOBase::processingFasAO( IOBase* it, const std::shared_ptr<SMInterface>& s
if( force )
{
val = shm->localGetValue(it->ioit,it->si.id);
it->value = val;
it->value = val; // обновим на всякий
}
if( it->rawdata )
......@@ -382,37 +381,25 @@ float IOBase::processingFasAO( IOBase* it, const std::shared_ptr<SMInterface>& s
return fval;
}
float fval = val;
if( it->stype == UniversalIO::AO ||
it->stype == UniversalIO::AI )
{
if( it->cdiagram ) // задана специальная калибровочная диаграмма
IOController_i::CalibrateInfo* cal( &(it->cal) );
if( cal->maxRaw!=cal->minRaw ) // задана калибровка
{
if( it->cprev != it->value )
{
it->cprev = it->value;
val = it->cdiagram->getRawValue(val);
it->craw = val;
}
else
val = it->craw; // просто передаём предыдущее значение
// Калибруем в обратную сторону!!!
fval = UniSetTypes::fcalibrate(fval,
cal->minCal, cal->maxCal, cal->minRaw, cal->maxRaw, it->calcrop );
}
else
{
float fval = val;
IOController_i::CalibrateInfo* cal( &(it->cal) );
if( cal->maxRaw!=cal->minRaw ) // задана калибровка
{
// Калибруем в обратную сторону!!!
fval = UniSetTypes::fcalibrate(fval,
cal->minCal, cal->maxCal, cal->minRaw, cal->maxRaw, it->calcrop );
}
if( !it->noprecision && it->cal.precision > 0 )
return ( fval / pow10(it->cal.precision) );
}
if( !it->noprecision && it->cal.precision > 0 )
return ( fval / pow10(it->cal.precision) );
}
return val;
return fval;
}
// -----------------------------------------------------------------------------
void IOBase::processingThreshold( IOBase* it, const std::shared_ptr<SMInterface>& shm, bool force )
......
......@@ -27,7 +27,8 @@ static bool init_iobase( IOBase* ib, const std::string& sensor )
CHECK( snode != 0 );
UniXML::iterator it(snode);
shm->initIterator(ib->d_it);
shm->initIterator(ib->d_it);
shm->initIterator(ib->ioit);
shm->initIterator(ib->t_ait);
return IOBase::initItem(ib,it,shm, "", false);
}
// -----------------------------------------------------------------------------
......@@ -188,12 +189,257 @@ TEST_CASE("[IOBase::depend]: AO depend on the DI","[iobase][depend][ao-di][exten
}
}
// -----------------------------------------------------------------------------
TEST_CASE("[IOBase::calibration]: AI calibration","[iobase][calibration][ai][extensions]")
{
CHECK( uniset_conf()!=nullptr );
auto conf = uniset_conf();
init_test();
ObjectId ai = conf->getSensorID("CalibrationTest_AI1_AS");
CHECK( ai != DefaultObjectId );
IOBase ib;
CHECK( init_iobase(&ib,"CalibrationTest_AI1_AS") );
SECTION("AI calibration (asAI)")
{
IOBase::processingAsAI(&ib,0,shm,true);
REQUIRE( shm->getValue(ai) == 0 );
IOBase::processingAsAI(&ib,-100,shm,true);
REQUIRE( shm->getValue(ai) == -1000 );
IOBase::processingAsAI(&ib,100,shm,true);
REQUIRE( shm->getValue(ai) == 1000 );
}
SECTION("AI calibration (asAO)")
{
shm->setValue(ai,0);
REQUIRE( IOBase::processingAsAO(&ib,shm,true) == 0 );
shm->setValue(ai,-1000);
REQUIRE( IOBase::processingAsAO(&ib,shm,true) == -100 );
shm->setValue(ai,1000);
REQUIRE( IOBase::processingAsAO(&ib,shm,true) == 100 );
}
SECTION("AI calibration (FasAI)")
{
IOBase::processingFasAI(&ib,0.0,shm,true);
REQUIRE( shm->getValue(ai) == 0 );
IOBase::processingFasAI(&ib,-99.9,shm,true); // округлится до 100
REQUIRE( shm->getValue(ai) == -1000 );
IOBase::processingFasAI(&ib,-99.4,shm,true); // округлится до 99
REQUIRE( shm->getValue(ai) == -990 );
IOBase::processingFasAI(&ib,99.9,shm,true);
REQUIRE( shm->getValue(ai) == 1000 );
IOBase::processingFasAI(&ib,99.4,shm,true);
REQUIRE( shm->getValue(ai) == 990 );
}
SECTION("AI calibration (FasAO)")
{
shm->setValue(ai,0);
REQUIRE( IOBase::processingFasAO(&ib,shm,true) == 0 );
shm->setValue(ai,-1000);
REQUIRE( IOBase::processingFasAO(&ib,shm,true) == -100 );
shm->setValue(ai,-995);
REQUIRE( IOBase::processingFasAO(&ib,shm,true) == -99.5f );
shm->setValue(ai,1000);
REQUIRE( IOBase::processingFasAO(&ib,shm,true) == 100 );
shm->setValue(ai,995);
REQUIRE( IOBase::processingFasAO(&ib,shm,true) == 99.5f );
shm->setValue(ai,994);
REQUIRE( IOBase::processingFasAO(&ib,shm,true) == 99.4f );
}
SECTION("AI calibration rawdata=1 (asAI)")
{
ib.rawdata = true;
IOBase::processingAsAI(&ib,0,shm,true);
REQUIRE( shm->getValue(ai) == 0 );
IOBase::processingAsAI(&ib,-100,shm,true);
REQUIRE( shm->getValue(ai) == -100 );
IOBase::processingAsAI(&ib,100,shm,true);
REQUIRE( shm->getValue(ai) == 100 );
}
SECTION("AI calibration rawdata=1 (asAO)")
{
ib.rawdata = true;
shm->setValue(ai,0);
REQUIRE( IOBase::processingAsAO(&ib,shm,true) == 0 );
shm->setValue(ai,-1000);
REQUIRE( IOBase::processingAsAO(&ib,shm,true) == -1000 );
shm->setValue(ai,1000);
REQUIRE( IOBase::processingAsAO(&ib,shm,true) == 1000 );
}
SECTION("AI calibration rawdata=1 (FasAI)")
{
ib.rawdata = true;
IOBase::processingFasAI(&ib,0.0,shm,true);
REQUIRE( shm->getValue(ai) == 0 );
IOBase::processingFasAI(&ib,1.0f,shm,true);
REQUIRE( shm->getValue(ai) == 1065353216 );
}
SECTION("AI calibration (FasAO)")
{
ib.rawdata = true;
shm->setValue(ai,0);
REQUIRE( IOBase::processingFasAO(&ib,shm,true) == 0 );
shm->setValue(ai,1065353216);
REQUIRE( IOBase::processingFasAO(&ib,shm,true) == 1.0f );
}
}
// -----------------------------------------------------------------------------
TEST_CASE("[IOBase::calibration]: AI calibration (precision)","[iobase][calibration][precision][ai][extensions]")
{
CHECK( uniset_conf()!=nullptr );
auto conf = uniset_conf();
init_test();
ObjectId ai = conf->getSensorID("CalibrationTest_AI2_AS");
CHECK( ai != DefaultObjectId );
IOBase ib;
CHECK( init_iobase(&ib,"CalibrationTest_AI2_AS") );
SECTION("AI calibration with precision (asAI)")
{
IOBase::processingAsAI(&ib,0,shm,true);
REQUIRE( shm->getValue(ai) == 0 );
IOBase::processingAsAI(&ib,-100,shm,true);
REQUIRE( shm->getValue(ai) == -100000 );
IOBase::processingAsAI(&ib,100,shm,true);
REQUIRE( shm->getValue(ai) == 100000 );
}
SECTION("AI calibration with precision (asAO)")
{
shm->setValue(ai,0);
REQUIRE( IOBase::processingAsAO(&ib,shm,true) == 0 );
shm->setValue(ai,-100000);
REQUIRE( IOBase::processingAsAO(&ib,shm,true) == -100 );
shm->setValue(ai,100000);
REQUIRE( IOBase::processingAsAO(&ib,shm,true) == 100 );
}
SECTION("AI calibration with precision (FasAI)")
{
IOBase::processingFasAI(&ib,0.0,shm,true);
REQUIRE( shm->getValue(ai) == 0 );
IOBase::processingFasAI(&ib,-0.99,shm,true); // сперва будет возведено в степень (10^precision)
REQUIRE( shm->getValue(ai) == -990 ); // потом откалибруется
IOBase::processingFasAI(&ib,0.99,shm,true);
REQUIRE( shm->getValue(ai) == 990 );
IOBase::processingFasAI(&ib,0.87,shm,true);
REQUIRE( shm->getValue(ai) == 870 );
}
SECTION("AI calibration (FasAO)")
{
shm->setValue(ai,0);
REQUIRE( IOBase::processingFasAO(&ib,shm,true) == 0 );
shm->setValue(ai,-990);
REQUIRE( IOBase::processingFasAO(&ib,shm,true) == -0.99f );
shm->setValue(ai,-995);
REQUIRE( IOBase::processingFasAO(&ib,shm,true) == -0.995f );
shm->setValue(ai,1000);
REQUIRE( IOBase::processingFasAO(&ib,shm,true) == 1.0f );
shm->setValue(ai,995);
REQUIRE( IOBase::processingFasAO(&ib,shm,true) == 0.995f );
shm->setValue(ai,994);
REQUIRE( IOBase::processingFasAO(&ib,shm,true) == 0.994f );
}
SECTION("AI calibration noprecision=1 (FasAO)")
{
ib.noprecision=true;
shm->setValue(ai,0);
REQUIRE( IOBase::processingFasAO(&ib,shm,true) == 0 );
shm->setValue(ai,-990);
REQUIRE( IOBase::processingFasAO(&ib,shm,true) == -99.0f );
shm->setValue(ai,-995);
REQUIRE( IOBase::processingFasAO(&ib,shm,true) == -99.5f );
shm->setValue(ai,1000);
REQUIRE( IOBase::processingFasAO(&ib,shm,true) == 100.0f );
shm->setValue(ai,995);
REQUIRE( IOBase::processingFasAO(&ib,shm,true) == 99.5f );
shm->setValue(ai,994);
REQUIRE( IOBase::processingFasAO(&ib,shm,true) == 99.4f );
ib.noprecision=false;
}
SECTION("AI calibration noprecision=1 (FasAI)")
{
ib.noprecision=true;
IOBase::processingFasAI(&ib,0.0,shm,true);
REQUIRE( shm->getValue(ai) == 0 );
IOBase::processingFasAI(&ib,-99.5,shm,true); // округлится до -100
REQUIRE( shm->getValue(ai) == -1000 ); // потом откалибруется
IOBase::processingFasAI(&ib,99.4,shm,true); // округлися до 99
REQUIRE( shm->getValue(ai) == 990 );
ib.noprecision=false;
}
}
// -----------------------------------------------------------------------------
TEST_CASE("IOBase with SM","[iobase][extensions]")
{
WARN("IOBase with SM not yet!");
// rawdata
WARN("IOBase with SM: Not all tests implemented!");
// ignore
// ioinvert
// precision
// asDO (!)
// asDI (!)
// iofront
// UndefinedState
// threshold_ai
}
// -----------------------------------------------------------------------------
......@@ -255,6 +255,10 @@
<item id="111" iotype="DO" name="DependTest_DO2_S" textname="Depend test: DO2" depend="DependTest_DI_S" depend_value="1" depend_off_value="0"/>
<item id="113" iotype="AO" name="DependTest_AO2_AS" textname="Depend test: AO2" depend="DependTest_DI_S" depend_value="1" depend_off_value="10000" default="15"/>
<!-- calibration test -->
<item id="114" iotype="AI" name="CalibrationTest_AI1_AS" textname="Calibration test: AI1" rmin="-100" rmax="100" cmin="-1000" cmax="1000"/>
<item id="115" iotype="AI" name="CalibrationTest_AI2_AS" textname="Calibration test: AI2" rmin="-100" rmax="100" cmin="-1000" cmax="1000" precision="2"/>
</sensors>
<thresholds name="thresholds">
<sensor iotype="AI" name="AI_AS">
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment