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

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

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