Listing 2: The AnalogInput class
class AnalogInput
{
friend MasterRun;
friend Configure;
const Address inputA_, inputB_;
Bool safe_;
Time lastReset_;
Auditor *auditor_;
Signal scaleFactor_;
void reset() {
const Time time = mtime();
if( time > lastReset_ + Global::resetHoldoff )
safe_ = Global::true;
lastReset_ = time;
}
void scaleFactor( const Signal& scale ){ scaleFactor_ = scale; }
public:
Bool ready() const { return safe_; }
Signal scaleFactor() const { return scaleFactor_; }
Signal offsetWindow() const { return Global::voltWin * 2.; }
Signal errorWindow() const { return Global::over
- Global::under; }
Signal level() {
if( ! safe_ ) {
auditor_->fault();
return Global::analogError;
}
const Signal aLevel = readAnalog( inputA_ ),
bLevel = readAnalog( inputB_ ) * scaleFactor_,
averageLevel = ( aLevel + bLevel ) / 2.,
aAbsLevel = abs( aLevel ),
bAbsLevel = abs( bLevel );
auditor_->refresh();
if( aAbsLevel < Global::voltWin &&
bAbsLevel < Global::voltWin )
return averageLevel;
if( sign( aLevel ) == sign( bLevel ) &&
aAbsLevel < Global::over * bAbsLevel + Global::voltWin &&
aAbsLevel > Global::under * bAbsLevel - Global::voltWin )
return averageLevel;
auditor_->fault();
safe_ = Global::false;
return Global::analogError;
}
};
/* End of File */