PIPacketExtractor теперь работает

This commit is contained in:
Бычков Андрей
2022-07-28 17:02:33 +03:00
parent 16c12a2756
commit 38fd1b5dc4
5 changed files with 81 additions and 95 deletions

View File

@@ -97,26 +97,23 @@ void PIPacketExtractor::construct() {
setPayloadSize(0);
setTimeout(100);
#ifdef MICRO_PIP
setBufferSize(512);
setThreadedReadBufferSize(512);
#else
setBufferSize(65536);
setThreadedReadBufferSize(65536);
#endif
setDevice(0);
setPacketSize(0);
setDevice(nullptr);
setSplitMode(None);
missed = missed_packets = footerInd = 0;
missed = footerInd = 0;
header_found = false;
}
void PIPacketExtractor::propertyChanged(const char *) {
packetSize_ = property("packetSize").toInt();
mode_ = (SplitMode)(property("splitMode").toInt());
dataSize = property("payloadSize").toInt();
src_header = property("header").toByteArray();
src_footer = property("footer").toByteArray();
time_ = property("timeout").toDouble();
packetSize_hf = src_header.size_s() + src_footer.size_s() + payloadSize();
}
@@ -143,32 +140,21 @@ ssize_t PIPacketExtractor::bytesAvailable() const {
}
void PIPacketExtractor::setBufferSize(int new_size) {
buffer_size = new_size;
buffer.resize(buffer_size);
memset(buffer.data(), 0, buffer.size());
setThreadedReadBufferSize(new_size);
}
void PIPacketExtractor::setPayloadSize(int size) {
setProperty("payloadSize", size);
dataSize = size;
packetSize_hf = src_header.size_s() + src_footer.size_s() + payloadSize();
}
void PIPacketExtractor::setHeader(const PIByteArray & data) {
setProperty("header", data);
src_header = data;
packetSize_hf = src_header.size_s() + src_footer.size_s() + payloadSize();
}
void PIPacketExtractor::setFooter(const PIByteArray & data) {
setProperty("footer", data);
src_footer = data;
packetSize_hf = src_header.size_s() + src_footer.size_s() + payloadSize();
}
@@ -199,69 +185,76 @@ bool PIPacketExtractor::validatePayload(const uchar * rec, int size) {
bool PIPacketExtractor::threadedRead(const uchar * readed, int size_) {
//piCoutObj << "readed" << size_;
int ss;
tmpbuf.append(readed, size_);
switch (mode_) {
case PIPacketExtractor::None:
tmpbuf.clear();
if (validatePayload(readed, size_)) {
packetReceived(readed, size_);
} else {
missed += size_;
}
break;
case PIPacketExtractor::Header:
tmpbuf.append(readed, size_);
ss = src_header.size_s();
while (tmpbuf.size_s() >= ss) {
int ns = validateHeader(src_header.data(), tmpbuf.data(), src_header.size_s());
while (ns < 0) {
if (src_header.isEmpty()) return PIIODevice::threadedRead(readed, size_);
while (tmpbuf.size() >= src_header.size()) {
if (!header_found) {
packetSize_pending = validateHeader(src_header.data(), tmpbuf.data(), src_header.size_s());
while (packetSize_pending < 0) {
tmpbuf.pop_front();
++missed;
if (tmpbuf.size() < src_header.size()) return PIIODevice::threadedRead(readed, size_);
packetSize_pending = validateHeader(src_header.data(), tmpbuf.data(), src_header.size_s());
}
header_found = true;
}
if (tmpbuf.size_s() < src_header.size_s() + packetSize_pending) return PIIODevice::threadedRead(readed, size_);
if (!validatePayload(tmpbuf.data(src_header.size_s()), packetSize_pending)) {
tmpbuf.pop_front();
++missed;
if (tmpbuf.size() < src_header.size()) return true;
ns = validateHeader(src_header.data(), tmpbuf.data(), src_header.size_s());
header_found = false;
continue;
}
ss = src_header.size_s() + ns;
while (!validatePayload(tmpbuf.data(src_header.size_s()), dataSize)) {
tmpbuf.pop_front();
++missed;
if (tmpbuf.size_s() < ss) return true;
}
packetReceived(tmpbuf.data(), ss);
tmpbuf.remove(0, ss);
packetReceived(tmpbuf.data(), src_header.size_s() + packetSize_pending);
tmpbuf.remove(0, src_header.size_s() + packetSize_pending);
header_found = false;
}
break;
case PIPacketExtractor::Footer:
tmpbuf.append(readed, size_);
if (src_footer.isEmpty()) return PIIODevice::threadedRead(readed, size_);
ss = src_footer.size_s() + dataSize;
while (tmpbuf.size_s() >= ss) {
while (!validateFooter(src_footer.data(), tmpbuf.data(dataSize), src_footer.size_s())) {
tmpbuf.pop_front();
++missed;
if (tmpbuf.size_s() < ss) return true;
if (tmpbuf.size_s() < ss) return PIIODevice::threadedRead(readed, size_);
}
while (!validatePayload(tmpbuf.data(), dataSize)) {
if (!validatePayload(tmpbuf.data(), dataSize)) {
tmpbuf.pop_front();
++missed;
if (tmpbuf.size_s() < ss) return true;
continue;
}
packetReceived(tmpbuf.data(), ss);
tmpbuf.remove(0, ss);
}
break;
case PIPacketExtractor::HeaderAndFooter:
tmpbuf.append(readed, size_);
ss = src_header.size_s() + src_footer.size_s();
while (tmpbuf.size_s() >= ss) {
while (tmpbuf.size_s() >= ss && ss > 0) {
if (!header_found) {
if (tmpbuf.size_s() < ss) return true;
if (tmpbuf.size_s() < ss) return PIIODevice::threadedRead(readed, size_);
while (validateHeader(src_header.data(), tmpbuf.data(), src_header.size_s()) < 0) {
tmpbuf.pop_front();
++missed;
if (tmpbuf.size_s() < ss) return true;
if (tmpbuf.size_s() < ss) return PIIODevice::threadedRead(readed, size_);
}
header_found = true;
footerInd = src_header.size_s();
} else {
if (tmpbuf.size_s() < footerInd + src_footer.size_s()) return true;
if (tmpbuf.size_s() < footerInd + src_footer.size_s()) return PIIODevice::threadedRead(readed, size_);
while (!validateFooter(src_footer.data(), tmpbuf.data(footerInd), src_footer.size_s())) {
++footerInd;
if (tmpbuf.size_s() < footerInd + src_footer.size_s()) return true;
if (tmpbuf.size_s() < footerInd + src_footer.size_s()) return PIIODevice::threadedRead(readed, size_);
}
//piCout << "footer found at" << footerInd;
header_found = false;
@@ -277,31 +270,28 @@ bool PIPacketExtractor::threadedRead(const uchar * readed, int size_) {
}
break;
case PIPacketExtractor::Size:
tmpbuf.append(readed, size_);
if (packetSize_ <= 0) {
if (dataSize <= 0) {
tmpbuf.clear();
return true;
return PIIODevice::threadedRead(readed, size_);
}
while (tmpbuf.size_s() >= packetSize_) {
if (!validatePayload(tmpbuf.data(), packetSize_)) {
while (tmpbuf.size_s() >= dataSize) {
if (!validatePayload(tmpbuf.data(), dataSize)) {
tmpbuf.pop_front();
++missed;
missed_packets = missed / packetSize_;
continue;
}
packetReceived(tmpbuf.data(), packetSize_);
tmpbuf.remove(0, packetSize_);
packetReceived(tmpbuf.data(), dataSize);
tmpbuf.remove(0, dataSize);
}
break;
case PIPacketExtractor::Timeout:
memcpy(buffer.data(), readed, size_);
trbuf = dev->readForTime(time_);
memcpy(buffer.data(size_), trbuf.data(), trbuf.size());
if (size_ + trbuf.size() > 0)
packetReceived(buffer.data(), size_ + trbuf.size());
tmpbuf.append(dev->readForTime(time_));
if (tmpbuf.size() > 0) {
packetReceived(tmpbuf.data(), tmpbuf.size());
}
break;
};
return true;
return PIIODevice::threadedRead(readed, size_);
}