Commit 949e7b6e authored by Pavel Vaynerman's avatar Pavel Vaynerman

add BLINK2, BLINK3 to IOControl (and new release)

parent 0c3eb913
...@@ -175,6 +175,9 @@ rm -f %buildroot%_libdir/*.la ...@@ -175,6 +175,9 @@ rm -f %buildroot%_libdir/*.la
%exclude %_pkgconfigdir/libUniSet.pc %exclude %_pkgconfigdir/libUniSet.pc
%changelog %changelog
* Wed Aug 19 2009 Pavel Vainerman <pv@etersoft.ru> 0.96-eter49
- add BLINK2, BLINK3 to IOControl
* Tue Aug 18 2009 Pavel Vainerman <pv@etersoft.ru> 0.96-eter48 * Tue Aug 18 2009 Pavel Vainerman <pv@etersoft.ru> 0.96-eter48
- fixed bug in PassiveTimer - fixed bug in PassiveTimer
......
...@@ -31,6 +31,8 @@ IOControl::IOControl( UniSetTypes::ObjectId id, UniSetTypes::ObjectId icID, ...@@ -31,6 +31,8 @@ IOControl::IOControl( UniSetTypes::ObjectId id, UniSetTypes::ObjectId icID,
shm(0), shm(0),
myid(id), myid(id),
blink_state(true), blink_state(true),
blink2_state(true),
blink3_state(true),
testLamp_S(UniSetTypes::DefaultObjectId), testLamp_S(UniSetTypes::DefaultObjectId),
isTestLamp(false), isTestLamp(false),
sidHeartBeat(UniSetTypes::DefaultObjectId), sidHeartBeat(UniSetTypes::DefaultObjectId),
...@@ -53,6 +55,8 @@ IOControl::IOControl( UniSetTypes::ObjectId id, UniSetTypes::ObjectId icID, ...@@ -53,6 +55,8 @@ IOControl::IOControl( UniSetTypes::ObjectId id, UniSetTypes::ObjectId icID,
defCardNum = atoi( conf->getArgParam("--io-default-cardnum","-1").c_str()); defCardNum = atoi( conf->getArgParam("--io-default-cardnum","-1").c_str());
unideb[Debug::INFO] << myname << "(init): numcards=" << numcards << endl;
UniXML_iterator it(cnode); UniXML_iterator it(cnode);
noCards = true; noCards = true;
...@@ -152,7 +156,19 @@ IOControl::IOControl( UniSetTypes::ObjectId id, UniSetTypes::ObjectId icID, ...@@ -152,7 +156,19 @@ IOControl::IOControl( UniSetTypes::ObjectId id, UniSetTypes::ObjectId icID,
ptBlink.setTiming(blink_msec); ptBlink.setTiming(blink_msec);
smReadyTimeout = conf->getArgInt("--io-sm-ready-timeout",it.getProp("ready_timeout")); int blink2_msec = conf->getArgInt("--io-blink2-time",it.getProp("blink2-time"));
if( blink2_msec<=0 )
blink2_msec = 150;
ptBlink2.setTiming(blink2_msec);
int blink3_msec = conf->getArgInt("--io-blink3-time",it.getProp("blink3-time"));
if( blink3_msec<=0 )
blink3_msec = 100;
ptBlink3.setTiming(blink2_msec);
smReadyTimeout = atoi(conf->getArgParam("--io-sm-ready-timeout",it.getProp("ready_timeout")).c_str());
if( smReadyTimeout == 0 ) if( smReadyTimeout == 0 )
smReadyTimeout = 15000; smReadyTimeout = 15000;
else if( smReadyTimeout < 0 ) else if( smReadyTimeout < 0 )
...@@ -211,6 +227,9 @@ IOControl::~IOControl() ...@@ -211,6 +227,9 @@ IOControl::~IOControl()
// ݣ delete // ݣ delete
// cdiagram new // cdiagram new
// //
for( unsigned int i=0; i<cards.size(); i++ )
delete cards[i];
delete shm; delete shm;
} }
...@@ -242,6 +261,7 @@ void IOControl::execute() ...@@ -242,6 +261,7 @@ void IOControl::execute()
} }
iomap.resize(maxItem); iomap.resize(maxItem);
maxHalf = maxItem / 2;
unideb[Debug::INFO] << myname << "(init): iomap size = " << iomap.size() << endl; unideb[Debug::INFO] << myname << "(init): iomap size = " << iomap.size() << endl;
cerr << myname << "(iomap size): " << iomap.size() << endl; cerr << myname << "(iomap size): " << iomap.size() << endl;
...@@ -297,7 +317,25 @@ void IOControl::execute() ...@@ -297,7 +317,25 @@ void IOControl::execute()
ptBlink.reset(); ptBlink.reset();
try try
{ {
blink(); blink(lstBlink,blink_state);
}
catch(...){}
}
if( ptBlink2.checkTime() )
{
ptBlink2.reset();
try
{
blink(lstBlink2,blink2_state);
}
catch(...){}
}
if( ptBlink3.checkTime() )
{
ptBlink3.reset();
try
{
blink(lstBlink3,blink3_state);
} }
catch(...){} catch(...){}
} }
...@@ -337,11 +375,51 @@ void IOControl::execute() ...@@ -337,11 +375,51 @@ void IOControl::execute()
// -------------------------------------------------------------------------------- // --------------------------------------------------------------------------------
void IOControl::iopoll() void IOControl::iopoll()
{ {
for( IOMap::iterator it=iomap.begin(); it!=iomap.end(); ++it ) //
for( PIOMap::iterator it=pmap.begin(); it!=pmap.end(); ++it )
{ {
if( it->ignore || it->ncard == defCardNum ) if( it->priority > 0 )
ioread( &(iomap[it->index]) );
}
bool prior = false;
int i=0;
for( IOMap::iterator it=iomap.begin(); it!=iomap.end(); ++it,i++ )
{
if( it->ignore )
continue; continue;
IOBase::processingThreshold((IOBase*)&(*it),shm,force);
ioread( (IOInfo*)&(*it) );
//
//
if( !prior && i>maxHalf )
{
for( PIOMap::iterator it=pmap.begin(); it!=pmap.end(); ++it )
{
if( it->priority > 1 )
ioread( &(iomap[it->index]) );
}
prior = true;
}
}
//
for( PIOMap::iterator it=pmap.begin(); it!=pmap.end(); ++it )
{
if( it->priority > 2 )
ioread( &(iomap[it->index]) );
}
}
// --------------------------------------------------------------------------------
void IOControl::ioread( IOInfo* it )
{
if( it->ignore || it->ncard == defCardNum )
return;
ComediInterface* card = cards.getCard(it->ncard); ComediInterface* card = cards.getCard(it->ncard);
// cout << conf->oind->getMapName(it->si.id) // cout << conf->oind->getMapName(it->si.id)
...@@ -350,7 +428,7 @@ void IOControl::iopoll() ...@@ -350,7 +428,7 @@ void IOControl::iopoll()
if( card == NULL || it->subdev==DefaultSubdev || it->channel==DefaultChannel ) if( card == NULL || it->subdev==DefaultSubdev || it->channel==DefaultChannel )
continue; return;
// cout << conf->oind->getMapName(it->si.id) // cout << conf->oind->getMapName(it->si.id)
// << " subdev: " << it->subdev << " chan: " << it->channel << endl; // << " subdev: " << it->subdev << " chan: " << it->channel << endl;
...@@ -358,7 +436,7 @@ void IOControl::iopoll() ...@@ -358,7 +436,7 @@ void IOControl::iopoll()
if( it->si.id == DefaultObjectId ) if( it->si.id == DefaultObjectId )
{ {
cerr << myname << "(iopoll): sid=DefaultObjectId?!" << endl; cerr << myname << "(iopoll): sid=DefaultObjectId?!" << endl;
continue; return;
} }
IOBase* ib = &(*it); IOBase* ib = &(*it);
...@@ -426,8 +504,14 @@ void IOControl::iopoll() ...@@ -426,8 +504,14 @@ void IOControl::iopoll()
{ {
case lmpOFF: case lmpOFF:
{ {
if( force_out && prev_val == lmpBLINK ) if( force_out && (prev_val == lmpBLINK
delBlink(it); || prev_val == lmpBLINK2
|| prev_val == lmpBLINK3) )
{
delBlink(it,lstBlink);
delBlink(it,lstBlink2);
delBlink(it,lstBlink3);
}
if( it->no_testlamp || (!it->no_testlamp && !isTestLamp) ) if( it->no_testlamp || (!it->no_testlamp && !isTestLamp) )
card->setDigitalChannel(it->subdev,it->channel,0); card->setDigitalChannel(it->subdev,it->channel,0);
...@@ -436,8 +520,14 @@ void IOControl::iopoll() ...@@ -436,8 +520,14 @@ void IOControl::iopoll()
case lmpON: case lmpON:
{ {
if( force_out && prev_val == lmpBLINK ) if( force_out && (prev_val == lmpBLINK
delBlink(it); || prev_val == lmpBLINK2
|| prev_val == lmpBLINK3) )
{
delBlink(it,lstBlink);
delBlink(it,lstBlink2);
delBlink(it,lstBlink3);
}
if( it->no_testlamp || (!it->no_testlamp && !isTestLamp) ) if( it->no_testlamp || (!it->no_testlamp && !isTestLamp) )
card->setDigitalChannel(it->subdev,it->channel,1); card->setDigitalChannel(it->subdev,it->channel,1);
...@@ -448,7 +538,35 @@ void IOControl::iopoll() ...@@ -448,7 +538,35 @@ void IOControl::iopoll()
{ {
if( force_out && prev_val != lmpBLINK ) if( force_out && prev_val != lmpBLINK )
{ {
addBlink(it); delBlink(it,lstBlink2);
delBlink(it,lstBlink3);
addBlink(it,lstBlink);
// , ( )
card->setDigitalChannel(it->subdev,it->channel,1);
}
}
break;
case lmpBLINK2:
{
if( force_out && prev_val != lmpBLINK2 )
{
delBlink(it,lstBlink);
delBlink(it,lstBlink3);
addBlink(it,lstBlink2);
// , ( )
card->setDigitalChannel(it->subdev,it->channel,1);
}
}
break;
case lmpBLINK3:
{
if( force_out && prev_val != lmpBLINK3 )
{
delBlink(it,lstBlink);
delBlink(it,lstBlink2);
addBlink(it,lstBlink3);
// , ( ) // , ( )
card->setDigitalChannel(it->subdev,it->channel,1); card->setDigitalChannel(it->subdev,it->channel,1);
} }
...@@ -456,7 +574,7 @@ void IOControl::iopoll() ...@@ -456,7 +574,7 @@ void IOControl::iopoll()
break; break;
default: default:
continue; return;
} }
} }
} }
...@@ -492,10 +610,7 @@ void IOControl::iopoll() ...@@ -492,10 +610,7 @@ void IOControl::iopoll()
{ {
unideb[Debug::LEVEL3] << myname << "(iopoll): catch ..." << endl; unideb[Debug::LEVEL3] << myname << "(iopoll): catch ..." << endl;
} }
}
for( IOMap::iterator it=iomap.begin(); it!=iomap.end(); ++it )
IOBase::processingThreshold(&(*it),shm,force);
} }
// -------------------------------------------------------------------------------- // --------------------------------------------------------------------------------
void IOControl::readConfiguration() void IOControl::readConfiguration()
...@@ -564,7 +679,7 @@ bool IOControl::initIOItem( UniXML_iterator& it ) ...@@ -564,7 +679,7 @@ bool IOControl::initIOItem( UniXML_iterator& it )
if( c.empty() || inf.ncard < 0 || inf.ncard >= (int)cards.size() ) if( c.empty() || inf.ncard < 0 || inf.ncard >= (int)cards.size() )
{ {
dlog[Debug::LEVEL3] << myname unideb[Debug::LEVEL3] << myname
<< "(initIOItem): (" << "(initIOItem): ("
<< inf.ncard << ") " << it.getProp("name") << inf.ncard << ") " << it.getProp("name")
<< " set default=" << defCardNum << endl; << " set default=" << defCardNum << endl;
...@@ -638,6 +753,15 @@ bool IOControl::initIOItem( UniXML_iterator& it ) ...@@ -638,6 +753,15 @@ bool IOControl::initIOItem( UniXML_iterator& it )
// //
if( maxItem >= iomap.size() ) if( maxItem >= iomap.size() )
iomap.resize(maxItem+10); iomap.resize(maxItem+10);
int prior = atoi((it.getProp("iopriority")).c_str());
if( prior > 0 )
{
IOPriority p(prior,maxItem);
pmap.push_back(p);
unideb[Debug::LEVEL3] << myname << "(readItem): add to priority list: " <<
it.getProp("name")
<< " priority=" << prior << endl;
}
iomap[maxItem++] = inf; iomap[maxItem++] = inf;
return true; return true;
...@@ -776,17 +900,17 @@ void IOControl::initIOCard() ...@@ -776,17 +900,17 @@ void IOControl::initIOCard()
} }
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void IOControl::blink() void IOControl::blink( BlinkList& lst, bool& bstate )
{ {
if( lstBlink.empty() ) if( lstBlink.empty() )
return; return;
for( BlinkList::iterator it=lstBlink.begin(); it!=lstBlink.end(); ++it ) for( BlinkList::iterator it=lst.begin(); it!=lst.end(); ++it )
{ {
IOMap::iterator& io(*it); IOInfo* io(*it);
if( io->subdev == DefaultSubdev || io->channel==DefaultChannel ) if( io->subdev==DefaultSubdev || io->channel==DefaultChannel )
continue; continue;
...@@ -804,27 +928,28 @@ void IOControl::blink() ...@@ -804,27 +928,28 @@ void IOControl::blink()
} }
} }
blink_state ^= true; bstate ^= true;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void IOControl::addBlink( IOMap::iterator& io )
void IOControl::addBlink( IOInfo* io, BlinkList& lst )
{ {
for( BlinkList::iterator it=lstBlink.begin(); it!=lstBlink.end(); ++it ) for( BlinkList::iterator it=lst.begin(); it!=lst.end(); ++it )
{ {
if( (*it) == io ) if( (*it) == io )
return; return;
} }
lstBlink.push_back(io); lst.push_back(io);
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void IOControl::delBlink( IOMap::iterator& io ) void IOControl::delBlink( IOInfo* io, BlinkList& lst )
{ {
for( BlinkList::iterator it=lstBlink.begin(); it!=lstBlink.end(); ++it ) for( BlinkList::iterator it=lstBlink.begin(); it!=lstBlink.end(); ++it )
{ {
if( (*it) == io ) if( (*it) == io )
{ {
lstBlink.erase(it); lst.erase(it);
return; return;
} }
} }
...@@ -858,16 +983,22 @@ void IOControl::check_testlamp() ...@@ -858,16 +983,22 @@ void IOControl::check_testlamp()
if( it->stype == UniversalIO::AnalogOutput ) if( it->stype == UniversalIO::AnalogOutput )
{ {
if( isTestLamp ) if( isTestLamp )
addBlink(it); addBlink( &(*it),lstBlink);
else if( it->value != lmpBLINK ) else if( it->value != lmpBLINK )
delBlink(it); {
delBlink(&(*it),lstBlink);
delBlink(&(*it),lstBlink2);
}
} }
else if( it->stype == UniversalIO::DigitalOutput ) else if( it->stype == UniversalIO::DigitalOutput )
{ {
if( isTestLamp ) if( isTestLamp )
addBlink(it); addBlink(&(*it),lstBlink);
else else
delBlink(it); {
delBlink(&(*it),lstBlink);
delBlink(&(*it),lstBlink2);
}
} }
} }
} }
...@@ -937,6 +1068,8 @@ void IOControl::help_print( int argc, const char* const* argv ) ...@@ -937,6 +1068,8 @@ void IOControl::help_print( int argc, const char* const* argv )
cout << "--io-s-filter-field - configure.xml " << endl; cout << "--io-s-filter-field - configure.xml " << endl;
cout << "--io-s-filter-value - " << endl; cout << "--io-s-filter-value - " << endl;
cout << "--io-blink-time msec - , . configure.xml" << endl; cout << "--io-blink-time msec - , . configure.xml" << endl;
cout << "--io-blink2-time msec - (lmpBLINK2), . configure.xml" << endl;
cout << "--io-blink3-time msec - (lmpBLINK3), . configure.xml" << endl;
cout << "--io-heartbeat-id - heartbeat-." << endl; cout << "--io-heartbeat-id - heartbeat-." << endl;
cout << "--io-heartbeat-max - heartbeat-ޣ . 10." << endl; cout << "--io-heartbeat-max - heartbeat-ޣ . 10." << endl;
cout << "--io-ready-timeout - SM , . (-1 - '')" << endl; cout << "--io-ready-timeout - SM , . (-1 - '')" << endl;
...@@ -1173,18 +1306,65 @@ void IOControl::sensorInfo( UniSetTypes::SensorMessage* sm ) ...@@ -1173,18 +1306,65 @@ void IOControl::sensorInfo( UniSetTypes::SensorMessage* sm )
switch( cur_val ) switch( cur_val )
{ {
case lmpOFF: case lmpOFF:
delBlink(it); delBlink(&(*it),lstBlink);
delBlink(&(*it),lstBlink2);
delBlink(&(*it),lstBlink3);
break; break;
case lmpON: case lmpON:
delBlink(it); delBlink(&(*it),lstBlink);
delBlink(&(*it),lstBlink2);
delBlink(&(*it),lstBlink3);
break; break;
case lmpBLINK: case lmpBLINK:
{ {
if( prev_val != lmpBLINK ) if( prev_val != lmpBLINK )
{ {
addBlink(it); delBlink(&(*it),lstBlink2);
delBlink(&(*it),lstBlink3);
addBlink(&(*it),lstBlink);
// ,
// ( )
if( it->ignore || it->subdev==DefaultSubdev || it->channel==DefaultChannel )
break;
ComediInterface* card = cards.getCard(it->ncard);
if( card != NULL )
card->setDigitalChannel(it->subdev,it->channel,1);
}
}
break;
case lmpBLINK2:
{
if( prev_val != lmpBLINK2 )
{
delBlink(&(*it),lstBlink);
delBlink(&(*it),lstBlink3);
addBlink(&(*it),lstBlink2);
// ,
// ( )
if( it->ignore || it->subdev==DefaultSubdev || it->channel==DefaultChannel )
break;
ComediInterface* card = cards.getCard(it->ncard);
if( card != NULL )
card->setDigitalChannel(it->subdev,it->channel,1);
}
}
break;
case lmpBLINK3:
{
if( prev_val != lmpBLINK3 )
{
delBlink(&(*it),lstBlink);
delBlink(&(*it),lstBlink2);
addBlink(&(*it),lstBlink3);
// , // ,
// ( ) // ( )
if( it->ignore || it->subdev==DefaultSubdev || it->channel==DefaultChannel ) if( it->ignore || it->subdev==DefaultSubdev || it->channel==DefaultChannel )
......
...@@ -114,13 +114,23 @@ class IOControl: ...@@ -114,13 +114,23 @@ class IOControl:
friend std::ostream& operator<<(std::ostream& os, IOInfo& inf ); friend std::ostream& operator<<(std::ostream& os, IOInfo& inf );
}; };
struct IOPriority
{
IOPriority(int p, int i):
priority(p),index(i){}
int priority;
int index;
};
void execute(); void execute();
protected: protected:
void iopoll(); /*!< / */ void iopoll(); /*!< / */
void blink(); void ioread( IOInfo* it );
void check_testlamp(); void check_testlamp();
void blink();
// //
virtual void processingMessage( UniSetTypes::VoidMessage* msg ); virtual void processingMessage( UniSetTypes::VoidMessage* msg );
...@@ -157,7 +167,12 @@ class IOControl: ...@@ -157,7 +167,12 @@ class IOControl:
typedef std::vector<IOInfo> IOMap; typedef std::vector<IOInfo> IOMap;
IOMap iomap; /*!< / */ IOMap iomap; /*!< / */
typedef std::list<IOPriority> PIOMap;
PIOMap pmap; /*!< / */
unsigned int maxItem; /*!< ( ) */ unsigned int maxItem; /*!< ( ) */
unsigned int maxHalf;
int filtersize; int filtersize;
float filterT; float filterT;
...@@ -168,13 +183,26 @@ class IOControl: ...@@ -168,13 +183,26 @@ class IOControl:
UniversalInterface ui; UniversalInterface ui;
UniSetTypes::ObjectId myid; UniSetTypes::ObjectId myid;
typedef std::list<IOMap::iterator> BlinkList; typedef std::list<IOInfo*> BlinkList;
void addBlink( IOInfo* it, BlinkList& lst );
void delBlink( IOInfo* it, BlinkList& lst );
void blink( BlinkList& lst, bool& bstate );
//
BlinkList lstBlink; BlinkList lstBlink;
PassiveTimer ptBlink; PassiveTimer ptBlink;
bool blink_state; bool blink_state;
void addBlink( IOMap::iterator& it ); //
void delBlink( IOMap::iterator& it ); BlinkList lstBlink2;
PassiveTimer ptBlink2;
bool blink2_state;
//
BlinkList lstBlink3;
PassiveTimer ptBlink3;
bool blink3_state;
UniSetTypes::ObjectId testLamp_S; UniSetTypes::ObjectId testLamp_S;
Trigger trTestLamp; Trigger trTestLamp;
......
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