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:
Бычков Андрей
2022-07-26 17:18:08 +03:00
parent a4882dc054
commit d13e68c206
36 changed files with 615 additions and 623 deletions

View File

@@ -91,7 +91,9 @@ PIPacketExtractor::PIPacketExtractor(PIIODevice * device_, PIPacketExtractor::Sp
void PIPacketExtractor::construct() {
ret_func_header = ret_func_footer = 0;
func_header = nullptr;
func_footer = nullptr;
func_payload = nullptr;
setPayloadSize(0);
setTimeout(100);
#ifdef MICRO_PIP
@@ -113,13 +115,25 @@ void PIPacketExtractor::propertyChanged(const char *) {
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();
}
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_) {
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_;
int ss;
switch (mode_) {
case PIPacketExtractor::None:
if (validatePayload(readed, size_))
if (validatePayload(readed, size_)) {
packetReceived(readed, size_);
break;
}
break;
case PIPacketExtractor::Header:
tmpbuf.append(readed, size_);
ss = src_header.size_s() + dataSize;
ss = src_header.size_s();
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();
++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)) {
tmpbuf.pop_front();
++missed;
@@ -179,56 +221,6 @@ bool PIPacketExtractor::threadedRead(uchar * readed, int size_) {
}
break;
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_);
ss = src_footer.size_s() + dataSize;
while (tmpbuf.size_s() >= ss) {
@@ -252,7 +244,7 @@ bool PIPacketExtractor::threadedRead(uchar * readed, int size_) {
while (tmpbuf.size_s() >= ss) {
if (!header_found) {
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();
++missed;
if (tmpbuf.size_s() < ss) return true;
@@ -310,3 +302,21 @@ bool PIPacketExtractor::threadedRead(uchar * readed, int size_) {
PIString PIPacketExtractor::constructFullPathDevice() const {
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;
}