fix: skip the room records too when a restore leaves the shades out

A restore without "shades" skipped the shade and group records but not
the room records, which come first, so it read the repeaters and the
settings from room data. The skip is now shadeModelBytes(), in a
ConfigHeader.h the native tests can reach, which counts rooms, shades
and groups. Found during LOOP_QUEUE_PLAN.md's review.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
cjkas 2026-10-17 22:53:18 +02:00
parent bee6a6d60b
commit 50aa491437
4 changed files with 91 additions and 20 deletions

33
src/ConfigHeader.h Normal file
View file

@ -0,0 +1,33 @@
#ifndef CONFIG_HEADER_H
#define CONFIG_HEADER_H
#include <stdint.h>
// The header of a shades.cfg file: its version and how many records of each
// kind follow, and their sizes. Kept free of the file system so it can be
// unit tested on the PC (pio test -e native).
struct config_header_t {
uint8_t version = 1;
uint8_t repeaterRecords = 0;
uint8_t repeaterRecordSize = 0;
uint8_t roomRecords = 0;
uint16_t roomRecordSize = 0;
uint16_t shadeRecordSize = 0;
uint8_t shadeRecords = 0;
uint16_t groupRecordSize = 0;
uint8_t groupRecords = 0;
uint16_t settingsRecordSize = 0;
uint16_t netRecordSize = 0;
uint16_t transRecordSize = 0;
char serverId[10] = ""; // This must match the server id size in the ConfigSettings.
int8_t length = 0;
};
// The bytes of the shade model's records, which follow the header in this
// order: rooms, shades, groups. A restore that leaves the shades out skips
// this many bytes.
inline uint32_t shadeModelBytes(const config_header_t &header) {
return static_cast<uint32_t>(header.roomRecords) * header.roomRecordSize
+ static_cast<uint32_t>(header.shadeRecords) * header.shadeRecordSize
+ static_cast<uint32_t>(header.groupRecords) * header.groupRecordSize;
}
#endif