PIPacketExtractor теперь работает
This commit is contained in:
@@ -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_);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user