mirror of
https://github.com/intrepidcs/libicsneo.git
synced 2026-08-05 01:18:36 +02:00
Testing the encoder for sending more complex messages
This commit is contained in:
+26
-19
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user