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

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

введено поле consumer. В тест SharedMemory добавлено тестирование заказа датчиков, механизма уведомления о старте SM
parent 796fd57c
......@@ -47,6 +47,7 @@
struct TransportMessage
{
RawDataOfTransportMessage data;
ObjectId consumer;
};
......
......@@ -50,7 +50,12 @@ SQL:
====
- добавить работу с History (при передаче указателя на SM в конструкторе).
Version 2.1
Оптимизация
============
- сделать в TransportMessage поле consumer..
Version 2.5
============
- smonit запись значений в файл (csv?,sqlite?)
- python: gui sensor monitor
......@@ -63,6 +68,8 @@ Version 2.1
version 3
=========
Перепроектировать классы [ObjectRepository, UInterface, ORepHelpers] с целью выработки абстрактного интерфейса
......
......@@ -203,7 +203,7 @@ AC_SUBST(DOXYGEN)
AM_CONDITIONAL(HAVE_DOXYGEN, test x$DOXYGEN != x)
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
AC_SUBST(UNISET_CODEGEN)
echo "UNISET_CODEGEN: $UNISET_CODEGEN"
......
......@@ -528,16 +528,18 @@ void SharedMemory::readEventList( const std::string& oname )
// -----------------------------------------------------------------------------
void SharedMemory::sendEvent( UniSetTypes::SystemMessage& sm )
{
for( auto& it : elst )
TransportMessage tm(sm.transport_msg());
for( const auto& it : elst )
{
bool ok = false;
sm.consumer = it;
tm.consumer = it;
for( unsigned int i = 0; i < 2; i++ )
{
try
{
ui->send(it, std::move(sm.transport_msg()) );
ui->send(it,tm);
ok = true;
break;
}
......
......@@ -2,7 +2,7 @@ if HAVE_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 \
$(top_builddir)/extensions/SharedMemory/libUniSet2SharedMemory.la \
$(SIGC_LIBS) $(COMCPP_LIBS)
......@@ -18,6 +18,9 @@ clean-local:
rm -rf $(CLEANFILES)
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
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 @@
<item node="localhost" name="ReservSharedMemory"/>
</ReservList>
</SharedMemory>
<TestObject name="TestObject" sensor_s="DI2_S" output_c="AO2_C"/>
</settings>
<ObjectsMap idfromfile="1">
<nodes port="2809" unet_broadcast_ip="192.168.1.255" unet_broadcast_ip2="192.168.122.255">
......@@ -45,6 +46,9 @@
<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 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>
<thresholds name="thresholds">
<sensor iotype="AI" name="AI1_AS">
......@@ -68,6 +72,7 @@
<!-- ******************* Идентификаторы объектов ***************** -->
<objects name="UniObjects">
<item id="6000" name="TestProc"/>
<item id="6001" name="TestObject" evnt_test="1"/>
</objects>
</ObjectsMap>
<messages idfromfile="1" name="messages">
......
......@@ -3,23 +3,27 @@
#include <memory>
#include "UniSetTypes.h"
#include "UInterface.h"
#include "TestObject.h"
// -----------------------------------------------------------------------------
using namespace std;
using namespace UniSetTypes;
// -----------------------------------------------------------------------------
static shared_ptr<UInterface> ui;
extern shared_ptr<TestObject> obj;
// -----------------------------------------------------------------------------
void InitTest()
{
auto conf = uniset_conf();
CHECK( conf != nullptr );
REQUIRE( conf != nullptr );
if( !ui )
{
ui = make_shared<UInterface>();
CHECK( ui->getObjectIndex() != nullptr );
CHECK( ui->getConf() == conf );
REQUIRE( ui->getObjectIndex() != nullptr );
REQUIRE( ui->getConf() == conf );
}
REQUIRE( obj != nullptr );
}
// -----------------------------------------------------------------------------
/*
......@@ -93,3 +97,64 @@ TEST_CASE("[SM]: heartbeat", "[sm][heartbeat]")
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 @@
#include "SharedMemory.h"
#include "Extensions.h"
#include "NullSM.h"
#include "TestObject.h"
// --------------------------------------------------------------------------
using namespace std;
using namespace UniSetTypes;
using namespace UniSetExtensions;
// --------------------------------------------------------------------------
std::shared_ptr<TestObject> obj;
// --------------------------------------------------------------------------
int main(int argc, char* argv[] )
{
Catch::Session session;
......@@ -52,6 +55,19 @@ int main(int argc, char* argv[] )
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");
act->add(nullsm);
......
......@@ -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 ./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
#--dlog-add-levels any
......@@ -80,6 +80,7 @@ namespace UniSetTypes
TransportMessage tmsg;
assert(sizeof(UniSetTypes::RawDataOfTransportMessage) >= sizeof(msg));
std::memcpy(&tmsg.data, &msg, sizeof(msg));
tmsg.consumer = msg.consumer;
return std::move(tmsg);
}
};
......
......@@ -379,7 +379,8 @@ void IONotifyController::localSetValue( IOController::IOStateList::iterator& li,
*/
void IONotifyController::send( ConsumerListInfo& lst, UniSetTypes::SensorMessage& sm )
{
TransportMessage tmsg;
TransportMessage tmsg(sm.transport_msg());
uniset_rwmutex_wrlock l(lst.mut);
for( auto li = lst.clst.begin(); li != lst.clst.end(); ++li )
......@@ -394,16 +395,8 @@ void IONotifyController::send( ConsumerListInfo& lst, UniSetTypes::SensorMessage
li->ref = UniSetObject_i::_narrow(op);
}
sm.consumer = li->id;
// Для оптимизации, чтобы избежать лишее копирование и создание TransportMessage
// не используем sm.transport_msg()
// а формируем TransportMessage самостоятельно..
assert(sizeof(UniSetTypes::RawDataOfTransportMessage) >= sizeof(sm));
std::memcpy(&tmsg.data, &sm, sizeof(sm));
tmsg.consumer = li->id;
li->ref->push( tmsg );
li->attempt = maxAttemtps; // reinit attempts
break;
}
......
......@@ -82,6 +82,7 @@ namespace UniSetTypes
{
assert(sizeof(VoidMessage) >= sizeof(UniSetTypes::RawDataOfTransportMessage));
memcpy(this, &tm.data, sizeof(tm.data));
consumer = tm.consumer;
}
VoidMessage::VoidMessage()
......
......@@ -164,6 +164,9 @@ extensions/SharedMemory/tests/test_sm.cc
extensions/SharedMemory/tests/tests.cc
extensions/SharedMemory/tests/NullSM.cc
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/smemory-plus.cc
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