threadedRead now const uchar *
pipacketextractor Header mode now more flexible fix splitTime mode more refactoring add virtual override to functions remove piforeach replace 0 to nullptr iterate over pimap via iterators replace CONNECTU to CONNECT# with compile time check
This commit is contained in:
@@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.0)
|
|||||||
cmake_policy(SET CMP0017 NEW) # need include() with .cmake
|
cmake_policy(SET CMP0017 NEW) # need include() with .cmake
|
||||||
project(pip)
|
project(pip)
|
||||||
set(pip_MAJOR 2)
|
set(pip_MAJOR 2)
|
||||||
set(pip_MINOR 95)
|
set(pip_MINOR 96)
|
||||||
set(pip_REVISION 0)
|
set(pip_REVISION 0)
|
||||||
set(pip_SUFFIX )
|
set(pip_SUFFIX )
|
||||||
set(pip_COMPANY SHS)
|
set(pip_COMPANY SHS)
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ PICloudClient::PICloudClient(const PIString & path, PIIODevice::DeviceMode mode)
|
|||||||
is_deleted = false;
|
is_deleted = false;
|
||||||
// setReopenEnabled(false);
|
// setReopenEnabled(false);
|
||||||
CONNECTL(ð, connected, [this](){opened_ = true; tcp.sendStart();});
|
CONNECTL(ð, connected, [this](){opened_ = true; tcp.sendStart();});
|
||||||
CONNECTU(&streampacker, packetReceiveEvent, this, _readed);
|
CONNECT1(void, PIByteArray, &streampacker, packetReceiveEvent, this, _readed);
|
||||||
CONNECTL(ð, disconnected, [this](bool){
|
CONNECTL(ð, disconnected, [this](bool){
|
||||||
if (is_deleted) return;
|
if (is_deleted) return;
|
||||||
bool need_disconn = is_connected;
|
bool need_disconn = is_connected;
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ PICloudServer::PICloudServer(const PIString & path, PIIODevice::DeviceMode mode)
|
|||||||
tcp.setRole(PICloud::TCP::Server);
|
tcp.setRole(PICloud::TCP::Server);
|
||||||
tcp.setServerName(server_name);
|
tcp.setServerName(server_name);
|
||||||
setName("cloud_server__" + server_name);
|
setName("cloud_server__" + server_name);
|
||||||
CONNECTU(&streampacker, packetReceiveEvent, this, _readed);
|
CONNECT1(void, PIByteArray, &streampacker, packetReceiveEvent, this, _readed);
|
||||||
CONNECTL(ð, connected, [this](){opened_ = true; piCoutObj << "connected"; tcp.sendStart();});
|
CONNECTL(ð, connected, [this](){opened_ = true; piCoutObj << "connected"; tcp.sendStart();});
|
||||||
CONNECTL(ð, disconnected, [this](bool){
|
CONNECTL(ð, disconnected, [this](bool){
|
||||||
piCoutObj << "disconnected";
|
piCoutObj << "disconnected";
|
||||||
@@ -189,7 +189,7 @@ void PICloudServer::_readed(PIByteArray & ba) {
|
|||||||
} else {
|
} else {
|
||||||
//piCoutObj << "new Client" << id;
|
//piCoutObj << "new Client" << id;
|
||||||
Client * c = new Client(this, id);
|
Client * c = new Client(this, id);
|
||||||
CONNECTU(c, deleted, this, clientDeleted);
|
CONNECT1(void, PIObject *, c, deleted, this, clientDeleted);
|
||||||
clients_mutex.lock();
|
clients_mutex.lock();
|
||||||
clients_ << c;
|
clients_ << c;
|
||||||
index_clients.insert(id, c);
|
index_clients.insert(id, c);
|
||||||
|
|||||||
@@ -392,18 +392,17 @@ PIScreen::PIScreen(bool startNow, PIKbdListener::KBFunc slot): PIThread(), drawe
|
|||||||
needLockRun(true);
|
needLockRun(true);
|
||||||
mouse_ = false;
|
mouse_ = false;
|
||||||
ret_func = slot;
|
ret_func = slot;
|
||||||
tile_focus = tile_dialog = 0;
|
tile_focus = tile_dialog = nullptr;
|
||||||
root.screen = this;
|
root.screen = this;
|
||||||
listener = new PIKbdListener(key_eventS, this, startNow);
|
listener = new PIKbdListener(key_eventS, this, startNow);
|
||||||
CONNECTU(listener, mouseEvent, this, mouse_event);
|
CONNECT1(void, PIKbdListener::MouseEvent, listener, mouseEvent, this, mouse_event);
|
||||||
CONNECTU(listener, wheelEvent, this, wheel_event);
|
CONNECT1(void, PIKbdListener::WheelEvent, listener, wheelEvent, this, wheel_event);
|
||||||
if (startNow) start();
|
if (startNow) start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PIScreen::~PIScreen() {
|
PIScreen::~PIScreen() {
|
||||||
if (isRunning())
|
if (isRunning()) stop();
|
||||||
stop();
|
|
||||||
PIThread::waitForFinish(10);
|
PIThread::waitForFinish(10);
|
||||||
listener->waitForFinish(10);
|
listener->waitForFinish(10);
|
||||||
delete listener;
|
delete listener;
|
||||||
|
|||||||
@@ -151,7 +151,7 @@ void PIBroadcast::initAll(PIVector<PIEthernet::Address> al) {
|
|||||||
//piCout << "mcast " << ce->readAddress() << ce->sendAddress();
|
//piCout << "mcast " << ce->readAddress() << ce->sendAddress();
|
||||||
if (ce->open()) {
|
if (ce->open()) {
|
||||||
eth_mcast << ce;
|
eth_mcast << ce;
|
||||||
CONNECTU(ce, threadedReadEvent, this, mcastRead);
|
CONNECT2(void, const uchar *, int, ce, threadedReadEvent, this, mcastRead);
|
||||||
} else {
|
} else {
|
||||||
delete ce;
|
delete ce;
|
||||||
}
|
}
|
||||||
@@ -173,7 +173,7 @@ void PIBroadcast::initAll(PIVector<PIEthernet::Address> al) {
|
|||||||
//piCout << "bcast " << ce->readAddress() << ce->sendAddress();
|
//piCout << "bcast " << ce->readAddress() << ce->sendAddress();
|
||||||
if (ce->open()) {
|
if (ce->open()) {
|
||||||
eth_mcast << ce;
|
eth_mcast << ce;
|
||||||
CONNECTU(ce, threadedReadEvent, this, mcastRead);
|
CONNECT2(void, const uchar *, int, ce, threadedReadEvent, this, mcastRead);
|
||||||
} else {
|
} else {
|
||||||
delete ce;
|
delete ce;
|
||||||
}
|
}
|
||||||
@@ -189,7 +189,7 @@ void PIBroadcast::initAll(PIVector<PIEthernet::Address> al) {
|
|||||||
eth_lo->setName("PIMulticast_loopback");
|
eth_lo->setName("PIMulticast_loopback");
|
||||||
if (!_send_only) {
|
if (!_send_only) {
|
||||||
eth_lo->setParameter(PIEthernet::ReuseAddress, false);
|
eth_lo->setParameter(PIEthernet::ReuseAddress, false);
|
||||||
CONNECTU(eth_lo, threadedReadEvent, this, mcastRead);
|
CONNECT2(void, const uchar *, int, eth_lo, threadedReadEvent, this, mcastRead);
|
||||||
for (int i = 0; i < lo_pcnt; ++i) {
|
for (int i = 0; i < lo_pcnt; ++i) {
|
||||||
eth_lo->setReadAddress("127.0.0.1", lo_port + i);
|
eth_lo->setReadAddress("127.0.0.1", lo_port + i);
|
||||||
if (eth_lo->open()) {
|
if (eth_lo->open()) {
|
||||||
@@ -248,7 +248,7 @@ void PIBroadcast::reinit() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void PIBroadcast::mcastRead(uchar * data, int size) {
|
void PIBroadcast::mcastRead(const uchar * data, int size) {
|
||||||
PIByteArray cd = decryptData(PIByteArray(data, size));
|
PIByteArray cd = decryptData(PIByteArray(data, size));
|
||||||
if (cd.isEmpty()) return;
|
if (cd.isEmpty()) return;
|
||||||
received(cd);
|
received(cd);
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ void PIStreamPacker::send(const PIByteArray & data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void PIStreamPacker::received(uchar * readed, int size) {
|
void PIStreamPacker::received(const uchar * readed, int size) {
|
||||||
received(PIByteArray(readed, size));
|
received(PIByteArray(readed, size));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -195,8 +195,9 @@ void PIStreamPacker::received(const PIByteArray & data) {
|
|||||||
|
|
||||||
void PIStreamPacker::assignDevice(PIIODevice * dev) {
|
void PIStreamPacker::assignDevice(PIIODevice * dev) {
|
||||||
if (!dev) return;
|
if (!dev) return;
|
||||||
if (!dev->infoFlags()[PIIODevice::Reliable])
|
if (!dev->infoFlags()[PIIODevice::Reliable]) {
|
||||||
piCoutObj << "Warning! Not recommended to use with non-reliable" << dev;
|
piCoutObj << "Warning! Not recommended to use with non-reliable" << dev;
|
||||||
CONNECTU(dev, threadedReadEvent, this, received);
|
}
|
||||||
CONNECTU(this, sendRequest, dev, write);
|
CONNECT2(void, const uchar *, int, dev, threadedReadEvent, this, received);
|
||||||
|
CONNECT1(void, PIByteArray, this, sendRequest, dev, write);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,11 +47,11 @@ public:
|
|||||||
EVENT(disconnected);
|
EVENT(disconnected);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool openDevice();
|
virtual bool openDevice() override;
|
||||||
bool closeDevice();
|
virtual bool closeDevice() override;
|
||||||
int readDevice(void * read_to, int max_size);
|
virtual int readDevice(void * read_to, int max_size) override;
|
||||||
int writeDevice(const void * data, int size);
|
virtual int writeDevice(const void * data, int size) override;
|
||||||
DeviceInfoFlags deviceInfoFlags() const {return PIIODevice::Reliable;}
|
virtual DeviceInfoFlags deviceInfoFlags() const override {return PIIODevice::Reliable;}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
EVENT_HANDLER1(void, _readed, PIByteArray &, data);
|
EVENT_HANDLER1(void, _readed, PIByteArray &, data);
|
||||||
|
|||||||
@@ -45,11 +45,11 @@ public:
|
|||||||
Client(PICloudServer * srv = nullptr, uint id = 0);
|
Client(PICloudServer * srv = nullptr, uint id = 0);
|
||||||
virtual ~Client();
|
virtual ~Client();
|
||||||
protected:
|
protected:
|
||||||
bool openDevice();
|
virtual bool openDevice() override;
|
||||||
bool closeDevice();
|
virtual bool closeDevice() override;
|
||||||
int readDevice(void * read_to, int max_size);
|
virtual int readDevice(void * read_to, int max_size) override;
|
||||||
int writeDevice(const void * data, int size);
|
virtual int writeDevice(const void * data, int size) override;
|
||||||
DeviceInfoFlags deviceInfoFlags() const {return PIIODevice::Reliable;}
|
virtual DeviceInfoFlags deviceInfoFlags() const override {return PIIODevice::Reliable;}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void pushBuffer(const PIByteArray & ba);
|
void pushBuffer(const PIByteArray & ba);
|
||||||
@@ -68,10 +68,10 @@ public:
|
|||||||
EVENT1(newConnection, PICloudServer::Client * , client);
|
EVENT1(newConnection, PICloudServer::Client * , client);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool openDevice();
|
virtual bool openDevice() override;
|
||||||
bool closeDevice();
|
virtual bool closeDevice() override;
|
||||||
int readDevice(void * read_to, int max_size);
|
virtual int readDevice(void * read_to, int max_size) override;
|
||||||
int writeDevice(const void * data, int max_size);
|
virtual int writeDevice(const void * data, int max_size) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
EVENT_HANDLER1(void, _readed, PIByteArray &, ba);
|
EVENT_HANDLER1(void, _readed, PIByteArray &, ba);
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ void PIIntrospectionServer::start(const PIString & server_name) {
|
|||||||
sysmon = PISystemMonitor::Pool::instance()->getByPID(PIProcess::currentPID());
|
sysmon = PISystemMonitor::Pool::instance()->getByPID(PIProcess::currentPID());
|
||||||
if (sysmon) {
|
if (sysmon) {
|
||||||
piCoutObj << "using existing sysmon";
|
piCoutObj << "using existing sysmon";
|
||||||
CONNECTU(sysmon, deleted, this, sysmonDeleted);
|
CONNECT1(void, PIObject *, sysmon, deleted, this, sysmonDeleted);
|
||||||
} else {
|
} else {
|
||||||
piCoutObj << "create own sysmon";
|
piCoutObj << "create own sysmon";
|
||||||
sysmon = new PISystemMonitor();
|
sysmon = new PISystemMonitor();
|
||||||
|
|||||||
@@ -170,7 +170,7 @@ bool PIBinaryLog::closeDevice() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool PIBinaryLog::threadedRead(uchar *readed, int size) {
|
bool PIBinaryLog::threadedRead(const uchar *readed, int size) {
|
||||||
// piCout << "binlog threaded read";
|
// piCout << "binlog threaded read";
|
||||||
if (!canRead() || isEnd()) return PIIODevice::threadedRead(readed, size);
|
if (!canRead() || isEnd()) return PIIODevice::threadedRead(readed, size);
|
||||||
is_thread_ok = false;
|
is_thread_ok = false;
|
||||||
@@ -429,6 +429,11 @@ int PIBinaryLog::readDevice(void *read_to, int max_size) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int PIBinaryLog::writeDevice(const void * data, int size) {
|
||||||
|
return writeBinLog(default_id, data, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void PIBinaryLog::restart() {
|
void PIBinaryLog::restart() {
|
||||||
bool th = isRunning();
|
bool th = isRunning();
|
||||||
if (th) stopThreadedRead();
|
if (th) stopThreadedRead();
|
||||||
|
|||||||
@@ -301,18 +301,18 @@ public:
|
|||||||
static bool joinBinLogsSerial(const PIStringList & src, const PIString & dst);
|
static bool joinBinLogsSerial(const PIStringList & src, const PIString & dst);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
PIString constructFullPathDevice() const;
|
virtual PIString constructFullPathDevice() const override;
|
||||||
void configureFromFullPathDevice(const PIString & full_path);
|
virtual void configureFromFullPathDevice(const PIString & full_path) override;
|
||||||
PIPropertyStorage constructVariantDevice() const;
|
virtual PIPropertyStorage constructVariantDevice() const override;
|
||||||
void configureFromVariantDevice(const PIPropertyStorage & d);
|
virtual void configureFromVariantDevice(const PIPropertyStorage & d) override;
|
||||||
int readDevice(void *read_to, int max_size);
|
virtual int readDevice(void *read_to, int max_size) override;
|
||||||
int writeDevice(const void * data, int size) {return writeBinLog(default_id, data, size);}
|
virtual int writeDevice(const void * data, int size) override;
|
||||||
bool openDevice();
|
virtual bool openDevice() override;
|
||||||
bool closeDevice();
|
virtual bool closeDevice() override;
|
||||||
void propertyChanged(const char * s);
|
virtual void propertyChanged(const char * s) override;
|
||||||
bool threadedRead(uchar *readed, int size);
|
virtual bool threadedRead(const uchar *readed, int size) override;
|
||||||
void threadedReadTerminated() {pausemutex.unlock();}
|
virtual void threadedReadTerminated() override {pausemutex.unlock();}
|
||||||
DeviceInfoFlags deviceInfoFlags() const {return PIIODevice::Reliable;}
|
virtual DeviceInfoFlags deviceInfoFlags() const override {return PIIODevice::Reliable;}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct PIP_EXPORT BinLogRecord {
|
struct PIP_EXPORT BinLogRecord {
|
||||||
|
|||||||
@@ -41,15 +41,15 @@ public:
|
|||||||
int readedCANID() const;
|
int readedCANID() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool openDevice();
|
virtual bool openDevice() override;
|
||||||
bool closeDevice();
|
virtual bool closeDevice() override;
|
||||||
int readDevice(void * read_to, int max_size);
|
virtual int readDevice(void * read_to, int max_size) override;
|
||||||
int writeDevice(const void * data, int max_size);
|
virtual int writeDevice(const void * data, int max_size) override;
|
||||||
PIString constructFullPathDevice() const;
|
virtual PIString constructFullPathDevice() const override;
|
||||||
void configureFromFullPathDevice(const PIString & full_path);
|
virtual void configureFromFullPathDevice(const PIString & full_path) override;
|
||||||
PIPropertyStorage constructVariantDevice() const;
|
virtual PIPropertyStorage constructVariantDevice() const override;
|
||||||
void configureFromVariantDevice(const PIPropertyStorage & d);
|
virtual void configureFromVariantDevice(const PIPropertyStorage & d) override;
|
||||||
DeviceInfoFlags deviceInfoFlags() const {return PIIODevice::Reliable;}
|
virtual DeviceInfoFlags deviceInfoFlags() const override {return PIIODevice::Reliable;}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int sock;
|
int sock;
|
||||||
|
|||||||
@@ -901,7 +901,7 @@ void PIEthernet::server_func(void * eth) {
|
|||||||
ip += ":" + PIString::fromNumber(htons(client_addr.sin_port));
|
ip += ":" + PIString::fromNumber(htons(client_addr.sin_port));
|
||||||
PIEthernet * e = new PIEthernet(s, ip);
|
PIEthernet * e = new PIEthernet(s, ip);
|
||||||
ce->clients_mutex.lock();
|
ce->clients_mutex.lock();
|
||||||
CONNECTU(e, deleted, ce, clientDeleted)
|
CONNECT1(void, PIObject *, e, deleted, ce, clientDeleted)
|
||||||
ce->clients_ << e;
|
ce->clients_ << e;
|
||||||
ce->clients_mutex.unlock();
|
ce->clients_mutex.unlock();
|
||||||
ce->newConnection(e);
|
ce->newConnection(e);
|
||||||
|
|||||||
@@ -462,24 +462,24 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
explicit PIEthernet(int sock, PIString ip_port);
|
explicit PIEthernet(int sock, PIString ip_port);
|
||||||
|
|
||||||
void propertyChanged(const char * name);
|
virtual void propertyChanged(const char * name) override;
|
||||||
|
|
||||||
PIString constructFullPathDevice() const;
|
virtual PIString constructFullPathDevice() const override;
|
||||||
void configureFromFullPathDevice(const PIString & full_path);
|
virtual void configureFromFullPathDevice(const PIString & full_path) override;
|
||||||
PIPropertyStorage constructVariantDevice() const;
|
virtual PIPropertyStorage constructVariantDevice() const override;
|
||||||
void configureFromVariantDevice(const PIPropertyStorage & d);
|
virtual void configureFromVariantDevice(const PIPropertyStorage & d) override;
|
||||||
bool configureDevice(const void * e_main, const void * e_parent = 0);
|
virtual bool configureDevice(const void * e_main, const void * e_parent = 0) override;
|
||||||
int readDevice(void * read_to, int max_size);
|
virtual int readDevice(void * read_to, int max_size) override;
|
||||||
int writeDevice(const void * data, int max_size);
|
virtual int writeDevice(const void * data, int max_size) override;
|
||||||
DeviceInfoFlags deviceInfoFlags() const;
|
virtual DeviceInfoFlags deviceInfoFlags() const override;
|
||||||
|
|
||||||
//! Executes when any read function was successful. Default implementation does nothing
|
//! Executes when any read function was successful. Default implementation does nothing
|
||||||
virtual void received(const void * data, int size) {;}
|
virtual void received(const void * data, int size) {;}
|
||||||
|
|
||||||
void construct();
|
void construct();
|
||||||
bool init();
|
virtual bool init() override;
|
||||||
bool openDevice();
|
virtual bool openDevice() override;
|
||||||
bool closeDevice();
|
virtual bool closeDevice() override;
|
||||||
void closeSocket(int & sd);
|
void closeSocket(int & sd);
|
||||||
void applyTimeouts();
|
void applyTimeouts();
|
||||||
void applyTimeout(int fd, int opt, double ms);
|
void applyTimeout(int fd, int opt, double ms);
|
||||||
|
|||||||
@@ -180,7 +180,7 @@ public:
|
|||||||
|
|
||||||
//! \~english Immediate write all buffered data to disk
|
//! \~english Immediate write all buffered data to disk
|
||||||
//! \~russian Немедленно записывает все буферизированные данные на диск
|
//! \~russian Немедленно записывает все буферизированные данные на диск
|
||||||
void flush();
|
virtual void flush() override;
|
||||||
|
|
||||||
//! \~english Move read/write position to "position"
|
//! \~english Move read/write position to "position"
|
||||||
//! \~russian Перемещает позицию чтения/записи на "position"
|
//! \~russian Перемещает позицию чтения/записи на "position"
|
||||||
@@ -324,15 +324,15 @@ public:
|
|||||||
//! \}
|
//! \}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
PIString constructFullPathDevice() const;
|
virtual PIString constructFullPathDevice() const override;
|
||||||
void configureFromFullPathDevice(const PIString & full_path);
|
virtual void configureFromFullPathDevice(const PIString & full_path) override;
|
||||||
PIPropertyStorage constructVariantDevice() const;
|
virtual PIPropertyStorage constructVariantDevice() const override;
|
||||||
void configureFromVariantDevice(const PIPropertyStorage & d);
|
virtual void configureFromVariantDevice(const PIPropertyStorage & d) override;
|
||||||
int readDevice(void * read_to, int max_size);
|
virtual int readDevice(void * read_to, int max_size) override;
|
||||||
int writeDevice(const void * data, int max_size);
|
virtual int writeDevice(const void * data, int max_size) override;
|
||||||
bool openDevice();
|
virtual bool openDevice() override;
|
||||||
bool closeDevice();
|
virtual bool closeDevice() override;
|
||||||
DeviceInfoFlags deviceInfoFlags() const {return PIIODevice::Sequential | PIIODevice::Reliable;}
|
virtual DeviceInfoFlags deviceInfoFlags() const override {return PIIODevice::Sequential | PIIODevice::Reliable;}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
PIString strType(const PIIODevice::DeviceMode type);
|
PIString strType(const PIIODevice::DeviceMode type);
|
||||||
|
|||||||
@@ -85,10 +85,10 @@ public:
|
|||||||
int writeByteArray(const PIByteArray & ba);
|
int writeByteArray(const PIByteArray & ba);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool openDevice();
|
virtual bool openDevice() override;
|
||||||
int readDevice(void * read_to, int size);
|
virtual int readDevice(void * read_to, int size) override;
|
||||||
int writeDevice(const void * data_, int size);
|
virtual int writeDevice(const void * data_, int size) override;
|
||||||
DeviceInfoFlags deviceInfoFlags() const {return PIIODevice::Sequential | PIIODevice::Reliable;}
|
virtual DeviceInfoFlags deviceInfoFlags() const override {return PIIODevice::Sequential | PIIODevice::Reliable;}
|
||||||
|
|
||||||
ssize_t pos;
|
ssize_t pos;
|
||||||
PIByteArray * data_;
|
PIByteArray * data_;
|
||||||
|
|||||||
@@ -159,7 +159,7 @@ bool PIIODevice::setOption(PIIODevice::DeviceOption o, bool yes) {
|
|||||||
//! после каждого успешного потокового чтения. Метод должен быть
|
//! после каждого успешного потокового чтения. Метод должен быть
|
||||||
//! в формате "bool func(void * data, uchar * readed, int size)"
|
//! в формате "bool func(void * data, uchar * readed, int size)"
|
||||||
void PIIODevice::setThreadedReadSlot(ReadRetFunc func) {
|
void PIIODevice::setThreadedReadSlot(ReadRetFunc func) {
|
||||||
ret_func_ = func;
|
func_read = func;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -239,8 +239,8 @@ PIByteArray PIIODevice::read(int max_size) {
|
|||||||
void PIIODevice::_init() {
|
void PIIODevice::_init() {
|
||||||
opened_ = init_ = thread_started_ = false;
|
opened_ = init_ = thread_started_ = false;
|
||||||
raise_threaded_read_ = true;
|
raise_threaded_read_ = true;
|
||||||
ret_func_ = 0;
|
func_read = nullptr;
|
||||||
ret_data_ = 0;
|
ret_data_ = nullptr;
|
||||||
tri = 0;
|
tri = 0;
|
||||||
setOptions(0);
|
setOptions(0);
|
||||||
setReopenEnabled(true);
|
setReopenEnabled(true);
|
||||||
@@ -596,9 +596,9 @@ PIMap<PIConstChars, PIIODevice::FabricInfo> & PIIODevice::fabrics() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool PIIODevice::threadedRead(uchar *readed, int size) {
|
bool PIIODevice::threadedRead(const uchar *readed, int size) {
|
||||||
// piCout << "iodevice threaded read";
|
// piCout << "iodevice threaded read";
|
||||||
if (ret_func_ != 0) return ret_func_(ret_data_, readed, size);
|
if (func_read != 0) return func_read(readed, size, ret_data_);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -30,9 +30,9 @@
|
|||||||
#include "pitimer.h"
|
#include "pitimer.h"
|
||||||
#include "piqueue.h"
|
#include "piqueue.h"
|
||||||
|
|
||||||
|
/// TODO: написать документацию, тут ничего не понятно
|
||||||
// function executed from threaded read, pass ThreadedReadData, readedData, sizeOfData
|
// function executed from threaded read, pass readedData, sizeOfData, ThreadedReadData
|
||||||
typedef bool (*ReadRetFunc)(void * , uchar * , int );
|
typedef bool (*ReadRetFunc)(const uchar *, int, void *);
|
||||||
|
|
||||||
|
|
||||||
#ifdef DOXYGEN
|
#ifdef DOXYGEN
|
||||||
@@ -64,9 +64,9 @@ typedef bool (*ReadRetFunc)(void * , uchar * , int );
|
|||||||
|
|
||||||
# define PIIODEVICE(name, prefix) \
|
# define PIIODEVICE(name, prefix) \
|
||||||
PIOBJECT_SUBCLASS(name, PIIODevice) \
|
PIOBJECT_SUBCLASS(name, PIIODevice) \
|
||||||
PIIODevice * copy() const {return new name();} \
|
PIIODevice * copy() const override {return new name();} \
|
||||||
public: \
|
public: \
|
||||||
virtual PIConstChars fullPathPrefix() const {return prefix;} \
|
virtual PIConstChars fullPathPrefix() const override {return prefix;} \
|
||||||
static PIConstChars fullPathPrefixS() {return prefix;} \
|
static PIConstChars fullPathPrefixS() {return prefix;} \
|
||||||
private:
|
private:
|
||||||
|
|
||||||
@@ -239,7 +239,7 @@ public:
|
|||||||
|
|
||||||
//! \~english Start threaded read and assign threaded read callback to "func"
|
//! \~english Start threaded read and assign threaded read callback to "func"
|
||||||
//! \~russian Запускает потоковое чтение и устанавливает callback потокового чтения в "func"
|
//! \~russian Запускает потоковое чтение и устанавливает callback потокового чтения в "func"
|
||||||
void startThreadedRead(ReadRetFunc func) {ret_func_ = func; startThreadedRead();}
|
void startThreadedRead(ReadRetFunc func) {func_read = func; startThreadedRead();}
|
||||||
|
|
||||||
//! \~english Stop threaded read. Hard stop terminate thread, otherwise wait fo 10 seconds
|
//! \~english Stop threaded read. Hard stop terminate thread, otherwise wait fo 10 seconds
|
||||||
//! \~russian Останавливает потоковое чтение. Жесткая остановка убивает поток, иначе ожидает 10 секунд
|
//! \~russian Останавливает потоковое чтение. Жесткая остановка убивает поток, иначе ожидает 10 секунд
|
||||||
@@ -369,7 +369,7 @@ public:
|
|||||||
|
|
||||||
EVENT(opened);
|
EVENT(opened);
|
||||||
EVENT(closed);
|
EVENT(closed);
|
||||||
EVENT2(threadedReadEvent, uchar * , readed, int, size);
|
EVENT2(threadedReadEvent, const uchar * , readed, int, size);
|
||||||
EVENT2(threadedWriteEvent, ullong, id, int, written_size);
|
EVENT2(threadedWriteEvent, ullong, id, int, written_size);
|
||||||
|
|
||||||
//! \handlers
|
//! \handlers
|
||||||
@@ -419,7 +419,7 @@ public:
|
|||||||
//! \~english Raise if succesfull close
|
//! \~english Raise if succesfull close
|
||||||
//! \~russian Вызывается при успешном закрытии
|
//! \~russian Вызывается при успешном закрытии
|
||||||
|
|
||||||
//! \fn void threadedReadEvent(uchar * readed, int size)
|
//! \fn void threadedReadEvent(const uchar * readed, int size)
|
||||||
//! \~english Raise if read thread succesfull read some data
|
//! \~english Raise if read thread succesfull read some data
|
||||||
//! \~russian Вызывается при успешном потоковом чтении данных
|
//! \~russian Вызывается при успешном потоковом чтении данных
|
||||||
|
|
||||||
@@ -475,7 +475,7 @@ protected:
|
|||||||
|
|
||||||
//! \~english Function executed when thread read some data, default implementation execute external callback "ret_func_"
|
//! \~english Function executed when thread read some data, default implementation execute external callback "ret_func_"
|
||||||
//! \~russian Метод вызывается после каждого успешного потокового чтения, по умолчанию вызывает callback "ret_func_"
|
//! \~russian Метод вызывается после каждого успешного потокового чтения, по умолчанию вызывает callback "ret_func_"
|
||||||
virtual bool threadedRead(uchar * readed, int size);
|
virtual bool threadedRead(const uchar * readed, int size);
|
||||||
|
|
||||||
//! \~english Reimplement to construct full unambiguous string, describes this device.
|
//! \~english Reimplement to construct full unambiguous string, describes this device.
|
||||||
//! Default implementation returns \a path()
|
//! Default implementation returns \a path()
|
||||||
@@ -528,7 +528,7 @@ protected:
|
|||||||
|
|
||||||
DeviceMode mode_;
|
DeviceMode mode_;
|
||||||
DeviceOptions options_;
|
DeviceOptions options_;
|
||||||
ReadRetFunc ret_func_;
|
ReadRetFunc func_read;
|
||||||
bool opened_;
|
bool opened_;
|
||||||
void * ret_data_;
|
void * ret_data_;
|
||||||
|
|
||||||
@@ -539,9 +539,9 @@ private:
|
|||||||
virtual PIIODevice * copy() const {return 0;}
|
virtual PIIODevice * copy() const {return 0;}
|
||||||
PIString fullPathOptions() const;
|
PIString fullPathOptions() const;
|
||||||
void _init();
|
void _init();
|
||||||
void begin();
|
void begin() override;
|
||||||
void run();
|
void run() override;
|
||||||
void end() {terminate();}
|
void end() override {terminate();}
|
||||||
static void cacheFullPath(const PIString & full_path, const PIIODevice * d);
|
static void cacheFullPath(const PIString & full_path, const PIIODevice * d);
|
||||||
static PIMap<PIConstChars, FabricInfo> & fabrics();
|
static PIMap<PIConstChars, FabricInfo> & fabrics();
|
||||||
|
|
||||||
|
|||||||
@@ -89,10 +89,10 @@ public:
|
|||||||
int writeString(const PIString & string);
|
int writeString(const PIString & string);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool openDevice();
|
virtual bool openDevice() override;
|
||||||
int readDevice(void * read_to, int max_size);
|
virtual int readDevice(void * read_to, int max_size) override;
|
||||||
int writeDevice(const void * data, int max_size);
|
virtual int writeDevice(const void * data, int max_size) override;
|
||||||
DeviceInfoFlags deviceInfoFlags() const {return PIIODevice::Sequential | PIIODevice::Reliable;}
|
virtual DeviceInfoFlags deviceInfoFlags() const override {return PIIODevice::Sequential | PIIODevice::Reliable;}
|
||||||
|
|
||||||
ssize_t pos;
|
ssize_t pos;
|
||||||
PIString * str;
|
PIString * str;
|
||||||
|
|||||||
@@ -61,11 +61,11 @@ PIPeer::PeerData::PeerData(const PIString & n): PIObject(n) {
|
|||||||
dt_out.setPacketSize(_PIPEER_MSG_SIZE);
|
dt_out.setPacketSize(_PIPEER_MSG_SIZE);
|
||||||
dt_in.setCRCEnabled(false);
|
dt_in.setCRCEnabled(false);
|
||||||
dt_out.setCRCEnabled(false);
|
dt_out.setCRCEnabled(false);
|
||||||
CONNECTU(&dt_in, sendRequest, this, dtSendRequestIn);
|
CONNECT1(void, PIByteArray &, &dt_in, sendRequest, this, dtSendRequestIn);
|
||||||
CONNECTU(&dt_out, sendRequest, this, dtSendRequestOut);
|
CONNECT1(void, PIByteArray &, &dt_out, sendRequest, this, dtSendRequestOut);
|
||||||
CONNECTU(&dt_in, receiveFinished, this, dtReceiveFinishedIn);
|
CONNECT1(void, bool, &dt_in, receiveFinished, this, dtReceiveFinishedIn);
|
||||||
CONNECTU(&dt_out, receiveFinished, this, dtReceiveFinishedOut);
|
CONNECT1(void, bool, &dt_out, receiveFinished, this, dtReceiveFinishedOut);
|
||||||
CONNECTU(&t, started, this, dtThread);
|
CONNECT0(void, &t, started, this, dtThread);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -172,7 +172,7 @@ PIPeer::PIPeer(const PIString & n): PIIODevice(), inited__(false), eth_tcp_srv(P
|
|||||||
self_info.dist = 0;
|
self_info.dist = 0;
|
||||||
self_info.time = PISystemTime::current();
|
self_info.time = PISystemTime::current();
|
||||||
randomize();
|
randomize();
|
||||||
CONNECTU(&sync_timer, tickEvent, this, timerEvent);
|
CONNECT2(void, void *, int, &sync_timer, tickEvent, this, timerEvent);
|
||||||
prev_ifaces = PIEthernet::interfaces();
|
prev_ifaces = PIEthernet::interfaces();
|
||||||
no_timer = false;
|
no_timer = false;
|
||||||
sync_timer.addDelimiter(5);
|
sync_timer.addDelimiter(5);
|
||||||
@@ -247,7 +247,7 @@ void PIPeer::initEths(PIStringList al) {
|
|||||||
eths_traffic << ce;
|
eths_traffic << ce;
|
||||||
cint = prev_ifaces.getByAddress(a);
|
cint = prev_ifaces.getByAddress(a);
|
||||||
self_info.addresses << PeerInfo::PeerAddress(ce->path(), cint == 0 ? "255.255.255.0" : cint->netmask);
|
self_info.addresses << PeerInfo::PeerAddress(ce->path(), cint == 0 ? "255.255.255.0" : cint->netmask);
|
||||||
CONNECTU(ce, threadedReadEvent, this, dataRead);
|
CONNECT2(void, const uchar *, int, ce, threadedReadEvent, this, dataRead);
|
||||||
ce->startThreadedRead();
|
ce->startThreadedRead();
|
||||||
// piCoutObj << "dc binded to" << ce->path();
|
// piCoutObj << "dc binded to" << ce->path();
|
||||||
// piCoutObj << "add eth" << a;
|
// piCoutObj << "add eth" << a;
|
||||||
@@ -282,7 +282,7 @@ void PIPeer::initMBcasts(PIStringList al) {
|
|||||||
ce->joinMulticastGroup(_PIPEER_MULTICAST_IP);
|
ce->joinMulticastGroup(_PIPEER_MULTICAST_IP);
|
||||||
if (ce->open()) {
|
if (ce->open()) {
|
||||||
eths_mcast << ce;
|
eths_mcast << ce;
|
||||||
CONNECTU(ce, threadedReadEvent, this, mbcastRead);
|
CONNECT2(void, const uchar *, int, ce, threadedReadEvent, this, mbcastRead);
|
||||||
ce->startThreadedRead();
|
ce->startThreadedRead();
|
||||||
// piCout << "mcast bind to" << a << ce->sendIP();
|
// piCout << "mcast bind to" << a << ce->sendIP();
|
||||||
} else {
|
} else {
|
||||||
@@ -302,7 +302,7 @@ void PIPeer::initMBcasts(PIStringList al) {
|
|||||||
ce->setReadAddress(a, _PIPEER_BROADCAST_PORT);
|
ce->setReadAddress(a, _PIPEER_BROADCAST_PORT);
|
||||||
if (ce->open()) {
|
if (ce->open()) {
|
||||||
eths_bcast << ce;
|
eths_bcast << ce;
|
||||||
CONNECTU(ce, threadedReadEvent, this, mbcastRead);
|
CONNECT2(void, const uchar *, int, ce, threadedReadEvent, this, mbcastRead);
|
||||||
ce->startThreadedRead();
|
ce->startThreadedRead();
|
||||||
// piCout << "mc BC try" << a << nm << ce->sendIP();
|
// piCout << "mc BC try" << a << nm << ce->sendIP();
|
||||||
// piCout << "bcast bind to" << a << nm;
|
// piCout << "bcast bind to" << a << nm;
|
||||||
@@ -319,7 +319,7 @@ void PIPeer::initMBcasts(PIStringList al) {
|
|||||||
eth_lo.setReadAddress("127.0.0.1", p);
|
eth_lo.setReadAddress("127.0.0.1", p);
|
||||||
if (eth_lo.open()) {
|
if (eth_lo.open()) {
|
||||||
eth_lo.setSendIP("127.0.0.1");
|
eth_lo.setSendIP("127.0.0.1");
|
||||||
CONNECTU(ð_lo, threadedReadEvent, this, mbcastRead);
|
CONNECT2(void, const uchar *, int, ð_lo, threadedReadEvent, this, mbcastRead);
|
||||||
eth_lo.startThreadedRead();
|
eth_lo.startThreadedRead();
|
||||||
// piCout << "lo binded to" << eth_lo.readAddress() << eth_lo.sendAddress();
|
// piCout << "lo binded to" << eth_lo.readAddress() << eth_lo.sendAddress();
|
||||||
//piCout << "add eth" << ta;
|
//piCout << "add eth" << ta;
|
||||||
@@ -330,13 +330,13 @@ void PIPeer::initMBcasts(PIStringList al) {
|
|||||||
eth_tcp_srv.init();
|
eth_tcp_srv.init();
|
||||||
eth_tcp_srv.listen("0.0.0.0", _PIPEER_TCP_PORT, true);
|
eth_tcp_srv.listen("0.0.0.0", _PIPEER_TCP_PORT, true);
|
||||||
eth_tcp_srv.setDebug(false);
|
eth_tcp_srv.setDebug(false);
|
||||||
CONNECTU(ð_tcp_srv, newConnection, this, newTcpClient);
|
CONNECT1(void, PIEthernet *, ð_tcp_srv, newConnection, this, newTcpClient);
|
||||||
eth_tcp_srv.startThreadedRead();
|
eth_tcp_srv.startThreadedRead();
|
||||||
eth_tcp_cli.setName("__S__PIPeer_eth_TCP_Client");
|
eth_tcp_cli.setName("__S__PIPeer_eth_TCP_Client");
|
||||||
eth_tcp_cli.init();
|
eth_tcp_cli.init();
|
||||||
eth_tcp_cli.setDebug(false);
|
eth_tcp_cli.setDebug(false);
|
||||||
tcpClientReconnect();
|
tcpClientReconnect();
|
||||||
CONNECTU(ð_tcp_cli, threadedReadEvent, this, mbcastRead);
|
CONNECT2(void, const uchar *, int, ð_tcp_cli, threadedReadEvent, this, mbcastRead);
|
||||||
CONNECTU(ð_tcp_cli, disconnected, this, tcpClientReconnect);
|
CONNECTU(ð_tcp_cli, disconnected, this, tcpClientReconnect);
|
||||||
eth_tcp_cli.startThreadedRead();
|
eth_tcp_cli.startThreadedRead();
|
||||||
if (eths_mcast.isEmpty() && eths_bcast.isEmpty() && !eth_lo.isOpened()) piCoutObj << "Warning! Can`t find suitable network interface for multicast receive, check for exists at least one interface with multicasting enabled!";
|
if (eths_mcast.isEmpty() && eths_bcast.isEmpty() && !eth_lo.isOpened()) piCoutObj << "Warning! Can`t find suitable network interface for multicast receive, check for exists at least one interface with multicasting enabled!";
|
||||||
@@ -444,7 +444,7 @@ void PIPeer::dtReceived(const PIString & from, const PIByteArray & data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool PIPeer::dataRead(uchar * readed, int size) {
|
bool PIPeer::dataRead(const uchar * readed, int size) {
|
||||||
if (destroyed) {
|
if (destroyed) {
|
||||||
//piCout << "[PIPeer] SegFault";
|
//piCout << "[PIPeer] SegFault";
|
||||||
return true;
|
return true;
|
||||||
@@ -561,7 +561,7 @@ bool PIPeer::dataRead(uchar * readed, int size) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool PIPeer::mbcastRead(uchar * data, int size) {
|
bool PIPeer::mbcastRead(const uchar * data, int size) {
|
||||||
if (destroyed) {
|
if (destroyed) {
|
||||||
//piCout << "[PIPeer] SegFault";
|
//piCout << "[PIPeer] SegFault";
|
||||||
return true;
|
return true;
|
||||||
@@ -765,8 +765,8 @@ void PIPeer::addPeer(const PIPeer::PeerInfo & pd) {
|
|||||||
peers << pd;
|
peers << pd;
|
||||||
PeerInfo & p(peers.back());
|
PeerInfo & p(peers.back());
|
||||||
p.init();
|
p.init();
|
||||||
CONNECTU(p._data, sendRequest, this, sendInternal)
|
CONNECT2(void, const PIString &, const PIByteArray &, p._data, sendRequest, this, sendInternal)
|
||||||
CONNECTU(p._data, received, this, dtReceived)
|
CONNECT2(void, const PIString &, const PIByteArray &, p._data, received, this, dtReceived)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -961,7 +961,7 @@ int PIPeer::writeDevice(const void *data, int size) {
|
|||||||
void PIPeer::newTcpClient(PIEthernet *client) {
|
void PIPeer::newTcpClient(PIEthernet *client) {
|
||||||
client->setName("__S__PIPeer_eth_TCP_ServerClient" + client->path());
|
client->setName("__S__PIPeer_eth_TCP_ServerClient" + client->path());
|
||||||
piCoutObj << "client" << client->path();
|
piCoutObj << "client" << client->path();
|
||||||
CONNECTU(client, threadedReadEvent, this, mbcastRead);
|
CONNECT2(void, const uchar *, int, client, threadedReadEvent, this, mbcastRead);
|
||||||
client->startThreadedRead();
|
client->startThreadedRead();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1009,8 +1009,9 @@ void PIPeer::initNetwork() {
|
|||||||
self_info.addresses.clear();
|
self_info.addresses.clear();
|
||||||
PIVector<PIEthernet::Address> al = PIEthernet::allAddresses();
|
PIVector<PIEthernet::Address> al = PIEthernet::allAddresses();
|
||||||
PIStringList sl;
|
PIStringList sl;
|
||||||
piForeachC (PIEthernet::Address & a, al)
|
for (const PIEthernet::Address & a : al) {
|
||||||
sl << a.ipString();
|
sl << a.ipString();
|
||||||
|
}
|
||||||
initEths(sl);
|
initEths(sl);
|
||||||
// piCoutObj << sl << self_info.addresses.size();
|
// piCoutObj << sl << self_info.addresses.size();
|
||||||
sl.removeAll("127.0.0.1");
|
sl.removeAll("127.0.0.1");
|
||||||
|
|||||||
@@ -132,8 +132,8 @@ protected:
|
|||||||
virtual void peerConnected(const PIString & name) {;}
|
virtual void peerConnected(const PIString & name) {;}
|
||||||
virtual void peerDisconnected(const PIString & name) {;}
|
virtual void peerDisconnected(const PIString & name) {;}
|
||||||
|
|
||||||
EVENT_HANDLER2(bool, dataRead, uchar *, readed, int, size);
|
EVENT_HANDLER2(bool, dataRead, const uchar *, readed, int, size);
|
||||||
EVENT_HANDLER2(bool, mbcastRead, uchar *, readed, int, size);
|
EVENT_HANDLER2(bool, mbcastRead, const uchar *, readed, int, size);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
EVENT_HANDLER2(void, timerEvent, void * , data, int, delim);
|
EVENT_HANDLER2(void, timerEvent, void * , data, int, delim);
|
||||||
@@ -164,15 +164,15 @@ private:
|
|||||||
void addToRemoved(const PeerInfo & pi) {removed[pi.name] = PIPair<int, PISystemTime>(pi.cnt, pi.time);}
|
void addToRemoved(const PeerInfo & pi) {removed[pi.name] = PIPair<int, PISystemTime>(pi.cnt, pi.time);}
|
||||||
bool isRemoved(const PeerInfo & pi) const {return (removed.value(pi.name) == PIPair<int, PISystemTime>(pi.cnt, pi.time));}
|
bool isRemoved(const PeerInfo & pi) const {return (removed.value(pi.name) == PIPair<int, PISystemTime>(pi.cnt, pi.time));}
|
||||||
|
|
||||||
bool openDevice();
|
virtual bool openDevice() override;
|
||||||
bool closeDevice();
|
virtual bool closeDevice() override;
|
||||||
PIString constructFullPathDevice() const;
|
virtual PIString constructFullPathDevice() const override;
|
||||||
void configureFromFullPathDevice(const PIString &full_path);
|
virtual void configureFromFullPathDevice(const PIString &full_path) override;
|
||||||
PIPropertyStorage constructVariantDevice() const;
|
virtual PIPropertyStorage constructVariantDevice() const override;
|
||||||
void configureFromVariantDevice(const PIPropertyStorage & d);
|
virtual void configureFromVariantDevice(const PIPropertyStorage & d) override;
|
||||||
int readDevice(void * read_to, int max_size);
|
virtual int readDevice(void * read_to, int max_size) override;
|
||||||
int writeDevice(const void * data, int size);
|
virtual int writeDevice(const void * data, int size) override;
|
||||||
DeviceInfoFlags deviceInfoFlags() const {return PIIODevice::Reliable;}
|
virtual DeviceInfoFlags deviceInfoFlags() const override {return PIIODevice::Reliable;}
|
||||||
|
|
||||||
PeerInfo * quickestPeer(const PIString & to);
|
PeerInfo * quickestPeer(const PIString & to);
|
||||||
bool sendToNeighbour(PeerInfo * peer, const PIByteArray & ba);
|
bool sendToNeighbour(PeerInfo * peer, const PIByteArray & ba);
|
||||||
|
|||||||
@@ -216,7 +216,7 @@ public:
|
|||||||
|
|
||||||
//! \~english Discard all buffered input and output data
|
//! \~english Discard all buffered input and output data
|
||||||
//! \~russian Откидывает все буферизированные данные для передачи и приема
|
//! \~russian Откидывает все буферизированные данные для передачи и приема
|
||||||
void flush();
|
virtual void flush() override;
|
||||||
|
|
||||||
int read(void * read_to, int max_size) {return readDevice(read_to, max_size);}
|
int read(void * read_to, int max_size) {return readDevice(read_to, max_size);}
|
||||||
|
|
||||||
@@ -282,19 +282,19 @@ public:
|
|||||||
//! \}
|
//! \}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
PIString constructFullPathDevice() const;
|
virtual PIString constructFullPathDevice() const override;
|
||||||
void configureFromFullPathDevice(const PIString & full_path);
|
virtual void configureFromFullPathDevice(const PIString & full_path) override;
|
||||||
PIPropertyStorage constructVariantDevice() const;
|
virtual PIPropertyStorage constructVariantDevice() const override;
|
||||||
void configureFromVariantDevice(const PIPropertyStorage & d);
|
virtual void configureFromVariantDevice(const PIPropertyStorage & d) override;
|
||||||
bool configureDevice(const void * e_main, const void * e_parent = 0);
|
virtual bool configureDevice(const void * e_main, const void * e_parent = 0) override;
|
||||||
void optionsChanged();
|
virtual void optionsChanged() override;
|
||||||
void threadedReadBufferSizeChanged();
|
virtual void threadedReadBufferSizeChanged() override;
|
||||||
|
|
||||||
//! \~english Basic read function
|
//! \~english Basic read function
|
||||||
//! \~russian Базовое чтение
|
//! \~russian Базовое чтение
|
||||||
int readDevice(void * read_to, int max_size);
|
virtual int readDevice(void * read_to, int max_size) override;
|
||||||
int writeDevice(const void * data, int max_size);
|
virtual int writeDevice(const void * data, int max_size) override;
|
||||||
DeviceInfoFlags deviceInfoFlags() const {return PIIODevice::Sequential;}
|
virtual DeviceInfoFlags deviceInfoFlags() const override {return PIIODevice::Sequential;}
|
||||||
|
|
||||||
//! Executes when any read function was successful. Default implementation does nothing
|
//! Executes when any read function was successful. Default implementation does nothing
|
||||||
virtual void received(const void * data, int size) {;}
|
virtual void received(const void * data, int size) {;}
|
||||||
@@ -306,8 +306,8 @@ protected:
|
|||||||
bool setBit(int bit, bool on, const PIString & bname);
|
bool setBit(int bit, bool on, const PIString & bname);
|
||||||
bool isBit(int bit, const PIString & bname) const;
|
bool isBit(int bit, const PIString & bname) const;
|
||||||
|
|
||||||
bool openDevice();
|
virtual bool openDevice() override;
|
||||||
bool closeDevice();
|
virtual bool closeDevice() override;
|
||||||
|
|
||||||
PRIVATE_DECLARATION(PIP_EXPORT)
|
PRIVATE_DECLARATION(PIP_EXPORT)
|
||||||
int fd, vtime;
|
int fd, vtime;
|
||||||
|
|||||||
@@ -91,15 +91,15 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool openDevice();
|
virtual bool openDevice() override;
|
||||||
bool closeDevice();
|
virtual bool closeDevice() override;
|
||||||
PIString constructFullPathDevice() const;
|
virtual PIString constructFullPathDevice() const override;
|
||||||
void configureFromFullPathDevice(const PIString & full_path);
|
virtual void configureFromFullPathDevice(const PIString & full_path) override;
|
||||||
PIPropertyStorage constructVariantDevice() const;
|
virtual PIPropertyStorage constructVariantDevice() const override;
|
||||||
void configureFromVariantDevice(const PIPropertyStorage & d);
|
virtual void configureFromVariantDevice(const PIPropertyStorage & d) override;
|
||||||
int readDevice(void * read_to, int max_size) {return read(read_to, max_size, 0);}
|
virtual int readDevice(void * read_to, int max_size) override {return read(read_to, max_size, 0);}
|
||||||
int writeDevice(const void * data, int max_size) {return write(data, max_size, 0);}
|
virtual int writeDevice(const void * data, int max_size) override {return write(data, max_size, 0);}
|
||||||
DeviceInfoFlags deviceInfoFlags() const {return PIIODevice::Reliable;}
|
virtual DeviceInfoFlags deviceInfoFlags() const override {return PIIODevice::Reliable;}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void initPrivate();
|
void initPrivate();
|
||||||
|
|||||||
@@ -62,16 +62,16 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool openDevice();
|
virtual bool openDevice() override;
|
||||||
bool closeDevice();
|
virtual bool closeDevice() override;
|
||||||
int readDevice(void * read_to, int max_size);
|
virtual int readDevice(void * read_to, int max_size) override;
|
||||||
int writeDevice(const void * data, int max_size);
|
virtual int writeDevice(const void * data, int max_size) override;
|
||||||
|
|
||||||
PIString constructFullPathDevice() const;
|
virtual PIString constructFullPathDevice() const override;
|
||||||
void configureFromFullPathDevice(const PIString & full_path);
|
virtual void configureFromFullPathDevice(const PIString & full_path) override;
|
||||||
PIPropertyStorage constructVariantDevice() const;
|
virtual PIPropertyStorage constructVariantDevice() const override;
|
||||||
void configureFromVariantDevice(const PIPropertyStorage & d);
|
virtual void configureFromVariantDevice(const PIPropertyStorage & d) override;
|
||||||
DeviceInfoFlags deviceInfoFlags() const {return PIIODevice::Sequential;}
|
virtual DeviceInfoFlags deviceInfoFlags() const override {return PIIODevice::Sequential;}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
uint spi_speed;
|
uint spi_speed;
|
||||||
|
|||||||
@@ -45,11 +45,11 @@ public:
|
|||||||
virtual ~PITransparentDevice();
|
virtual ~PITransparentDevice();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool openDevice();
|
virtual bool openDevice() override;
|
||||||
bool closeDevice();
|
virtual bool closeDevice() override;
|
||||||
int readDevice(void * read_to, int max_size);
|
virtual int readDevice(void * read_to, int max_size) override;
|
||||||
int writeDevice(const void * data, int max_size);
|
virtual int writeDevice(const void * data, int max_size) override;
|
||||||
DeviceInfoFlags deviceInfoFlags() const {return PIIODevice::Reliable;}
|
virtual DeviceInfoFlags deviceInfoFlags() const override {return PIIODevice::Reliable;}
|
||||||
|
|
||||||
PIMutex que_mutex;
|
PIMutex que_mutex;
|
||||||
PIQueue<PIByteArray> que;
|
PIQueue<PIByteArray> que;
|
||||||
|
|||||||
@@ -157,17 +157,17 @@ public:
|
|||||||
|
|
||||||
int controlWrite(const void * data, int max_size);
|
int controlWrite(const void * data, int max_size);
|
||||||
|
|
||||||
void flush();
|
virtual void flush() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool configureDevice(const void * e_main, const void * e_parent = 0);
|
virtual bool configureDevice(const void * e_main, const void * e_parent = 0) override;
|
||||||
PIString constructFullPathDevice() const;
|
virtual PIString constructFullPathDevice() const override;
|
||||||
void configureFromFullPathDevice(const PIString & full_path);
|
virtual void configureFromFullPathDevice(const PIString & full_path) override;
|
||||||
int readDevice(void * read_to, int max_size);
|
virtual int readDevice(void * read_to, int max_size) override;
|
||||||
int writeDevice(const void * data, int max_size);
|
virtual int writeDevice(const void * data, int max_size) override;
|
||||||
bool openDevice();
|
virtual bool openDevice() override;
|
||||||
bool closeDevice();
|
virtual bool closeDevice() override;
|
||||||
DeviceInfoFlags deviceInfoFlags() const {return PIIODevice::Reliable;}
|
virtual DeviceInfoFlags deviceInfoFlags() const {return PIIODevice::Reliable;}
|
||||||
|
|
||||||
PIVector<PIUSB::Endpoint> eps;
|
PIVector<PIUSB::Endpoint> eps;
|
||||||
ushort vid_, pid_;
|
ushort vid_, pid_;
|
||||||
|
|||||||
@@ -133,7 +133,7 @@ protected:
|
|||||||
virtual void addressesChanged() {}
|
virtual void addressesChanged() {}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
EVENT_HANDLER2(void, mcastRead, uchar * , data, int, size);
|
EVENT_HANDLER2(void, mcastRead, const uchar * , data, int, size);
|
||||||
void destroyAll();
|
void destroyAll();
|
||||||
void initAll(PIVector<PIEthernet::Address> al);
|
void initAll(PIVector<PIEthernet::Address> al);
|
||||||
void run();
|
void run();
|
||||||
|
|||||||
@@ -128,12 +128,13 @@ bool PIConnection::configure(PIConfig & conf, const PIString & name_) {
|
|||||||
PIStringList dev_list(ce.getValue("device").toString());
|
PIStringList dev_list(ce.getValue("device").toString());
|
||||||
PIStringList name_list(ce.getValue("device").name());
|
PIStringList name_list(ce.getValue("device").name());
|
||||||
PIStringList flt_list(ce.getValue("filter").toString());
|
PIStringList flt_list(ce.getValue("filter").toString());
|
||||||
piForeachC (PIConfig::Entry * e, db) {
|
for (const PIConfig::Entry * e : db) {
|
||||||
dev_list << e->value();
|
dev_list << e->value();
|
||||||
name_list << e->name();
|
name_list << e->name();
|
||||||
}
|
}
|
||||||
piForeachC (PIConfig::Entry * e, fb)
|
for (const PIConfig::Entry * e : fb) {
|
||||||
flt_list << e->name();
|
flt_list << e->name();
|
||||||
|
}
|
||||||
PISet<PIString> chk_set = (PISet<PIString>(name_list) & PISet<PIString>(flt_list));
|
PISet<PIString> chk_set = (PISet<PIString>(name_list) & PISet<PIString>(flt_list));
|
||||||
//piCout << name_list << flt_list << chk_set;
|
//piCout << name_list << flt_list << chk_set;
|
||||||
chk_set.remove("");
|
chk_set.remove("");
|
||||||
@@ -157,9 +158,8 @@ bool PIConnection::configure(PIConfig & conf, const PIString & name_) {
|
|||||||
dev->setName(name_ + ".device." + dev_list[i]);
|
dev->setName(name_ + ".device." + dev_list[i]);
|
||||||
PIConfig::Entry de = ce.getValue("device." + n);
|
PIConfig::Entry de = ce.getValue("device." + n);
|
||||||
dev->setThreadedReadBufferSize(de.getValue("bufferSize", dev->threadedReadBufferSize()).toInt());
|
dev->setThreadedReadBufferSize(de.getValue("bufferSize", dev->threadedReadBufferSize()).toInt());
|
||||||
PIDiagnostics * diag = diags_.value(dev, 0);
|
PIDiagnostics * diag = diags_.value(dev, nullptr);
|
||||||
if (diag != 0)
|
if (diag) diag->setDisconnectTimeout(de.getValue("disconnectTimeout", diag->disconnectTimeout()).toFloat());
|
||||||
diag->setDisconnectTimeout(de.getValue("disconnectTimeout", diag->disconnectTimeout()).toFloat());
|
|
||||||
}
|
}
|
||||||
int added(0), padded(-1), tries(0);
|
int added(0), padded(-1), tries(0);
|
||||||
bool pdebug = debug();
|
bool pdebug = debug();
|
||||||
@@ -169,7 +169,7 @@ bool PIConnection::configure(PIConfig & conf, const PIString & name_) {
|
|||||||
padded = added;
|
padded = added;
|
||||||
added = 0;
|
added = 0;
|
||||||
++tries;
|
++tries;
|
||||||
piForeachC (PIConfig::Entry * e, fb) {
|
for (const PIConfig::Entry * e : fb) {
|
||||||
PIPacketExtractor::SplitMode sm = PIPacketExtractor::None;
|
PIPacketExtractor::SplitMode sm = PIPacketExtractor::None;
|
||||||
PIString sms(e->getValue("splitMode").value());
|
PIString sms(e->getValue("splitMode").value());
|
||||||
int smi = sms.toInt();
|
int smi = sms.toInt();
|
||||||
@@ -198,15 +198,15 @@ bool PIConnection::configure(PIConfig & conf, const PIString & name_) {
|
|||||||
PIStringList devs(e->value());
|
PIStringList devs(e->value());
|
||||||
PIConfig::Branch db(e->getValue("device").children());
|
PIConfig::Branch db(e->getValue("device").children());
|
||||||
devs << e->getValue("device", "").value();
|
devs << e->getValue("device", "").value();
|
||||||
piForeachC (PIConfig::Entry * e2, db)
|
for (const PIConfig::Entry * e2 : db) {
|
||||||
devs << e2->value();
|
devs << e2->value();
|
||||||
|
}
|
||||||
devs.removeStrings("");
|
devs.removeStrings("");
|
||||||
if (devs.isEmpty()) continue;
|
if (devs.isEmpty()) continue;
|
||||||
PIString dname = dev_aliases.value(devs.front(), devs.front());
|
PIString dname = dev_aliases.value(devs.front(), devs.front());
|
||||||
PIPacketExtractor * pe = addFilter(e->name(), dname, sm);
|
PIPacketExtractor * pe = addFilter(e->name(), dname, sm);
|
||||||
if (pe == 0) {
|
if (!pe) {
|
||||||
if (!filter_fails.contains(dname))
|
if (!filter_fails.contains(dname)) filter_fails << dname;
|
||||||
filter_fails << dname;
|
|
||||||
continue;
|
continue;
|
||||||
} else {
|
} else {
|
||||||
filter_fails.removeAll(dname);
|
filter_fails.removeAll(dname);
|
||||||
@@ -214,7 +214,7 @@ bool PIConnection::configure(PIConfig & conf, const PIString & name_) {
|
|||||||
++added;
|
++added;
|
||||||
for (int i = 1; i < devs.size_s(); ++i) {
|
for (int i = 1; i < devs.size_s(); ++i) {
|
||||||
dname = dev_aliases.value(devs[i], devs[i]);
|
dname = dev_aliases.value(devs[i], devs[i]);
|
||||||
if (addFilter(e->name(), dname, sm) != 0) {
|
if (addFilter(e->name(), dname, sm)) {
|
||||||
filter_fails.removeAll(dname);
|
filter_fails.removeAll(dname);
|
||||||
++added;
|
++added;
|
||||||
} else {
|
} else {
|
||||||
@@ -222,9 +222,8 @@ bool PIConnection::configure(PIConfig & conf, const PIString & name_) {
|
|||||||
filter_fails << dname;
|
filter_fails << dname;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
PIDiagnostics * diag = diags_.value(pe, 0);
|
PIDiagnostics * diag = diags_.value(pe, nullptr);
|
||||||
if (diag != 0)
|
if (diag) diag->setDisconnectTimeout(e->getValue("disconnectTimeout", diag->disconnectTimeout()).toFloat());
|
||||||
diag->setDisconnectTimeout(e->getValue("disconnectTimeout", diag->disconnectTimeout()).toFloat());
|
|
||||||
pe->setBufferSize(e->getValue("bufferSize", pe->bufferSize()).toInt());
|
pe->setBufferSize(e->getValue("bufferSize", pe->bufferSize()).toInt());
|
||||||
pe->setPayloadSize(e->getValue("payloadSize", pe->payloadSize()).toInt());
|
pe->setPayloadSize(e->getValue("payloadSize", pe->payloadSize()).toInt());
|
||||||
pe->setPacketSize(e->getValue("packetSize", pe->packetSize()).toInt());
|
pe->setPacketSize(e->getValue("packetSize", pe->packetSize()).toInt());
|
||||||
@@ -234,23 +233,26 @@ bool PIConnection::configure(PIConfig & conf, const PIString & name_) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
setDebug(pdebug);
|
setDebug(pdebug);
|
||||||
piForeachC (PIString & f, filter_fails)
|
for (const PIString & f : filter_fails) {
|
||||||
piCoutObj << "\"addFilter\" error: no such device \"" << f << "\"!";
|
piCoutObj << "\"addFilter\" error: no such device \"" << f << "\"!";
|
||||||
piForeachC (PIConfig::Entry * e, cb) {
|
}
|
||||||
|
for (const PIConfig::Entry * e : cb) {
|
||||||
PIString f(e->getValue("from").value()), t(e->getValue("to").value());
|
PIString f(e->getValue("from").value()), t(e->getValue("to").value());
|
||||||
addChannel(dev_aliases.value(f, f), dev_aliases.value(t, t));
|
addChannel(dev_aliases.value(f, f), dev_aliases.value(t, t));
|
||||||
}
|
}
|
||||||
piForeachC (PIConfig::Entry * e, sb) {
|
for (const PIConfig::Entry * e : sb) {
|
||||||
PIStringList devs(e->value());
|
PIStringList devs(e->value());
|
||||||
PIConfig::Branch db(e->getValue("device").children());
|
PIConfig::Branch db(e->getValue("device").children());
|
||||||
devs << e->getValue("device", "").value();
|
devs << e->getValue("device", "").value();
|
||||||
piForeachC (PIConfig::Entry * e2, db)
|
for (const PIConfig::Entry * e2 : db) {
|
||||||
devs << e2->value();
|
devs << e2->value();
|
||||||
|
}
|
||||||
devs.removeStrings("");
|
devs.removeStrings("");
|
||||||
if (devs.isEmpty()) continue;
|
if (devs.isEmpty()) continue;
|
||||||
float freq = e->getValue("frequency").toFloat();
|
float freq = e->getValue("frequency").toFloat();
|
||||||
piForeachC (PIString & d, devs)
|
for (const PIString & d : devs) {
|
||||||
addSender(e->name(), dev_aliases.value(d, d), freq);
|
addSender(e->name(), dev_aliases.value(d, d), freq);
|
||||||
|
}
|
||||||
PIByteArray fd(PIByteArray::fromUserInput(e->getValue("fixedData").toString()));
|
PIByteArray fd(PIByteArray::fromUserInput(e->getValue("fixedData").toString()));
|
||||||
setSenderFixedData(e->name(), fd);
|
setSenderFixedData(e->name(), fd);
|
||||||
}
|
}
|
||||||
@@ -264,32 +266,31 @@ PIString PIConnection::makeConfig() const {
|
|||||||
ts << "[" << name() << "]\n";
|
ts << "[" << name() << "]\n";
|
||||||
PIVector<PIIODevice * > devs(boundedDevices());
|
PIVector<PIIODevice * > devs(boundedDevices());
|
||||||
int dn(-1);
|
int dn(-1);
|
||||||
piForeachC (PIIODevice * d, devs) {
|
for (const PIIODevice * d : devs) {
|
||||||
PIStringList dnl(deviceNames(d));
|
PIStringList dnl(deviceNames(d));
|
||||||
if (dnl.isEmpty()) dnl << PIString::fromNumber(++dn);
|
if (dnl.isEmpty()) dnl << PIString::fromNumber(++dn);
|
||||||
piForeachC (PIString & dname, dnl) {
|
for (const PIString & dname : dnl) {
|
||||||
ts << "device." << dname << " = " << d->constructFullPath() << " #s\n";
|
ts << "device." << dname << " = " << d->constructFullPath() << " #s\n";
|
||||||
ts << "device." << dname << ".bufferSize = " << d->threadedReadBufferSize() << " #n\n";
|
ts << "device." << dname << ".bufferSize = " << d->threadedReadBufferSize() << " #n\n";
|
||||||
PIDiagnostics * diag = diags_.value(const_cast<PIIODevice * >(d), 0);
|
PIDiagnostics * diag = diags_.value(const_cast<PIIODevice * >(d), nullptr);
|
||||||
if (diag != 0)
|
if (diag) ts << "device." << dname << ".disconnectTimeout = " << diag->disconnectTimeout() << " #f\n";
|
||||||
ts << "device." << dname << ".disconnectTimeout = " << diag->disconnectTimeout() << " #f\n";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
piForeachC (PEPair & f, extractors) {
|
auto ite = extractors.makeIterator();
|
||||||
if (f.second == 0) continue;
|
while (ite.next()) {
|
||||||
if (f.second->extractor == 0) continue;
|
if (!ite.value()) continue;
|
||||||
PIString prefix = "filter." + f.first;
|
if (!ite.value()->extractor) continue;
|
||||||
for (int i = 0; i < f.second->devices.size_s(); ++i) {
|
PIString prefix = "filter." + ite.key();
|
||||||
PIString dname = device_names.key(f.second->devices[i]);
|
for (int i = 0; i < ite.value()->devices.size_s(); ++i) {
|
||||||
if (dname.isEmpty()) dname = devPath(f.second->devices[i]);
|
PIString dname = device_names.key(ite.value()->devices[i]);
|
||||||
|
if (dname.isEmpty()) dname = devPath(ite.value()->devices[i]);
|
||||||
ts << prefix << ".device." << i << " = " << dname << " #s\n";
|
ts << prefix << ".device." << i << " = " << dname << " #s\n";
|
||||||
}
|
}
|
||||||
PIDiagnostics * diag = diags_.value(f.second->extractor, 0);
|
PIDiagnostics * diag = diags_.value(ite.value()->extractor, nullptr);
|
||||||
ts << prefix << ".bufferSize = " << f.second->extractor->bufferSize() << " #n\n";
|
ts << prefix << ".bufferSize = " << ite.value()->extractor->bufferSize() << " #n\n";
|
||||||
if (diag != 0)
|
if (diag) ts << prefix << ".disconnectTimeout = " << diag->disconnectTimeout() << " #f\n";
|
||||||
ts << prefix << ".disconnectTimeout = " << diag->disconnectTimeout() << " #f\n";
|
|
||||||
ts << prefix << ".splitMode = ";
|
ts << prefix << ".splitMode = ";
|
||||||
switch (f.second->extractor->splitMode()) {
|
switch (ite.value()->extractor->splitMode()) {
|
||||||
case PIPacketExtractor::None: ts << "none"; break;
|
case PIPacketExtractor::None: ts << "none"; break;
|
||||||
case PIPacketExtractor::Header: ts << "header"; break;
|
case PIPacketExtractor::Header: ts << "header"; break;
|
||||||
case PIPacketExtractor::Footer: ts << "footer"; break;
|
case PIPacketExtractor::Footer: ts << "footer"; break;
|
||||||
@@ -298,37 +299,39 @@ PIString PIConnection::makeConfig() const {
|
|||||||
case PIPacketExtractor::Timeout: ts << "timeout"; break;
|
case PIPacketExtractor::Timeout: ts << "timeout"; break;
|
||||||
}
|
}
|
||||||
ts << " #s\n";
|
ts << " #s\n";
|
||||||
ts << prefix << ".payloadSize = " << f.second->extractor->payloadSize() << " #n\n";
|
ts << prefix << ".payloadSize = " << ite.value()->extractor->payloadSize() << " #n\n";
|
||||||
ts << prefix << ".packetSize = " << f.second->extractor->packetSize() << " #n\n";
|
ts << prefix << ".packetSize = " << ite.value()->extractor->packetSize() << " #n\n";
|
||||||
ts << prefix << ".timeout = " << f.second->extractor->timeout() << " #f\n";
|
ts << prefix << ".timeout = " << ite.value()->extractor->timeout() << " #f\n";
|
||||||
ts << prefix << ".header = " << f.second->extractor->header().toString() << " #s\n";
|
ts << prefix << ".header = " << ite.value()->extractor->header().toString() << " #s\n";
|
||||||
ts << prefix << ".footer = " << f.second->extractor->footer().toString() << " #s\n";
|
ts << prefix << ".footer = " << ite.value()->extractor->footer().toString() << " #s\n";
|
||||||
}
|
}
|
||||||
dn = 0;
|
dn = 0;
|
||||||
piForeachC (CPair & c, channels_) {
|
auto itc = channels_.makeIterator();
|
||||||
piForeachC (PIIODevice * d, c.second) {
|
while (itc.next()) {
|
||||||
|
for (const PIIODevice * d : itc.value()) {
|
||||||
PIString prefix = "channel." + PIString::fromNumber(dn); ++dn;
|
PIString prefix = "channel." + PIString::fromNumber(dn); ++dn;
|
||||||
PIString dname = device_names.key(c.first);
|
PIString dname = device_names.key(itc.key());
|
||||||
if (dname.isEmpty()) dname = devPath(c.first);
|
if (dname.isEmpty()) dname = devPath(itc.key());
|
||||||
ts << prefix << ".from = " << dname << " #s\n";
|
ts << prefix << ".from = " << dname << " #s\n";
|
||||||
dname = device_names.key(const_cast<PIIODevice *>(d));
|
dname = device_names.key(const_cast<PIIODevice *>(d));
|
||||||
if (dname.isEmpty()) dname = devPath(d);
|
if (dname.isEmpty()) dname = devPath(d);
|
||||||
ts << prefix << ".to = " << dname << " #s\n";
|
ts << prefix << ".to = " << dname << " #s\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
piForeachC (SPair & s, senders) {
|
auto its = senders.makeIterator();
|
||||||
if (s.second == 0) continue;
|
while (its.next()) {
|
||||||
PIString prefix = "sender." + s.second->name();
|
if (!its.value()) continue;
|
||||||
for (int i = 0; i < s.second->devices.size_s(); ++i) {
|
PIString prefix = "sender." + its.value()->name();
|
||||||
PIString dname = device_names.key(s.second->devices[i]);
|
for (int i = 0; i < its.value()->devices.size_s(); ++i) {
|
||||||
if (dname.isEmpty()) dname = devPath(s.second->devices[i]);
|
PIString dname = device_names.key(its.value()->devices[i]);
|
||||||
|
if (dname.isEmpty()) dname = devPath(its.value()->devices[i]);
|
||||||
ts << prefix << ".device." << i << " = " << dname << " #s\n";
|
ts << prefix << ".device." << i << " = " << dname << " #s\n";
|
||||||
}
|
}
|
||||||
double int_ = s.second->int_;
|
double int_ = its.value()->int_;
|
||||||
if (int_ > 0.)
|
if (int_ > 0.)
|
||||||
ts << prefix << ".frequency = " << (1000. / int_) << " #f\n";
|
ts << prefix << ".frequency = " << (1000. / int_) << " #f\n";
|
||||||
if (!s.second->sdata.isEmpty())
|
if (!its.value()->sdata.isEmpty())
|
||||||
ts << prefix << ".fixedData = " << s.second->sdata.toString() << " #s\n";
|
ts << prefix << ".fixedData = " << its.value()->sdata.toString() << " #s\n";
|
||||||
}
|
}
|
||||||
ts << "[]\n";
|
ts << "[]\n";
|
||||||
return ret;
|
return ret;
|
||||||
@@ -342,11 +345,11 @@ PIIODevice * PIConnection::addDevice(const PIString & full_path, PIIODevice::Dev
|
|||||||
dev->setName(name() + ".device." + fp);
|
dev->setName(name() + ".device." + fp);
|
||||||
device_modes[dev] = mode;
|
device_modes[dev] = mode;
|
||||||
__device_pool__->lock();
|
__device_pool__->lock();
|
||||||
if (diags_.value(dev, 0) == 0) {
|
if (!diags_.value(dev, nullptr)) {
|
||||||
PIDiagnostics * d = new PIDiagnostics(false);
|
PIDiagnostics * d = new PIDiagnostics(false);
|
||||||
d->setInterval(100.);
|
d->setInterval(100.);
|
||||||
diags_[dev] = d;
|
diags_[dev] = d;
|
||||||
CONNECTU(d, qualityChanged, this, diagQualityChanged);
|
CONNECT2(void, PIDiagnostics::Quality, PIDiagnostics::Quality, d, qualityChanged, this, diagQualityChanged);
|
||||||
__device_pool__->init();
|
__device_pool__->init();
|
||||||
}
|
}
|
||||||
__device_pool__->unlock();
|
__device_pool__->unlock();
|
||||||
@@ -363,9 +366,10 @@ void PIConnection::setDeviceName(PIIODevice * dev, const PIString & name) {
|
|||||||
|
|
||||||
PIStringList PIConnection::deviceNames(const PIIODevice * dev) const {
|
PIStringList PIConnection::deviceNames(const PIIODevice * dev) const {
|
||||||
PIStringList ret;
|
PIStringList ret;
|
||||||
piForeachC (DNPair & s, device_names)
|
auto it = device_names.makeIterator();
|
||||||
if (s.second == dev)
|
while(it.next()) {
|
||||||
ret << s.first;
|
if (it.value() == dev) ret << it.key();
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -373,29 +377,31 @@ PIStringList PIConnection::deviceNames(const PIIODevice * dev) const {
|
|||||||
bool PIConnection::removeDevice(const PIString & full_path) {
|
bool PIConnection::removeDevice(const PIString & full_path) {
|
||||||
PIString fp(PIIODevice::normalizeFullPath(full_path));
|
PIString fp(PIIODevice::normalizeFullPath(full_path));
|
||||||
PIIODevice * dev = __device_pool__->device(fp);
|
PIIODevice * dev = __device_pool__->device(fp);
|
||||||
if (dev == 0) return false;
|
if (!dev) return false;
|
||||||
PIStringList dntd(deviceNames(dev));
|
PIStringList dntd(deviceNames(dev));
|
||||||
piForeachC (PIString & n, dntd)
|
for (const PIString & n : dntd) {
|
||||||
device_names.removeOne(n);
|
device_names.removeOne(n);
|
||||||
|
}
|
||||||
for (auto s = senders.constBegin(); s != senders.constEnd(); s++) {
|
for (auto s = senders.constBegin(); s != senders.constEnd(); s++) {
|
||||||
if (s.value() == 0) continue;
|
if (!s.value()) continue;
|
||||||
s.value()->lock();
|
s.value()->lock();
|
||||||
s.value()->devices.removeAll(dev);
|
s.value()->devices.removeAll(dev);
|
||||||
s.value()->unlock();
|
s.value()->unlock();
|
||||||
}
|
}
|
||||||
device_modes.remove(dev);
|
device_modes.remove(dev);
|
||||||
for (auto i = extractors.constBegin(); i != extractors.constEnd(); i++) {
|
for (auto i = extractors.constBegin(); i != extractors.constEnd(); i++) {
|
||||||
if (i.value() == 0) continue;
|
if (!i.value()) continue;
|
||||||
i.value()->devices.removeAll(dev);
|
i.value()->devices.removeAll(dev);
|
||||||
}
|
}
|
||||||
bounded_extractors.remove(dev);
|
bounded_extractors.remove(dev);
|
||||||
channels_.remove(dev);
|
channels_.remove(dev);
|
||||||
auto it = channels_.makeIterator();
|
auto it = channels_.makeIterator();
|
||||||
while (it.next())
|
while (it.next()) {
|
||||||
it.valueRef().removeAll(dev);
|
it.valueRef().removeAll(dev);
|
||||||
|
}
|
||||||
__device_pool__->lock();
|
__device_pool__->lock();
|
||||||
if (diags_.value(dev, 0) != 0)
|
PIDiagnostics * dg = diags_.value(dev, nullptr);
|
||||||
delete diags_.value(dev);
|
if (dg) delete dg;
|
||||||
diags_.remove(dev);
|
diags_.remove(dev);
|
||||||
__device_pool__->unlock();
|
__device_pool__->unlock();
|
||||||
return __device_pool__->removeDevice(this, fp);
|
return __device_pool__->removeDevice(this, fp);
|
||||||
@@ -406,19 +412,20 @@ void PIConnection::removeAllDevices() {
|
|||||||
device_names.clear();
|
device_names.clear();
|
||||||
PIVector<PIIODevice * > bdevs(__device_pool__->boundedDevices(this));
|
PIVector<PIIODevice * > bdevs(__device_pool__->boundedDevices(this));
|
||||||
__device_pool__->lock();
|
__device_pool__->lock();
|
||||||
piForeach (PIIODevice * d, bdevs) {
|
for (PIIODevice * d : bdevs) {
|
||||||
for (auto s = senders.constBegin(); s != senders.constEnd(); s++) {
|
for (auto s = senders.constBegin(); s != senders.constEnd(); s++) {
|
||||||
if (s.value() == 0) continue;
|
if (!s.value()) continue;
|
||||||
s.value()->lock();
|
s.value()->lock();
|
||||||
s.value()->devices.removeAll(d);
|
s.value()->devices.removeAll(d);
|
||||||
s.value()->unlock();
|
s.value()->unlock();
|
||||||
}
|
}
|
||||||
channels_.remove(d);
|
channels_.remove(d);
|
||||||
auto it = channels_.makeIterator();
|
auto it = channels_.makeIterator();
|
||||||
while (it.next())
|
while (it.next()) {
|
||||||
it.valueRef().removeAll(d);
|
it.valueRef().removeAll(d);
|
||||||
if (diags_.value(d, 0) != 0)
|
}
|
||||||
delete diags_.value(d);
|
PIDiagnostics * dg = diags_.value(d, nullptr);
|
||||||
|
if (dg) delete dg;
|
||||||
diags_.remove(d);
|
diags_.remove(d);
|
||||||
}
|
}
|
||||||
__device_pool__->unboundConnection(this);
|
__device_pool__->unboundConnection(this);
|
||||||
@@ -426,7 +433,7 @@ void PIConnection::removeAllDevices() {
|
|||||||
device_modes.clear();
|
device_modes.clear();
|
||||||
bounded_extractors.clear();
|
bounded_extractors.clear();
|
||||||
for (auto i = extractors.constBegin(); i != extractors.constEnd(); i++) {
|
for (auto i = extractors.constBegin(); i != extractors.constEnd(); i++) {
|
||||||
if (i.value() == 0) continue;
|
if (!i.value()) continue;
|
||||||
i.value()->devices.clear();
|
i.value()->devices.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -434,16 +441,16 @@ void PIConnection::removeAllDevices() {
|
|||||||
|
|
||||||
PIIODevice * PIConnection::deviceByFullPath(const PIString & full_path) const {
|
PIIODevice * PIConnection::deviceByFullPath(const PIString & full_path) const {
|
||||||
PIString fp(PIIODevice::normalizeFullPath(full_path));
|
PIString fp(PIIODevice::normalizeFullPath(full_path));
|
||||||
DevicePool::DeviceData * dd = __device_pool__->devices.value(fp);
|
DevicePool::DeviceData * dd = __device_pool__->devices.value(fp, nullptr);
|
||||||
if (dd == 0) return 0;
|
if (!dd) return nullptr;
|
||||||
if (dd->dev == 0) return 0;
|
if (!dd->dev) return nullptr;
|
||||||
if (!dd->listeners.contains(const_cast<PIConnection * >(this))) return 0;
|
if (!dd->listeners.contains(const_cast<PIConnection * >(this))) return nullptr;
|
||||||
return dd->dev;
|
return dd->dev;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PIIODevice * PIConnection::deviceByName(const PIString & name) const {
|
PIIODevice * PIConnection::deviceByName(const PIString & name) const {
|
||||||
return device_names.value(name, 0);
|
return device_names.value(name, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -454,36 +461,32 @@ PIVector<PIIODevice * > PIConnection::boundedDevices() const {
|
|||||||
|
|
||||||
PIPacketExtractor * PIConnection::addFilter(const PIString & name_, const PIString & full_path, PIPacketExtractor::SplitMode mode) {
|
PIPacketExtractor * PIConnection::addFilter(const PIString & name_, const PIString & full_path, PIPacketExtractor::SplitMode mode) {
|
||||||
PIString fname_ = name_.trimmed();
|
PIString fname_ = name_.trimmed();
|
||||||
Extractor * e = extractors.value(fname_);
|
Extractor * e = extractors.value(fname_, nullptr);
|
||||||
if (full_path.isEmpty()) return (e == 0 ? 0 : e->extractor);
|
if (full_path.isEmpty()) return (e ? e->extractor : nullptr);
|
||||||
PIIODevice * dev = devByString(full_path);
|
PIIODevice * dev = devByString(full_path);
|
||||||
PIPacketExtractor * pe(0);
|
PIPacketExtractor * pe = nullptr;
|
||||||
if (extractors.value(full_path) != 0) pe = extractors.value(full_path)->extractor;
|
if (extractors.value(full_path, nullptr)) pe = extractors.value(full_path, nullptr)->extractor;
|
||||||
if (pe != 0) dev = pe;
|
if (pe) dev = pe;
|
||||||
if (dev == 0) {
|
if (!dev) {
|
||||||
piCoutObj << "\"addFilter\" error: no such device or filter \"" << full_path << "\"!";
|
piCoutObj << "\"addFilter\" error: no such device or filter \"" << full_path << "\"!";
|
||||||
return 0;
|
return nullptr;
|
||||||
}
|
}
|
||||||
if (e == 0) {
|
if (!e) {
|
||||||
e = new Extractor();
|
e = new Extractor();
|
||||||
extractors[fname_] = e;
|
extractors[fname_] = e;
|
||||||
}
|
}
|
||||||
if (e->extractor == 0) {
|
if (!e->extractor) {
|
||||||
e->extractor = new PIPacketExtractor(0, mode);
|
e->extractor = new PIPacketExtractor(nullptr, mode);
|
||||||
e->extractor->setName(fname_);
|
e->extractor->setName(fname_);
|
||||||
e->extractor->setThreadedReadData(new PIPair<PIConnection * , PIString>(this, fname_));
|
|
||||||
e->extractor->setHeaderCheckSlot(filterValidateHeaderS);
|
|
||||||
e->extractor->setFooterCheckSlot(filterValidateFooterS);
|
|
||||||
e->extractor->setPayloadCheckSlot(filterValidatePayloadS);
|
|
||||||
__device_pool__->lock();
|
__device_pool__->lock();
|
||||||
if (diags_.value(e->extractor, 0) == 0) {
|
if (!diags_.value(e->extractor, nullptr)) {
|
||||||
PIDiagnostics * d = new PIDiagnostics(false);
|
PIDiagnostics * d = new PIDiagnostics(false);
|
||||||
d->setInterval(100.);
|
d->setInterval(100.);
|
||||||
diags_[e->extractor] = d;
|
diags_[e->extractor] = d;
|
||||||
CONNECTU(d, qualityChanged, this, diagQualityChanged);
|
CONNECT2(void, PIDiagnostics::Quality, PIDiagnostics::Quality, d, qualityChanged, this, diagQualityChanged);
|
||||||
}
|
}
|
||||||
__device_pool__->unlock();
|
__device_pool__->unlock();
|
||||||
CONNECT2(void, uchar * , int, e->extractor, packetReceived, this, packetExtractorReceived)
|
CONNECT2(void, const uchar * , int, e->extractor, packetReceived, this, packetExtractorReceived)
|
||||||
}
|
}
|
||||||
if (!e->devices.contains(dev)) {
|
if (!e->devices.contains(dev)) {
|
||||||
bounded_extractors[dev] << e->extractor;
|
bounded_extractors[dev] << e->extractor;
|
||||||
@@ -495,32 +498,33 @@ PIPacketExtractor * PIConnection::addFilter(const PIString & name_, const PIStri
|
|||||||
|
|
||||||
|
|
||||||
PIPacketExtractor * PIConnection::addFilter(PIPacketExtractor * filter, const PIString & full_path) {
|
PIPacketExtractor * PIConnection::addFilter(PIPacketExtractor * filter, const PIString & full_path) {
|
||||||
Extractor * e = 0;
|
Extractor * e = nullptr;
|
||||||
if (full_path.isEmpty()) return (e == 0 ? 0 : e->extractor);
|
if (full_path.isEmpty()) return nullptr;
|
||||||
PIIODevice * dev = devByString(full_path);
|
PIIODevice * dev = devByString(full_path);
|
||||||
PIPacketExtractor * pe(0);
|
PIPacketExtractor * pe = nullptr;
|
||||||
if (extractors.value(full_path) != 0) pe = extractors.value(full_path)->extractor;
|
e = extractors.value(full_path, nullptr);
|
||||||
if (pe != 0) dev = pe;
|
if (e) pe = e->extractor;
|
||||||
if (dev == 0) {
|
if (pe) {
|
||||||
|
dev = pe;
|
||||||
|
} else {
|
||||||
piCoutObj << "\"addFilter\" error: no such device or filter \"" << full_path << "\"!";
|
piCoutObj << "\"addFilter\" error: no such device or filter \"" << full_path << "\"!";
|
||||||
return 0;
|
return nullptr;
|
||||||
}
|
}
|
||||||
if (e == 0) {
|
if (!e) {
|
||||||
e = new Extractor();
|
e = new Extractor();
|
||||||
extractors[filter->name()] = e;
|
extractors[filter->name()] = e;
|
||||||
}
|
}
|
||||||
if (e->extractor == 0) {
|
if (!e->extractor) {
|
||||||
e->extractor = filter;
|
e->extractor = filter;
|
||||||
e->extractor->setThreadedReadData(new PIPair<PIConnection * , PIString>(this, filter->name()));
|
|
||||||
__device_pool__->lock();
|
__device_pool__->lock();
|
||||||
if (diags_.value(e->extractor, 0) == 0) {
|
if (diags_.value(e->extractor, 0) == 0) {
|
||||||
PIDiagnostics * d = new PIDiagnostics(false);
|
PIDiagnostics * d = new PIDiagnostics(false);
|
||||||
d->setInterval(100.);
|
d->setInterval(100.);
|
||||||
diags_[e->extractor] = d;
|
diags_[e->extractor] = d;
|
||||||
CONNECTU(d, qualityChanged, this, diagQualityChanged);
|
CONNECT2(void, PIDiagnostics::Quality, PIDiagnostics::Quality, d, qualityChanged, this, diagQualityChanged);
|
||||||
}
|
}
|
||||||
__device_pool__->unlock();
|
__device_pool__->unlock();
|
||||||
CONNECT2(void, uchar * , int, e->extractor, packetReceived, this, packetExtractorReceived)
|
CONNECT2(void, const uchar * , int, e->extractor, packetReceived, this, packetExtractorReceived)
|
||||||
}
|
}
|
||||||
if (!e->devices.contains(dev)) {
|
if (!e->devices.contains(dev)) {
|
||||||
bounded_extractors[dev] << e->extractor;
|
bounded_extractors[dev] << e->extractor;
|
||||||
@@ -536,9 +540,9 @@ bool PIConnection::removeFilter(const PIString & name_, const PIString & full_pa
|
|||||||
|
|
||||||
|
|
||||||
bool PIConnection::removeFilter(const PIString & name_, const PIIODevice * dev) {
|
bool PIConnection::removeFilter(const PIString & name_, const PIIODevice * dev) {
|
||||||
if (dev == 0) return false;
|
if (!dev) return false;
|
||||||
Extractor * p = extractors.value(name_.trimmed());
|
Extractor * p = extractors.value(name_.trimmed(), nullptr);
|
||||||
if (p == 0) return false;
|
if (!p) return false;
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
for (int i = 0; i < p->devices.size_s(); ++i) {
|
for (int i = 0; i < p->devices.size_s(); ++i) {
|
||||||
if (p->devices[i] == dev) {
|
if (p->devices[i] == dev) {
|
||||||
@@ -557,8 +561,8 @@ bool PIConnection::removeFilter(const PIString & name_, const PIIODevice * dev)
|
|||||||
|
|
||||||
|
|
||||||
bool PIConnection::removeFilter(const PIString & name_) {
|
bool PIConnection::removeFilter(const PIString & name_) {
|
||||||
Extractor * p = extractors.value(name_.trimmed());
|
Extractor * p = extractors.value(name_.trimmed(), nullptr);
|
||||||
if (p == 0) return false;
|
if (!p) return false;
|
||||||
unboundExtractor(p->extractor);
|
unboundExtractor(p->extractor);
|
||||||
delete p;
|
delete p;
|
||||||
return true;
|
return true;
|
||||||
@@ -568,13 +572,15 @@ bool PIConnection::removeFilter(const PIString & name_) {
|
|||||||
void PIConnection::removeAllFilters() {
|
void PIConnection::removeAllFilters() {
|
||||||
__device_pool__->lock();
|
__device_pool__->lock();
|
||||||
for (auto i = extractors.constBegin(); i != extractors.constEnd(); i++) {
|
for (auto i = extractors.constBegin(); i != extractors.constEnd(); i++) {
|
||||||
if (i.value() == 0) continue;
|
if (!i.value()) continue;
|
||||||
channels_.remove(i.value()->extractor);
|
channels_.remove(i.value()->extractor);
|
||||||
auto it = channels_.makeIterator();
|
auto it = channels_.makeIterator();
|
||||||
while (it.next())
|
while (it.next()) {
|
||||||
it.valueRef().removeAll(i.value()->extractor);
|
it.valueRef().removeAll(i.value()->extractor);
|
||||||
if (diags_.value(i.value()->extractor, 0) != 0)
|
}
|
||||||
|
if (diags_.value(i.value()->extractor)) {
|
||||||
delete diags_.value(i.value()->extractor);
|
delete diags_.value(i.value()->extractor);
|
||||||
|
}
|
||||||
diags_.remove(i.value()->extractor);
|
diags_.remove(i.value()->extractor);
|
||||||
delete i.value();
|
delete i.value();
|
||||||
}
|
}
|
||||||
@@ -587,8 +593,9 @@ void PIConnection::removeAllFilters() {
|
|||||||
PIVector<PIPacketExtractor * > PIConnection::filters() const {
|
PIVector<PIPacketExtractor * > PIConnection::filters() const {
|
||||||
PIVector<PIPacketExtractor * > ret;
|
PIVector<PIPacketExtractor * > ret;
|
||||||
for (auto i = extractors.constBegin(); i != extractors.constEnd(); i++) {
|
for (auto i = extractors.constBegin(); i != extractors.constEnd(); i++) {
|
||||||
if (i.value() != 0)
|
if (i.value()) {
|
||||||
if (i.value()->extractor != 0) ret << i.value()->extractor;
|
if (i.value()->extractor) ret << i.value()->extractor;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -597,8 +604,8 @@ PIVector<PIPacketExtractor * > PIConnection::filters() const {
|
|||||||
PIStringList PIConnection::filterNames() const {
|
PIStringList PIConnection::filterNames() const {
|
||||||
PIStringList ret;
|
PIStringList ret;
|
||||||
for (auto i = extractors.constBegin(); i != extractors.constEnd(); i++) {
|
for (auto i = extractors.constBegin(); i != extractors.constEnd(); i++) {
|
||||||
if (i.value() != 0)
|
if (i.value())
|
||||||
if (i.value()->extractor != 0) ret << i.key();
|
if (i.value()->extractor) ret << i.key();
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -607,18 +614,18 @@ PIStringList PIConnection::filterNames() const {
|
|||||||
PIPacketExtractor * PIConnection::filter(const PIString & name_) const {
|
PIPacketExtractor * PIConnection::filter(const PIString & name_) const {
|
||||||
PIString fname_ = name_.trimmed();
|
PIString fname_ = name_.trimmed();
|
||||||
for (auto i = extractors.constBegin(); i != extractors.constEnd(); i++) {
|
for (auto i = extractors.constBegin(); i != extractors.constEnd(); i++) {
|
||||||
if (i.value() != 0)
|
if (i.value()) {
|
||||||
if (i.value()->extractor != 0 && i.key() == fname_)
|
if ((i.value()->extractor) && (i.key() == fname_)) return i.value()->extractor;
|
||||||
return i.value()->extractor;
|
|
||||||
}
|
}
|
||||||
return 0;
|
}
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PIVector<PIIODevice * > PIConnection::filterBoundedDevices(const PIString & name_) const {
|
PIVector<PIIODevice * > PIConnection::filterBoundedDevices(const PIString & name_) const {
|
||||||
PIVector<PIIODevice * > ret;
|
PIVector<PIIODevice * > ret;
|
||||||
Extractor * p = extractors.value(name_.trimmed());
|
Extractor * p = extractors.value(name_.trimmed());
|
||||||
if (p == 0) return ret;
|
if (!p) return ret;
|
||||||
return p->devices;
|
return p->devices;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -626,15 +633,19 @@ PIVector<PIIODevice * > PIConnection::filterBoundedDevices(const PIString & name
|
|||||||
bool PIConnection::addChannel(const PIString & name0, const PIString & name1) {
|
bool PIConnection::addChannel(const PIString & name0, const PIString & name1) {
|
||||||
//piCout << "addChannel" << name0 << name1;
|
//piCout << "addChannel" << name0 << name1;
|
||||||
if (name0.isEmpty() || name1.isEmpty()) return false;
|
if (name0.isEmpty() || name1.isEmpty()) return false;
|
||||||
PIIODevice * dev0 = devByString(name0), * dev1 = devByString(name1);
|
PIIODevice * dev0 = devByString(name0);
|
||||||
PIPacketExtractor * pe0(0), * pe1(0);
|
PIIODevice * dev1 = devByString(name1);
|
||||||
if (extractors.value(name0) != 0) pe0 = extractors.value(name0)->extractor;
|
Extractor * p0 = extractors.value(name0, nullptr);
|
||||||
if (extractors.value(name1) != 0) pe1 = extractors.value(name1)->extractor;
|
Extractor * p1 = extractors.value(name1, nullptr);
|
||||||
if (pe0 != 0) dev0 = pe0;
|
PIPacketExtractor * pe0 = nullptr;
|
||||||
if (pe1 != 0) dev1 = pe1;
|
PIPacketExtractor * pe1 = nullptr;
|
||||||
if (dev0 == 0 || dev1 == 0) {
|
if (p0) pe0 = p0->extractor;
|
||||||
if (dev0 == 0) piCoutObj << "\"addChannel\" error: no such device \"" << name0 << "\"!";
|
if (p1) pe1 = p1->extractor;
|
||||||
if (dev1 == 0) piCoutObj << "\"addChannel\" error: no such device \"" << name1 << "\"!";
|
if (pe0) dev0 = pe0;
|
||||||
|
if (pe1) dev1 = pe1;
|
||||||
|
if (!dev0 || !dev1) {
|
||||||
|
if (!dev0) piCoutObj << "\"addChannel\" error: no such device \"" << name0 << "\"!";
|
||||||
|
if (!dev1) piCoutObj << "\"addChannel\" error: no such device \"" << name1 << "\"!";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!channels_[dev0].contains(dev1))
|
if (!channels_[dev0].contains(dev1))
|
||||||
@@ -644,13 +655,17 @@ bool PIConnection::addChannel(const PIString & name0, const PIString & name1) {
|
|||||||
|
|
||||||
|
|
||||||
bool PIConnection::removeChannel(const PIString & name0, const PIString & name1) {
|
bool PIConnection::removeChannel(const PIString & name0, const PIString & name1) {
|
||||||
PIIODevice * dev0 = devByString(name0), * dev1 = devByString(name1);
|
PIIODevice * dev0 = devByString(name0);
|
||||||
PIPacketExtractor * pe0(0), * pe1(0);
|
PIIODevice * dev1 = devByString(name1);
|
||||||
if (extractors.value(name0) != 0) pe0 = extractors.value(name0)->extractor;
|
Extractor * p0 = extractors.value(name0, nullptr);
|
||||||
if (extractors.value(name1) != 0) pe1 = extractors.value(name1)->extractor;
|
Extractor * p1 = extractors.value(name1, nullptr);
|
||||||
if (pe0 != 0) dev0 = pe0;
|
PIPacketExtractor * pe0 = nullptr;
|
||||||
if (pe1 != 0) dev1 = pe1;
|
PIPacketExtractor * pe1 = nullptr;
|
||||||
if (dev0 == 0 || dev1 == 0) return false;
|
if (p0) pe0 = p0->extractor;
|
||||||
|
if (p1) pe1 = p1->extractor;
|
||||||
|
if (pe0) dev0 = pe0;
|
||||||
|
if (pe1) dev1 = pe1;
|
||||||
|
if (!dev0 || !dev1) return false;
|
||||||
channels_[dev0].removeAll(dev1);
|
channels_[dev0].removeAll(dev1);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -658,14 +673,16 @@ bool PIConnection::removeChannel(const PIString & name0, const PIString & name1)
|
|||||||
|
|
||||||
bool PIConnection::removeChannel(const PIString & name0) {
|
bool PIConnection::removeChannel(const PIString & name0) {
|
||||||
PIIODevice * dev0 = devByString(name0);
|
PIIODevice * dev0 = devByString(name0);
|
||||||
PIPacketExtractor * pe0(0);
|
Extractor * p0 = extractors.value(name0, nullptr);
|
||||||
if (extractors.value(name0) != 0) pe0 = extractors.value(name0)->extractor;
|
PIPacketExtractor * pe0 = nullptr;
|
||||||
if (pe0 != 0) dev0 = pe0;
|
if (p0) pe0 = p0->extractor;
|
||||||
if (dev0 == 0) return false;
|
if (pe0) dev0 = pe0;
|
||||||
|
if (!dev0) return false;
|
||||||
channels_.remove(dev0);
|
channels_.remove(dev0);
|
||||||
auto it = channels_.makeIterator();
|
auto it = channels_.makeIterator();
|
||||||
while (it.next())
|
while (it.next()) {
|
||||||
it.valueRef().removeAll(dev0);
|
it.valueRef().removeAll(dev0);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -676,21 +693,21 @@ void PIConnection::removeAllChannels() {
|
|||||||
|
|
||||||
|
|
||||||
PIString PIConnection::devPath(const PIIODevice * d) const {
|
PIString PIConnection::devPath(const PIIODevice * d) const {
|
||||||
if (d == 0) return PIString();
|
if (!d) return PIString();
|
||||||
if (strcmp(d->className(), "PIPacketExtractor") == 0) return d->name();
|
if (strcmp(d->className(), "PIPacketExtractor") == 0) return d->name();
|
||||||
return d->constructFullPath();
|
return d->constructFullPath();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PIString PIConnection::devFPath(const PIIODevice * d) const {
|
PIString PIConnection::devFPath(const PIIODevice * d) const {
|
||||||
if (d == 0) return PIString();
|
if (!d) return PIString();
|
||||||
if (d->isPropertyExists("__fullPath__")) return d->property("__fullPath__").toString();
|
if (d->isPropertyExists("__fullPath__")) return d->property("__fullPath__").toString();
|
||||||
return d->name();
|
return d->name();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PIIODevice * PIConnection::devByString(const PIString & s) const {
|
PIIODevice * PIConnection::devByString(const PIString & s) const {
|
||||||
if (s.isEmpty()) return 0;
|
if (s.isEmpty()) return nullptr;
|
||||||
PIIODevice * ret = deviceByName(s);
|
PIIODevice * ret = deviceByName(s);
|
||||||
if (!ret) ret = deviceByFullPath(s);
|
if (!ret) ret = deviceByFullPath(s);
|
||||||
return ret;
|
return ret;
|
||||||
@@ -699,11 +716,13 @@ PIIODevice * PIConnection::devByString(const PIString & s) const {
|
|||||||
|
|
||||||
PIVector<PIPair<PIString, PIString > > PIConnection::channels() const {
|
PIVector<PIPair<PIString, PIString > > PIConnection::channels() const {
|
||||||
PIVector<PIPair<PIString, PIString > > ret;
|
PIVector<PIPair<PIString, PIString > > ret;
|
||||||
piForeachC (CPair & i, channels_) {
|
auto it = channels_.makeIterator();
|
||||||
PIString fp0(devFPath(i.first));
|
while (it.next()) {
|
||||||
piForeachC (PIIODevice * d, i.second)
|
PIString fp0(devFPath(it.key()));
|
||||||
|
for (const PIIODevice * d : it.value()) {
|
||||||
ret << PIPair<PIString, PIString>(fp0, devFPath(d));
|
ret << PIPair<PIString, PIString>(fp0, devFPath(d));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -711,15 +730,15 @@ PIVector<PIPair<PIString, PIString > > PIConnection::channels() const {
|
|||||||
void PIConnection::addSender(const PIString & name_, const PIString & full_path_name, float frequency, bool start_) {
|
void PIConnection::addSender(const PIString & name_, const PIString & full_path_name, float frequency, bool start_) {
|
||||||
PIString fname_ = name_.trimmed();
|
PIString fname_ = name_.trimmed();
|
||||||
if (full_path_name.isEmpty() || frequency <= 0.) return;
|
if (full_path_name.isEmpty() || frequency <= 0.) return;
|
||||||
Sender * s = senders.value(fname_);
|
Sender * s = senders.value(fname_, nullptr);
|
||||||
if (s == 0) {
|
if (!s) {
|
||||||
s = new Sender(this);
|
s = new Sender(this);
|
||||||
s->setName(fname_);
|
s->setName(fname_);
|
||||||
s->int_ = 1000. / frequency;
|
s->int_ = 1000. / frequency;
|
||||||
senders[fname_] = s;
|
senders[fname_] = s;
|
||||||
}
|
}
|
||||||
PIIODevice * dev = devByString(full_path_name);
|
PIIODevice * dev = devByString(full_path_name);
|
||||||
if (dev == 0) {
|
if (!dev) {
|
||||||
piCoutObj << "\"addSender\" error: no such device \"" << full_path_name << "\"!";
|
piCoutObj << "\"addSender\" error: no such device \"" << full_path_name << "\"!";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -728,28 +747,26 @@ void PIConnection::addSender(const PIString & name_, const PIString & full_path_
|
|||||||
if (!__device_pool__->fake) s->start(s->int_);
|
if (!__device_pool__->fake) s->start(s->int_);
|
||||||
}
|
}
|
||||||
s->lock();
|
s->lock();
|
||||||
if (!s->devices.contains(dev))
|
if (!s->devices.contains(dev)) s->devices << dev;
|
||||||
s->devices << dev;
|
|
||||||
s->unlock();
|
s->unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool PIConnection::removeSender(const PIString & name, const PIString & full_path_name) {
|
bool PIConnection::removeSender(const PIString & name, const PIString & full_path_name) {
|
||||||
Sender * s = senders.value(name, 0);
|
Sender * s = senders.value(name, nullptr);
|
||||||
PIIODevice * d = devByString(full_path_name);
|
PIIODevice * d = devByString(full_path_name);
|
||||||
if (s == 0 || d == 0) return false;
|
if (!s || !d) return false;
|
||||||
s->lock();
|
s->lock();
|
||||||
bool ret = s->devices.contains(d);
|
bool ret = s->devices.contains(d);
|
||||||
if (ret)
|
if (ret) s->devices.removeAll(d);
|
||||||
s->devices.removeAll(d);
|
|
||||||
s->unlock();
|
s->unlock();
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool PIConnection::removeSender(const PIString & name) {
|
bool PIConnection::removeSender(const PIString & name) {
|
||||||
Sender * s = senders.value(name, 0);
|
Sender * s = senders.value(name, nullptr);
|
||||||
if (s == 0) return false;
|
if (!s) return false;
|
||||||
delete s;
|
delete s;
|
||||||
senders.remove(name);
|
senders.remove(name);
|
||||||
return true;
|
return true;
|
||||||
@@ -757,8 +774,8 @@ bool PIConnection::removeSender(const PIString & name) {
|
|||||||
|
|
||||||
|
|
||||||
bool PIConnection::setSenderFixedData(const PIString & name, const PIByteArray & data) {
|
bool PIConnection::setSenderFixedData(const PIString & name, const PIByteArray & data) {
|
||||||
Sender * s = senders.value(name, 0);
|
Sender * s = senders.value(name, nullptr);
|
||||||
if (s == 0) return false;
|
if (!s) return false;
|
||||||
s->lock();
|
s->lock();
|
||||||
s->sdata = data;
|
s->sdata = data;
|
||||||
s->unlock();
|
s->unlock();
|
||||||
@@ -767,8 +784,8 @@ bool PIConnection::setSenderFixedData(const PIString & name, const PIByteArray &
|
|||||||
|
|
||||||
|
|
||||||
bool PIConnection::clearSenderFixedData(const PIString & name) {
|
bool PIConnection::clearSenderFixedData(const PIString & name) {
|
||||||
Sender * s = senders.value(name, 0);
|
Sender * s = senders.value(name, nullptr);
|
||||||
if (s == 0) return false;
|
if (!s) return false;
|
||||||
s->lock();
|
s->lock();
|
||||||
s->sdata.clear();
|
s->sdata.clear();
|
||||||
s->unlock();
|
s->unlock();
|
||||||
@@ -777,15 +794,15 @@ bool PIConnection::clearSenderFixedData(const PIString & name) {
|
|||||||
|
|
||||||
|
|
||||||
PIByteArray PIConnection::senderFixedData(const PIString & name) const {
|
PIByteArray PIConnection::senderFixedData(const PIString & name) const {
|
||||||
Sender * s = senders.value(name, 0);
|
Sender * s = senders.value(name, nullptr);
|
||||||
if (s == 0) return PIByteArray();
|
if (!s) return PIByteArray();
|
||||||
return s->sdata;
|
return s->sdata;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
float PIConnection::senderFrequency(const PIString & name) const {
|
float PIConnection::senderFrequency(const PIString & name) const {
|
||||||
Sender * s = senders.value(name, 0);
|
Sender * s = senders.value(name, nullptr);
|
||||||
if (s == 0) return -1.f;
|
if (!s) return -1.f;
|
||||||
double i = s->interval();
|
double i = s->interval();
|
||||||
if (i == 0.) return 0.f;
|
if (i == 0.) return 0.f;
|
||||||
return 1000. / s->interval();
|
return 1000. / s->interval();
|
||||||
@@ -794,8 +811,7 @@ float PIConnection::senderFrequency(const PIString & name) const {
|
|||||||
|
|
||||||
void PIConnection::removeAllSenders() {
|
void PIConnection::removeAllSenders() {
|
||||||
for (auto s = senders.constBegin(); s != senders.constEnd(); s++) {
|
for (auto s = senders.constBegin(); s != senders.constEnd(); s++) {
|
||||||
if (s.value() != 0)
|
if (s.value()) delete s.value();
|
||||||
delete s.value();
|
|
||||||
}
|
}
|
||||||
senders.clear();
|
senders.clear();
|
||||||
}
|
}
|
||||||
@@ -803,8 +819,8 @@ void PIConnection::removeAllSenders() {
|
|||||||
|
|
||||||
void PIConnection::startThreadedRead(const PIString & full_path_name) {
|
void PIConnection::startThreadedRead(const PIString & full_path_name) {
|
||||||
DevicePool::DeviceData * dd = __device_pool__->deviceData(devByString(full_path_name));
|
DevicePool::DeviceData * dd = __device_pool__->deviceData(devByString(full_path_name));
|
||||||
if (dd == 0) return;
|
if (!dd) return;
|
||||||
if (dd->dev == 0) return;
|
if (!dd->dev) return;
|
||||||
if (dd->started || dd->dev->mode() == PIIODevice::WriteOnly) return;
|
if (dd->started || dd->dev->mode() == PIIODevice::WriteOnly) return;
|
||||||
if (!__device_pool__->fake) dd->rthread->start();
|
if (!__device_pool__->fake) dd->rthread->start();
|
||||||
dd->started = true;
|
dd->started = true;
|
||||||
@@ -812,32 +828,33 @@ void PIConnection::startThreadedRead(const PIString & full_path_name) {
|
|||||||
|
|
||||||
|
|
||||||
void PIConnection::startAllThreadedReads() {
|
void PIConnection::startAllThreadedReads() {
|
||||||
for (auto d = __device_pool__->devices.constBegin(); d != __device_pool__->devices.constEnd(); d++)
|
for (auto d = __device_pool__->devices.constBegin(); d != __device_pool__->devices.constEnd(); d++) {
|
||||||
startThreadedRead(d.key());
|
startThreadedRead(d.key());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void PIConnection::startSender(const PIString & name) {
|
void PIConnection::startSender(const PIString & name) {
|
||||||
Sender * s = senders.value(name, 0);
|
Sender * s = senders.value(name, nullptr);
|
||||||
if (s == 0) return;
|
if (!s) return;
|
||||||
if (!s->isRunning() && !__device_pool__->fake)
|
if (!s->isRunning() && !__device_pool__->fake) s->start(s->int_);
|
||||||
s->start(s->int_);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void PIConnection::startAllSenders() {
|
void PIConnection::startAllSenders() {
|
||||||
for (auto s = senders.constBegin(); s != senders.constEnd(); s++) {
|
for (auto s = senders.constBegin(); s != senders.constEnd(); s++) {
|
||||||
if (s.value() == 0) continue;
|
if (!s.value()) continue;
|
||||||
if (!s.value()->isRunning() && !__device_pool__->fake)
|
if (!s.value()->isRunning() && !__device_pool__->fake) {
|
||||||
s.value()->start(s.value()->int_);
|
s.value()->start(s.value()->int_);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void PIConnection::stopThreadedRead(const PIString & full_path_name) {
|
void PIConnection::stopThreadedRead(const PIString & full_path_name) {
|
||||||
DevicePool::DeviceData * dd = __device_pool__->deviceData(devByString(full_path_name));
|
DevicePool::DeviceData * dd = __device_pool__->deviceData(devByString(full_path_name));
|
||||||
if (dd == 0) return;
|
if (!dd) return;
|
||||||
if (dd->dev == 0) return;
|
if (!dd->dev) return;
|
||||||
if (!dd->started || dd->dev->mode() == PIIODevice::WriteOnly) return;
|
if (!dd->started || dd->dev->mode() == PIIODevice::WriteOnly) return;
|
||||||
dd->rthread->stop();
|
dd->rthread->stop();
|
||||||
dd->started = false;
|
dd->started = false;
|
||||||
@@ -845,34 +862,35 @@ void PIConnection::stopThreadedRead(const PIString & full_path_name) {
|
|||||||
|
|
||||||
|
|
||||||
void PIConnection::stopAllThreadedReads() {
|
void PIConnection::stopAllThreadedReads() {
|
||||||
for (auto d = __device_pool__->devices.constBegin(); d != __device_pool__->devices.constEnd(); d++)
|
for (auto d = __device_pool__->devices.constBegin(); d != __device_pool__->devices.constEnd(); d++) {
|
||||||
stopThreadedRead(d.key());
|
stopThreadedRead(d.key());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void PIConnection::stopSender(const PIString & name) {
|
void PIConnection::stopSender(const PIString & name) {
|
||||||
Sender * s = senders.value(name, 0);
|
Sender * s = senders.value(name, nullptr);
|
||||||
if (s == 0) return;
|
if (!s) return;
|
||||||
if (s->isRunning()) s->stop();
|
if (s->isRunning()) s->stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void PIConnection::stopAllSenders() {
|
void PIConnection::stopAllSenders() {
|
||||||
for (auto s = senders.constBegin(); s != senders.constEnd(); s++) {
|
for (auto s = senders.constBegin(); s != senders.constEnd(); s++) {
|
||||||
if (s.value() == 0) continue;
|
if (!s.value()) continue;
|
||||||
if (s.value()->isRunning())
|
if (s.value()->isRunning()) s.value()->stop();
|
||||||
s.value()->stop();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PIDiagnostics * PIConnection::diagnostic(const PIString & full_path_name) const {
|
PIDiagnostics * PIConnection::diagnostic(const PIString & full_path_name) const {
|
||||||
PIIODevice * dev = devByString(full_path_name);
|
PIIODevice * dev = devByString(full_path_name);
|
||||||
PIPacketExtractor * pe(0);
|
Extractor * e = extractors.value(full_path_name, nullptr);
|
||||||
if (extractors.value(full_path_name) != 0) pe = extractors.value(full_path_name)->extractor;
|
PIPacketExtractor * pe = nullptr;
|
||||||
if (pe != 0) dev = pe;
|
if (e) pe = e->extractor;
|
||||||
if (dev == 0) return 0;
|
if (pe) dev = pe;
|
||||||
return diags_.value(dev, 0);
|
if (!dev) return 0;
|
||||||
|
return diags_.value(dev, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -899,7 +917,7 @@ int PIConnection::writeByName(const PIString & name_, const PIByteArray & data)
|
|||||||
|
|
||||||
|
|
||||||
int PIConnection::write(PIIODevice * dev, const PIByteArray & data) {
|
int PIConnection::write(PIIODevice * dev, const PIByteArray & data) {
|
||||||
if (dev == 0) {
|
if (!dev) {
|
||||||
piCoutObj << "Null Device!";
|
piCoutObj << "Null Device!";
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -909,8 +927,8 @@ int PIConnection::write(PIIODevice * dev, const PIByteArray & data) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
int ret = dev->write(data);
|
int ret = dev->write(data);
|
||||||
PIDiagnostics * diag = diags_.value(dev);
|
PIDiagnostics * diag = diags_.value(dev, nullptr);
|
||||||
if (diag != 0 && ret > 0) diag->sended(ret);
|
if (diag && ret > 0) diag->sended(ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -951,37 +969,35 @@ PIConnection::DevicePool::~DevicePool() {
|
|||||||
|
|
||||||
|
|
||||||
void PIConnection::DevicePool::init() {
|
void PIConnection::DevicePool::init() {
|
||||||
if (!isRunning())
|
if (!isRunning()) start(100);
|
||||||
start(100);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PIIODevice * PIConnection::DevicePool::addDevice(PIConnection * parent, const PIString & fp, PIIODevice::DeviceMode mode, bool start) {
|
PIIODevice * PIConnection::DevicePool::addDevice(PIConnection * parent, const PIString & fp, PIIODevice::DeviceMode mode, bool start) {
|
||||||
DeviceData * dd = devices[fp];
|
DeviceData * dd = devices[fp];
|
||||||
int pmode(0);
|
int pmode = 0;
|
||||||
bool need_start = false;
|
bool need_start = false;
|
||||||
if (dd == 0) {
|
if (!dd) {
|
||||||
dd = new DeviceData();
|
dd = new DeviceData();
|
||||||
devices[fp] = dd;
|
devices[fp] = dd;
|
||||||
}
|
}
|
||||||
if (dd->dev == 0) {
|
if (!dd->dev) {
|
||||||
//piCout << "new device" << fp;
|
//piCout << "new device" << fp;
|
||||||
dd->dev = PIIODevice::createFromFullPath(fp);
|
dd->dev = PIIODevice::createFromFullPath(fp);
|
||||||
if (dd->dev == 0) {
|
if (!dd->dev) {
|
||||||
piCoutObj << "Error: can`t create device \"" << fp << "\"!"; //:" << errorString();
|
piCoutObj << "Error: can`t create device \"" << fp << "\"!"; //:" << errorString();
|
||||||
return 0;
|
return nullptr;
|
||||||
}
|
}
|
||||||
dd->dev->setProperty("__fullPath__", fp);
|
dd->dev->setProperty("__fullPath__", fp);
|
||||||
} else
|
} else {
|
||||||
pmode = dd->dev->mode();
|
pmode = dd->dev->mode();
|
||||||
if (!dd->listeners.contains(parent))
|
}
|
||||||
dd->listeners << parent;
|
if (!dd->listeners.contains(parent)) dd->listeners << parent;
|
||||||
if (pmode == mode || pmode == PIIODevice::ReadWrite)
|
if (pmode == mode || pmode == PIIODevice::ReadWrite) return dd->dev;
|
||||||
return dd->dev;
|
|
||||||
if ((mode & PIIODevice::ReadOnly) > 0) {
|
if ((mode & PIIODevice::ReadOnly) > 0) {
|
||||||
if (dd->rthread != 0) {
|
if (dd->rthread) {
|
||||||
delete dd->rthread;
|
delete dd->rthread;
|
||||||
dd->rthread = 0;
|
dd->rthread = nullptr;
|
||||||
dd->started = false;
|
dd->started = false;
|
||||||
}
|
}
|
||||||
dd->rthread = new PIThread(dd, __DevicePool_threadReadDP);
|
dd->rthread = new PIThread(dd, __DevicePool_threadReadDP);
|
||||||
@@ -989,13 +1005,13 @@ PIIODevice * PIConnection::DevicePool::addDevice(PIConnection * parent, const PI
|
|||||||
need_start = true;
|
need_start = true;
|
||||||
pmode |= PIIODevice::ReadOnly;
|
pmode |= PIIODevice::ReadOnly;
|
||||||
}
|
}
|
||||||
if ((mode & PIIODevice::WriteOnly) > 0)
|
if ((mode & PIIODevice::WriteOnly) > 0) pmode |= PIIODevice::WriteOnly;
|
||||||
pmode |= PIIODevice::WriteOnly;
|
|
||||||
if (!fake) {
|
if (!fake) {
|
||||||
dd->dev->close();
|
dd->dev->close();
|
||||||
dd->dev->open((PIIODevice::DeviceMode)pmode);
|
dd->dev->open((PIIODevice::DeviceMode)pmode);
|
||||||
} else
|
} else {
|
||||||
dd->dev->setMode((PIIODevice::DeviceMode)pmode);
|
dd->dev->setMode((PIIODevice::DeviceMode)pmode);
|
||||||
|
}
|
||||||
if (need_start && start) {
|
if (need_start && start) {
|
||||||
if (!fake) dd->rthread->start();
|
if (!fake) dd->rthread->start();
|
||||||
dd->started = true;
|
dd->started = true;
|
||||||
@@ -1005,11 +1021,9 @@ PIIODevice * PIConnection::DevicePool::addDevice(PIConnection * parent, const PI
|
|||||||
|
|
||||||
|
|
||||||
bool PIConnection::DevicePool::removeDevice(PIConnection * parent, const PIString & fp) {
|
bool PIConnection::DevicePool::removeDevice(PIConnection * parent, const PIString & fp) {
|
||||||
DeviceData * dd = devices.value(fp);
|
DeviceData * dd = devices.value(fp, nullptr);
|
||||||
if (dd == 0)
|
if (!dd) return false;
|
||||||
return false;
|
if (!dd->dev) return false;
|
||||||
if (dd->dev == 0)
|
|
||||||
return false;
|
|
||||||
bool ok = dd->listeners.contains(parent);
|
bool ok = dd->listeners.contains(parent);
|
||||||
dd->listeners.removeAll(parent);
|
dd->listeners.removeAll(parent);
|
||||||
if (dd->listeners.isEmpty()) {
|
if (dd->listeners.isEmpty()) {
|
||||||
@@ -1023,18 +1037,16 @@ bool PIConnection::DevicePool::removeDevice(PIConnection * parent, const PIStrin
|
|||||||
void PIConnection::DevicePool::unboundConnection(PIConnection * parent) {
|
void PIConnection::DevicePool::unboundConnection(PIConnection * parent) {
|
||||||
PIStringList rem;
|
PIStringList rem;
|
||||||
for (auto i = devices.constBegin(); i != devices.constEnd(); i++) {
|
for (auto i = devices.constBegin(); i != devices.constEnd(); i++) {
|
||||||
if (i.value() == 0) {
|
if (!i.value()) {
|
||||||
rem << i.key();
|
rem << i.key();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
i.value()->listeners.removeAll(parent);
|
i.value()->listeners.removeAll(parent);
|
||||||
if (i.value()->listeners.isEmpty())
|
if (i.value()->listeners.isEmpty()) rem << i.key();
|
||||||
rem << i.key();
|
|
||||||
}
|
}
|
||||||
piForeachC (PIString & i, rem) {
|
for (const PIString & i : rem) {
|
||||||
DeviceData * dd = devices.value(i);
|
DeviceData * dd = devices.value(i, nullptr);
|
||||||
if (dd == 0)
|
if (!dd) continue;
|
||||||
continue;
|
|
||||||
delete dd;
|
delete dd;
|
||||||
devices.remove(i);
|
devices.remove(i);
|
||||||
}
|
}
|
||||||
@@ -1042,45 +1054,49 @@ void PIConnection::DevicePool::unboundConnection(PIConnection * parent) {
|
|||||||
|
|
||||||
|
|
||||||
PIIODevice * PIConnection::DevicePool::device(const PIString & fp) const {
|
PIIODevice * PIConnection::DevicePool::device(const PIString & fp) const {
|
||||||
DeviceData * dd = devices.value(fp);
|
DeviceData * dd = devices.value(fp, nullptr);
|
||||||
if (dd == 0) return 0;
|
if (!dd) return nullptr;
|
||||||
return dd->dev;
|
return dd->dev;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PIConnection::DevicePool::DeviceData * PIConnection::DevicePool::deviceData(PIIODevice * d) const {
|
PIConnection::DevicePool::DeviceData * PIConnection::DevicePool::deviceData(PIIODevice * d) const {
|
||||||
if (!d) return 0;
|
if (!d) return nullptr;
|
||||||
piForeachC (DDPair & i, devices) {
|
auto it = devices.makeIterator();
|
||||||
if (i.second->dev == d)
|
while (it.next()) {
|
||||||
return i.second;
|
if (!it.value()) continue;
|
||||||
|
if (it.value()->dev == d) return it.value();
|
||||||
}
|
}
|
||||||
return 0;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PIVector<PIConnection * > PIConnection::DevicePool::boundedConnections() const {
|
PIVector<PIConnection * > PIConnection::DevicePool::boundedConnections() const {
|
||||||
PIVector<PIConnection * > ret;
|
PIVector<PIConnection * > ret;
|
||||||
piForeachC (DDPair & i, devices) {
|
auto it = devices.makeIterator();
|
||||||
if (i.second == 0)
|
while (it.next()) {
|
||||||
continue;
|
if (!it.value()) continue;
|
||||||
ret << i.second->listeners;
|
ret << it.value()->listeners;
|
||||||
}
|
}
|
||||||
for (int i = 0; i < ret.size_s(); ++i)
|
for (int i = 0; i < ret.size_s(); ++i) {
|
||||||
for (int j = i + 1; j < ret.size_s(); ++j)
|
for (int j = i + 1; j < ret.size_s(); ++j) {
|
||||||
if (ret[i] == ret[j]) {
|
if (ret[i] == ret[j]) {
|
||||||
ret.remove(j);
|
ret.remove(j);
|
||||||
--j;
|
--j;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PIVector< PIIODevice * > PIConnection::DevicePool::boundedDevices() const {
|
PIVector< PIIODevice * > PIConnection::DevicePool::boundedDevices() const {
|
||||||
PIVector<PIIODevice * > ret;
|
PIVector<PIIODevice * > ret;
|
||||||
piForeachC (DDPair & i, devices) {
|
auto it = devices.makeIterator();
|
||||||
if (i.second == 0) continue;
|
while (it.next()) {
|
||||||
if (i.second->dev == 0) continue;
|
if (!it.value()) continue;
|
||||||
ret << i.second->dev;
|
if (!it.value()->dev) continue;
|
||||||
|
ret << it.value()->dev;
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -1088,11 +1104,13 @@ PIVector< PIIODevice * > PIConnection::DevicePool::boundedDevices() const {
|
|||||||
|
|
||||||
PIVector<PIIODevice * > PIConnection::DevicePool::boundedDevices(const PIConnection * parent) const {
|
PIVector<PIIODevice * > PIConnection::DevicePool::boundedDevices(const PIConnection * parent) const {
|
||||||
PIVector<PIIODevice * > ret;
|
PIVector<PIIODevice * > ret;
|
||||||
piForeachC (DDPair & i, devices) {
|
auto it = devices.makeIterator();
|
||||||
if (i.second == 0) continue;
|
while (it.next()) {
|
||||||
if (i.second->dev == 0) continue;
|
if (!it.value()) continue;
|
||||||
if (i.second->listeners.contains(const_cast<PIConnection*>(parent)))
|
if (!it.value()->dev) continue;
|
||||||
ret << i.second->dev;
|
if (it.value()->listeners.contains(const_cast<PIConnection*>(parent))) {
|
||||||
|
ret << it.value()->dev;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -1102,21 +1120,21 @@ PIConnection::DevicePool::DeviceData::~DeviceData() {
|
|||||||
if (rthread) {
|
if (rthread) {
|
||||||
rthread->terminate();
|
rthread->terminate();
|
||||||
delete rthread;
|
delete rthread;
|
||||||
rthread = 0;
|
rthread = nullptr;
|
||||||
}
|
}
|
||||||
if (dev) {
|
if (dev) {
|
||||||
dev->close();
|
dev->close();
|
||||||
delete dev;
|
delete dev;
|
||||||
dev = 0;
|
dev = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void PIConnection::DevicePool::run() {
|
void PIConnection::DevicePool::run() {
|
||||||
PIVector<PIConnection * > conns(PIConnection::allConnections());
|
PIVector<PIConnection * > conns(PIConnection::allConnections());
|
||||||
piForeach (PIConnection * c, conns) {
|
for (PIConnection * c : conns) {
|
||||||
for (auto d = c->diags_.constBegin(); d != c->diags_.constEnd(); d++) {
|
for (auto d = c->diags_.constBegin(); d != c->diags_.constEnd(); d++) {
|
||||||
if (d.value() == 0) continue;
|
if (!d.value()) continue;
|
||||||
d.value()->tick(0, 1);
|
d.value()->tick(0, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1125,13 +1143,23 @@ void PIConnection::DevicePool::run() {
|
|||||||
|
|
||||||
void __DevicePool_threadReadDP(void * ddp) {
|
void __DevicePool_threadReadDP(void * ddp) {
|
||||||
PIConnection::DevicePool::DeviceData * dd((PIConnection::DevicePool::DeviceData * )ddp);
|
PIConnection::DevicePool::DeviceData * dd((PIConnection::DevicePool::DeviceData * )ddp);
|
||||||
if (dd->dev == 0) {piMSleep(100); return;}
|
|
||||||
PIIODevice * dev = dd->dev;
|
PIIODevice * dev = dd->dev;
|
||||||
if (dev->isClosed())
|
if (!dev) {
|
||||||
if (!dev->open()) {piMSleep(dev->reopenTimeout()); return;}
|
piMSleep(100);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (dev->isClosed()) {
|
||||||
|
if (!dev->open()) {
|
||||||
|
piMSleep(dev->reopenTimeout());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
PIByteArray ba;
|
PIByteArray ba;
|
||||||
ba = dev->read(dev->threadedReadBufferSize());
|
ba = dev->read(dev->threadedReadBufferSize());
|
||||||
if (ba.isEmpty()) {piMSleep(10); return;}
|
if (ba.isEmpty()) {
|
||||||
|
piMSleep(10);
|
||||||
|
return;
|
||||||
|
}
|
||||||
dev->threadedRead(ba.data(), ba.size_s());
|
dev->threadedRead(ba.data(), ba.size_s());
|
||||||
dev->threadedReadEvent(ba.data(), ba.size_s());
|
dev->threadedReadEvent(ba.data(), ba.size_s());
|
||||||
//piCout << "Readed from" << dd->dev->path() << Hex << ba;
|
//piCout << "Readed from" << dd->dev->path() << Hex << ba;
|
||||||
@@ -1141,26 +1169,9 @@ void __DevicePool_threadReadDP(void * ddp) {
|
|||||||
|
|
||||||
void PIConnection::DevicePool::deviceReaded(PIConnection::DevicePool::DeviceData * dd, const PIByteArray & data) {
|
void PIConnection::DevicePool::deviceReaded(PIConnection::DevicePool::DeviceData * dd, const PIByteArray & data) {
|
||||||
PIString from = dd->dev->property("__fullPath__").toString();
|
PIString from = dd->dev->property("__fullPath__").toString();
|
||||||
piForeach (PIConnection * ld, dd->listeners)
|
for (PIConnection * ld : dd->listeners) {
|
||||||
ld->rawReceived(dd->dev, from, data);
|
ld->rawReceived(dd->dev, from, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool PIConnection::filterValidateHeaderS(void * c, uchar * src, uchar * rec, int size) {
|
|
||||||
PIPair<PIConnection * , PIString> * p((PIPair<PIConnection * , PIString> * )c);
|
|
||||||
return p->first->filterValidateHeader(p->second, src, rec, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool PIConnection::filterValidateFooterS(void * c, uchar * src, uchar * rec, int size) {
|
|
||||||
PIPair<PIConnection * , PIString> * p((PIPair<PIConnection * , PIString> * )c);
|
|
||||||
return p->first->filterValidateFooter(p->second, src, rec, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool PIConnection::filterValidatePayloadS(void * c, uchar * rec, int size) {
|
|
||||||
PIPair<PIConnection * , PIString> * p((PIPair<PIConnection * , PIString> * )c);
|
|
||||||
return p->first->filterValidatePayload(p->second, rec, size);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1169,39 +1180,20 @@ void PIConnection::rawReceived(PIIODevice * dev, const PIString & from, const PI
|
|||||||
dataReceivedEvent(from, data);
|
dataReceivedEvent(from, data);
|
||||||
PIVector<PIPacketExtractor * > be(bounded_extractors.value(dev));
|
PIVector<PIPacketExtractor * > be(bounded_extractors.value(dev));
|
||||||
//piCout << be;
|
//piCout << be;
|
||||||
piForeach (PIPacketExtractor * i, be)
|
for (PIPacketExtractor * i : be) {
|
||||||
i->threadedRead(const_cast<uchar * >(data.data()), data.size_s());
|
i->threadedRead(data.data(), data.size_s());
|
||||||
PIVector<PIIODevice * > chd(channels_.value(dev));
|
|
||||||
piForeach (PIIODevice * d, chd) {
|
|
||||||
int ret = d->write(data);
|
|
||||||
PIDiagnostics * diag = diags_.value(d);
|
|
||||||
if (diag != 0 && ret > 0) diag->sended(ret);
|
|
||||||
}
|
}
|
||||||
PIDiagnostics * diag = diags_.value(dev);
|
PIVector<PIIODevice * > chd(channels_.value(dev));
|
||||||
if (diag != 0) diag->received(data.size_s());
|
for (PIIODevice * d : chd) {
|
||||||
|
int ret = d->write(data);
|
||||||
|
PIDiagnostics * diag = diags_.value(d, nullptr);
|
||||||
|
if (diag && ret > 0) diag->sended(ret);
|
||||||
|
}
|
||||||
|
PIDiagnostics * diag = diags_.value(dev, nullptr);
|
||||||
|
if (diag) diag->received(data.size_s());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool PIConnection::filterValidateHeader(const PIString & filter_name, uchar * src, uchar * rec, int size) {
|
|
||||||
for (int i = 0; i < size; ++i)
|
|
||||||
if (src[i] != rec[i])
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool PIConnection::filterValidateFooter(const PIString & filter_name, uchar * src, uchar * rec, int size) {
|
|
||||||
for (int i = 0; i < size; ++i)
|
|
||||||
if (src[i] != rec[i])
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool PIConnection::filterValidatePayload(const PIString & filter_name, uchar * rec, int size) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
PIByteArray PIConnection::senderData(const PIString & sender_name) {
|
PIByteArray PIConnection::senderData(const PIString & sender_name) {
|
||||||
return PIByteArray();
|
return PIByteArray();
|
||||||
@@ -1209,11 +1201,9 @@ PIByteArray PIConnection::senderData(const PIString & sender_name) {
|
|||||||
|
|
||||||
|
|
||||||
PIConnection::Extractor::~Extractor() {
|
PIConnection::Extractor::~Extractor() {
|
||||||
if (extractor != 0) {
|
if (extractor) {
|
||||||
if (extractor->threadedReadData() != 0)
|
|
||||||
delete (PIPair<PIConnection * , PIString> * )(extractor->threadedReadData());
|
|
||||||
delete extractor;
|
delete extractor;
|
||||||
extractor = 0;
|
extractor = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1227,16 +1217,16 @@ PIConnection::Sender::Sender(PIConnection * parent_): parent(parent_), int_(0.f)
|
|||||||
|
|
||||||
|
|
||||||
void PIConnection::Sender::tick(void * , int) {
|
void PIConnection::Sender::tick(void * , int) {
|
||||||
if (parent == 0) return;
|
if (!parent) return;
|
||||||
PIByteArray data;
|
PIByteArray data;
|
||||||
if (!sdata.isEmpty()) data = sdata;
|
if (!sdata.isEmpty()) data = sdata;
|
||||||
else data = parent->senderData(name());
|
else data = parent->senderData(name());
|
||||||
if (data.isEmpty()) return;
|
if (data.isEmpty()) return;
|
||||||
//piCoutObj << "write"<<data.size()<<"bytes to"<<devices.size()<<"devices";
|
//piCoutObj << "write"<<data.size()<<"bytes to"<<devices.size()<<"devices";
|
||||||
piForeach (PIIODevice * d, devices) {
|
for (PIIODevice * d : devices) {
|
||||||
int ret = d->write(data);
|
int ret = d->write(data);
|
||||||
PIDiagnostics * diag = parent->diags_.value(d);
|
PIDiagnostics * diag = parent->diags_.value(d, nullptr);
|
||||||
if (diag != 0 && ret > 0) diag->sended(ret);
|
if (diag && ret > 0) diag->sended(ret);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1244,45 +1234,45 @@ void PIConnection::Sender::tick(void * , int) {
|
|||||||
|
|
||||||
|
|
||||||
void PIConnection::unboundExtractor(PIPacketExtractor * pe) {
|
void PIConnection::unboundExtractor(PIPacketExtractor * pe) {
|
||||||
if (pe == 0) return;
|
if (!pe) return;
|
||||||
channels_.remove(pe);
|
channels_.remove(pe);
|
||||||
auto it = channels_.makeIterator();
|
auto it = channels_.makeIterator();
|
||||||
while (it.next())
|
while (it.next()) {
|
||||||
it.valueRef().removeAll(pe);
|
it.valueRef().removeAll(pe);
|
||||||
|
}
|
||||||
bounded_extractors.remove(pe);
|
bounded_extractors.remove(pe);
|
||||||
PIVector<PIIODevice * > k = bounded_extractors.keys();
|
PIVector<PIIODevice * > k = bounded_extractors.keys();
|
||||||
piForeach (PIIODevice * i, k) {
|
for (PIIODevice * i : k) {
|
||||||
PIVector<PIPacketExtractor * > & be(bounded_extractors[i]);
|
PIVector<PIPacketExtractor * > & be(bounded_extractors[i]);
|
||||||
be.removeAll(pe);
|
be.removeAll(pe);
|
||||||
if (be.isEmpty())
|
if (be.isEmpty()) bounded_extractors.remove(i);
|
||||||
bounded_extractors.remove(i);
|
|
||||||
}
|
}
|
||||||
__device_pool__->lock();
|
__device_pool__->lock();
|
||||||
if (diags_.value(pe, 0) != 0)
|
if (diags_.value(pe, nullptr)) delete diags_.value(pe);
|
||||||
delete diags_.value(pe);
|
|
||||||
diags_.remove(pe);
|
diags_.remove(pe);
|
||||||
extractors.remove(pe->name());
|
extractors.remove(pe->name());
|
||||||
__device_pool__->unlock();
|
__device_pool__->unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void PIConnection::packetExtractorReceived(uchar * data, int size) {
|
void PIConnection::packetExtractorReceived(const uchar * data, int size) {
|
||||||
PIString from(emitter() == 0 ? "" : emitter()->name());
|
PIString from(emitter()? emitter()->name() : PIString());
|
||||||
PIIODevice * cd = (PIIODevice * )emitter();
|
PIIODevice * cd = (PIIODevice * )emitter();
|
||||||
// piCout << "packetExtractorReceived" << from << cd;
|
// piCout << "packetExtractorReceived" << from << cd;
|
||||||
if (cd != 0) {
|
if (cd) {
|
||||||
PIVector<PIPacketExtractor * > be(bounded_extractors.value(cd));
|
PIVector<PIPacketExtractor * > be(bounded_extractors.value(cd));
|
||||||
//piCout << be << (void*)data << size;
|
//piCout << be << (void*)data << size;
|
||||||
piForeach (PIPacketExtractor * i, be)
|
for (PIPacketExtractor * i : be) {
|
||||||
i->threadedRead(data, size);
|
i->threadedRead(data, size);
|
||||||
|
}
|
||||||
PIVector<PIIODevice * > chd(channels_.value(cd));
|
PIVector<PIIODevice * > chd(channels_.value(cd));
|
||||||
piForeach (PIIODevice * d, chd) {
|
for (PIIODevice * d : chd) {
|
||||||
int ret = d->write(data, size);
|
int ret = d->write(data, size);
|
||||||
PIDiagnostics * diag = diags_.value(d);
|
PIDiagnostics * diag = diags_.value(d);
|
||||||
if (diag != 0) diag->sended(ret);
|
if (diag) diag->sended(ret);
|
||||||
}
|
}
|
||||||
PIDiagnostics * diag = diags_.value(cd);
|
PIDiagnostics * diag = diags_.value(cd);
|
||||||
if (diag != 0) diag->received(size);
|
if (diag) diag->received(size);
|
||||||
}
|
}
|
||||||
packetReceived(from, PIByteArray(data, size));
|
packetReceived(from, PIByteArray(data, size));
|
||||||
packetReceivedEvent(from, PIByteArray(data, size));
|
packetReceivedEvent(from, PIByteArray(data, size));
|
||||||
|
|||||||
@@ -312,7 +312,6 @@ public:
|
|||||||
|
|
||||||
void deviceReaded(DeviceData * dd, const PIByteArray & data);
|
void deviceReaded(DeviceData * dd, const PIByteArray & data);
|
||||||
|
|
||||||
typedef PIMap<PIString, DeviceData * >::value_type DDPair;
|
|
||||||
PIMap<PIString, DeviceData * > devices;
|
PIMap<PIString, DeviceData * > devices;
|
||||||
bool fake;
|
bool fake;
|
||||||
};
|
};
|
||||||
@@ -343,26 +342,14 @@ protected:
|
|||||||
//! Executes on packet received from filter with name "from"
|
//! Executes on packet received from filter with name "from"
|
||||||
virtual void packetReceived(const PIString & from, const PIByteArray & data) {}
|
virtual void packetReceived(const PIString & from, const PIByteArray & data) {}
|
||||||
|
|
||||||
//! Validate header "rec" with source header "src" and size "size", executes from filter "filter_name"
|
|
||||||
virtual bool filterValidateHeader(const PIString & filter_name, uchar * src, uchar * rec, int size);
|
|
||||||
|
|
||||||
//! Validate footer "rec" with source footer "src" and size "size", executes from filter "filter_name"
|
|
||||||
virtual bool filterValidateFooter(const PIString & filter_name, uchar * src, uchar * rec, int size);
|
|
||||||
|
|
||||||
//! Validate payload "rec" with size "size", executes from filter "filter_name"
|
|
||||||
virtual bool filterValidatePayload(const PIString & filter_name, uchar * rec, int size);
|
|
||||||
|
|
||||||
//! You should returns data for sender "sender_name"
|
//! You should returns data for sender "sender_name"
|
||||||
virtual PIByteArray senderData(const PIString & sender_name);
|
virtual PIByteArray senderData(const PIString & sender_name);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static bool filterValidateHeaderS(void * c, uchar * src, uchar * rec, int size);
|
|
||||||
static bool filterValidateFooterS(void * c, uchar * src, uchar * rec, int size);
|
|
||||||
static bool filterValidatePayloadS(void * c, uchar * rec, int size);
|
|
||||||
bool configure(PIConfig & conf, const PIString & name_);
|
bool configure(PIConfig & conf, const PIString & name_);
|
||||||
void rawReceived(PIIODevice * dev, const PIString & from, const PIByteArray & data);
|
void rawReceived(PIIODevice * dev, const PIString & from, const PIByteArray & data);
|
||||||
void unboundExtractor(PIPacketExtractor * pe);
|
void unboundExtractor(PIPacketExtractor * pe);
|
||||||
EVENT_HANDLER2(void, packetExtractorReceived, uchar * , data, int, size);
|
EVENT_HANDLER2(void, packetExtractorReceived, const uchar * , data, int, size);
|
||||||
EVENT_HANDLER2(void, diagQualityChanged, PIDiagnostics::Quality, new_quality, PIDiagnostics::Quality, old_quality);
|
EVENT_HANDLER2(void, diagQualityChanged, PIDiagnostics::Quality, new_quality, PIDiagnostics::Quality, old_quality);
|
||||||
|
|
||||||
PIString devPath(const PIIODevice * d) const;
|
PIString devPath(const PIIODevice * d) const;
|
||||||
@@ -388,12 +375,6 @@ private:
|
|||||||
void tick(void * , int);
|
void tick(void * , int);
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef PIMap<PIString, Extractor * >::value_type PEPair;
|
|
||||||
typedef PIMap<PIString, Sender * >::value_type SPair;
|
|
||||||
typedef PIMap<PIString, PIIODevice * >::value_type DNPair;
|
|
||||||
typedef PIMap<PIIODevice * , PIVector<PIPacketExtractor * > >::value_type BEPair;
|
|
||||||
typedef PIMap<PIIODevice * , PIVector<PIIODevice * > >::value_type CPair;
|
|
||||||
typedef PIMap<PIIODevice * , PIDiagnostics * >::value_type DPair;
|
|
||||||
PIMap<PIString, Extractor * > extractors;
|
PIMap<PIString, Extractor * > extractors;
|
||||||
PIMap<PIString, Sender * > senders;
|
PIMap<PIString, Sender * > senders;
|
||||||
PIMap<PIString, PIIODevice * > device_names;
|
PIMap<PIString, PIIODevice * > device_names;
|
||||||
|
|||||||
@@ -91,7 +91,9 @@ PIPacketExtractor::PIPacketExtractor(PIIODevice * device_, PIPacketExtractor::Sp
|
|||||||
|
|
||||||
|
|
||||||
void PIPacketExtractor::construct() {
|
void PIPacketExtractor::construct() {
|
||||||
ret_func_header = ret_func_footer = 0;
|
func_header = nullptr;
|
||||||
|
func_footer = nullptr;
|
||||||
|
func_payload = nullptr;
|
||||||
setPayloadSize(0);
|
setPayloadSize(0);
|
||||||
setTimeout(100);
|
setTimeout(100);
|
||||||
#ifdef MICRO_PIP
|
#ifdef MICRO_PIP
|
||||||
@@ -113,13 +115,25 @@ void PIPacketExtractor::propertyChanged(const char *) {
|
|||||||
dataSize = property("payloadSize").toInt();
|
dataSize = property("payloadSize").toInt();
|
||||||
src_header = property("header").toByteArray();
|
src_header = property("header").toByteArray();
|
||||||
src_footer = property("footer").toByteArray();
|
src_footer = property("footer").toByteArray();
|
||||||
|
time_ = property("timeout").toDouble();
|
||||||
packetSize_hf = src_header.size_s() + src_footer.size_s() + payloadSize();
|
packetSize_hf = src_header.size_s() + src_footer.size_s() + payloadSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int PIPacketExtractor::readDevice(void * read_to, int max_size) {
|
||||||
|
if (dev) return dev->read(read_to, max_size);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int PIPacketExtractor::writeDevice(const void * data, int max_size) {
|
||||||
|
if (dev) return dev->write(data, max_size);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void PIPacketExtractor::setDevice(PIIODevice * device_) {
|
void PIPacketExtractor::setDevice(PIIODevice * device_) {
|
||||||
dev = device_;
|
dev = device_;
|
||||||
if (dev == 0) return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -152,23 +166,51 @@ void PIPacketExtractor::setFooter(const PIByteArray & data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool PIPacketExtractor::threadedRead(uchar * readed, int size_) {
|
int PIPacketExtractor::validateHeader(const uchar * src, const uchar * rec, int size) {
|
||||||
|
if (func_header) return func_header(src, rec, size);
|
||||||
|
for (int i = 0; i < size; ++i) {
|
||||||
|
if (src[i] != rec[i]) return -1;
|
||||||
|
}
|
||||||
|
return dataSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool PIPacketExtractor::validateFooter(const uchar * src, const uchar * rec, int size) {
|
||||||
|
if (func_footer) return func_footer(src, rec, size);
|
||||||
|
for (int i = 0; i < size; ++i) {
|
||||||
|
if (src[i] != rec[i]) return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool PIPacketExtractor::validatePayload(const uchar * rec, int size) {
|
||||||
|
if (func_payload) return func_payload(rec, size);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool PIPacketExtractor::threadedRead(const uchar * readed, int size_) {
|
||||||
//piCoutObj << "readed" << size_;
|
//piCoutObj << "readed" << size_;
|
||||||
int ss;
|
int ss;
|
||||||
switch (mode_) {
|
switch (mode_) {
|
||||||
case PIPacketExtractor::None:
|
case PIPacketExtractor::None:
|
||||||
if (validatePayload(readed, size_))
|
if (validatePayload(readed, size_)) {
|
||||||
packetReceived(readed, size_);
|
packetReceived(readed, size_);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case PIPacketExtractor::Header:
|
case PIPacketExtractor::Header:
|
||||||
tmpbuf.append(readed, size_);
|
tmpbuf.append(readed, size_);
|
||||||
ss = src_header.size_s() + dataSize;
|
ss = src_header.size_s();
|
||||||
while (tmpbuf.size_s() >= ss) {
|
while (tmpbuf.size_s() >= ss) {
|
||||||
while (!validateHeader(src_header.data(), tmpbuf.data(), src_header.size_s())) {
|
int ns = validateHeader(src_header.data(), tmpbuf.data(), src_header.size_s());
|
||||||
|
while (ns < 0) {
|
||||||
tmpbuf.pop_front();
|
tmpbuf.pop_front();
|
||||||
++missed;
|
++missed;
|
||||||
if (tmpbuf.size_s() < ss) return true;
|
if (tmpbuf.size() < src_header.size()) return true;
|
||||||
|
ns = validateHeader(src_header.data(), tmpbuf.data(), src_header.size_s());
|
||||||
}
|
}
|
||||||
|
ss = src_header.size_s() + ns;
|
||||||
while (!validatePayload(tmpbuf.data(src_header.size_s()), dataSize)) {
|
while (!validatePayload(tmpbuf.data(src_header.size_s()), dataSize)) {
|
||||||
tmpbuf.pop_front();
|
tmpbuf.pop_front();
|
||||||
++missed;
|
++missed;
|
||||||
@@ -179,56 +221,6 @@ bool PIPacketExtractor::threadedRead(uchar * readed, int size_) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PIPacketExtractor::Footer:
|
case PIPacketExtractor::Footer:
|
||||||
/*memcpy(buffer.data(allReaded), readed, size_);
|
|
||||||
allReaded += size_;
|
|
||||||
footer_ = (mode_ == PIPacketExtractor::Footer);
|
|
||||||
while (allReaded >= packetSize_hf + addSize && allReaded > 0) {
|
|
||||||
if (!src_header.isEmpty()) {
|
|
||||||
if (allReaded + curInd >= buffer_size) {
|
|
||||||
memcpy(sbuffer.data(), buffer.data(), buffer_size);
|
|
||||||
memcpy(buffer.data(), sbuffer.data(buffer_size - packetSize_hf), allReaded);
|
|
||||||
allReaded = packetSize_hf;
|
|
||||||
addSize = curInd = 0;
|
|
||||||
}
|
|
||||||
bool brk = false;
|
|
||||||
while (!validateHeader((uchar * )(footer_ ? src_footer.data() : src_header.data()), buffer.data(curInd + (footer_ ? dataSize : 0)), footer_ ? src_footer.size_s() : src_header.size_s())) {
|
|
||||||
++curInd; ++missed;
|
|
||||||
if (packetSize_hf > 0) missed_packets = missed / packetSize_hf;
|
|
||||||
if (curInd > addSize) {
|
|
||||||
addSize += packetSize_hf;
|
|
||||||
brk = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (brk) continue;
|
|
||||||
//memcpy(mheader.data(), buffer.data(curInd + (footer_ ? dataSize : 0)), src_header.size_s());
|
|
||||||
if (!src_header.isEmpty()) memcpy(src_header.data(), buffer.data(curInd), src_header.size_s());
|
|
||||||
if (!validatePayload(buffer.data(curInd + src_header.size_s()), dataSize)) {
|
|
||||||
++curInd; ++missed;
|
|
||||||
if (packetSize_hf > 0) missed_packets = missed / packetSize_hf;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
packetReceived(buffer.data(curInd), packetSize_hf);
|
|
||||||
memcpy(sbuffer.data(), buffer.data(), allReaded);
|
|
||||||
memcpy(buffer.data(), sbuffer.data(packetSize_hf + curInd), allReaded);
|
|
||||||
allReaded -= packetSize_hf + curInd;
|
|
||||||
curInd = addSize = 0;
|
|
||||||
} else {
|
|
||||||
if (dataSize == 0) {
|
|
||||||
if (validatePayload(buffer.data(), size_))
|
|
||||||
packetReceived(buffer.data(), size_);
|
|
||||||
memcpy(sbuffer.data(), buffer.data(), allReaded);
|
|
||||||
memcpy(buffer.data(), sbuffer.data(size_), allReaded);
|
|
||||||
allReaded -= size_;
|
|
||||||
} else {
|
|
||||||
if (validatePayload(buffer.data(), dataSize))
|
|
||||||
packetReceived(buffer.data(), dataSize);
|
|
||||||
memcpy(sbuffer.data(), buffer.data(), allReaded);
|
|
||||||
memcpy(buffer.data(), sbuffer.data(packetSize_hf), allReaded);
|
|
||||||
allReaded -= packetSize_hf;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
tmpbuf.append(readed, size_);
|
tmpbuf.append(readed, size_);
|
||||||
ss = src_footer.size_s() + dataSize;
|
ss = src_footer.size_s() + dataSize;
|
||||||
while (tmpbuf.size_s() >= ss) {
|
while (tmpbuf.size_s() >= ss) {
|
||||||
@@ -252,7 +244,7 @@ bool PIPacketExtractor::threadedRead(uchar * readed, int size_) {
|
|||||||
while (tmpbuf.size_s() >= ss) {
|
while (tmpbuf.size_s() >= ss) {
|
||||||
if (!header_found) {
|
if (!header_found) {
|
||||||
if (tmpbuf.size_s() < ss) return true;
|
if (tmpbuf.size_s() < ss) return true;
|
||||||
while (!validateHeader(src_header.data(), tmpbuf.data(), src_header.size_s())) {
|
while (validateHeader(src_header.data(), tmpbuf.data(), src_header.size_s()) < 0) {
|
||||||
tmpbuf.pop_front();
|
tmpbuf.pop_front();
|
||||||
++missed;
|
++missed;
|
||||||
if (tmpbuf.size_s() < ss) return true;
|
if (tmpbuf.size_s() < ss) return true;
|
||||||
@@ -310,3 +302,21 @@ bool PIPacketExtractor::threadedRead(uchar * readed, int size_) {
|
|||||||
PIString PIPacketExtractor::constructFullPathDevice() const {
|
PIString PIPacketExtractor::constructFullPathDevice() const {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool PIPacketExtractor::openDevice() {
|
||||||
|
if (dev) return dev->open();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool PIPacketExtractor::closeDevice() {
|
||||||
|
if (dev) return dev->close();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
PIIODevice::DeviceInfoFlags PIPacketExtractor::deviceInfoFlags() const {
|
||||||
|
if (dev) return dev->infoFlags();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|||||||
@@ -28,8 +28,11 @@
|
|||||||
|
|
||||||
#include "piiodevice.h"
|
#include "piiodevice.h"
|
||||||
|
|
||||||
|
/// TODO: написать документацию, тут ничего не понятно
|
||||||
// Pass data, recHeaderPtr, received_data, recHeaderSize. Return true if packet is correct nor return false.
|
// Pass data, recHeaderPtr, received_data, recHeaderSize. Return true if packet is correct nor return false.
|
||||||
typedef bool (*PacketExtractorCheckFunc)(void * , uchar * , uchar * , int );
|
typedef int (*PacketExtractorHeaderFunc)(const uchar *, const uchar *, int);
|
||||||
|
typedef bool (*PacketExtractorPayloadFunc)(const uchar *, int );
|
||||||
|
typedef bool (*PacketExtractorFooterFunc)(const uchar *, const uchar *, int);
|
||||||
|
|
||||||
class PIP_EXPORT PIPacketExtractor: public PIIODevice
|
class PIP_EXPORT PIPacketExtractor: public PIIODevice
|
||||||
{
|
{
|
||||||
@@ -48,7 +51,7 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
//! Contructs extractor with child device "device_" and extract algorithm "mode"
|
//! Contructs extractor with child device "device_" and extract algorithm "mode"
|
||||||
explicit PIPacketExtractor(PIIODevice * device_ = 0, SplitMode mode = None);
|
explicit PIPacketExtractor(PIIODevice * device_ = nullptr, SplitMode mode = None);
|
||||||
|
|
||||||
virtual ~PIPacketExtractor() {stop();}
|
virtual ~PIPacketExtractor() {stop();}
|
||||||
|
|
||||||
@@ -66,13 +69,13 @@ public:
|
|||||||
//! Set buffer size to "new_size" bytes, should be at least greater than whole packet size
|
//! Set buffer size to "new_size" bytes, should be at least greater than whole packet size
|
||||||
void setBufferSize(int new_size);
|
void setBufferSize(int new_size);
|
||||||
|
|
||||||
void setHeaderCheckSlot(PacketExtractorCheckFunc f) {ret_func_header = f;}
|
void setHeaderCheckSlot(PacketExtractorHeaderFunc f) {func_header = f;}
|
||||||
void setFooterCheckSlot(PacketExtractorCheckFunc f) {ret_func_footer = f;}
|
void setPayloadCheckSlot(PacketExtractorPayloadFunc f) {func_payload = f;}
|
||||||
void setPayloadCheckSlot(ReadRetFunc f) {ret_func_ = f;}
|
void setFooterCheckSlot(PacketExtractorFooterFunc f) {func_footer = f;}
|
||||||
|
|
||||||
|
|
||||||
//! Set extract algorithm
|
//! Set extract algorithm
|
||||||
void setSplitMode(SplitMode mode) {setProperty("splitMode", int(mode)); mode_ = mode;}
|
void setSplitMode(SplitMode mode) {setProperty("splitMode", int(mode));}
|
||||||
|
|
||||||
//! Set payload size, used for PIPacketExtractor::Header and PIPacketExtractor::Footer algorithms
|
//! Set payload size, used for PIPacketExtractor::Header and PIPacketExtractor::Footer algorithms
|
||||||
void setPayloadSize(int size);
|
void setPayloadSize(int size);
|
||||||
@@ -84,17 +87,17 @@ public:
|
|||||||
void setFooter(const PIByteArray & data);
|
void setFooter(const PIByteArray & data);
|
||||||
|
|
||||||
//! Set packet size, used for PIPacketExtractor::Size algorithm
|
//! Set packet size, used for PIPacketExtractor::Size algorithm
|
||||||
void setPacketSize(int size) {setProperty("packetSize", size); packetSize_ = size;}
|
void setPacketSize(int size) {setProperty("packetSize", size);}
|
||||||
|
|
||||||
//! Set timeout in milliseconds, used for PIPacketExtractor::Timeout algorithm
|
//! Set timeout in milliseconds, used for PIPacketExtractor::Timeout algorithm
|
||||||
void setTimeout(double msecs) {setProperty("timeout", msecs); time_ = msecs;}
|
void setTimeout(double msecs) {setProperty("timeout", msecs);}
|
||||||
|
|
||||||
|
|
||||||
//! Returns current extract algorithm
|
//! Returns current extract algorithm
|
||||||
SplitMode splitMode() const {return (SplitMode)(property("splitMode").toInt());}
|
SplitMode splitMode() const {return mode_;}
|
||||||
|
|
||||||
//! Returns current payload size, used for PIPacketExtractor::Header and PIPacketExtractor::Footer algorithms
|
//! Returns current payload size, used for PIPacketExtractor::Header and PIPacketExtractor::Footer algorithms
|
||||||
int payloadSize() const {return property("payloadSize").toInt();}
|
int payloadSize() const {return dataSize;}
|
||||||
|
|
||||||
//! Returns current header data, used for PIPacketExtractor::Header and PIPacketExtractor::HeaderAndFooter algorithms
|
//! Returns current header data, used for PIPacketExtractor::Header and PIPacketExtractor::HeaderAndFooter algorithms
|
||||||
PIByteArray header() const {return src_header;}
|
PIByteArray header() const {return src_header;}
|
||||||
@@ -103,10 +106,10 @@ public:
|
|||||||
PIByteArray footer() const {return src_footer;}
|
PIByteArray footer() const {return src_footer;}
|
||||||
|
|
||||||
//! Returns current packet size, used for PIPacketExtractor::Size algorithm
|
//! Returns current packet size, used for PIPacketExtractor::Size algorithm
|
||||||
int packetSize() const {return property("packetSize").toInt();}
|
int packetSize() const {return packetSize_;}
|
||||||
|
|
||||||
//! Returns current timeout in milliseconds, used for PIPacketExtractor::Timeout algorithm
|
//! Returns current timeout in milliseconds, used for PIPacketExtractor::Timeout algorithm
|
||||||
double timeout() const {return property("timeout").toDouble();}
|
double timeout() const {return time_;}
|
||||||
|
|
||||||
|
|
||||||
//! Returns missed by validating functions bytes count
|
//! Returns missed by validating functions bytes count
|
||||||
@@ -122,17 +125,17 @@ public:
|
|||||||
const ullong * missedPackets_ptr() const {return &missed_packets;}
|
const ullong * missedPackets_ptr() const {return &missed_packets;}
|
||||||
|
|
||||||
//! Add data to extractor, raise \a packetReceived() if packet is ready
|
//! Add data to extractor, raise \a packetReceived() if packet is ready
|
||||||
void appendData(const void * d, int s) {threadedRead(const_cast<uchar*>((const uchar *)d), s);}
|
void appendData(const uchar * d, int s) {threadedRead(d, s);}
|
||||||
|
|
||||||
//! Add data to extractor, raise \a packetReceived() if packet is ready
|
//! Add data to extractor, raise \a packetReceived() if packet is ready
|
||||||
void appendData(const PIByteArray & data) {appendData(data.data(), data.size_s());}
|
void appendData(const PIByteArray & data) {threadedRead(data.data(), data.size_s());}
|
||||||
|
|
||||||
EVENT2(packetReceived, uchar * , data, int, size);
|
EVENT2(packetReceived, const uchar * , data, int, size);
|
||||||
|
|
||||||
//! \events
|
//! \events
|
||||||
//! \{
|
//! \{
|
||||||
|
|
||||||
//! \fn void packetReceived(uchar * data, int size)
|
//! \fn void packetReceived(const uchar * data, int size)
|
||||||
//! \brief Raise on successfull \a packetValidate() function
|
//! \brief Raise on successfull \a packetValidate() function
|
||||||
|
|
||||||
//! \}
|
//! \}
|
||||||
@@ -144,35 +147,37 @@ protected:
|
|||||||
* \param rec Received header
|
* \param rec Received header
|
||||||
* \param size Header size
|
* \param size Header size
|
||||||
* \details Default implementation returns by-byte "src" with "rec" compare result */
|
* \details Default implementation returns by-byte "src" with "rec" compare result */
|
||||||
virtual bool validateHeader(uchar * src, uchar * rec, int size) {if (ret_func_header != 0) return ret_func_header(ret_data_, src, rec, size); for (int i = 0; i < size; ++i) if (src[i] != rec[i]) return false; return true;}
|
virtual int validateHeader(const uchar * src, const uchar * rec, int size);
|
||||||
|
|
||||||
/** \brief Function to validate footer
|
/** \brief Function to validate footer
|
||||||
* \param src Your footer content
|
* \param src Your footer content
|
||||||
* \param rec Received footer
|
* \param rec Received footer
|
||||||
* \param size Footer size
|
* \param size Footer size
|
||||||
* \details Default implementation returns by-byte "src" with "rec" compare result */
|
* \details Default implementation returns by-byte "src" with "rec" compare result */
|
||||||
virtual bool validateFooter(uchar * src, uchar * rec, int size) {if (ret_func_footer != 0) return ret_func_footer(ret_data_, src, rec, size); for (int i = 0; i < size; ++i) if (src[i] != rec[i]) return false; return true;}
|
virtual bool validateFooter(const uchar * src, const uchar * rec, int size);
|
||||||
|
|
||||||
/** \brief Function to validate payload
|
/** \brief Function to validate payload
|
||||||
* \param rec Received payload
|
* \param rec Received payload
|
||||||
* \param size payload size
|
* \param size payload size
|
||||||
* \details Default implementation returns \b true */
|
* \details Default implementation returns \b true */
|
||||||
virtual bool validatePayload(uchar * rec, int size) {if (ret_func_ != 0) return ret_func_(ret_data_, rec, size); return true;}
|
virtual bool validatePayload(const uchar * rec, int size);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void construct();
|
void construct();
|
||||||
void propertyChanged(const char *);
|
void propertyChanged(const char *);
|
||||||
int readDevice(void * read_to, int max_size) {if (dev == 0) return -1; return dev->read(read_to, max_size);}
|
virtual int readDevice(void * read_to, int max_size) override;
|
||||||
int writeDevice(const void * data, int max_size) {if (dev == 0) return -1; return dev->write(data, max_size);}
|
virtual int writeDevice(const void * data, int max_size) override;
|
||||||
bool threadedRead(uchar * readed, int size);
|
virtual bool threadedRead(const uchar * readed, int size) override;
|
||||||
PIString constructFullPathDevice() const;
|
virtual PIString constructFullPathDevice() const override;
|
||||||
bool openDevice() {if (dev == 0) return false; return dev->open();}
|
virtual bool openDevice() override;
|
||||||
bool closeDevice() {if (dev == 0) return false; return dev->close();}
|
virtual bool closeDevice() override;
|
||||||
DeviceInfoFlags deviceInfoFlags() const {if (dev) return dev->infoFlags(); return 0;}
|
virtual DeviceInfoFlags deviceInfoFlags() const override;
|
||||||
|
|
||||||
PIIODevice * dev;
|
PIIODevice * dev;
|
||||||
PIByteArray buffer, tmpbuf, src_header, src_footer, trbuf;
|
PIByteArray buffer, tmpbuf, src_header, src_footer, trbuf;
|
||||||
PacketExtractorCheckFunc ret_func_header, ret_func_footer;
|
PacketExtractorHeaderFunc func_header;
|
||||||
|
PacketExtractorPayloadFunc func_payload;
|
||||||
|
PacketExtractorFooterFunc func_footer;
|
||||||
SplitMode mode_;
|
SplitMode mode_;
|
||||||
int buffer_size, dataSize, packetSize_hf, footerInd, packetSize_;
|
int buffer_size, dataSize, packetSize_hf, footerInd, packetSize_;
|
||||||
double time_;
|
double time_;
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ public:
|
|||||||
//! and \a packetReceived() virtual method
|
//! and \a packetReceived() virtual method
|
||||||
void received(const PIByteArray & data);
|
void received(const PIByteArray & data);
|
||||||
|
|
||||||
EVENT_HANDLER2(void, received, uchar * , readed, int, size);
|
EVENT_HANDLER2(void, received, const uchar * , readed, int, size);
|
||||||
|
|
||||||
//! Connect \"dev\" \a PIIODevice::threadedReadEvent() event to \a received() handler
|
//! Connect \"dev\" \a PIIODevice::threadedReadEvent() event to \a received() handler
|
||||||
//! and \a sendRequest() event to \"dev\" \a PIIODevice::write() handler
|
//! and \a sendRequest() event to \"dev\" \a PIIODevice::write() handler
|
||||||
|
|||||||
@@ -962,7 +962,7 @@ void PIThread::runOnce(PIObject * object, const char * handler, const PIString &
|
|||||||
}
|
}
|
||||||
#ifndef MICRO_PIP
|
#ifndef MICRO_PIP
|
||||||
__PIThreadCollection::instance()->startedAuto(t);
|
__PIThreadCollection::instance()->startedAuto(t);
|
||||||
CONNECTU(t, stopped, __PIThreadCollection::instance(), stoppedAuto);
|
CONNECT0(void, t, stopped, __PIThreadCollection::instance(), stoppedAuto);
|
||||||
#endif
|
#endif
|
||||||
t->startOnce();
|
t->startOnce();
|
||||||
}
|
}
|
||||||
@@ -996,7 +996,7 @@ void PIThread::runOnce(std::function<void ()> func, const PIString & name) {
|
|||||||
t->setSlot(func);
|
t->setSlot(func);
|
||||||
#ifndef MICRO_PIP
|
#ifndef MICRO_PIP
|
||||||
__PIThreadCollection::instance()->startedAuto(t);
|
__PIThreadCollection::instance()->startedAuto(t);
|
||||||
CONNECTU(t, stopped, __PIThreadCollection::instance(), stoppedAuto);
|
CONNECT0(void, t, stopped, __PIThreadCollection::instance(), stoppedAuto);
|
||||||
#endif
|
#endif
|
||||||
t->startOnce();
|
t->startOnce();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ int main(int argc, char * argv[]) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
CONNECTL(&c, threadedReadEvent, ([&](uchar * readed, int size){
|
CONNECTL(&c, threadedReadEvent, ([&](const uchar * readed, int size){
|
||||||
PIByteArray ba(readed, size);
|
PIByteArray ba(readed, size);
|
||||||
if (size < 1024) {
|
if (size < 1024) {
|
||||||
PIString str = PIString(ba);
|
PIString str = PIString(ba);
|
||||||
@@ -41,7 +41,7 @@ int main(int argc, char * argv[]) {
|
|||||||
CONNECTL(&s, newConnection, ([&](PICloudServer::Client * cl){
|
CONNECTL(&s, newConnection, ([&](PICloudServer::Client * cl){
|
||||||
piCout << "[Server] new client:" << cl;
|
piCout << "[Server] new client:" << cl;
|
||||||
clients << cl;
|
clients << cl;
|
||||||
CONNECTL(cl, threadedReadEvent, ([&c, &s, cl, &rnd](uchar * readed, int size){
|
CONNECTL(cl, threadedReadEvent, ([&c, &s, cl, &rnd](const uchar * readed, int size){
|
||||||
PIByteArray ba(readed, size);
|
PIByteArray ba(readed, size);
|
||||||
PIString str = PIString(ba);
|
PIString str = PIString(ba);
|
||||||
piCout << "[Server] data from" << cl << ":" << str;
|
piCout << "[Server] data from" << cl << ":" << str;
|
||||||
|
|||||||
@@ -6,12 +6,12 @@ public:
|
|||||||
Client(PIEthernet * eth_) {
|
Client(PIEthernet * eth_) {
|
||||||
eth = eth_;
|
eth = eth_;
|
||||||
eth->startThreadedRead();
|
eth->startThreadedRead();
|
||||||
CONNECTU(eth, threadedReadEvent, this, readed);
|
CONNECT2(void, const uchar *, int, eth, threadedReadEvent, this, readed);
|
||||||
CONNECTU(eth, disconnected, this, disconnected);
|
CONNECT1(void, bool, eth, disconnected, this, disconnected);
|
||||||
piCoutObj << uint(eth) << "client connected";
|
piCoutObj << uint(eth) << "client connected";
|
||||||
}
|
}
|
||||||
~Client() {}
|
~Client() {}
|
||||||
EVENT_HANDLER2(void, readed, uchar * , data, int, size) {
|
EVENT_HANDLER2(void, readed, const uchar *, data, int, size) {
|
||||||
PIByteArray ba(data, size);
|
PIByteArray ba(data, size);
|
||||||
piCoutObj << uint(eth) << "readed" << size << "bytes" << Hex << ba;
|
piCoutObj << uint(eth) << "readed" << size << "bytes" << Hex << ba;
|
||||||
eth->write(ba);
|
eth->write(ba);
|
||||||
@@ -37,7 +37,7 @@ public:
|
|||||||
Server(int port) {
|
Server(int port) {
|
||||||
eth = new PIEthernet(PIEthernet::TCP_Server);
|
eth = new PIEthernet(PIEthernet::TCP_Server);
|
||||||
eth->setParameter(PIEthernet::ReuseAddress);
|
eth->setParameter(PIEthernet::ReuseAddress);
|
||||||
CONNECTU(eth, newConnection, this, newConnection);
|
CONNECT1(void, PIEthernet *, eth, newConnection, this, newConnection);
|
||||||
PIString path = "0.0.0.0:" + PIString::fromNumber(port);
|
PIString path = "0.0.0.0:" + PIString::fromNumber(port);
|
||||||
eth->listen(path, true);
|
eth->listen(path, true);
|
||||||
piCoutObj << uint(eth) << "server started" << path;
|
piCoutObj << uint(eth) << "server started" << path;
|
||||||
@@ -50,7 +50,7 @@ public:
|
|||||||
EVENT_HANDLER1(void, newConnection, PIEthernet * , cl) {
|
EVENT_HANDLER1(void, newConnection, PIEthernet * , cl) {
|
||||||
piCoutObj << uint(eth) << "add client";
|
piCoutObj << uint(eth) << "add client";
|
||||||
Client * client = new Client(cl);
|
Client * client = new Client(cl);
|
||||||
CONNECTU(client, disconnect, this, disconnect);
|
CONNECT1(void, Client *, client, disconnect, this, disconnect);
|
||||||
clients.push_back(client);
|
clients.push_back(client);
|
||||||
}
|
}
|
||||||
EVENT_HANDLER1(void, disconnect, Client *, client) {
|
EVENT_HANDLER1(void, disconnect, Client *, client) {
|
||||||
|
|||||||
@@ -40,17 +40,17 @@ public:
|
|||||||
if (test_) {
|
if (test_) {
|
||||||
testt.setCRCEnabled(false);
|
testt.setCRCEnabled(false);
|
||||||
testt.setName("TEST");
|
testt.setName("TEST");
|
||||||
CONNECTU(&testt, sendRequest, this, ftsend);
|
CONNECT1(void, PIByteArray &, &testt, sendRequest, this, ftsend);
|
||||||
} else {
|
} else {
|
||||||
ft.setPacketSize(65000);
|
ft.setPacketSize(65000);
|
||||||
ft.setName("PIFT");
|
ft.setName("PIFT");
|
||||||
CONNECTU(&ft, sendRequest, this, ftsend);
|
CONNECT1(void, PIByteArray &, &ft, sendRequest, this, ftsend);
|
||||||
CONNECTU(&ft, sendFilesStarted, this, ftevent);
|
CONNECTU(&ft, sendFilesStarted, this, ftevent);
|
||||||
CONNECTU(&ft, receiveFilesStarted, this, ftevent);
|
CONNECTU(&ft, receiveFilesStarted, this, ftevent);
|
||||||
CONNECTU(&ft, sendFilesFinished, this, ftevent);
|
CONNECTU(&ft, sendFilesFinished, this, ftevent);
|
||||||
CONNECTU(&ft, receiveFilesFinished, this, ftevent);
|
CONNECTU(&ft, receiveFilesFinished, this, ftevent);
|
||||||
}
|
}
|
||||||
CONNECTU(ð, threadedReadEvent, this, received);
|
CONNECT2(void, const uchar *, int, ð, threadedReadEvent, this, received);
|
||||||
start(50);
|
start(50);
|
||||||
eth.setParameter(PIEthernet::SeparateSockets);
|
eth.setParameter(PIEthernet::SeparateSockets);
|
||||||
eth.startThreadedRead();
|
eth.startThreadedRead();
|
||||||
@@ -136,7 +136,7 @@ private:
|
|||||||
eth.send(data);
|
eth.send(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
EVENT_HANDLER2(void, received, uchar * , readed, int, size) {
|
EVENT_HANDLER2(void, received, const uchar * , readed, int, size) {
|
||||||
PIByteArray ba(readed, size);
|
PIByteArray ba(readed, size);
|
||||||
if(test_) {
|
if(test_) {
|
||||||
testt.received(ba);
|
testt.received(ba);
|
||||||
|
|||||||
Reference in New Issue
Block a user