Commit 55e4d73a authored by Pavel Vainerman's avatar Pavel Vainerman

(unet2): Исправил ошибки в обработке заказа датчиков.

parent 7b0a07d5
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
using namespace std; using namespace std;
using namespace UniSetTypes; using namespace UniSetTypes;
using namespace UniSetExtensions; using namespace UniSetExtensions;
// -----------------------------------------------------------------------------
UNetExchange::UNetExchange( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmId, SharedMemory* ic ): UNetExchange::UNetExchange( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmId, SharedMemory* ic ):
UniSetObject_LT(objId), UniSetObject_LT(objId),
shm(0), shm(0),
...@@ -17,7 +18,6 @@ sender(0) ...@@ -17,7 +18,6 @@ sender(0)
if( objId == DefaultObjectId ) if( objId == DefaultObjectId )
throw UniSetTypes::SystemError("(UNetExchange): objId=-1?!! Use --unet-name" ); throw UniSetTypes::SystemError("(UNetExchange): objId=-1?!! Use --unet-name" );
// xmlNode* cnode = conf->getNode(myname);
cnode = conf->getNode(myname); cnode = conf->getNode(myname);
if( cnode == NULL ) if( cnode == NULL )
throw UniSetTypes::SystemError("(UNetExchange): Not found conf-node for " + myname ); throw UniSetTypes::SystemError("(UNetExchange): Not found conf-node for " + myname );
...@@ -143,10 +143,6 @@ sender(0) ...@@ -143,10 +143,6 @@ sender(0)
dlog[Debug::INFO] << myname << "(init): test_id=" << test_id << endl; dlog[Debug::INFO] << myname << "(init): test_id=" << test_id << endl;
activateTimeout = conf->getArgPInt("--activate-timeout", 20000); activateTimeout = conf->getArgPInt("--activate-timeout", 20000);
timeout_t msec = conf->getArgPInt("--unet-timeout",it.getProp("timeout"), 3000);
dlog[Debug::INFO] << myname << "(init): udp-timeout=" << msec << " msec" << endl;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
UNetExchange::~UNetExchange() UNetExchange::~UNetExchange()
...@@ -176,12 +172,6 @@ void UNetExchange::startReceivers() ...@@ -176,12 +172,6 @@ void UNetExchange::startReceivers()
(*it)->start(); (*it)->start();
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void UNetExchange::initSender( const std::string s_host, const ost::tpport_t port, UniXML_iterator& it )
{
if( no_sender )
return;
}
// -----------------------------------------------------------------------------
void UNetExchange::waitSMReady() void UNetExchange::waitSMReady()
{ {
// waiting for SM is ready... // waiting for SM is ready...
...@@ -229,7 +219,7 @@ void UNetExchange::step() ...@@ -229,7 +219,7 @@ void UNetExchange::step()
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void UNetExchange::processingMessage(UniSetTypes::VoidMessage *msg) void UNetExchange::processingMessage( UniSetTypes::VoidMessage *msg )
{ {
try try
{ {
...@@ -272,7 +262,7 @@ void UNetExchange::processingMessage(UniSetTypes::VoidMessage *msg) ...@@ -272,7 +262,7 @@ void UNetExchange::processingMessage(UniSetTypes::VoidMessage *msg)
} }
catch(...) catch(...)
{ {
dlog[Debug::CRIT] << myname << "(processingMessage): catch ...\n"; dlog[Debug::CRIT] << myname << "(processingMessage): catch ..." << std::endl;
} }
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
...@@ -301,30 +291,32 @@ void UNetExchange::sysCommand( UniSetTypes::SystemMessage *sm ) ...@@ -301,30 +291,32 @@ void UNetExchange::sysCommand( UniSetTypes::SystemMessage *sm )
{ {
UniSetTypes::uniset_mutex_lock l(mutex_start, 10000); UniSetTypes::uniset_mutex_lock l(mutex_start, 10000);
askSensors(UniversalIO::UIONotify); if( shm->isLocalwork() )
askSensors(UniversalIO::UIONotify);
} }
askTimer(tmStep,steptime); askTimer(tmStep,steptime);
startReceivers(); startReceivers();
if( sender ) if( sender )
sender->start(); sender->start();
} }
break;
case SystemMessage::FoldUp: case SystemMessage::FoldUp:
case SystemMessage::Finish: case SystemMessage::Finish:
askSensors(UniversalIO::UIODontNotify); if( shm->isLocalwork() )
askSensors(UniversalIO::UIODontNotify);
break; break;
case SystemMessage::WatchDog: case SystemMessage::WatchDog:
{ {
// ОПТИМИЗАЦИЯ (защита от двойного перезаказа при старте) // ОПТИМИЗАЦИЯ (защита от двойного перезаказа при старте)
// Если идёт локальная работа // Если идёт автономная работа, то нужно заказывать датчики
// (т.е. UNetExchange запущен в одном процессе с SharedMemory2) // если запущены в одном процессе с SharedMemory2,
// то обрабатывать WatchDog не надо, т.к. мы и так ждём готовности SM // то обрабатывать WatchDog не надо, т.к. мы и так ждём готовности SM
// при заказе датчиков, а если SM вылетит, то вместе с этим процессом(UNetExchange) // при заказе датчиков, а если SM вылетит, то вместе с этим процессом(UNetExchange)
if( shm->isLocalwork() ) if( shm->isLocalwork() )
break; askSensors(UniversalIO::UIONotify);
askSensors(UniversalIO::UIONotify);
} }
break; break;
...@@ -375,7 +367,7 @@ void UNetExchange::askSensors( UniversalIO::UIOCommand cmd ) ...@@ -375,7 +367,7 @@ void UNetExchange::askSensors( UniversalIO::UIOCommand cmd )
void UNetExchange::sensorInfo( UniSetTypes::SensorMessage* sm ) void UNetExchange::sensorInfo( UniSetTypes::SensorMessage* sm )
{ {
if( sender ) if( sender )
sender->updateSensor(sm->id,sm->value); sender->updateSensor( sm->id , sm->value );
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
bool UNetExchange::activateObject() bool UNetExchange::activateObject()
...@@ -396,7 +388,7 @@ bool UNetExchange::activateObject() ...@@ -396,7 +388,7 @@ bool UNetExchange::activateObject()
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UNetExchange::sigterm( int signo ) void UNetExchange::sigterm( int signo )
{ {
cerr << myname << ": ********* SIGTERM(" << signo <<") ********" << endl; dlog[Debug::INFO] << myname << ": ********* SIGTERM(" << signo <<") ********" << endl;
activated = false; activated = false;
for( ReceiverList::iterator it=recvlist.begin(); it!=recvlist.end(); ++it ) for( ReceiverList::iterator it=recvlist.begin(); it!=recvlist.end(); ++it )
{ {
......
...@@ -84,7 +84,6 @@ class UNetExchange: ...@@ -84,7 +84,6 @@ class UNetExchange:
void initIterators(); void initIterators();
void startReceivers(); void startReceivers();
void initSender( const std::string host, const ost::tpport_t port, UniXML_iterator& it );
enum Timer enum Timer
{ {
......
...@@ -209,8 +209,8 @@ void UNetReceiver::real_update() ...@@ -209,8 +209,8 @@ void UNetReceiver::real_update()
shm->initDIterator(ii.dit); shm->initDIterator(ii.dit);
} }
if( d.id == 121 ) // if( d.id == 121 )
cerr << "****** save id=" << d.id << " val=" << d.val << endl; // cerr << "****** save id=" << d.id << " val=" << d.val << endl;
if( ii.iotype == UniversalIO::DigitalInput ) if( ii.iotype == UniversalIO::DigitalInput )
shm->localSaveState(ii.dit,d.id,d.val,shm->ID()); shm->localSaveState(ii.dit,d.id,d.val,shm->ID());
else if( ii.iotype == UniversalIO::AnalogInput ) else if( ii.iotype == UniversalIO::AnalogInput )
...@@ -315,6 +315,7 @@ bool UNetReceiver::recv() ...@@ -315,6 +315,7 @@ bool UNetReceiver::recv()
rnum = pack.msg.header.num; rnum = pack.msg.header.num;
#if 0
cerr << myname << "(receive): recv DATA OK. ret=" << ret << " sizeof=" << sz cerr << myname << "(receive): recv DATA OK. ret=" << ret << " sizeof=" << sz
<< " header: " << pack.msg.header << " header: " << pack.msg.header
<< " waitClean=" << waitClean << " waitClean=" << waitClean
...@@ -324,6 +325,7 @@ bool UNetReceiver::recv() ...@@ -324,6 +325,7 @@ bool UNetReceiver::recv()
UniSetUDP::UDPData& d = pack.msg.dat[i]; UniSetUDP::UDPData& d = pack.msg.dat[i];
cerr << "****** save id=" << d.id << " val=" << d.val << endl; cerr << "****** save id=" << d.id << " val=" << d.val << endl;
} }
#endif
{ // lock qpack { // lock qpack
uniset_mutex_lock l(packMutex,500); uniset_mutex_lock l(packMutex,500);
......
...@@ -97,6 +97,7 @@ void UNetSender::updateFromSM() ...@@ -97,6 +97,7 @@ void UNetSender::updateFromSM()
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void UNetSender::updateSensor( UniSetTypes::ObjectId id, long value ) void UNetSender::updateSensor( UniSetTypes::ObjectId id, long value )
{ {
// cerr << myname << ": UPDATE SENSOR id=" << id << " value=" << value << endl;
DMap::iterator it=dlist.begin(); DMap::iterator it=dlist.begin();
for( ; it!=dlist.end(); ++it ) for( ; it!=dlist.end(); ++it )
{ {
...@@ -110,7 +111,7 @@ void UNetSender::updateSensor( UniSetTypes::ObjectId id, long value ) ...@@ -110,7 +111,7 @@ void UNetSender::updateSensor( UniSetTypes::ObjectId id, long value )
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void UNetSender::updateItem( DMap::iterator& it, long value ) void UNetSender::updateItem( DMap::iterator& it, long value )
{ {
if( it != dlist.end() ) if( it == dlist.end() )
return; return;
UniSetTypes::uniset_mutex_lock l(pack_mutex,100); UniSetTypes::uniset_mutex_lock l(pack_mutex,100);
...@@ -139,25 +140,28 @@ void UNetSender::send() ...@@ -139,25 +140,28 @@ void UNetSender::send()
{ {
try try
{ {
if( !shm->isLocalwork() )
updateFromSM();
real_send(); real_send();
} }
catch( ost::SockException& e ) catch( ost::SockException& e )
{ {
cerr << myname << "(send): " << e.getString() << endl; dlog[Debug::WARN] << myname << "(send): " << e.getString() << endl;
} }
catch( UniSetTypes::Exception& ex) catch( UniSetTypes::Exception& ex)
{ {
cerr << myname << "(send): " << ex << std::endl; dlog[Debug::WARN] << myname << "(send): " << ex << std::endl;
} }
catch(...) catch(...)
{ {
cerr << myname << "(send): catch ..." << std::endl; dlog[Debug::WARN] << myname << "(send): catch ..." << std::endl;
} }
msleep(sendpause); msleep(sendpause);
} }
cerr << "************* execute FINISH **********" << endl; dlog[Debug::INFO] << "************* execute FINISH **********" << endl;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void UNetSender::real_send() void UNetSender::real_send()
...@@ -276,12 +280,6 @@ bool UNetSender::initItem( UniXML_iterator& it ) ...@@ -276,12 +280,6 @@ bool UNetSender::initItem( UniXML_iterator& it )
return false; return false;
} }
if( shm )
{
shm->initDIterator(p.dit);
shm->initAIterator(p.ait);
}
if( maxItem >= dlist.size() ) if( maxItem >= dlist.size() )
dlist.resize(maxItem+10); dlist.resize(maxItem+10);
......
...@@ -199,7 +199,8 @@ void IONotifyController::askState( const IOController_i::SensorInfo& si, ...@@ -199,7 +199,8 @@ void IONotifyController::askState( const IOController_i::SensorInfo& si,
// контроль заказа типа датчика(дискретного) здесь производится // контроль заказа типа датчика(дискретного) здесь производится
if( unideb.debugging(Debug::INFO) ) if( unideb.debugging(Debug::INFO) )
{ {
unideb[Debug::INFO] << "поступил заказ от " unideb[Debug::INFO] << "(askState): поступил " << ( cmd == UIODontNotify ? "отказ" :"заказ" )
<< " от "
<< conf->oind->getNameById(ci.id, ci.node) << " на дискретный датчик " << conf->oind->getNameById(ci.id, ci.node) << " на дискретный датчик "
<< conf->oind->getNameById(si.id,si.node) << endl; << conf->oind->getNameById(si.id,si.node) << endl;
} }
...@@ -284,7 +285,8 @@ void IONotifyController::askValue(const IOController_i::SensorInfo& si, ...@@ -284,7 +285,8 @@ void IONotifyController::askValue(const IOController_i::SensorInfo& si,
if( unideb.debugging(Debug::INFO) ) if( unideb.debugging(Debug::INFO) )
{ {
unideb[Debug::INFO] << "поступил заказ от "<< conf->oind->getNameById(ci.id, ci.node) unideb[Debug::INFO] << "(askValue): поступил " << ( cmd == UIODontNotify ? "отказ" :"заказ" ) << " от "
<< conf->oind->getNameById(ci.id, ci.node)
<< " на аналоговый датчик " << " на аналоговый датчик "
<< conf->oind->getNameById(si.id,si.node) << endl; << conf->oind->getNameById(si.id,si.node) << endl;
} }
...@@ -1082,7 +1084,8 @@ void IONotifyController::askOutput(const IOController_i::SensorInfo& si, ...@@ -1082,7 +1084,8 @@ void IONotifyController::askOutput(const IOController_i::SensorInfo& si,
string name = conf->oind->getNameById(ci.id, ci.node); string name = conf->oind->getNameById(ci.id, ci.node);
if( unideb.debugging(Debug::INFO) ) if( unideb.debugging(Debug::INFO) )
{ {
unideb[Debug::INFO] << "(askOutput): поступил заказ от ("<< ci.id << ") " unideb[Debug::INFO] << "(askOutput): поступил " << ( cmd == UIODontNotify ? "отказ" :"заказ" )
<< " от ("<< ci.id << ") "
<< name << " на выход " << name << " на выход "
<< conf->oind->getNameById(si.id,si.node) << endl; << conf->oind->getNameById(si.id,si.node) << endl;
} }
......
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