Skip to content

Commit

Permalink
Simplify _write_row_packet by precomputing header and lengths and mak…
Browse files Browse the repository at this point in the history
…e it static
  • Loading branch information
mathieucarbou committed Jun 3, 2024
1 parent a079df4 commit 5c56eff
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 36 deletions.
65 changes: 30 additions & 35 deletions src/WebSerial.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,24 @@ typedef enum {
static const uint8_t WSL_PONG[] = {WSL_MAGIC_BYTE_1, WSL_MAGIC_BYTE_2, WSLPacketType::WSL_PONG};
static const size_t WSL_PONG_LEN = sizeof(WSL_PONG) / sizeof(WSL_PONG[0]);

static const uint8_t WSL_HEAD[] = {
WSL_MAGIC_BYTE_1, // Magic Bytes
WSL_MAGIC_BYTE_2, // Magic Bytes
WSLPacketType::WSL_WRITE_ROW, // Packet Type (1 byte)
0x00, // Reserved
0x00, // Reserved
0x00, // Reserved
0x00, // Reserved
0x00, // Padding
0x00, // Padding
0x00, // Padding
0x00, // Padding
0x00 // Reserved
};
static const size_t WSL_HEAD_LEN = sizeof(WSL_HEAD) / sizeof(WSL_HEAD[0]);

static const size_t WSL_MSG_SIZE_LEN = sizeof(uint16_t);

void WebSerialClass::setAuthentication(const String& username, const String& password){
_username = username;
_password = password;
Expand Down Expand Up @@ -141,40 +159,6 @@ bool WebSerialClass::_has_enough_space(size_t size) {
return (_buffer_offset + WSL_CALC_LOG_PACKET_SIZE(size) > WSL_BUFFER_SIZE);
}

size_t WebSerialClass::_write_row_packet(__unused uint64_t reserved1, __unused uint8_t reserved2, const uint8_t *payload, const size_t payload_size) {
size_t header_size = 0;

// Write Magic Bytes
_buffer[_buffer_offset + header_size++] = WSL_MAGIC_BYTE_1;
_buffer[_buffer_offset + header_size++] = WSL_MAGIC_BYTE_2;

// Packet Type (1 byte)
_buffer[_buffer_offset + header_size++] = WSLPacketType::WSL_WRITE_ROW;

// Reserved (8 bytes)
_buffer[_buffer_offset + header_size++] = 0x00;
_buffer[_buffer_offset + header_size++] = 0x00;
_buffer[_buffer_offset + header_size++] = 0x00;
_buffer[_buffer_offset + header_size++] = 0x00;
_buffer[_buffer_offset + header_size++] = 0x00;
_buffer[_buffer_offset + header_size++] = 0x00;
_buffer[_buffer_offset + header_size++] = 0x00;
_buffer[_buffer_offset + header_size++] = 0x00;

// Reserved (1 byte)
_buffer[_buffer_offset + header_size++] = 0x00;

// Message Length (2 bytes)
memset(_buffer + _buffer_offset + header_size, (uint16_t)payload_size, sizeof((uint16_t)payload_size));
header_size += sizeof((uint16_t)payload_size);

// Set Message
memcpy(_buffer + _buffer_offset + header_size, payload, payload_size);

// Return total packet size
return header_size + payload_size;
}

size_t WebSerialClass::_write_row(uint8_t *data, size_t len) {
// Split the logData into multiple packets
size_t remaining_size = len;
Expand All @@ -195,7 +179,7 @@ size_t WebSerialClass::_write_row(uint8_t *data, size_t len) {
_buffer_mutex = true;

// Write Packet to Buffer
_buffer_offset += _write_row_packet(0, 0, current_ptr, packet_size);
_buffer_offset += _write_row_packet(_buffer, current_ptr, packet_size);

// Unlock Mutex
_buffer_mutex = false;
Expand Down Expand Up @@ -262,4 +246,15 @@ void WebSerialClass::loop() {
}
}

size_t WebSerialClass::_write_row_packet(uint8_t* dest, const uint8_t *payload, const size_t payload_size) {
// Write header
memmove(dest, WSL_HEAD, WSL_HEAD_LEN);
// Message Length (2 bytes)
memset(dest + WSL_HEAD_LEN, static_cast<uint16_t>(payload_size), WSL_MSG_SIZE_LEN);
// Set Message
memmove(dest + WSL_HEAD_LEN + WSL_MSG_SIZE_LEN, payload, payload_size);
// Return total packet size
return WSL_HEAD_LEN + WSL_MSG_SIZE_LEN + payload_size;
}

WebSerialClass WebSerial;
3 changes: 2 additions & 1 deletion src/WebSerial.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,10 +118,11 @@ class WebSerialClass : public Print {
bool _has_enough_space(size_t size);
size_t _start_row();
size_t _write_row(uint8_t *data, size_t len);
size_t _write_row_packet(uint64_t reserved1, uint8_t reserved2, const uint8_t *payload, const size_t payload_size);
size_t _end_row();
void _flush_print_buffer();
void _flush_global_buffer();

static size_t _write_row_packet(uint8_t* dest, const uint8_t *payload, const size_t payload_size);
};

extern WebSerialClass WebSerial;
Expand Down

0 comments on commit 5c56eff

Please sign in to comment.