mirror of
https://github.com/BotChain-Robots/firmware.git
synced 2026-07-08 17:47:21 +02:00
Reliability fixes for wired comms
This commit is contained in:
@@ -151,7 +151,14 @@ esp_err_t DataLinkManager::complete_fragment(uint16_t board_id, uint16_t sequenc
|
||||
if (metadata.num_fragments_rx != metadata.fragments.size()){
|
||||
return ESP_ERR_INVALID_STATE;
|
||||
}
|
||||
uint16_t total_data_len = metadata.num_fragments_rx * MAX_GENERIC_DATA_LEN; //max data size with n fragments
|
||||
// Compute the exact total size from actual fragment data lengths, not the
|
||||
// theoretical maximum (num_fragments * MAX_GENERIC_DATA_LEN). The last fragment
|
||||
// is almost always shorter, so over-allocating would leave garbage bytes at the
|
||||
// end that consumers reading combined_data->size() would see.
|
||||
uint16_t total_data_len = 0;
|
||||
for (size_t i = 0; i < metadata.num_fragments_rx; i++){
|
||||
total_data_len += metadata.fragments[i].data_len;
|
||||
}
|
||||
xSemaphoreGive(rx_fragment_mutex[channel]);
|
||||
|
||||
auto combined_data = std::make_unique<std::vector<uint8_t>>();
|
||||
@@ -181,6 +188,7 @@ esp_err_t DataLinkManager::complete_fragment(uint16_t board_id, uint16_t sequenc
|
||||
memcpy(&combined_data->data()[prev_index], metadata.fragments[i].data, metadata.fragments[i].data_len);
|
||||
prev_index += metadata.fragments[i].data_len;
|
||||
}
|
||||
combined_data->resize(prev_index); // ensure vector size == actual data (no garbage tail bytes)
|
||||
|
||||
xSemaphoreGive(rx_fragment_mutex[channel]);
|
||||
|
||||
|
||||
@@ -175,9 +175,10 @@ esp_err_t DataLinkManager::rip_find_entry(uint8_t board_id, RIPRow** entry, bool
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Returns the associated RIP Table row by row number. Information returned is read only.
|
||||
* @brief Returns a snapshot of the RIP table row by row number. Information returned is a safe copy taken under the lock.
|
||||
*
|
||||
* @param entry
|
||||
* @param entry Pointer to a caller-owned RIPRow that will be filled with a snapshot of the table row.
|
||||
* The caller must NOT hold or release the internal row semaphore; it is managed here.
|
||||
* @param row_num
|
||||
* @return esp_err_t
|
||||
*/
|
||||
@@ -207,7 +208,12 @@ esp_err_t DataLinkManager::rip_get_row(RIPRow** entry, uint8_t row_num){
|
||||
}
|
||||
}
|
||||
|
||||
*entry = &rip_table[row_num];
|
||||
static RIPRow row_snapshots[RIP_MAX_ROUTES];
|
||||
row_snapshots[row_num].info = rip_table[row_num].info;
|
||||
row_snapshots[row_num].channel = rip_table[row_num].channel;
|
||||
row_snapshots[row_num].ttl = rip_table[row_num].ttl;
|
||||
row_snapshots[row_num].valid = rip_table[row_num].valid;
|
||||
*entry = &row_snapshots[row_num];
|
||||
|
||||
xSemaphoreGive(rip_table[row_num].row_sem);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user