Commit 844fa525 authored by Pavel Vainerman's avatar Pavel Vainerman

(unet2): Предварительная реализация "обновления" данных для посылки в сеть

parent 61c3f37f
...@@ -43,3 +43,14 @@ bool UDPMessage::addData( long id, long val) ...@@ -43,3 +43,14 @@ bool UDPMessage::addData( long id, long val)
return addData(d); return addData(d);
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
bool UDPMessage::setData( unsigned int index, long val )
{
if( index < MaxDataCount )
{
msg.dat[index].val = val;
return true;
}
return false;
}
// -----------------------------------------------------------------------------
...@@ -49,6 +49,7 @@ namespace UniSetUDP ...@@ -49,6 +49,7 @@ namespace UniSetUDP
bool addData( const UDPData& dat ); bool addData( const UDPData& dat );
bool addData( long id, long val ); bool addData( long id, long val );
bool setData( unsigned int index, long val );
inline bool isFull(){ return count<MaxDataCount; } inline bool isFull(){ return count<MaxDataCount; }
inline int size(){ return count; } inline int size(){ return count; }
......
...@@ -367,12 +367,15 @@ void UNetExchange::askSensors( UniversalIO::UIOCommand cmd ) ...@@ -367,12 +367,15 @@ void UNetExchange::askSensors( UniversalIO::UIOCommand cmd )
kill(SIGTERM,getpid()); // прерываем (перезапускаем) процесс... kill(SIGTERM,getpid()); // прерываем (перезапускаем) процесс...
throw SystemError(err.str()); throw SystemError(err.str());
} }
if( sender )
sender->askSensors(cmd);
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UNetExchange::sensorInfo( UniSetTypes::SensorMessage* sm ) void UNetExchange::sensorInfo( UniSetTypes::SensorMessage* sm )
{ {
if( sender ) if( sender )
sender->update(sm->id,sm->value); sender->updateSensor(sm->id,sm->value);
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
bool UNetExchange::activateObject() bool UNetExchange::activateObject()
...@@ -395,12 +398,30 @@ void UNetExchange::sigterm( int signo ) ...@@ -395,12 +398,30 @@ void UNetExchange::sigterm( int signo )
{ {
cerr << myname << ": ********* SIGTERM(" << signo <<") ********" << endl; cerr << myname << ": ********* SIGTERM(" << signo <<") ********" << endl;
activated = false; activated = false;
for( ReceiverList::iterator it=recvlist.begin(); it!=recvlist.end(); ++it )
{
try
{
(*it)->stop();
}
catch(...){}
}
try
{
if( sender )
sender->stop();
}
catch(...){}
UniSetObject_LT::sigterm(signo); UniSetObject_LT::sigterm(signo);
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UNetExchange::initIterators() void UNetExchange::initIterators()
{ {
shm->initAIterator(aitHeartBeat); shm->initAIterator(aitHeartBeat);
if( sender )
sender->initIterators();
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void UNetExchange::help_print( int argc, const char* argv[] ) void UNetExchange::help_print( int argc, const char* argv[] )
......
...@@ -209,6 +209,8 @@ void UNetReceiver::real_update() ...@@ -209,6 +209,8 @@ void UNetReceiver::real_update()
shm->initDIterator(ii.dit); shm->initDIterator(ii.dit);
} }
if( d.id == 121 )
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 )
...@@ -233,6 +235,14 @@ void UNetReceiver::real_update() ...@@ -233,6 +235,14 @@ void UNetReceiver::real_update()
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void UNetReceiver::stop()
{
activated = false;
// msleep(10);
// u_thr->stop();
// r_thr->stop();
}
// -----------------------------------------------------------------------------
void UNetReceiver::receive() void UNetReceiver::receive()
{ {
cout << myname << ": ******************* receive start" << endl; cout << myname << ": ******************* receive start" << endl;
...@@ -305,10 +315,15 @@ bool UNetReceiver::recv() ...@@ -305,10 +315,15 @@ bool UNetReceiver::recv()
rnum = pack.msg.header.num; rnum = pack.msg.header.num;
// 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
// << endl; << endl;
for( size_t i=0; i<pack.msg.header.dcount; i++ )
{
UniSetUDP::UDPData& d = pack.msg.dat[i];
cerr << "****** save id=" << d.id << " val=" << d.val << endl;
}
{ // lock qpack { // lock qpack
uniset_mutex_lock l(packMutex,500); uniset_mutex_lock l(packMutex,500);
......
...@@ -53,6 +53,7 @@ class UNetReceiver ...@@ -53,6 +53,7 @@ class UNetReceiver
~UNetReceiver(); ~UNetReceiver();
void start(); void start();
void stop();
void receive(); void receive();
void update(); void update();
......
...@@ -74,18 +74,47 @@ UNetSender::~UNetSender() ...@@ -74,18 +74,47 @@ UNetSender::~UNetSender()
delete shm; delete shm;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void UNetSender::update( UniSetTypes::ObjectId id, long value ) void UNetSender::updateFromSM()
{ {
DMap::iterator it=dlist.begin(); DMap::iterator it=dlist.begin();
for( ; it!=dlist.end(); ++it ) for( ; it!=dlist.end(); ++it )
{ {
if( it->si.id == id ) long value = 0;
if( it->iotype == UniversalIO::DigitalInput || it->iotype == UniversalIO::DigitalOutput )
value = shm->localGetState(it->dit,it->id) ? 1 : 0;
else if( it->iotype == UniversalIO::AnalogInput || it->iotype == UniversalIO::AnalogOutput )
value = shm->localGetValue(it->ait,it->id);
else
{ {
uniset_spin_lock lock(it->val_lock); dlog[Debug::CRIT] << myname << "(update): Unknown iotype for sid=" << it->id << endl;
it->val = value; continue;
} }
updateItem(it,value);
}
}
// -----------------------------------------------------------------------------
void UNetSender::updateSensor( UniSetTypes::ObjectId id, long value )
{
DMap::iterator it=dlist.begin();
for( ; it!=dlist.end(); ++it )
{
if( it->id == id )
{
updateItem( it, value );
break; break;
} }
}
}
// -----------------------------------------------------------------------------
void UNetSender::updateItem( DMap::iterator& it, long value )
{
if( it != dlist.end() )
return;
UniSetTypes::uniset_mutex_lock l(pack_mutex,100);
mypack.setData(it->pack_ind,value);
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void UNetSender::send() void UNetSender::send()
...@@ -133,6 +162,7 @@ void UNetSender::send() ...@@ -133,6 +162,7 @@ void UNetSender::send()
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void UNetSender::real_send() void UNetSender::real_send()
{ {
UniSetTypes::uniset_mutex_lock l(pack_mutex,300);
mypack.msg.header.num = packetnum++; mypack.msg.header.num = packetnum++;
if( packetnum > UniSetUDP::MaxPacketNum ) if( packetnum > UniSetUDP::MaxPacketNum )
...@@ -148,6 +178,12 @@ void UNetSender::real_send() ...@@ -148,6 +178,12 @@ void UNetSender::real_send()
dlog[Debug::CRIT] << myname << "(real_send): FAILED ret=" << ret << " < sizeof=" << sz << endl; dlog[Debug::CRIT] << myname << "(real_send): FAILED ret=" << ret << " < sizeof=" << sz << endl;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void UNetSender::stop()
{
activated = false;
// s_thr->stop();
}
// -----------------------------------------------------------------------------
void UNetSender::start() void UNetSender::start()
{ {
if( !activated ) if( !activated )
...@@ -229,10 +265,22 @@ bool UNetSender::initItem( UniXML_iterator& it ) ...@@ -229,10 +265,22 @@ bool UNetSender::initItem( UniXML_iterator& it )
} }
UItem p; UItem p;
p.si.id = sid; p.id = sid;
p.si.node = conf->getLocalNode();
mypack.addData(sid,0); mypack.addData(sid,0);
p.pack_ind = mypack.size()-1; p.pack_ind = mypack.size()-1;
p.iotype = UniSetTypes::getIOType(it.getProp("iotype"));
if( p.iotype == UniversalIO::UnknownIOType )
{
dlog[Debug::CRIT] << myname << "(update): Unknown iotype for sid=" << sid << endl;
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);
...@@ -247,6 +295,11 @@ bool UNetSender::initItem( UniXML_iterator& it ) ...@@ -247,6 +295,11 @@ bool UNetSender::initItem( UniXML_iterator& it )
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
std::ostream& operator<<( std::ostream& os, UNetSender::UItem& p )
{
return os << " sid=" << p.id;
}
// -----------------------------------------------------------------------------
void UNetSender::initIterators() void UNetSender::initIterators()
{ {
DMap::iterator it=dlist.begin(); DMap::iterator it=dlist.begin();
...@@ -257,8 +310,10 @@ void UNetSender::initIterators() ...@@ -257,8 +310,10 @@ void UNetSender::initIterators()
} }
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
std::ostream& operator<<( std::ostream& os, UNetSender::UItem& p ) void UNetSender::askSensors( UniversalIO::UIOCommand cmd )
{ {
return os << " sid=" << p.si.id; DMap::iterator it=dlist.begin();
for( ; it!=dlist.end(); it++ )
shm->askSensor(it->id,cmd);
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
...@@ -29,27 +29,44 @@ class UNetSender ...@@ -29,27 +29,44 @@ class UNetSender
struct UItem struct UItem
{ {
UItem(): UItem():
val(0) iotype(UniversalIO::UnknownIOType),
{} id(UniSetTypes::DefaultObjectId),
pack_ind(-1){}
IOController_i::SensorInfo si; UniversalIO::IOTypes iotype;
UniSetTypes::ObjectId id;
IOController::AIOStateList::iterator ait; IOController::AIOStateList::iterator ait;
IOController::DIOStateList::iterator dit; IOController::DIOStateList::iterator dit;
UniSetTypes::uniset_spin_mutex val_lock;
int pack_ind; int pack_ind;
long val;
friend std::ostream& operator<<( std::ostream& os, UItem& p ); friend std::ostream& operator<<( std::ostream& os, UItem& p );
}; };
typedef std::vector<UItem> DMap;
void start(); void start();
void stop();
void send(); void send();
void real_send(); void real_send();
void update( UniSetTypes::ObjectId id, long value );
/*! (принудительно) обновить все данные (из SM) */
void updateFromSM();
/*! Обновить значение по ID датчика */
void updateSensor( UniSetTypes::ObjectId id, long value );
/*! Обновить значение по итератору */
void updateItem( DMap::iterator& it, long value );
inline void setSendPause( int msec ){ sendpause = msec; } inline void setSendPause( int msec ){ sendpause = msec; }
/*! заказать датчики */
void askSensors( UniversalIO::UIOCommand cmd );
/*! инициализация итераторов */
void initIterators();
protected: protected:
std::string s_field; std::string s_field;
...@@ -57,7 +74,6 @@ class UNetSender ...@@ -57,7 +74,6 @@ class UNetSender
SMInterface* shm; SMInterface* shm;
void initIterators();
bool initItem( UniXML_iterator& it ); bool initItem( UniXML_iterator& it );
bool readItem( UniXML& xml, UniXML_iterator& it, xmlNode* sec ); bool readItem( UniXML& xml, UniXML_iterator& it, xmlNode* sec );
...@@ -76,8 +92,8 @@ class UNetSender ...@@ -76,8 +92,8 @@ class UNetSender
int sendpause; int sendpause;
bool activated; bool activated;
UniSetTypes::uniset_mutex pack_mutex;
UniSetUDP::UDPMessage mypack; UniSetUDP::UDPMessage mypack;
typedef std::vector<UItem> DMap;
DMap dlist; DMap dlist;
int maxItem; int maxItem;
unsigned long packetnum; unsigned long packetnum;
......
#include <sstream> #include <sstream>
#include <sys/wait.h>
#include "ObjectsActivator.h" #include "ObjectsActivator.h"
#include "Extensions.h" #include "Extensions.h"
#include "UNetExchange.h" #include "UNetExchange.h"
...@@ -68,6 +69,7 @@ int main( int argc, const char** argv ) ...@@ -68,6 +69,7 @@ int main( int argc, const char** argv )
dlog[Debug::ANY] << "(main): -------------- UDPReceiver START -------------------------\n\n"; dlog[Debug::ANY] << "(main): -------------- UDPReceiver START -------------------------\n\n";
act.run(false); act.run(false);
while (waitpid(-1, 0, 0));
} }
catch( Exception& ex ) catch( Exception& ex )
{ {
...@@ -84,5 +86,6 @@ int main( int argc, const char** argv ) ...@@ -84,5 +86,6 @@ int main( int argc, const char** argv )
dlog[Debug::CRIT] << "(unetexchange): catch ..." << std::endl; dlog[Debug::CRIT] << "(unetexchange): catch ..." << std::endl;
} }
while (waitpid(-1, 0, 0));
return 0; return 0;
} }
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