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:
@@ -128,12 +128,13 @@ bool PIConnection::configure(PIConfig & conf, const PIString & name_) {
|
||||
PIStringList dev_list(ce.getValue("device").toString());
|
||||
PIStringList name_list(ce.getValue("device").name());
|
||||
PIStringList flt_list(ce.getValue("filter").toString());
|
||||
piForeachC (PIConfig::Entry * e, db) {
|
||||
for (const PIConfig::Entry * e : db) {
|
||||
dev_list << e->value();
|
||||
name_list << e->name();
|
||||
}
|
||||
piForeachC (PIConfig::Entry * e, fb)
|
||||
for (const PIConfig::Entry * e : fb) {
|
||||
flt_list << e->name();
|
||||
}
|
||||
PISet<PIString> chk_set = (PISet<PIString>(name_list) & PISet<PIString>(flt_list));
|
||||
//piCout << name_list << flt_list << chk_set;
|
||||
chk_set.remove("");
|
||||
@@ -157,9 +158,8 @@ bool PIConnection::configure(PIConfig & conf, const PIString & name_) {
|
||||
dev->setName(name_ + ".device." + dev_list[i]);
|
||||
PIConfig::Entry de = ce.getValue("device." + n);
|
||||
dev->setThreadedReadBufferSize(de.getValue("bufferSize", dev->threadedReadBufferSize()).toInt());
|
||||
PIDiagnostics * diag = diags_.value(dev, 0);
|
||||
if (diag != 0)
|
||||
diag->setDisconnectTimeout(de.getValue("disconnectTimeout", diag->disconnectTimeout()).toFloat());
|
||||
PIDiagnostics * diag = diags_.value(dev, nullptr);
|
||||
if (diag) diag->setDisconnectTimeout(de.getValue("disconnectTimeout", diag->disconnectTimeout()).toFloat());
|
||||
}
|
||||
int added(0), padded(-1), tries(0);
|
||||
bool pdebug = debug();
|
||||
@@ -169,7 +169,7 @@ bool PIConnection::configure(PIConfig & conf, const PIString & name_) {
|
||||
padded = added;
|
||||
added = 0;
|
||||
++tries;
|
||||
piForeachC (PIConfig::Entry * e, fb) {
|
||||
for (const PIConfig::Entry * e : fb) {
|
||||
PIPacketExtractor::SplitMode sm = PIPacketExtractor::None;
|
||||
PIString sms(e->getValue("splitMode").value());
|
||||
int smi = sms.toInt();
|
||||
@@ -198,15 +198,15 @@ bool PIConnection::configure(PIConfig & conf, const PIString & name_) {
|
||||
PIStringList devs(e->value());
|
||||
PIConfig::Branch db(e->getValue("device").children());
|
||||
devs << e->getValue("device", "").value();
|
||||
piForeachC (PIConfig::Entry * e2, db)
|
||||
for (const PIConfig::Entry * e2 : db) {
|
||||
devs << e2->value();
|
||||
}
|
||||
devs.removeStrings("");
|
||||
if (devs.isEmpty()) continue;
|
||||
PIString dname = dev_aliases.value(devs.front(), devs.front());
|
||||
PIPacketExtractor * pe = addFilter(e->name(), dname, sm);
|
||||
if (pe == 0) {
|
||||
if (!filter_fails.contains(dname))
|
||||
filter_fails << dname;
|
||||
if (!pe) {
|
||||
if (!filter_fails.contains(dname)) filter_fails << dname;
|
||||
continue;
|
||||
} else {
|
||||
filter_fails.removeAll(dname);
|
||||
@@ -214,7 +214,7 @@ bool PIConnection::configure(PIConfig & conf, const PIString & name_) {
|
||||
++added;
|
||||
for (int i = 1; i < devs.size_s(); ++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);
|
||||
++added;
|
||||
} else {
|
||||
@@ -222,9 +222,8 @@ bool PIConnection::configure(PIConfig & conf, const PIString & name_) {
|
||||
filter_fails << dname;
|
||||
}
|
||||
}
|
||||
PIDiagnostics * diag = diags_.value(pe, 0);
|
||||
if (diag != 0)
|
||||
diag->setDisconnectTimeout(e->getValue("disconnectTimeout", diag->disconnectTimeout()).toFloat());
|
||||
PIDiagnostics * diag = diags_.value(pe, nullptr);
|
||||
if (diag) diag->setDisconnectTimeout(e->getValue("disconnectTimeout", diag->disconnectTimeout()).toFloat());
|
||||
pe->setBufferSize(e->getValue("bufferSize", pe->bufferSize()).toInt());
|
||||
pe->setPayloadSize(e->getValue("payloadSize", pe->payloadSize()).toInt());
|
||||
pe->setPacketSize(e->getValue("packetSize", pe->packetSize()).toInt());
|
||||
@@ -234,23 +233,26 @@ bool PIConnection::configure(PIConfig & conf, const PIString & name_) {
|
||||
}
|
||||
}
|
||||
setDebug(pdebug);
|
||||
piForeachC (PIString & f, filter_fails)
|
||||
for (const PIString & f : filter_fails) {
|
||||
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());
|
||||
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());
|
||||
PIConfig::Branch db(e->getValue("device").children());
|
||||
devs << e->getValue("device", "").value();
|
||||
piForeachC (PIConfig::Entry * e2, db)
|
||||
for (const PIConfig::Entry * e2 : db) {
|
||||
devs << e2->value();
|
||||
}
|
||||
devs.removeStrings("");
|
||||
if (devs.isEmpty()) continue;
|
||||
float freq = e->getValue("frequency").toFloat();
|
||||
piForeachC (PIString & d, devs)
|
||||
for (const PIString & d : devs) {
|
||||
addSender(e->name(), dev_aliases.value(d, d), freq);
|
||||
}
|
||||
PIByteArray fd(PIByteArray::fromUserInput(e->getValue("fixedData").toString()));
|
||||
setSenderFixedData(e->name(), fd);
|
||||
}
|
||||
@@ -264,32 +266,31 @@ PIString PIConnection::makeConfig() const {
|
||||
ts << "[" << name() << "]\n";
|
||||
PIVector<PIIODevice * > devs(boundedDevices());
|
||||
int dn(-1);
|
||||
piForeachC (PIIODevice * d, devs) {
|
||||
for (const PIIODevice * d : devs) {
|
||||
PIStringList dnl(deviceNames(d));
|
||||
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 << ".bufferSize = " << d->threadedReadBufferSize() << " #n\n";
|
||||
PIDiagnostics * diag = diags_.value(const_cast<PIIODevice * >(d), 0);
|
||||
if (diag != 0)
|
||||
ts << "device." << dname << ".disconnectTimeout = " << diag->disconnectTimeout() << " #f\n";
|
||||
PIDiagnostics * diag = diags_.value(const_cast<PIIODevice * >(d), nullptr);
|
||||
if (diag) ts << "device." << dname << ".disconnectTimeout = " << diag->disconnectTimeout() << " #f\n";
|
||||
}
|
||||
}
|
||||
piForeachC (PEPair & f, extractors) {
|
||||
if (f.second == 0) continue;
|
||||
if (f.second->extractor == 0) continue;
|
||||
PIString prefix = "filter." + f.first;
|
||||
for (int i = 0; i < f.second->devices.size_s(); ++i) {
|
||||
PIString dname = device_names.key(f.second->devices[i]);
|
||||
if (dname.isEmpty()) dname = devPath(f.second->devices[i]);
|
||||
auto ite = extractors.makeIterator();
|
||||
while (ite.next()) {
|
||||
if (!ite.value()) continue;
|
||||
if (!ite.value()->extractor) continue;
|
||||
PIString prefix = "filter." + ite.key();
|
||||
for (int i = 0; i < ite.value()->devices.size_s(); ++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";
|
||||
}
|
||||
PIDiagnostics * diag = diags_.value(f.second->extractor, 0);
|
||||
ts << prefix << ".bufferSize = " << f.second->extractor->bufferSize() << " #n\n";
|
||||
if (diag != 0)
|
||||
ts << prefix << ".disconnectTimeout = " << diag->disconnectTimeout() << " #f\n";
|
||||
PIDiagnostics * diag = diags_.value(ite.value()->extractor, nullptr);
|
||||
ts << prefix << ".bufferSize = " << ite.value()->extractor->bufferSize() << " #n\n";
|
||||
if (diag) ts << prefix << ".disconnectTimeout = " << diag->disconnectTimeout() << " #f\n";
|
||||
ts << prefix << ".splitMode = ";
|
||||
switch (f.second->extractor->splitMode()) {
|
||||
switch (ite.value()->extractor->splitMode()) {
|
||||
case PIPacketExtractor::None: ts << "none"; break;
|
||||
case PIPacketExtractor::Header: ts << "header"; break;
|
||||
case PIPacketExtractor::Footer: ts << "footer"; break;
|
||||
@@ -298,37 +299,39 @@ PIString PIConnection::makeConfig() const {
|
||||
case PIPacketExtractor::Timeout: ts << "timeout"; break;
|
||||
}
|
||||
ts << " #s\n";
|
||||
ts << prefix << ".payloadSize = " << f.second->extractor->payloadSize() << " #n\n";
|
||||
ts << prefix << ".packetSize = " << f.second->extractor->packetSize() << " #n\n";
|
||||
ts << prefix << ".timeout = " << f.second->extractor->timeout() << " #f\n";
|
||||
ts << prefix << ".header = " << f.second->extractor->header().toString() << " #s\n";
|
||||
ts << prefix << ".footer = " << f.second->extractor->footer().toString() << " #s\n";
|
||||
ts << prefix << ".payloadSize = " << ite.value()->extractor->payloadSize() << " #n\n";
|
||||
ts << prefix << ".packetSize = " << ite.value()->extractor->packetSize() << " #n\n";
|
||||
ts << prefix << ".timeout = " << ite.value()->extractor->timeout() << " #f\n";
|
||||
ts << prefix << ".header = " << ite.value()->extractor->header().toString() << " #s\n";
|
||||
ts << prefix << ".footer = " << ite.value()->extractor->footer().toString() << " #s\n";
|
||||
}
|
||||
dn = 0;
|
||||
piForeachC (CPair & c, channels_) {
|
||||
piForeachC (PIIODevice * d, c.second) {
|
||||
auto itc = channels_.makeIterator();
|
||||
while (itc.next()) {
|
||||
for (const PIIODevice * d : itc.value()) {
|
||||
PIString prefix = "channel." + PIString::fromNumber(dn); ++dn;
|
||||
PIString dname = device_names.key(c.first);
|
||||
if (dname.isEmpty()) dname = devPath(c.first);
|
||||
PIString dname = device_names.key(itc.key());
|
||||
if (dname.isEmpty()) dname = devPath(itc.key());
|
||||
ts << prefix << ".from = " << dname << " #s\n";
|
||||
dname = device_names.key(const_cast<PIIODevice *>(d));
|
||||
if (dname.isEmpty()) dname = devPath(d);
|
||||
ts << prefix << ".to = " << dname << " #s\n";
|
||||
}
|
||||
}
|
||||
piForeachC (SPair & s, senders) {
|
||||
if (s.second == 0) continue;
|
||||
PIString prefix = "sender." + s.second->name();
|
||||
for (int i = 0; i < s.second->devices.size_s(); ++i) {
|
||||
PIString dname = device_names.key(s.second->devices[i]);
|
||||
if (dname.isEmpty()) dname = devPath(s.second->devices[i]);
|
||||
auto its = senders.makeIterator();
|
||||
while (its.next()) {
|
||||
if (!its.value()) continue;
|
||||
PIString prefix = "sender." + its.value()->name();
|
||||
for (int i = 0; i < its.value()->devices.size_s(); ++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";
|
||||
}
|
||||
double int_ = s.second->int_;
|
||||
double int_ = its.value()->int_;
|
||||
if (int_ > 0.)
|
||||
ts << prefix << ".frequency = " << (1000. / int_) << " #f\n";
|
||||
if (!s.second->sdata.isEmpty())
|
||||
ts << prefix << ".fixedData = " << s.second->sdata.toString() << " #s\n";
|
||||
if (!its.value()->sdata.isEmpty())
|
||||
ts << prefix << ".fixedData = " << its.value()->sdata.toString() << " #s\n";
|
||||
}
|
||||
ts << "[]\n";
|
||||
return ret;
|
||||
@@ -342,11 +345,11 @@ PIIODevice * PIConnection::addDevice(const PIString & full_path, PIIODevice::Dev
|
||||
dev->setName(name() + ".device." + fp);
|
||||
device_modes[dev] = mode;
|
||||
__device_pool__->lock();
|
||||
if (diags_.value(dev, 0) == 0) {
|
||||
if (!diags_.value(dev, nullptr)) {
|
||||
PIDiagnostics * d = new PIDiagnostics(false);
|
||||
d->setInterval(100.);
|
||||
diags_[dev] = d;
|
||||
CONNECTU(d, qualityChanged, this, diagQualityChanged);
|
||||
CONNECT2(void, PIDiagnostics::Quality, PIDiagnostics::Quality, d, qualityChanged, this, diagQualityChanged);
|
||||
__device_pool__->init();
|
||||
}
|
||||
__device_pool__->unlock();
|
||||
@@ -363,9 +366,10 @@ void PIConnection::setDeviceName(PIIODevice * dev, const PIString & name) {
|
||||
|
||||
PIStringList PIConnection::deviceNames(const PIIODevice * dev) const {
|
||||
PIStringList ret;
|
||||
piForeachC (DNPair & s, device_names)
|
||||
if (s.second == dev)
|
||||
ret << s.first;
|
||||
auto it = device_names.makeIterator();
|
||||
while(it.next()) {
|
||||
if (it.value() == dev) ret << it.key();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -373,29 +377,31 @@ PIStringList PIConnection::deviceNames(const PIIODevice * dev) const {
|
||||
bool PIConnection::removeDevice(const PIString & full_path) {
|
||||
PIString fp(PIIODevice::normalizeFullPath(full_path));
|
||||
PIIODevice * dev = __device_pool__->device(fp);
|
||||
if (dev == 0) return false;
|
||||
if (!dev) return false;
|
||||
PIStringList dntd(deviceNames(dev));
|
||||
piForeachC (PIString & n, dntd)
|
||||
for (const PIString & n : dntd) {
|
||||
device_names.removeOne(n);
|
||||
}
|
||||
for (auto s = senders.constBegin(); s != senders.constEnd(); s++) {
|
||||
if (s.value() == 0) continue;
|
||||
if (!s.value()) continue;
|
||||
s.value()->lock();
|
||||
s.value()->devices.removeAll(dev);
|
||||
s.value()->unlock();
|
||||
}
|
||||
device_modes.remove(dev);
|
||||
for (auto i = extractors.constBegin(); i != extractors.constEnd(); i++) {
|
||||
if (i.value() == 0) continue;
|
||||
if (!i.value()) continue;
|
||||
i.value()->devices.removeAll(dev);
|
||||
}
|
||||
bounded_extractors.remove(dev);
|
||||
channels_.remove(dev);
|
||||
auto it = channels_.makeIterator();
|
||||
while (it.next())
|
||||
while (it.next()) {
|
||||
it.valueRef().removeAll(dev);
|
||||
}
|
||||
__device_pool__->lock();
|
||||
if (diags_.value(dev, 0) != 0)
|
||||
delete diags_.value(dev);
|
||||
PIDiagnostics * dg = diags_.value(dev, nullptr);
|
||||
if (dg) delete dg;
|
||||
diags_.remove(dev);
|
||||
__device_pool__->unlock();
|
||||
return __device_pool__->removeDevice(this, fp);
|
||||
@@ -406,19 +412,20 @@ void PIConnection::removeAllDevices() {
|
||||
device_names.clear();
|
||||
PIVector<PIIODevice * > bdevs(__device_pool__->boundedDevices(this));
|
||||
__device_pool__->lock();
|
||||
piForeach (PIIODevice * d, bdevs) {
|
||||
for (PIIODevice * d : bdevs) {
|
||||
for (auto s = senders.constBegin(); s != senders.constEnd(); s++) {
|
||||
if (s.value() == 0) continue;
|
||||
if (!s.value()) continue;
|
||||
s.value()->lock();
|
||||
s.value()->devices.removeAll(d);
|
||||
s.value()->unlock();
|
||||
}
|
||||
channels_.remove(d);
|
||||
auto it = channels_.makeIterator();
|
||||
while (it.next())
|
||||
while (it.next()) {
|
||||
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);
|
||||
}
|
||||
__device_pool__->unboundConnection(this);
|
||||
@@ -426,7 +433,7 @@ void PIConnection::removeAllDevices() {
|
||||
device_modes.clear();
|
||||
bounded_extractors.clear();
|
||||
for (auto i = extractors.constBegin(); i != extractors.constEnd(); i++) {
|
||||
if (i.value() == 0) continue;
|
||||
if (!i.value()) continue;
|
||||
i.value()->devices.clear();
|
||||
}
|
||||
}
|
||||
@@ -434,16 +441,16 @@ void PIConnection::removeAllDevices() {
|
||||
|
||||
PIIODevice * PIConnection::deviceByFullPath(const PIString & full_path) const {
|
||||
PIString fp(PIIODevice::normalizeFullPath(full_path));
|
||||
DevicePool::DeviceData * dd = __device_pool__->devices.value(fp);
|
||||
if (dd == 0) return 0;
|
||||
if (dd->dev == 0) return 0;
|
||||
if (!dd->listeners.contains(const_cast<PIConnection * >(this))) return 0;
|
||||
DevicePool::DeviceData * dd = __device_pool__->devices.value(fp, nullptr);
|
||||
if (!dd) return nullptr;
|
||||
if (!dd->dev) return nullptr;
|
||||
if (!dd->listeners.contains(const_cast<PIConnection * >(this))) return nullptr;
|
||||
return dd->dev;
|
||||
}
|
||||
|
||||
|
||||
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) {
|
||||
PIString fname_ = name_.trimmed();
|
||||
Extractor * e = extractors.value(fname_);
|
||||
if (full_path.isEmpty()) return (e == 0 ? 0 : e->extractor);
|
||||
Extractor * e = extractors.value(fname_, nullptr);
|
||||
if (full_path.isEmpty()) return (e ? e->extractor : nullptr);
|
||||
PIIODevice * dev = devByString(full_path);
|
||||
PIPacketExtractor * pe(0);
|
||||
if (extractors.value(full_path) != 0) pe = extractors.value(full_path)->extractor;
|
||||
if (pe != 0) dev = pe;
|
||||
if (dev == 0) {
|
||||
PIPacketExtractor * pe = nullptr;
|
||||
if (extractors.value(full_path, nullptr)) pe = extractors.value(full_path, nullptr)->extractor;
|
||||
if (pe) dev = pe;
|
||||
if (!dev) {
|
||||
piCoutObj << "\"addFilter\" error: no such device or filter \"" << full_path << "\"!";
|
||||
return 0;
|
||||
return nullptr;
|
||||
}
|
||||
if (e == 0) {
|
||||
if (!e) {
|
||||
e = new Extractor();
|
||||
extractors[fname_] = e;
|
||||
}
|
||||
if (e->extractor == 0) {
|
||||
e->extractor = new PIPacketExtractor(0, mode);
|
||||
if (!e->extractor) {
|
||||
e->extractor = new PIPacketExtractor(nullptr, mode);
|
||||
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();
|
||||
if (diags_.value(e->extractor, 0) == 0) {
|
||||
if (!diags_.value(e->extractor, nullptr)) {
|
||||
PIDiagnostics * d = new PIDiagnostics(false);
|
||||
d->setInterval(100.);
|
||||
diags_[e->extractor] = d;
|
||||
CONNECTU(d, qualityChanged, this, diagQualityChanged);
|
||||
CONNECT2(void, PIDiagnostics::Quality, PIDiagnostics::Quality, d, qualityChanged, this, diagQualityChanged);
|
||||
}
|
||||
__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)) {
|
||||
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) {
|
||||
Extractor * e = 0;
|
||||
if (full_path.isEmpty()) return (e == 0 ? 0 : e->extractor);
|
||||
Extractor * e = nullptr;
|
||||
if (full_path.isEmpty()) return nullptr;
|
||||
PIIODevice * dev = devByString(full_path);
|
||||
PIPacketExtractor * pe(0);
|
||||
if (extractors.value(full_path) != 0) pe = extractors.value(full_path)->extractor;
|
||||
if (pe != 0) dev = pe;
|
||||
if (dev == 0) {
|
||||
PIPacketExtractor * pe = nullptr;
|
||||
e = extractors.value(full_path, nullptr);
|
||||
if (e) pe = e->extractor;
|
||||
if (pe) {
|
||||
dev = pe;
|
||||
} else {
|
||||
piCoutObj << "\"addFilter\" error: no such device or filter \"" << full_path << "\"!";
|
||||
return 0;
|
||||
return nullptr;
|
||||
}
|
||||
if (e == 0) {
|
||||
if (!e) {
|
||||
e = new Extractor();
|
||||
extractors[filter->name()] = e;
|
||||
}
|
||||
if (e->extractor == 0) {
|
||||
if (!e->extractor) {
|
||||
e->extractor = filter;
|
||||
e->extractor->setThreadedReadData(new PIPair<PIConnection * , PIString>(this, filter->name()));
|
||||
__device_pool__->lock();
|
||||
if (diags_.value(e->extractor, 0) == 0) {
|
||||
PIDiagnostics * d = new PIDiagnostics(false);
|
||||
d->setInterval(100.);
|
||||
diags_[e->extractor] = d;
|
||||
CONNECTU(d, qualityChanged, this, diagQualityChanged);
|
||||
CONNECT2(void, PIDiagnostics::Quality, PIDiagnostics::Quality, d, qualityChanged, this, diagQualityChanged);
|
||||
}
|
||||
__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)) {
|
||||
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) {
|
||||
if (dev == 0) return false;
|
||||
Extractor * p = extractors.value(name_.trimmed());
|
||||
if (p == 0) return false;
|
||||
if (!dev) return false;
|
||||
Extractor * p = extractors.value(name_.trimmed(), nullptr);
|
||||
if (!p) return false;
|
||||
bool ret = false;
|
||||
for (int i = 0; i < p->devices.size_s(); ++i) {
|
||||
if (p->devices[i] == dev) {
|
||||
@@ -557,8 +561,8 @@ bool PIConnection::removeFilter(const PIString & name_, const PIIODevice * dev)
|
||||
|
||||
|
||||
bool PIConnection::removeFilter(const PIString & name_) {
|
||||
Extractor * p = extractors.value(name_.trimmed());
|
||||
if (p == 0) return false;
|
||||
Extractor * p = extractors.value(name_.trimmed(), nullptr);
|
||||
if (!p) return false;
|
||||
unboundExtractor(p->extractor);
|
||||
delete p;
|
||||
return true;
|
||||
@@ -568,13 +572,15 @@ bool PIConnection::removeFilter(const PIString & name_) {
|
||||
void PIConnection::removeAllFilters() {
|
||||
__device_pool__->lock();
|
||||
for (auto i = extractors.constBegin(); i != extractors.constEnd(); i++) {
|
||||
if (i.value() == 0) continue;
|
||||
if (!i.value()) continue;
|
||||
channels_.remove(i.value()->extractor);
|
||||
auto it = channels_.makeIterator();
|
||||
while (it.next())
|
||||
while (it.next()) {
|
||||
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);
|
||||
}
|
||||
diags_.remove(i.value()->extractor);
|
||||
delete i.value();
|
||||
}
|
||||
@@ -587,8 +593,9 @@ void PIConnection::removeAllFilters() {
|
||||
PIVector<PIPacketExtractor * > PIConnection::filters() const {
|
||||
PIVector<PIPacketExtractor * > ret;
|
||||
for (auto i = extractors.constBegin(); i != extractors.constEnd(); i++) {
|
||||
if (i.value() != 0)
|
||||
if (i.value()->extractor != 0) ret << i.value()->extractor;
|
||||
if (i.value()) {
|
||||
if (i.value()->extractor) ret << i.value()->extractor;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
@@ -597,8 +604,8 @@ PIVector<PIPacketExtractor * > PIConnection::filters() const {
|
||||
PIStringList PIConnection::filterNames() const {
|
||||
PIStringList ret;
|
||||
for (auto i = extractors.constBegin(); i != extractors.constEnd(); i++) {
|
||||
if (i.value() != 0)
|
||||
if (i.value()->extractor != 0) ret << i.key();
|
||||
if (i.value())
|
||||
if (i.value()->extractor) ret << i.key();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
@@ -607,18 +614,18 @@ PIStringList PIConnection::filterNames() const {
|
||||
PIPacketExtractor * PIConnection::filter(const PIString & name_) const {
|
||||
PIString fname_ = name_.trimmed();
|
||||
for (auto i = extractors.constBegin(); i != extractors.constEnd(); i++) {
|
||||
if (i.value() != 0)
|
||||
if (i.value()->extractor != 0 && i.key() == fname_)
|
||||
return i.value()->extractor;
|
||||
if (i.value()) {
|
||||
if ((i.value()->extractor) && (i.key() == fname_)) return i.value()->extractor;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
PIVector<PIIODevice * > PIConnection::filterBoundedDevices(const PIString & name_) const {
|
||||
PIVector<PIIODevice * > ret;
|
||||
Extractor * p = extractors.value(name_.trimmed());
|
||||
if (p == 0) return ret;
|
||||
if (!p) return ret;
|
||||
return p->devices;
|
||||
}
|
||||
|
||||
@@ -626,15 +633,19 @@ PIVector<PIIODevice * > PIConnection::filterBoundedDevices(const PIString & name
|
||||
bool PIConnection::addChannel(const PIString & name0, const PIString & name1) {
|
||||
//piCout << "addChannel" << name0 << name1;
|
||||
if (name0.isEmpty() || name1.isEmpty()) return false;
|
||||
PIIODevice * dev0 = devByString(name0), * dev1 = devByString(name1);
|
||||
PIPacketExtractor * pe0(0), * pe1(0);
|
||||
if (extractors.value(name0) != 0) pe0 = extractors.value(name0)->extractor;
|
||||
if (extractors.value(name1) != 0) pe1 = extractors.value(name1)->extractor;
|
||||
if (pe0 != 0) dev0 = pe0;
|
||||
if (pe1 != 0) dev1 = pe1;
|
||||
if (dev0 == 0 || dev1 == 0) {
|
||||
if (dev0 == 0) piCoutObj << "\"addChannel\" error: no such device \"" << name0 << "\"!";
|
||||
if (dev1 == 0) piCoutObj << "\"addChannel\" error: no such device \"" << name1 << "\"!";
|
||||
PIIODevice * dev0 = devByString(name0);
|
||||
PIIODevice * dev1 = devByString(name1);
|
||||
Extractor * p0 = extractors.value(name0, nullptr);
|
||||
Extractor * p1 = extractors.value(name1, nullptr);
|
||||
PIPacketExtractor * pe0 = nullptr;
|
||||
PIPacketExtractor * pe1 = nullptr;
|
||||
if (p0) pe0 = p0->extractor;
|
||||
if (p1) pe1 = p1->extractor;
|
||||
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;
|
||||
}
|
||||
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) {
|
||||
PIIODevice * dev0 = devByString(name0), * dev1 = devByString(name1);
|
||||
PIPacketExtractor * pe0(0), * pe1(0);
|
||||
if (extractors.value(name0) != 0) pe0 = extractors.value(name0)->extractor;
|
||||
if (extractors.value(name1) != 0) pe1 = extractors.value(name1)->extractor;
|
||||
if (pe0 != 0) dev0 = pe0;
|
||||
if (pe1 != 0) dev1 = pe1;
|
||||
if (dev0 == 0 || dev1 == 0) return false;
|
||||
PIIODevice * dev0 = devByString(name0);
|
||||
PIIODevice * dev1 = devByString(name1);
|
||||
Extractor * p0 = extractors.value(name0, nullptr);
|
||||
Extractor * p1 = extractors.value(name1, nullptr);
|
||||
PIPacketExtractor * pe0 = nullptr;
|
||||
PIPacketExtractor * pe1 = nullptr;
|
||||
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);
|
||||
return true;
|
||||
}
|
||||
@@ -658,14 +673,16 @@ bool PIConnection::removeChannel(const PIString & name0, const PIString & name1)
|
||||
|
||||
bool PIConnection::removeChannel(const PIString & name0) {
|
||||
PIIODevice * dev0 = devByString(name0);
|
||||
PIPacketExtractor * pe0(0);
|
||||
if (extractors.value(name0) != 0) pe0 = extractors.value(name0)->extractor;
|
||||
if (pe0 != 0) dev0 = pe0;
|
||||
if (dev0 == 0) return false;
|
||||
Extractor * p0 = extractors.value(name0, nullptr);
|
||||
PIPacketExtractor * pe0 = nullptr;
|
||||
if (p0) pe0 = p0->extractor;
|
||||
if (pe0) dev0 = pe0;
|
||||
if (!dev0) return false;
|
||||
channels_.remove(dev0);
|
||||
auto it = channels_.makeIterator();
|
||||
while (it.next())
|
||||
while (it.next()) {
|
||||
it.valueRef().removeAll(dev0);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -676,21 +693,21 @@ void PIConnection::removeAllChannels() {
|
||||
|
||||
|
||||
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();
|
||||
return d->constructFullPath();
|
||||
}
|
||||
|
||||
|
||||
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();
|
||||
return d->name();
|
||||
}
|
||||
|
||||
|
||||
PIIODevice * PIConnection::devByString(const PIString & s) const {
|
||||
if (s.isEmpty()) return 0;
|
||||
if (s.isEmpty()) return nullptr;
|
||||
PIIODevice * ret = deviceByName(s);
|
||||
if (!ret) ret = deviceByFullPath(s);
|
||||
return ret;
|
||||
@@ -699,10 +716,12 @@ PIIODevice * PIConnection::devByString(const PIString & s) const {
|
||||
|
||||
PIVector<PIPair<PIString, PIString > > PIConnection::channels() const {
|
||||
PIVector<PIPair<PIString, PIString > > ret;
|
||||
piForeachC (CPair & i, channels_) {
|
||||
PIString fp0(devFPath(i.first));
|
||||
piForeachC (PIIODevice * d, i.second)
|
||||
auto it = channels_.makeIterator();
|
||||
while (it.next()) {
|
||||
PIString fp0(devFPath(it.key()));
|
||||
for (const PIIODevice * d : it.value()) {
|
||||
ret << PIPair<PIString, PIString>(fp0, devFPath(d));
|
||||
}
|
||||
}
|
||||
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_) {
|
||||
PIString fname_ = name_.trimmed();
|
||||
if (full_path_name.isEmpty() || frequency <= 0.) return;
|
||||
Sender * s = senders.value(fname_);
|
||||
if (s == 0) {
|
||||
Sender * s = senders.value(fname_, nullptr);
|
||||
if (!s) {
|
||||
s = new Sender(this);
|
||||
s->setName(fname_);
|
||||
s->int_ = 1000. / frequency;
|
||||
senders[fname_] = s;
|
||||
}
|
||||
PIIODevice * dev = devByString(full_path_name);
|
||||
if (dev == 0) {
|
||||
if (!dev) {
|
||||
piCoutObj << "\"addSender\" error: no such device \"" << full_path_name << "\"!";
|
||||
return;
|
||||
}
|
||||
@@ -728,28 +747,26 @@ void PIConnection::addSender(const PIString & name_, const PIString & full_path_
|
||||
if (!__device_pool__->fake) s->start(s->int_);
|
||||
}
|
||||
s->lock();
|
||||
if (!s->devices.contains(dev))
|
||||
s->devices << dev;
|
||||
if (!s->devices.contains(dev)) s->devices << dev;
|
||||
s->unlock();
|
||||
}
|
||||
|
||||
|
||||
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);
|
||||
if (s == 0 || d == 0) return false;
|
||||
if (!s || !d) return false;
|
||||
s->lock();
|
||||
bool ret = s->devices.contains(d);
|
||||
if (ret)
|
||||
s->devices.removeAll(d);
|
||||
if (ret) s->devices.removeAll(d);
|
||||
s->unlock();
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
bool PIConnection::removeSender(const PIString & name) {
|
||||
Sender * s = senders.value(name, 0);
|
||||
if (s == 0) return false;
|
||||
Sender * s = senders.value(name, nullptr);
|
||||
if (!s) return false;
|
||||
delete s;
|
||||
senders.remove(name);
|
||||
return true;
|
||||
@@ -757,8 +774,8 @@ bool PIConnection::removeSender(const PIString & name) {
|
||||
|
||||
|
||||
bool PIConnection::setSenderFixedData(const PIString & name, const PIByteArray & data) {
|
||||
Sender * s = senders.value(name, 0);
|
||||
if (s == 0) return false;
|
||||
Sender * s = senders.value(name, nullptr);
|
||||
if (!s) return false;
|
||||
s->lock();
|
||||
s->sdata = data;
|
||||
s->unlock();
|
||||
@@ -767,8 +784,8 @@ bool PIConnection::setSenderFixedData(const PIString & name, const PIByteArray &
|
||||
|
||||
|
||||
bool PIConnection::clearSenderFixedData(const PIString & name) {
|
||||
Sender * s = senders.value(name, 0);
|
||||
if (s == 0) return false;
|
||||
Sender * s = senders.value(name, nullptr);
|
||||
if (!s) return false;
|
||||
s->lock();
|
||||
s->sdata.clear();
|
||||
s->unlock();
|
||||
@@ -777,15 +794,15 @@ bool PIConnection::clearSenderFixedData(const PIString & name) {
|
||||
|
||||
|
||||
PIByteArray PIConnection::senderFixedData(const PIString & name) const {
|
||||
Sender * s = senders.value(name, 0);
|
||||
if (s == 0) return PIByteArray();
|
||||
Sender * s = senders.value(name, nullptr);
|
||||
if (!s) return PIByteArray();
|
||||
return s->sdata;
|
||||
}
|
||||
|
||||
|
||||
float PIConnection::senderFrequency(const PIString & name) const {
|
||||
Sender * s = senders.value(name, 0);
|
||||
if (s == 0) return -1.f;
|
||||
Sender * s = senders.value(name, nullptr);
|
||||
if (!s) return -1.f;
|
||||
double i = s->interval();
|
||||
if (i == 0.) return 0.f;
|
||||
return 1000. / s->interval();
|
||||
@@ -794,8 +811,7 @@ float PIConnection::senderFrequency(const PIString & name) const {
|
||||
|
||||
void PIConnection::removeAllSenders() {
|
||||
for (auto s = senders.constBegin(); s != senders.constEnd(); s++) {
|
||||
if (s.value() != 0)
|
||||
delete s.value();
|
||||
if (s.value()) delete s.value();
|
||||
}
|
||||
senders.clear();
|
||||
}
|
||||
@@ -803,8 +819,8 @@ void PIConnection::removeAllSenders() {
|
||||
|
||||
void PIConnection::startThreadedRead(const PIString & full_path_name) {
|
||||
DevicePool::DeviceData * dd = __device_pool__->deviceData(devByString(full_path_name));
|
||||
if (dd == 0) return;
|
||||
if (dd->dev == 0) return;
|
||||
if (!dd) return;
|
||||
if (!dd->dev) return;
|
||||
if (dd->started || dd->dev->mode() == PIIODevice::WriteOnly) return;
|
||||
if (!__device_pool__->fake) dd->rthread->start();
|
||||
dd->started = true;
|
||||
@@ -812,32 +828,33 @@ void PIConnection::startThreadedRead(const PIString & full_path_name) {
|
||||
|
||||
|
||||
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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void PIConnection::startSender(const PIString & name) {
|
||||
Sender * s = senders.value(name, 0);
|
||||
if (s == 0) return;
|
||||
if (!s->isRunning() && !__device_pool__->fake)
|
||||
s->start(s->int_);
|
||||
Sender * s = senders.value(name, nullptr);
|
||||
if (!s) return;
|
||||
if (!s->isRunning() && !__device_pool__->fake) s->start(s->int_);
|
||||
}
|
||||
|
||||
|
||||
void PIConnection::startAllSenders() {
|
||||
for (auto s = senders.constBegin(); s != senders.constEnd(); s++) {
|
||||
if (s.value() == 0) continue;
|
||||
if (!s.value()->isRunning() && !__device_pool__->fake)
|
||||
if (!s.value()) continue;
|
||||
if (!s.value()->isRunning() && !__device_pool__->fake) {
|
||||
s.value()->start(s.value()->int_);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void PIConnection::stopThreadedRead(const PIString & full_path_name) {
|
||||
DevicePool::DeviceData * dd = __device_pool__->deviceData(devByString(full_path_name));
|
||||
if (dd == 0) return;
|
||||
if (dd->dev == 0) return;
|
||||
if (!dd) return;
|
||||
if (!dd->dev) return;
|
||||
if (!dd->started || dd->dev->mode() == PIIODevice::WriteOnly) return;
|
||||
dd->rthread->stop();
|
||||
dd->started = false;
|
||||
@@ -845,34 +862,35 @@ void PIConnection::stopThreadedRead(const PIString & full_path_name) {
|
||||
|
||||
|
||||
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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void PIConnection::stopSender(const PIString & name) {
|
||||
Sender * s = senders.value(name, 0);
|
||||
if (s == 0) return;
|
||||
Sender * s = senders.value(name, nullptr);
|
||||
if (!s) return;
|
||||
if (s->isRunning()) s->stop();
|
||||
}
|
||||
|
||||
|
||||
void PIConnection::stopAllSenders() {
|
||||
for (auto s = senders.constBegin(); s != senders.constEnd(); s++) {
|
||||
if (s.value() == 0) continue;
|
||||
if (s.value()->isRunning())
|
||||
s.value()->stop();
|
||||
if (!s.value()) continue;
|
||||
if (s.value()->isRunning()) s.value()->stop();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
PIDiagnostics * PIConnection::diagnostic(const PIString & full_path_name) const {
|
||||
PIIODevice * dev = devByString(full_path_name);
|
||||
PIPacketExtractor * pe(0);
|
||||
if (extractors.value(full_path_name) != 0) pe = extractors.value(full_path_name)->extractor;
|
||||
if (pe != 0) dev = pe;
|
||||
if (dev == 0) return 0;
|
||||
return diags_.value(dev, 0);
|
||||
Extractor * e = extractors.value(full_path_name, nullptr);
|
||||
PIPacketExtractor * pe = nullptr;
|
||||
if (e) pe = e->extractor;
|
||||
if (pe) dev = pe;
|
||||
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) {
|
||||
if (dev == 0) {
|
||||
if (!dev) {
|
||||
piCoutObj << "Null Device!";
|
||||
return -1;
|
||||
}
|
||||
@@ -909,8 +927,8 @@ int PIConnection::write(PIIODevice * dev, const PIByteArray & data) {
|
||||
return -1;
|
||||
}
|
||||
int ret = dev->write(data);
|
||||
PIDiagnostics * diag = diags_.value(dev);
|
||||
if (diag != 0 && ret > 0) diag->sended(ret);
|
||||
PIDiagnostics * diag = diags_.value(dev, nullptr);
|
||||
if (diag && ret > 0) diag->sended(ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -951,37 +969,35 @@ PIConnection::DevicePool::~DevicePool() {
|
||||
|
||||
|
||||
void PIConnection::DevicePool::init() {
|
||||
if (!isRunning())
|
||||
start(100);
|
||||
if (!isRunning()) start(100);
|
||||
}
|
||||
|
||||
|
||||
PIIODevice * PIConnection::DevicePool::addDevice(PIConnection * parent, const PIString & fp, PIIODevice::DeviceMode mode, bool start) {
|
||||
DeviceData * dd = devices[fp];
|
||||
int pmode(0);
|
||||
int pmode = 0;
|
||||
bool need_start = false;
|
||||
if (dd == 0) {
|
||||
if (!dd) {
|
||||
dd = new DeviceData();
|
||||
devices[fp] = dd;
|
||||
}
|
||||
if (dd->dev == 0) {
|
||||
if (!dd->dev) {
|
||||
//piCout << "new device" << fp;
|
||||
dd->dev = PIIODevice::createFromFullPath(fp);
|
||||
if (dd->dev == 0) {
|
||||
if (!dd->dev) {
|
||||
piCoutObj << "Error: can`t create device \"" << fp << "\"!"; //:" << errorString();
|
||||
return 0;
|
||||
return nullptr;
|
||||
}
|
||||
dd->dev->setProperty("__fullPath__", fp);
|
||||
} else
|
||||
} else {
|
||||
pmode = dd->dev->mode();
|
||||
if (!dd->listeners.contains(parent))
|
||||
dd->listeners << parent;
|
||||
if (pmode == mode || pmode == PIIODevice::ReadWrite)
|
||||
return dd->dev;
|
||||
}
|
||||
if (!dd->listeners.contains(parent)) dd->listeners << parent;
|
||||
if (pmode == mode || pmode == PIIODevice::ReadWrite) return dd->dev;
|
||||
if ((mode & PIIODevice::ReadOnly) > 0) {
|
||||
if (dd->rthread != 0) {
|
||||
if (dd->rthread) {
|
||||
delete dd->rthread;
|
||||
dd->rthread = 0;
|
||||
dd->rthread = nullptr;
|
||||
dd->started = false;
|
||||
}
|
||||
dd->rthread = new PIThread(dd, __DevicePool_threadReadDP);
|
||||
@@ -989,13 +1005,13 @@ PIIODevice * PIConnection::DevicePool::addDevice(PIConnection * parent, const PI
|
||||
need_start = true;
|
||||
pmode |= PIIODevice::ReadOnly;
|
||||
}
|
||||
if ((mode & PIIODevice::WriteOnly) > 0)
|
||||
pmode |= PIIODevice::WriteOnly;
|
||||
if ((mode & PIIODevice::WriteOnly) > 0) pmode |= PIIODevice::WriteOnly;
|
||||
if (!fake) {
|
||||
dd->dev->close();
|
||||
dd->dev->open((PIIODevice::DeviceMode)pmode);
|
||||
} else
|
||||
} else {
|
||||
dd->dev->setMode((PIIODevice::DeviceMode)pmode);
|
||||
}
|
||||
if (need_start && start) {
|
||||
if (!fake) dd->rthread->start();
|
||||
dd->started = true;
|
||||
@@ -1005,11 +1021,9 @@ PIIODevice * PIConnection::DevicePool::addDevice(PIConnection * parent, const PI
|
||||
|
||||
|
||||
bool PIConnection::DevicePool::removeDevice(PIConnection * parent, const PIString & fp) {
|
||||
DeviceData * dd = devices.value(fp);
|
||||
if (dd == 0)
|
||||
return false;
|
||||
if (dd->dev == 0)
|
||||
return false;
|
||||
DeviceData * dd = devices.value(fp, nullptr);
|
||||
if (!dd) return false;
|
||||
if (!dd->dev) return false;
|
||||
bool ok = dd->listeners.contains(parent);
|
||||
dd->listeners.removeAll(parent);
|
||||
if (dd->listeners.isEmpty()) {
|
||||
@@ -1023,18 +1037,16 @@ bool PIConnection::DevicePool::removeDevice(PIConnection * parent, const PIStrin
|
||||
void PIConnection::DevicePool::unboundConnection(PIConnection * parent) {
|
||||
PIStringList rem;
|
||||
for (auto i = devices.constBegin(); i != devices.constEnd(); i++) {
|
||||
if (i.value() == 0) {
|
||||
if (!i.value()) {
|
||||
rem << i.key();
|
||||
continue;
|
||||
}
|
||||
i.value()->listeners.removeAll(parent);
|
||||
if (i.value()->listeners.isEmpty())
|
||||
rem << i.key();
|
||||
if (i.value()->listeners.isEmpty()) rem << i.key();
|
||||
}
|
||||
piForeachC (PIString & i, rem) {
|
||||
DeviceData * dd = devices.value(i);
|
||||
if (dd == 0)
|
||||
continue;
|
||||
for (const PIString & i : rem) {
|
||||
DeviceData * dd = devices.value(i, nullptr);
|
||||
if (!dd) continue;
|
||||
delete dd;
|
||||
devices.remove(i);
|
||||
}
|
||||
@@ -1042,45 +1054,49 @@ void PIConnection::DevicePool::unboundConnection(PIConnection * parent) {
|
||||
|
||||
|
||||
PIIODevice * PIConnection::DevicePool::device(const PIString & fp) const {
|
||||
DeviceData * dd = devices.value(fp);
|
||||
if (dd == 0) return 0;
|
||||
DeviceData * dd = devices.value(fp, nullptr);
|
||||
if (!dd) return nullptr;
|
||||
return dd->dev;
|
||||
}
|
||||
|
||||
|
||||
PIConnection::DevicePool::DeviceData * PIConnection::DevicePool::deviceData(PIIODevice * d) const {
|
||||
if (!d) return 0;
|
||||
piForeachC (DDPair & i, devices) {
|
||||
if (i.second->dev == d)
|
||||
return i.second;
|
||||
if (!d) return nullptr;
|
||||
auto it = devices.makeIterator();
|
||||
while (it.next()) {
|
||||
if (!it.value()) continue;
|
||||
if (it.value()->dev == d) return it.value();
|
||||
}
|
||||
return 0;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
PIVector<PIConnection * > PIConnection::DevicePool::boundedConnections() const {
|
||||
PIVector<PIConnection * > ret;
|
||||
piForeachC (DDPair & i, devices) {
|
||||
if (i.second == 0)
|
||||
continue;
|
||||
ret << i.second->listeners;
|
||||
auto it = devices.makeIterator();
|
||||
while (it.next()) {
|
||||
if (!it.value()) continue;
|
||||
ret << it.value()->listeners;
|
||||
}
|
||||
for (int i = 0; i < ret.size_s(); ++i)
|
||||
for (int j = i + 1; j < ret.size_s(); ++j)
|
||||
for (int i = 0; i < ret.size_s(); ++i) {
|
||||
for (int j = i + 1; j < ret.size_s(); ++j) {
|
||||
if (ret[i] == ret[j]) {
|
||||
ret.remove(j);
|
||||
--j;
|
||||
}
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
PIVector< PIIODevice * > PIConnection::DevicePool::boundedDevices() const {
|
||||
PIVector<PIIODevice * > ret;
|
||||
piForeachC (DDPair & i, devices) {
|
||||
if (i.second == 0) continue;
|
||||
if (i.second->dev == 0) continue;
|
||||
ret << i.second->dev;
|
||||
auto it = devices.makeIterator();
|
||||
while (it.next()) {
|
||||
if (!it.value()) continue;
|
||||
if (!it.value()->dev) continue;
|
||||
ret << it.value()->dev;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
@@ -1088,11 +1104,13 @@ PIVector< PIIODevice * > PIConnection::DevicePool::boundedDevices() const {
|
||||
|
||||
PIVector<PIIODevice * > PIConnection::DevicePool::boundedDevices(const PIConnection * parent) const {
|
||||
PIVector<PIIODevice * > ret;
|
||||
piForeachC (DDPair & i, devices) {
|
||||
if (i.second == 0) continue;
|
||||
if (i.second->dev == 0) continue;
|
||||
if (i.second->listeners.contains(const_cast<PIConnection*>(parent)))
|
||||
ret << i.second->dev;
|
||||
auto it = devices.makeIterator();
|
||||
while (it.next()) {
|
||||
if (!it.value()) continue;
|
||||
if (!it.value()->dev) continue;
|
||||
if (it.value()->listeners.contains(const_cast<PIConnection*>(parent))) {
|
||||
ret << it.value()->dev;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
@@ -1102,21 +1120,21 @@ PIConnection::DevicePool::DeviceData::~DeviceData() {
|
||||
if (rthread) {
|
||||
rthread->terminate();
|
||||
delete rthread;
|
||||
rthread = 0;
|
||||
rthread = nullptr;
|
||||
}
|
||||
if (dev) {
|
||||
dev->close();
|
||||
delete dev;
|
||||
dev = 0;
|
||||
dev = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void PIConnection::DevicePool::run() {
|
||||
PIVector<PIConnection * > conns(PIConnection::allConnections());
|
||||
piForeach (PIConnection * c, conns) {
|
||||
for (PIConnection * c : conns) {
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -1125,13 +1143,23 @@ void PIConnection::DevicePool::run() {
|
||||
|
||||
void __DevicePool_threadReadDP(void * ddp) {
|
||||
PIConnection::DevicePool::DeviceData * dd((PIConnection::DevicePool::DeviceData * )ddp);
|
||||
if (dd->dev == 0) {piMSleep(100); return;}
|
||||
PIIODevice * dev = dd->dev;
|
||||
if (dev->isClosed())
|
||||
if (!dev->open()) {piMSleep(dev->reopenTimeout()); return;}
|
||||
if (!dev) {
|
||||
piMSleep(100);
|
||||
return;
|
||||
}
|
||||
if (dev->isClosed()) {
|
||||
if (!dev->open()) {
|
||||
piMSleep(dev->reopenTimeout());
|
||||
return;
|
||||
}
|
||||
}
|
||||
PIByteArray ba;
|
||||
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->threadedReadEvent(ba.data(), ba.size_s());
|
||||
//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) {
|
||||
PIString from = dd->dev->property("__fullPath__").toString();
|
||||
piForeach (PIConnection * ld, dd->listeners)
|
||||
for (PIConnection * ld : dd->listeners) {
|
||||
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);
|
||||
PIVector<PIPacketExtractor * > be(bounded_extractors.value(dev));
|
||||
//piCout << be;
|
||||
piForeach (PIPacketExtractor * i, be)
|
||||
i->threadedRead(const_cast<uchar * >(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);
|
||||
for (PIPacketExtractor * i : be) {
|
||||
i->threadedRead(data.data(), data.size_s());
|
||||
}
|
||||
PIDiagnostics * diag = diags_.value(dev);
|
||||
if (diag != 0) diag->received(data.size_s());
|
||||
PIVector<PIIODevice * > chd(channels_.value(dev));
|
||||
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) {
|
||||
return PIByteArray();
|
||||
@@ -1209,11 +1201,9 @@ PIByteArray PIConnection::senderData(const PIString & sender_name) {
|
||||
|
||||
|
||||
PIConnection::Extractor::~Extractor() {
|
||||
if (extractor != 0) {
|
||||
if (extractor->threadedReadData() != 0)
|
||||
delete (PIPair<PIConnection * , PIString> * )(extractor->threadedReadData());
|
||||
if (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) {
|
||||
if (parent == 0) return;
|
||||
if (!parent) return;
|
||||
PIByteArray data;
|
||||
if (!sdata.isEmpty()) data = sdata;
|
||||
else data = parent->senderData(name());
|
||||
if (data.isEmpty()) return;
|
||||
//piCoutObj << "write"<<data.size()<<"bytes to"<<devices.size()<<"devices";
|
||||
piForeach (PIIODevice * d, devices) {
|
||||
for (PIIODevice * d : devices) {
|
||||
int ret = d->write(data);
|
||||
PIDiagnostics * diag = parent->diags_.value(d);
|
||||
if (diag != 0 && ret > 0) diag->sended(ret);
|
||||
PIDiagnostics * diag = parent->diags_.value(d, nullptr);
|
||||
if (diag && ret > 0) diag->sended(ret);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1244,45 +1234,45 @@ void PIConnection::Sender::tick(void * , int) {
|
||||
|
||||
|
||||
void PIConnection::unboundExtractor(PIPacketExtractor * pe) {
|
||||
if (pe == 0) return;
|
||||
if (!pe) return;
|
||||
channels_.remove(pe);
|
||||
auto it = channels_.makeIterator();
|
||||
while (it.next())
|
||||
while (it.next()) {
|
||||
it.valueRef().removeAll(pe);
|
||||
}
|
||||
bounded_extractors.remove(pe);
|
||||
PIVector<PIIODevice * > k = bounded_extractors.keys();
|
||||
piForeach (PIIODevice * i, k) {
|
||||
for (PIIODevice * i : k) {
|
||||
PIVector<PIPacketExtractor * > & be(bounded_extractors[i]);
|
||||
be.removeAll(pe);
|
||||
if (be.isEmpty())
|
||||
bounded_extractors.remove(i);
|
||||
if (be.isEmpty()) bounded_extractors.remove(i);
|
||||
}
|
||||
__device_pool__->lock();
|
||||
if (diags_.value(pe, 0) != 0)
|
||||
delete diags_.value(pe);
|
||||
if (diags_.value(pe, nullptr)) delete diags_.value(pe);
|
||||
diags_.remove(pe);
|
||||
extractors.remove(pe->name());
|
||||
__device_pool__->unlock();
|
||||
}
|
||||
|
||||
|
||||
void PIConnection::packetExtractorReceived(uchar * data, int size) {
|
||||
PIString from(emitter() == 0 ? "" : emitter()->name());
|
||||
void PIConnection::packetExtractorReceived(const uchar * data, int size) {
|
||||
PIString from(emitter()? emitter()->name() : PIString());
|
||||
PIIODevice * cd = (PIIODevice * )emitter();
|
||||
// piCout << "packetExtractorReceived" << from << cd;
|
||||
if (cd != 0) {
|
||||
if (cd) {
|
||||
PIVector<PIPacketExtractor * > be(bounded_extractors.value(cd));
|
||||
//piCout << be << (void*)data << size;
|
||||
piForeach (PIPacketExtractor * i, be)
|
||||
for (PIPacketExtractor * i : be) {
|
||||
i->threadedRead(data, size);
|
||||
}
|
||||
PIVector<PIIODevice * > chd(channels_.value(cd));
|
||||
piForeach (PIIODevice * d, chd) {
|
||||
for (PIIODevice * d : chd) {
|
||||
int ret = d->write(data, size);
|
||||
PIDiagnostics * diag = diags_.value(d);
|
||||
if (diag != 0) diag->sended(ret);
|
||||
if (diag) diag->sended(ret);
|
||||
}
|
||||
PIDiagnostics * diag = diags_.value(cd);
|
||||
if (diag != 0) diag->received(size);
|
||||
if (diag) diag->received(size);
|
||||
}
|
||||
packetReceived(from, PIByteArray(data, size));
|
||||
packetReceivedEvent(from, PIByteArray(data, size));
|
||||
|
||||
Reference in New Issue
Block a user