<commit_before>// -----------------------------------------------------------------------------
#include <cmath>
#include <sstream>
#include "Extensions.h"
#include "RTUExchange.h"
// -----------------------------------------------------------------------------
using namespace std;
using namespace UniSetTypes;
using namespace UniSetExtensions;
// -----------------------------------------------------------------------------
RTUExchange::RTUExchange( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmId, SharedMemory* ic,
						  const std::string prefix_ ):
MBExchange(objId,shmId,ic,prefix_),
mbrtu(0),
defSpeed(ComPort::ComSpeed0),
use485F(false),
transmitCtl(false),
rs_pre_clean(false)
{
	if( objId == DefaultObjectId )
		throw UniSetTypes::SystemError("(RTUExchange): objId=-1?!! Use --" + prefix + "-name" );

	// префикс для "свойств" - по умолчанию
	prop_prefix = "";
	// если задано поле для "фильтрации"
	// то в качестве префикса используем его
	if( !s_field.empty() )
		prop_prefix = s_field + "_";
	// если "принудительно" задан префикс
	// используем его.
	{
		string p("--" + prefix + "-set-prop-prefix");
		string v = conf->getArgParam(p,"");
		if( !v.empty() )
			prop_prefix = v;
		// если параметр всё-таки указан, считаем, что это попытка задать "пустой" префикс
		else if( findArgParam(p,conf->getArgc(),conf->getArgv()) != -1 )
			prop_prefix = "";
	}

	dlog[Debug::INFO] << myname << "(init): prop_prefix=" << prop_prefix << endl;

	UniXML_iterator it(cnode);

	// ---------- init RS ----------
	devname	= conf->getArgParam("--"+prefix+"-dev",it.getProp("device"));
	if( devname.empty() )
		throw UniSetTypes::SystemError(myname+"(RTUExchange): Unknown device..." );

	string speed = conf->getArgParam("--"+prefix+"-speed",it.getProp("speed"));
	if( speed.empty() )
		speed = "38400";

	use485F = conf->getArgInt("--"+prefix+"-use485F",it.getProp("use485F"));
	transmitCtl = conf->getArgInt("--"+prefix+"-transmit-ctl",it.getProp("transmitCtl"));
	defSpeed = ComPort::getSpeed(speed);

	sleepPause_usec = conf->getArgPInt("--" + prefix + "-sleepPause-usec",it.getProp("slepePause"), 100);

	rs_pre_clean = conf->getArgInt("--"+prefix+"-pre-clean",it.getProp("pre_clean"));
	if( shm->isLocalwork() )
	{
		readConfiguration();
		rtuQueryOptimization(rmap);
		initDeviceList();
	}
	else
		ic->addReadItem( sigc::mem_fun(this,&RTUExchange::readItem) );


	initMB(false);

	if( dlog.debugging(Debug::INFO) )
		printMap(rmap);
}
// -----------------------------------------------------------------------------
void RTUExchange::help_print( int argc, const char* const* argv )
{
	cout << "Default: prefix='rs'" << endl;
	MBExchange::help_print(argc,argv);
//	cout << " Настройки протокола RS: " << endl;
	cout << "--prefix-dev devname  - файл устройства" << endl;
	cout << "--prefix-speed        - Скорость обмена (9600,19920,38400,57600,115200)." << endl;
	cout << "--prefix-my-addr      - адрес текущего узла" << endl;
	cout << "--prefix-recv-timeout - Таймаут на ожидание ответа." << endl;
	cout << "--prefix-pre-clean    - Очищать буфер перед каждым запросом" << endl;
	cout << "--prefix-sleepPause-usec - Таймаут на ожидание очередного байта" << endl;
}
// -----------------------------------------------------------------------------
RTUExchange::~RTUExchange()
{
	delete mbrtu;
}
// -----------------------------------------------------------------------------
ModbusClient* RTUExchange::initMB( bool reopen )
{
	if( !file_exist(devname) )
	{
		if( mbrtu )
		{
			delete mbrtu;
			mb = 0;
			mbrtu = 0;
		}
		return mbrtu;
	}

	if( mbrtu )
	{
		if( !reopen )
			return mbrtu;

		delete mbrtu;
		mbrtu = 0;
		mb = 0;
	}

	try
	{
		mbrtu = new ModbusRTUMaster(devname,use485F,transmitCtl);

		if( defSpeed != ComPort::ComSpeed0 )
			mbrtu->setSpeed(defSpeed);

        if( dlog.debugging(Debug::LEVEL9) )
			mb->setLog(dlog);

		if( recv_timeout > 0 )
			mbrtu->setTimeout(recv_timeout);

		mbrtu->setSleepPause(sleepPause_usec);
<commit_msg>(ModbusRTU): исправление к предыдущему коммиту<commit_after>// -----------------------------------------------------------------------------
#include <cmath>
#include <sstream>
#include "Extensions.h"
#include "RTUExchange.h"
// -----------------------------------------------------------------------------
using namespace std;
using namespace UniSetTypes;
using namespace UniSetExtensions;
// -----------------------------------------------------------------------------
RTUExchange::RTUExchange( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmId, SharedMemory* ic,
						  const std::string prefix_ ):
MBExchange(objId,shmId,ic,prefix_),
mbrtu(0),
defSpeed(ComPort::ComSpeed0),
use485F(false),
transmitCtl(false),
rs_pre_clean(false)
{
	if( objId == DefaultObjectId )
		throw UniSetTypes::SystemError("(RTUExchange): objId=-1?!! Use --" + prefix + "-name" );

	// префикс для "свойств" - по умолчанию
	prop_prefix = "";
	// если задано поле для "фильтрации"
	// то в качестве префикса используем его
	if( !s_field.empty() )
		prop_prefix = s_field + "_";
	// если "принудительно" задан префикс
	// используем его.
	{
		string p("--" + prefix + "-set-prop-prefix");
		string v = conf->getArgParam(p,"");
		if( !v.empty() )
			prop_prefix = v;
		// если параметр всё-таки указан, считаем, что это попытка задать "пустой" префикс
		else if( findArgParam(p,conf->getArgc(),conf->getArgv()) != -1 )
			prop_prefix = "";
	}

	dlog[Debug::INFO] << myname << "(init): prop_prefix=" << prop_prefix << endl;

	UniXML_iterator it(cnode);

	// ---------- init RS ----------
	devname	= conf->getArgParam("--"+prefix+"-dev",it.getProp("device"));
	if( devname.empty() )
		throw UniSetTypes::SystemError(myname+"(RTUExchange): Unknown device..." );

	string speed = conf->getArgParam("--"+prefix+"-speed",it.getProp("speed"));
	if( speed.empty() )
		speed = "38400";

	use485F = conf->getArgInt("--"+prefix+"-use485F",it.getProp("use485F"));
	transmitCtl = conf->getArgInt("--"+prefix+"-transmit-ctl",it.getProp("transmitCtl"));
	defSpeed = ComPort::getSpeed(speed);

	sleepPause_usec = conf->getArgPInt("--" + prefix + "-sleepPause-usec",it.getProp("slepePause"), 100);

	rs_pre_clean = conf->getArgInt("--"+prefix+"-pre-clean",it.getProp("pre_clean"));
	if( shm->isLocalwork() )
	{
		readConfiguration();
		rtuQueryOptimization(rmap);
		initDeviceList();
	}
	else
		ic->addReadItem( sigc::mem_fun(this,&RTUExchange::readItem) );


	initMB(false);

	if( dlog.debugging(Debug::INFO) )
		printMap(rmap);
}
// -----------------------------------------------------------------------------
void RTUExchange::help_print( int argc, const char* const* argv )
{
	cout << "Default: prefix='rs'" << endl;
	MBExchange::help_print(argc,argv);
//	cout << " Настройки протокола RS: " << endl;
	cout << "--prefix-dev devname  - файл устройства" << endl;
	cout << "--prefix-speed        - Скорость обмена (9600,19920,38400,57600,115200)." << endl;
	cout << "--prefix-my-addr      - адрес текущего узла" << endl;
	cout << "--prefix-recv-timeout - Таймаут на ожидание ответа." << endl;
	cout << "--prefix-pre-clean    - Очищать буфер перед каждым запросом" << endl;
	cout << "--prefix-sleepPause-usec - Таймаут на ожидание очередного байта" << endl;
}
// -----------------------------------------------------------------------------
RTUExchange::~RTUExchange()
{
	delete mbrtu;
}
// -----------------------------------------------------------------------------
ModbusClient* RTUExchange::initMB( bool reopen )
{
	if( !file_exist(devname) )
	{
		if( mbrtu )
		{
			delete mbrtu;
			mb = 0;
			mbrtu = 0;
		}
		return mbrtu;
	}

	if( mbrtu )
	{
		if( !reopen )
			return mbrtu;

		delete mbrtu;
		mbrtu = 0;
		mb = 0;
	}

	try
	{
		mbrtu = new ModbusRTUMaster(devname,use485F,transmitCtl);

		if( defSpeed != ComPort::ComSpeed0 )
			mbrtu->setSpeed(defSpeed);

        if( dlog.debugging(Debug::LEVEL9) )
			mbrtu->setLog(dlog);

		if( recv_timeout > 0 )
			mbrtu->setTimeout(recv_timeout);

		mbrtu->setSleepPause(sleepPause_usec);

{'fraction_non_alphanumeric': 0.27738781649536226, 'fraction_numerical': 0.014790674354474806, 'mean_word_length': 2.4466522678185747, 'pattern_counts': {'":': 0, '<': 87, '<?xml version=': 0, '>': 39, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1995237', 'n_tokens_mistral': 3021, 'n_tokens_neox': 2855, 'n_words': 510}