Enable filling buffer with packets that use fields
This commit is contained in:
@@ -25,11 +25,11 @@ private:
|
|||||||
void setDestinationAddress(uint8_t *buffer, uint16_t);
|
void setDestinationAddress(uint8_t *buffer, uint16_t);
|
||||||
void setRollingCodes(uint8_t *buffer);
|
void setRollingCodes(uint8_t *buffer);
|
||||||
void setProtocolVersion(uint8_t *buffer, uint8_t);
|
void setProtocolVersion(uint8_t *buffer, uint8_t);
|
||||||
void setOpenPacketData(uint8_t *buffer);
|
void setFieldsData(uint8_t *buffer, const FieldsParameters& parameters);
|
||||||
void setClosePacketData(uint8_t *buffer);
|
|
||||||
void setStopPacketData(uint8_t *buffer);
|
|
||||||
void calculateCRC(uint8_t *buffer);
|
void calculateCRC(uint8_t *buffer);
|
||||||
void incrementRollingCodes();
|
void incrementRollingCodes();
|
||||||
|
uint8_t calculateTotalFieldSize(const FieldsParameters& parameters);
|
||||||
|
uint8_t calculateFieldSize(const Field& field);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // BUFFERFILLER_H
|
#endif // BUFFERFILLER_H
|
||||||
@@ -12,19 +12,6 @@ BufferFiller::~BufferFiller()
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool BufferFiller::fill(uint8_t *buffer, const Packet* packet) {
|
bool BufferFiller::fill(uint8_t *buffer, const Packet* packet) {
|
||||||
uint8_t packetSize = 0;
|
|
||||||
switch(packet->type) {
|
|
||||||
case PacketType::STOP:
|
|
||||||
case PacketType::OPEN:
|
|
||||||
case PacketType::CLOSE:
|
|
||||||
packetSize = 0x11;
|
|
||||||
break;
|
|
||||||
// TODO: Calculate fields length in buffer
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
setPacketSize(buffer, packetSize);
|
|
||||||
setConstants(buffer);
|
setConstants(buffer);
|
||||||
setProtocolVersion(buffer, protocolVersion);
|
setProtocolVersion(buffer, protocolVersion);
|
||||||
setSourceAddress(buffer, packet->source);
|
setSourceAddress(buffer, packet->source);
|
||||||
@@ -32,14 +19,41 @@ bool BufferFiller::fill(uint8_t *buffer, const Packet* packet) {
|
|||||||
|
|
||||||
switch(packet->type) {
|
switch(packet->type) {
|
||||||
case PacketType::STOP:
|
case PacketType::STOP:
|
||||||
setStopPacketData(buffer);
|
setPacketSize(buffer, 0x11);
|
||||||
|
buffer[16] = 0x52;
|
||||||
|
buffer[17] = 0x53;
|
||||||
|
buffer[18] = 0x00;
|
||||||
break;
|
break;
|
||||||
case PacketType::CLOSE:
|
case PacketType::CLOSE:
|
||||||
setClosePacketData(buffer);
|
setPacketSize(buffer, 0x11);
|
||||||
|
buffer[16] = 0x52;
|
||||||
|
buffer[17] = 0x44;
|
||||||
|
buffer[18] = 0x00;
|
||||||
break;
|
break;
|
||||||
case PacketType::OPEN:
|
case PacketType::OPEN:
|
||||||
setOpenPacketData(buffer);
|
setPacketSize(buffer, 0x11);
|
||||||
|
buffer[16] = 0x52;
|
||||||
|
buffer[17] = 0x55;
|
||||||
|
buffer[18] = 0x00;
|
||||||
break;
|
break;
|
||||||
|
case PacketType::FIELDS: {
|
||||||
|
FieldsParameters parameters = std::get<FieldsParameters>(packet->parameters);
|
||||||
|
// 0x10 is the number of bytes without any fields
|
||||||
|
setPacketSize(buffer, 0x10 + calculateTotalFieldSize(parameters));
|
||||||
|
buffer[16] = 0x21;
|
||||||
|
buffer[17] = 0x5A;
|
||||||
|
setFieldsData(buffer, parameters);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case PacketType::FIELD_COMMAND: {
|
||||||
|
FieldsParameters parameters = std::get<FieldsParameters>(packet->parameters);
|
||||||
|
// 0x10 is the number of bytes without any fields
|
||||||
|
setPacketSize(buffer, 0x10 + calculateTotalFieldSize(parameters));
|
||||||
|
buffer[16] = 0x3F;
|
||||||
|
buffer[17] = 0x5A;
|
||||||
|
setFieldsData(buffer, std::get<FieldsParameters>(packet->parameters));
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -52,57 +66,40 @@ bool BufferFiller::fill(uint8_t *buffer, const Packet* packet) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void BufferFiller::setOpenPacketData(uint8_t *buffer)
|
void BufferFiller::setFieldsData(uint8_t *buffer, const FieldsParameters& parameters) {
|
||||||
{
|
uint8_t offset = 18;
|
||||||
buffer[16] = 0x52;
|
|
||||||
buffer[17] = 0x55;
|
|
||||||
buffer[18] = 0x00;
|
|
||||||
}
|
|
||||||
|
|
||||||
void BufferFiller::setClosePacketData(uint8_t *buffer)
|
for (size_t i = 0; i < parameters.fields.size(); i++) {
|
||||||
{
|
Field field = parameters.fields[i];
|
||||||
buffer[16] = 0x52;
|
uint8_t fieldSize = calculateFieldSize(field);
|
||||||
buffer[17] = 0x44;
|
buffer[offset] = fieldSize - 1; // Minus 1 because the length byte isn't counted
|
||||||
buffer[18] = 0x00;
|
switch(field.type) {
|
||||||
}
|
case FieldType::SET:
|
||||||
|
buffer[offset + 1] = 0x40;
|
||||||
|
break;
|
||||||
void BufferFiller::setStopPacketData(uint8_t *buffer)
|
case FieldType::FETCH:
|
||||||
{
|
buffer[offset + 1] = 0x3F;
|
||||||
buffer[16] = 0x52;
|
break;
|
||||||
buffer[17] = 0x53;
|
case FieldType::VALUE:
|
||||||
buffer[18] = 0x00;
|
buffer[offset + 1] = 0x21;
|
||||||
}
|
break;
|
||||||
|
default:
|
||||||
/*
|
// TODO: Return false?
|
||||||
void BufferFiller::setPositionCommand(uint8_t *buffer, float percentage)
|
break;
|
||||||
{
|
|
||||||
// packetSize = 0x15;
|
|
||||||
|
|
||||||
buffer[16] = 0x3F; // Field command
|
|
||||||
buffer[17] = 0x5A; // Constant
|
|
||||||
|
|
||||||
buffer[18] = 0x04; // Field of 4 bytes
|
|
||||||
buffer[19] = 0x40; // Field type (0x40 is set)
|
|
||||||
buffer[20] = 0x50; // ID of position field
|
|
||||||
|
|
||||||
uint16_t position = (uint16_t)(0xFFFF * percentage);
|
|
||||||
|
|
||||||
buffer[21] = (uint8_t)(position & 0x00FF);
|
|
||||||
buffer[22] = (uint8_t)((position & 0xFF00) >> 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
void BufferFiller::setFetchPositionCommand(uint8_t *buffer) {
|
|
||||||
// packetSize = 0x13;
|
|
||||||
|
|
||||||
buffer[16] = 0x3F; // Field command
|
|
||||||
buffer[17] = 0x5A; // Constant
|
|
||||||
|
|
||||||
buffer[18] = 0x02; // Field of 2 bytes
|
|
||||||
buffer[19] = 0x3F; // Field type (0x3F is fetch)
|
|
||||||
buffer[20] = 0x50; // ID of position field
|
|
||||||
}
|
}
|
||||||
*/
|
buffer[offset + 2] = field.identifier;
|
||||||
|
if(field.hasValue) {
|
||||||
|
if (std::holds_alternative<uint8_t>(field.value)) {
|
||||||
|
buffer[offset + 3] = std::get<uint8_t>(field.value);
|
||||||
|
} else if (std::holds_alternative<uint16_t>(field.value)) {
|
||||||
|
uint16_t value = std::get<uint16_t>(field.value);
|
||||||
|
buffer[offset + 3] = (uint8_t)(value & 0x00FF);
|
||||||
|
buffer[offset + 4] = (uint8_t)((value & 0xFF00) >> 8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
offset += fieldSize;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void BufferFiller::setPacketSize(uint8_t *buffer, uint8_t length) {
|
void BufferFiller::setPacketSize(uint8_t *buffer, uint8_t length) {
|
||||||
buffer[1] = length; // Packet size
|
buffer[1] = length; // Packet size
|
||||||
@@ -160,3 +157,24 @@ void BufferFiller::incrementRollingCodes() {
|
|||||||
rollingCode1++;
|
rollingCode1++;
|
||||||
rollingCode2++;
|
rollingCode2++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t BufferFiller::calculateTotalFieldSize(const FieldsParameters& parameters) {
|
||||||
|
uint8_t totalSize = 0;
|
||||||
|
for (size_t i = 0; i < parameters.fields.size(); i++) {
|
||||||
|
Field field = parameters.fields[i];
|
||||||
|
totalSize += calculateFieldSize(field);
|
||||||
|
}
|
||||||
|
return totalSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t BufferFiller::calculateFieldSize(const Field& field) {
|
||||||
|
uint8_t fieldSize = 3; // Length byte + field type byte + identifier byte
|
||||||
|
if (field.hasValue) {
|
||||||
|
if (std::holds_alternative<uint8_t>(field.value)) {
|
||||||
|
fieldSize += 1;
|
||||||
|
} else if (std::holds_alternative<uint16_t>(field.value)) {
|
||||||
|
fieldSize += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return fieldSize;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user