Добавлено нормальное декодирование explicit сообщений
This commit is contained in:
parent
c7efe2a31e
commit
f794fc27ce
@ -69,6 +69,7 @@ int MessageDecoder::getDestMac() const {
|
|||||||
switch (getGroup()) {
|
switch (getGroup()) {
|
||||||
case 3:
|
case 3:
|
||||||
case 1:
|
case 1:
|
||||||
|
// там куча MsgId, но я ебал их в рот
|
||||||
if (msg.dataLen != 0)
|
if (msg.dataLen != 0)
|
||||||
return msg.data[0] & 0x3F;
|
return msg.data[0] & 0x3F;
|
||||||
else
|
else
|
||||||
@ -105,7 +106,7 @@ std::string MessageDecoder::getMessageDescription() const {
|
|||||||
case 0xC: return "Slave I/O Change of state or cyclic message";
|
case 0xC: return "Slave I/O Change of state or cyclic message";
|
||||||
case 0xE: return "Slave I/O Bit-Strobe response message";
|
case 0xE: return "Slave I/O Bit-Strobe response message";
|
||||||
case 0xF: return "Slave I/O Poll response or COS/Cyclic Ack message";
|
case 0xF: return "Slave I/O Poll response or COS/Cyclic Ack message";
|
||||||
default: return "group 2 message";
|
default: return "Group 1 message";
|
||||||
}
|
}
|
||||||
case 2:
|
case 2:
|
||||||
switch (getMsgId()) {
|
switch (getMsgId()) {
|
||||||
@ -127,6 +128,7 @@ std::string MessageDecoder::getMessageDescription() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static std::string buildDataArray(const MessageStruct& msg) {
|
static std::string buildDataArray(const MessageStruct& msg) {
|
||||||
|
if (msg.dataLen == 0) return "{}";
|
||||||
std::string out = "{";
|
std::string out = "{";
|
||||||
for (int i = 0; i < msg.dataLen; i++) {
|
for (int i = 0; i < msg.dataLen; i++) {
|
||||||
char tmp[8];
|
char tmp[8];
|
||||||
@ -142,16 +144,30 @@ static std::string buildDataArray(const MessageStruct& msg) {
|
|||||||
static std::string buildExplicitMessageFrame(const MessageStruct& msg) {
|
static std::string buildExplicitMessageFrame(const MessageStruct& msg) {
|
||||||
if (msg.dataLen == 0) return "empty explicit frame";
|
if (msg.dataLen == 0) return "empty explicit frame";
|
||||||
char buff[256];
|
char buff[256];
|
||||||
sprintf(buff, "{{Frag=%d, XID=%d, MAC=%d}, ",
|
int headerLen;
|
||||||
(msg.data[0] & 0x80) != 0, (msg.data[0] & 0x40) != 0, msg.data[0] & 0x3F);
|
if (msg.data[0] & 0x80) {
|
||||||
|
// Frag=1
|
||||||
|
sprintf(buff, "{{Frag=1, XID=%d, MAC=%d}, {FragType=%d, Fragment count=%d}, {R/R=%d, ServiceCode=%d} Data=",
|
||||||
|
(msg.data[0] & 0x40) != 0, msg.data[0] & 0x3F,
|
||||||
|
(msg.data[1] & 0xC0) >> 6, msg.data[1] & 0x3F,
|
||||||
|
(msg.data[2] & 0x80) != 0, msg.data[2] & 0x7F);
|
||||||
|
headerLen = 3;
|
||||||
|
} else {
|
||||||
|
sprintf(buff, "{{Frag=0, XID=%d, MAC=%d}, {R/R=%d, ServiceCode=%d} Data=",
|
||||||
|
(msg.data[0] & 0x40) != 0, msg.data[0] & 0x3F,
|
||||||
|
(msg.data[1] & 0x80) != 0, msg.data[1] & 0x7F);
|
||||||
|
headerLen = 2;
|
||||||
|
}
|
||||||
|
|
||||||
MessageStruct tmpMsg = msg;
|
MessageStruct tmpMsg = msg;
|
||||||
if (tmpMsg.dataLen >= 1) {
|
if (tmpMsg.dataLen >= headerLen) {
|
||||||
// убираем первый байт, чтобы посылка была
|
// убираем первый байт, чтобы посылка была
|
||||||
tmpMsg.dataLen--;
|
tmpMsg.dataLen -= headerLen;
|
||||||
for (int i = 0; i < tmpMsg.dataLen; i++) {
|
for (int i = 0; i < tmpMsg.dataLen - headerLen; i++) {
|
||||||
tmpMsg.data[i] = tmpMsg.data[i + 1];
|
tmpMsg.data[i] = tmpMsg.data[i + headerLen];
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
return "invalid explicit frame " + buildDataArray(tmpMsg);
|
||||||
}
|
}
|
||||||
return buff + buildDataArray(tmpMsg) + "}";
|
return buff + buildDataArray(tmpMsg) + "}";
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user