Enable filling buffer with packets that use fields

This commit is contained in:
2024-01-02 21:05:00 +11:00
parent e57e55775a
commit c6b6ec65c9
2 changed files with 87 additions and 69 deletions

View File

@@ -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

View File

@@ -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;
}