Commit 301b2370 authored by Pavel Vainerman's avatar Pavel Vainerman

(MessageTypes): для оптимизации работы IONotifyContoller в TransportMesasge

введено поле consumer. В тест SharedMemory добавлено тестирование заказа датчиков, механизма уведомления о старте SM
parent 796fd57c
...@@ -47,6 +47,7 @@ ...@@ -47,6 +47,7 @@
struct TransportMessage struct TransportMessage
{ {
RawDataOfTransportMessage data; RawDataOfTransportMessage data;
ObjectId consumer;
}; };
......
...@@ -50,7 +50,12 @@ SQL: ...@@ -50,7 +50,12 @@ SQL:
==== ====
- добавить работу с History (при передаче указателя на SM в конструкторе). - добавить работу с History (при передаче указателя на SM в конструкторе).
Version 2.1
Оптимизация
============
- сделать в TransportMessage поле consumer..
Version 2.5
============ ============
- smonit запись значений в файл (csv?,sqlite?) - smonit запись значений в файл (csv?,sqlite?)
- python: gui sensor monitor - python: gui sensor monitor
...@@ -63,6 +68,8 @@ Version 2.1 ...@@ -63,6 +68,8 @@ Version 2.1
version 3 version 3
========= =========
Перепроектировать классы [ObjectRepository, UInterface, ORepHelpers] с целью выработки абстрактного интерфейса Перепроектировать классы [ObjectRepository, UInterface, ORepHelpers] с целью выработки абстрактного интерфейса
......
...@@ -203,7 +203,7 @@ AC_SUBST(DOXYGEN) ...@@ -203,7 +203,7 @@ AC_SUBST(DOXYGEN)
AM_CONDITIONAL(HAVE_DOXYGEN, test x$DOXYGEN != x) AM_CONDITIONAL(HAVE_DOXYGEN, test x$DOXYGEN != x)
if test "x$UNISET_CODEGEN" = x ; then if test "x$UNISET_CODEGEN" = x ; then
UNISET_CODEGEN="sh \$(top_builddir)/Utilities/codegen/uniset-codegen --path \$(top_builddir)/Utilities/codegen/" UNISET_CODEGEN="sh \$(top_builddir)/Utilities/codegen/uniset2-codegen --path \$(top_builddir)/Utilities/codegen/"
fi fi
AC_SUBST(UNISET_CODEGEN) AC_SUBST(UNISET_CODEGEN)
echo "UNISET_CODEGEN: $UNISET_CODEGEN" echo "UNISET_CODEGEN: $UNISET_CODEGEN"
......
...@@ -528,16 +528,18 @@ void SharedMemory::readEventList( const std::string& oname ) ...@@ -528,16 +528,18 @@ void SharedMemory::readEventList( const std::string& oname )
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void SharedMemory::sendEvent( UniSetTypes::SystemMessage& sm ) void SharedMemory::sendEvent( UniSetTypes::SystemMessage& sm )
{ {
for( auto& it : elst ) TransportMessage tm(sm.transport_msg());
for( const auto& it : elst )
{ {
bool ok = false; bool ok = false;
sm.consumer = it; tm.consumer = it;
for( unsigned int i = 0; i < 2; i++ ) for( unsigned int i = 0; i < 2; i++ )
{ {
try try
{ {
ui->send(it, std::move(sm.transport_msg()) ); ui->send(it,tm);
ok = true; ok = true;
break; break;
} }
......
...@@ -2,7 +2,7 @@ if HAVE_TESTS ...@@ -2,7 +2,7 @@ if HAVE_TESTS
noinst_PROGRAMS = tests noinst_PROGRAMS = tests
tests_SOURCES = tests.cc NullSM.cc test_sm.cc tests_SOURCES = tests.cc NullSM.cc TestObject_SK.cc TestObject.cc test_sm.cc
tests_LDADD = $(top_builddir)/lib/libUniSet2.la $(top_builddir)/extensions/lib/libUniSet2Extensions.la \ tests_LDADD = $(top_builddir)/lib/libUniSet2.la $(top_builddir)/extensions/lib/libUniSet2Extensions.la \
$(top_builddir)/extensions/SharedMemory/libUniSet2SharedMemory.la \ $(top_builddir)/extensions/SharedMemory/libUniSet2SharedMemory.la \
$(SIGC_LIBS) $(COMCPP_LIBS) $(SIGC_LIBS) $(COMCPP_LIBS)
...@@ -18,6 +18,9 @@ clean-local: ...@@ -18,6 +18,9 @@ clean-local:
rm -rf $(CLEANFILES) rm -rf $(CLEANFILES)
rm -rf $(COVERAGE_REPORT_DIR) rm -rf $(COVERAGE_REPORT_DIR)
TestObject_SK.cc TestObject.h: testobject.src.xml
$(UNISET_CODEGEN) -l $(top_builddir)/Utilities/codegen -n TestObject --topdir $(top_builddir)/ --ask --no-main testobject.src.xml
include $(top_builddir)/include.mk include $(top_builddir)/include.mk
endif endif
// -----------------------------------------------------------------------------
#include "TestObject.h"
// -----------------------------------------------------------------------------
using namespace std;
using namespace UniSetTypes;
// -----------------------------------------------------------------------------
TestObject::TestObject( UniSetTypes::ObjectId objId, xmlNode* cnode ):
TestObject_SK(objId, cnode)
{
}
// -----------------------------------------------------------------------------
TestObject::~TestObject()
{
}
// -----------------------------------------------------------------------------
void TestObject::askDoNotNotify()
{
preAskSensors(UniversalIO::UIODontNotify);
}
// -----------------------------------------------------------------------------
void TestObject::askNotifyChange()
{
preAskSensors(UniversalIO::UIONotifyChange);
}
// -----------------------------------------------------------------------------
void TestObject::askNotifyFirstNotNull()
{
preAskSensors(UniversalIO::UIONotifyFirstNotNull);
}
// -----------------------------------------------------------------------------
void TestObject::sysCommand( const UniSetTypes::SystemMessage* sm )
{
// фиксируем что SM прислала WDT при своём запуске
if( sm->command == SystemMessage::WatchDog )
evntIsOK = true;
}
// -----------------------------------------------------------------------------
#ifndef _TestObject_H_
#define _TestObject_H_
// -----------------------------------------------------------------------------
#include "TestObject_SK.h"
// -----------------------------------------------------------------------------
class TestObject:
public TestObject_SK
{
public:
TestObject( UniSetTypes::ObjectId objId, xmlNode* cnode );
virtual ~TestObject();
void askDoNotNotify();
void askNotifyChange();
void askNotifyFirstNotNull();
inline bool getEvnt(){ return evntIsOK; }
protected:
TestObject();
virtual void sysCommand( const UniSetTypes::SystemMessage* sm ) override;
private:
bool evntIsOK = { false };
};
// -----------------------------------------------------------------------------
#endif // _TestObject_H_
// -----------------------------------------------------------------------------
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
<item node="localhost" name="ReservSharedMemory"/> <item node="localhost" name="ReservSharedMemory"/>
</ReservList> </ReservList>
</SharedMemory> </SharedMemory>
<TestObject name="TestObject" sensor_s="DI2_S" output_c="AO2_C"/>
</settings> </settings>
<ObjectsMap idfromfile="1"> <ObjectsMap idfromfile="1">
<nodes port="2809" unet_broadcast_ip="192.168.1.255" unet_broadcast_ip2="192.168.122.255"> <nodes port="2809" unet_broadcast_ip="192.168.1.255" unet_broadcast_ip2="192.168.122.255">
...@@ -45,6 +46,9 @@ ...@@ -45,6 +46,9 @@
<item id="505" iotype="DI" name="Pulsar_S" priority="Medium" textname="pulsar"/> <item id="505" iotype="DI" name="Pulsar_S" priority="Medium" textname="pulsar"/>
<item heartbeat="1" heartbeat_ds_name="Heartbeat_S" heartbeat_node="localhost" id="506" iotype="AI" name="Heart_Counter_AS" textname="Heartbeat counter"/> <item heartbeat="1" heartbeat_ds_name="Heartbeat_S" heartbeat_node="localhost" id="506" iotype="AI" name="Heart_Counter_AS" textname="Heartbeat counter"/>
<item id="507" iotype="DI" name="Heartbeat_S" textname="Heartbeat"/> <item id="507" iotype="DI" name="Heartbeat_S" textname="Heartbeat"/>
<item id="508" iotype="AI" name="AO2_C" priority="Medium" textname="TestObject test"/>
<item id="509" iotype="DI" name="DI2_S" priority="Medium" textname="TestObject test"/>
</sensors> </sensors>
<thresholds name="thresholds"> <thresholds name="thresholds">
<sensor iotype="AI" name="AI1_AS"> <sensor iotype="AI" name="AI1_AS">
...@@ -68,6 +72,7 @@ ...@@ -68,6 +72,7 @@
<!-- ******************* Идентификаторы объектов ***************** --> <!-- ******************* Идентификаторы объектов ***************** -->
<objects name="UniObjects"> <objects name="UniObjects">
<item id="6000" name="TestProc"/> <item id="6000" name="TestProc"/>
<item id="6001" name="TestObject" evnt_test="1"/>
</objects> </objects>
</ObjectsMap> </ObjectsMap>
<messages idfromfile="1" name="messages"> <messages idfromfile="1" name="messages">
......
...@@ -3,23 +3,27 @@ ...@@ -3,23 +3,27 @@
#include <memory> #include <memory>
#include "UniSetTypes.h" #include "UniSetTypes.h"
#include "UInterface.h" #include "UInterface.h"
#include "TestObject.h"
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
using namespace std; using namespace std;
using namespace UniSetTypes; using namespace UniSetTypes;
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
static shared_ptr<UInterface> ui; static shared_ptr<UInterface> ui;
extern shared_ptr<TestObject> obj;
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void InitTest() void InitTest()
{ {
auto conf = uniset_conf(); auto conf = uniset_conf();
CHECK( conf != nullptr ); REQUIRE( conf != nullptr );
if( !ui ) if( !ui )
{ {
ui = make_shared<UInterface>(); ui = make_shared<UInterface>();
CHECK( ui->getObjectIndex() != nullptr ); REQUIRE( ui->getObjectIndex() != nullptr );
CHECK( ui->getConf() == conf ); REQUIRE( ui->getConf() == conf );
} }
REQUIRE( obj != nullptr );
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
/* /*
...@@ -93,3 +97,64 @@ TEST_CASE("[SM]: heartbeat", "[sm][heartbeat]") ...@@ -93,3 +97,64 @@ TEST_CASE("[SM]: heartbeat", "[sm][heartbeat]")
CHECK( ui->getValue(507) ); CHECK( ui->getValue(507) );
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
TEST_CASE("[SM]: event", "[sm][event]")
{
// SM при старте должна была прислать..
// здесь просто проверяем
CHECK( obj->getEvnt() );
}
// -----------------------------------------------------------------------------
TEST_CASE("[SM]: askSensors", "[sm][ask]")
{
InitTest();
ui->setValue(509, 1);
msleep(200);
CHECK( obj->in_sensor_s );
ui->setValue(509, 0);
msleep(200);
CHECK_FALSE( obj->in_sensor_s );
obj->out_output_c = 1200;
msleep(200);
REQUIRE( ui->getValue(508) == 1200 );
obj->out_output_c = 100;
msleep(200);
REQUIRE( ui->getValue(508) == 100 );
}
// -----------------------------------------------------------------------------
TEST_CASE("[SM]: askDoNotNotify", "[sm][ask]")
{
InitTest();
ui->setValue(509, 1);
msleep(200);
CHECK( obj->in_sensor_s );
obj->askDoNotNotify();
ui->setValue(509, 0); // !!
msleep(200);
CHECK( obj->in_sensor_s ); //не поменялось значение
obj->askNotifyChange();
msleep(200);
CHECK( obj->in_sensor_s ); // не менялось..
ui->setValue(509, 1);
msleep(200);
CHECK( obj->in_sensor_s );
ui->setValue(509, 0);
msleep(200);
CHECK_FALSE( obj->in_sensor_s );
obj->askDoNotNotify();
ui->setValue(509, 1);
msleep(200);
CHECK_FALSE( obj->in_sensor_s );
obj->askNotifyFirstNotNull();
msleep(200);
CHECK( obj->in_sensor_s ); // должно придти т.к. равно "1"
}
// -----------------------------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<Cell>
<settings>
<set name="class-name" val="TestObject"/>
<set name="msg-count" val="30"/>
<set name="sleep-msec" val="150"/>
</settings>
<variables>
</variables>
<smap>
<item name="sensor_s" vartype="in" iotype="DI" comment="Test input"/>
<item name="output_c" vartype="out" iotype="AO" comment="Test output"/>
</smap>
<msgmap>
</msgmap>
</Cell>
...@@ -8,11 +8,14 @@ ...@@ -8,11 +8,14 @@
#include "SharedMemory.h" #include "SharedMemory.h"
#include "Extensions.h" #include "Extensions.h"
#include "NullSM.h" #include "NullSM.h"
#include "TestObject.h"
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
using namespace std; using namespace std;
using namespace UniSetTypes; using namespace UniSetTypes;
using namespace UniSetExtensions; using namespace UniSetExtensions;
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
std::shared_ptr<TestObject> obj;
// --------------------------------------------------------------------------
int main(int argc, char* argv[] ) int main(int argc, char* argv[] )
{ {
Catch::Session session; Catch::Session session;
...@@ -52,6 +55,19 @@ int main(int argc, char* argv[] ) ...@@ -52,6 +55,19 @@ int main(int argc, char* argv[] )
return 1; return 1;
} }
ObjectId o_id = conf->getObjectID("TestObject");
if( o_id == DefaultObjectId )
{
cerr << "Not found ID for 'TestObject'" << endl;
return 1;
}
xmlNode* o_node = conf->getNode("TestObject");
obj = make_shared<TestObject>(o_id,o_node);
act->add(obj);
auto nullsm = make_shared<NullSM>(ns_id, "reserv-sm-configure.xml"); auto nullsm = make_shared<NullSM>(ns_id, "reserv-sm-configure.xml");
act->add(nullsm); act->add(nullsm);
......
...@@ -7,6 +7,6 @@ ...@@ -7,6 +7,6 @@
./uniset2-start.sh -f ./uniset2-admin --confile ./reserv-sm-configure.xml --exist | grep -q UNISET_SM/Controllers || exit 1 ./uniset2-start.sh -f ./uniset2-admin --confile ./reserv-sm-configure.xml --exist | grep -q UNISET_SM/Controllers || exit 1
./uniset2-start.sh -f ./tests $* -- --confile ./sm-configure.xml --pulsar-id Pulsar_S --pulsar-msec 1000 \ ./uniset2-start.sh -f ./tests $* -- --confile ./sm-configure.xml --pulsar-id Pulsar_S --pulsar-msec 1000 --e-filter evnt_test \
--heartbeat-node localhost --heartbeat-check-time 1000 --heartbeat-node localhost --heartbeat-check-time 1000
#--dlog-add-levels any #--dlog-add-levels any
...@@ -80,6 +80,7 @@ namespace UniSetTypes ...@@ -80,6 +80,7 @@ namespace UniSetTypes
TransportMessage tmsg; TransportMessage tmsg;
assert(sizeof(UniSetTypes::RawDataOfTransportMessage) >= sizeof(msg)); assert(sizeof(UniSetTypes::RawDataOfTransportMessage) >= sizeof(msg));
std::memcpy(&tmsg.data, &msg, sizeof(msg)); std::memcpy(&tmsg.data, &msg, sizeof(msg));
tmsg.consumer = msg.consumer;
return std::move(tmsg); return std::move(tmsg);
} }
}; };
......
...@@ -379,7 +379,8 @@ void IONotifyController::localSetValue( IOController::IOStateList::iterator& li, ...@@ -379,7 +379,8 @@ void IONotifyController::localSetValue( IOController::IOStateList::iterator& li,
*/ */
void IONotifyController::send( ConsumerListInfo& lst, UniSetTypes::SensorMessage& sm ) void IONotifyController::send( ConsumerListInfo& lst, UniSetTypes::SensorMessage& sm )
{ {
TransportMessage tmsg; TransportMessage tmsg(sm.transport_msg());
uniset_rwmutex_wrlock l(lst.mut); uniset_rwmutex_wrlock l(lst.mut);
for( auto li = lst.clst.begin(); li != lst.clst.end(); ++li ) for( auto li = lst.clst.begin(); li != lst.clst.end(); ++li )
...@@ -394,16 +395,8 @@ void IONotifyController::send( ConsumerListInfo& lst, UniSetTypes::SensorMessage ...@@ -394,16 +395,8 @@ void IONotifyController::send( ConsumerListInfo& lst, UniSetTypes::SensorMessage
li->ref = UniSetObject_i::_narrow(op); li->ref = UniSetObject_i::_narrow(op);
} }
sm.consumer = li->id; tmsg.consumer = li->id;
// Для оптимизации, чтобы избежать лишее копирование и создание TransportMessage
// не используем sm.transport_msg()
// а формируем TransportMessage самостоятельно..
assert(sizeof(UniSetTypes::RawDataOfTransportMessage) >= sizeof(sm));
std::memcpy(&tmsg.data, &sm, sizeof(sm));
li->ref->push( tmsg ); li->ref->push( tmsg );
li->attempt = maxAttemtps; // reinit attempts li->attempt = maxAttemtps; // reinit attempts
break; break;
} }
......
...@@ -82,6 +82,7 @@ namespace UniSetTypes ...@@ -82,6 +82,7 @@ namespace UniSetTypes
{ {
assert(sizeof(VoidMessage) >= sizeof(UniSetTypes::RawDataOfTransportMessage)); assert(sizeof(VoidMessage) >= sizeof(UniSetTypes::RawDataOfTransportMessage));
memcpy(this, &tm.data, sizeof(tm.data)); memcpy(this, &tm.data, sizeof(tm.data));
consumer = tm.consumer;
} }
VoidMessage::VoidMessage() VoidMessage::VoidMessage()
......
...@@ -164,6 +164,9 @@ extensions/SharedMemory/tests/test_sm.cc ...@@ -164,6 +164,9 @@ extensions/SharedMemory/tests/test_sm.cc
extensions/SharedMemory/tests/tests.cc extensions/SharedMemory/tests/tests.cc
extensions/SharedMemory/tests/NullSM.cc extensions/SharedMemory/tests/NullSM.cc
extensions/SharedMemory/tests/NullSM.h extensions/SharedMemory/tests/NullSM.h
extensions/SharedMemory/tests/TestObject.cc
extensions/SharedMemory/tests/TestObject.h
extensions/SharedMemory/tests/testobject.src.xml
extensions/SharedMemoryPlus/Makefile.am extensions/SharedMemoryPlus/Makefile.am
extensions/SharedMemoryPlus/smemory-plus.cc extensions/SharedMemoryPlus/smemory-plus.cc
extensions/SharedMemoryPlus/test.xml extensions/SharedMemoryPlus/test.xml
......
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