Testing the encoder for sending more complex messages

This commit is contained in:
Paul Hollinsky
2018-10-03 14:33:30 -04:00
parent 590a99d995
commit dffae23e54
13 changed files with 78 additions and 37 deletions
+26 -19
View File
@@ -2,7 +2,8 @@
using namespace icsneo;
std::shared_ptr<Message> Encoder::encode(const std::shared_ptr<Message>& message) {
std::vector<uint8_t> Encoder::encode(const std::shared_ptr<Message>& message) {
bool shortFormat = false;
switch(message->network.getType()) {
// case Network::Type::CAN: {
// if(message->data.size() < 24)
@@ -24,34 +25,40 @@ std::shared_ptr<Message> Encoder::encode(const std::shared_ptr<Message>& message
default:
switch(message->network.getNetID()) {
case Network::NetID::Main51:
if(message->data.size() > 0xF) {
message->network = Network::NetID::RED_OLDFORMAT;
message->data.insert(message->data.begin(), 0x10 | (uint8_t)Network::NetID::Main51);
return encode(message);
}
message->data.insert(message->data.begin(), (message->data.size() << 4) | (uint8_t)Network::NetID::Main51);
data.in
if(message->data.size() <= 0xF)
shortFormat = true;
break;
case Network::NetID::RED_OLDFORMAT: {
// See the decoder for an explanation
uint16_t length = message->data[0] | (message->data[1] << 8);
message->network = Network(message->data[2] & 0xF);
message->data.erase(message->data.begin(), message->data.begin() + 3);
if(message->data.size() != length)
message->data.resize(length);
return decodePacket(message);
// We expect the network byte to be populated already in data, but not the length
uint16_t length = message->data.size() - 1;
message->data.insert(message->data.begin(), {(uint8_t)length, (uint8_t)(length >> 8)});
}
default:
break;
}
break;
}
auto msg = std::make_shared<Message>();
msg->network = message->network;
msg->data = message->data;
return msg;
if(shortFormat) {
message->data.insert(message->data.begin(), (message->data.size() << 4) | (uint8_t)message->network.getNetID());
} else {
// Size in long format is the size of the entire packet
// So +1 for AA header, +1 for short format header, +2 for long format size, and +2 for long format NetID
uint16_t size = message->data.size() + 1 + 1 + 2 + 2;
message->data.insert(message->data.begin(), {
(uint8_t)Network::NetID::RED, // 0x0C for long message
(uint8_t)size, // Size, little endian 16-bit
(uint8_t)(size >> 8),
(uint8_t)message->network.getNetID(), // NetID, little endian 16-bit
(uint8_t)(uint16_t(message->network.getNetID()) >> 8)
});
}
return packetizer->packetWrap(message->data, shortFormat);
}
std::vector<uint8_t> Encoder::encode(Command cmd, std::vector<uint8_t> arguments = {}) {
std::vector<uint8_t> Encoder::encode(Command cmd, std::vector<uint8_t> arguments) {
auto msg = std::make_shared<Message>();
msg->network = Network::NetID::Main51;
msg->data.resize(arguments.size() + 1);