23.06.2014 - PICodeParser, PICodeInfo, PIConnection, new binary "pip_cmg"
This commit is contained in:
@@ -60,13 +60,34 @@
|
||||
REGISTER_DEVICE(PIPacketExtractor);
|
||||
|
||||
|
||||
PIPacketExtractor::PIPacketExtractor(PIIODevice * device_, void * recHeaderPtr, int recHeaderSize, int recDataSize) {
|
||||
ret_func_header = 0;
|
||||
setPacketData(recHeaderPtr, recHeaderSize, recDataSize);
|
||||
PIPacketExtractor::PIPacketExtractor(PIIODevice * device_, PIPacketExtractor::SplitMode mode) {
|
||||
init_();
|
||||
setDevice(device_);
|
||||
setSplitMode(mode);
|
||||
}
|
||||
|
||||
|
||||
void PIPacketExtractor::init_() {
|
||||
ret_func_header = ret_func_footer = 0;
|
||||
setPayloadSize(0);
|
||||
setTimeout(100);
|
||||
setThreadedReadBufferSize(65536);
|
||||
setBufferSize(65536);
|
||||
setDevice(device_);
|
||||
allReaded = addSize = curInd = missed = 0;
|
||||
setDevice(0);
|
||||
setPacketSize(0);
|
||||
setSplitMode(None);
|
||||
allReaded = addSize = curInd = missed = footerInd = 0;
|
||||
header_found = false;
|
||||
}
|
||||
|
||||
|
||||
void PIPacketExtractor::propertyChanged(const PIString &) {
|
||||
packetSize_ = property("packetSize").toInt();
|
||||
mode_ = (SplitMode)(property("splitMode").toInt());
|
||||
dataSize = property("payloadSize").toInt();
|
||||
src_header = property("header").toByteArray();
|
||||
src_footer = property("footer").toByteArray();
|
||||
packetSize_hf = src_header.size_s() + src_footer.size_s() + payloadSize();
|
||||
}
|
||||
|
||||
|
||||
@@ -76,55 +97,181 @@ void PIPacketExtractor::setDevice(PIIODevice * device_) {
|
||||
}
|
||||
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
|
||||
bool PIPacketExtractor::threadedRead(uchar * readed, int size_) {
|
||||
memcpy(buffer.data(allReaded), readed, size_);
|
||||
allReaded += size_;
|
||||
while (allReaded >= packetSize + addSize && allReaded > 0) {
|
||||
if (headerSize > 0) {
|
||||
if (allReaded + curInd >= buffer_size) {
|
||||
memcpy(sbuffer.data(), buffer.data(), buffer_size);
|
||||
memcpy(buffer.data(), sbuffer.data(buffer_size - packetSize), allReaded);
|
||||
allReaded = packetSize;
|
||||
addSize = curInd = 0;
|
||||
//piCout << "readed" << size_;
|
||||
int ss;
|
||||
switch (mode_) {
|
||||
case PIPacketExtractor::None:
|
||||
packetReceived(readed, size_);
|
||||
break;
|
||||
case PIPacketExtractor::Header:
|
||||
tmpbuf.append(readed, size_);
|
||||
ss = src_header.size_s() + dataSize;
|
||||
while (tmpbuf.size_s() >= ss) {
|
||||
while (!validateHeader(src_header.data(), tmpbuf.data(), src_header.size_s())) {
|
||||
tmpbuf.pop_front();
|
||||
++missed;
|
||||
if (tmpbuf.size_s() < ss) return true;
|
||||
}
|
||||
bool brk = false;
|
||||
while (!packetHeaderValidate((uchar * )headerPtr, buffer.data(curInd), headerSize)) {
|
||||
curInd++; missed++;
|
||||
if (packetSize > 0) missed_packets = missed / packetSize;
|
||||
if (curInd > addSize) {
|
||||
addSize += packetSize;
|
||||
brk = true;
|
||||
break;
|
||||
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);
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
if (brk) continue;
|
||||
memcpy(mheader.data(), buffer.data(curInd), headerSize);
|
||||
if (headerPtr != 0) memcpy(headerPtr, buffer.data(curInd), headerSize);
|
||||
if (!packetValidate(buffer.data(curInd + headerSize), dataSize)) {
|
||||
curInd++; missed++;
|
||||
if (packetSize > 0) missed_packets = missed / packetSize;
|
||||
continue;
|
||||
}*/
|
||||
tmpbuf.append(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;
|
||||
}
|
||||
packetReceived(buffer.data(curInd), packetSize);
|
||||
memcpy(sbuffer.data(), buffer.data(), allReaded);
|
||||
memcpy(buffer.data(), sbuffer.data(packetSize + curInd), allReaded);
|
||||
allReaded -= packetSize + curInd;
|
||||
curInd = addSize = 0;
|
||||
} else {
|
||||
if (dataSize == 0) {
|
||||
if (packetValidate(buffer.data(), size_))
|
||||
packetReceived(buffer.data(), size_);
|
||||
memcpy(sbuffer.data(), buffer.data(), allReaded);
|
||||
memcpy(buffer.data(), sbuffer.data(size_), allReaded);
|
||||
allReaded -= size_;
|
||||
while (!validatePayload(tmpbuf.data(), dataSize)) {
|
||||
tmpbuf.pop_front();
|
||||
++missed;
|
||||
if (tmpbuf.size_s() < ss) return true;
|
||||
}
|
||||
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) {
|
||||
if (!header_found) {
|
||||
if (tmpbuf.size_s() < ss) return true;
|
||||
while (!validateHeader(src_header.data(), tmpbuf.data(), src_header.size_s())) {
|
||||
tmpbuf.pop_front();
|
||||
++missed;
|
||||
if (tmpbuf.size_s() < ss) return true;
|
||||
}
|
||||
header_found = true;
|
||||
footerInd = src_header.size_s();
|
||||
} else {
|
||||
if (packetValidate(buffer.data(), dataSize))
|
||||
packetReceived(buffer.data(), dataSize);
|
||||
memcpy(sbuffer.data(), buffer.data(), allReaded);
|
||||
memcpy(buffer.data(), sbuffer.data(packetSize), allReaded);
|
||||
allReaded -= packetSize;
|
||||
if (tmpbuf.size_s() < footerInd + src_footer.size_s()) return true;
|
||||
while (!validateFooter(src_footer.data(), tmpbuf.data(footerInd), src_footer.size_s())) {
|
||||
++footerInd;
|
||||
if (tmpbuf.size_s() < footerInd + src_footer.size_s()) return true;
|
||||
}
|
||||
//piCout << "footer found at" << footerInd;
|
||||
header_found = false;
|
||||
if (!validatePayload(tmpbuf.data(src_header.size_s()), footerInd - src_header.size_s())) {
|
||||
tmpbuf.pop_front();
|
||||
++missed;
|
||||
continue;
|
||||
}
|
||||
packetReceived(tmpbuf.data(), footerInd + src_footer.size_s());
|
||||
tmpbuf.remove(0, footerInd + src_footer.size_s());
|
||||
footerInd = src_header.size_s();
|
||||
}
|
||||
}
|
||||
}
|
||||
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());
|
||||
break;
|
||||
case PIPacketExtractor::Size:
|
||||
tmpbuf.append(readed, size_);
|
||||
if (packetSize_ <= 0) {
|
||||
tmpbuf.clear();
|
||||
return true;
|
||||
}
|
||||
while (tmpbuf.size_s() >= packetSize_) {
|
||||
if (!validatePayload(tmpbuf.data(), packetSize_)) {
|
||||
tmpbuf.pop_front();
|
||||
++missed;
|
||||
missed_packets = missed / packetSize_;
|
||||
continue;
|
||||
}
|
||||
packetReceived(tmpbuf.data(), packetSize_);
|
||||
tmpbuf.remove(0, packetSize_);
|
||||
}
|
||||
break;
|
||||
};
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
PIString PIPacketExtractor::constructFullPath() const {
|
||||
return fullPathPrefix() + "://";
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user