Merge pull request #57 from cjkas/fix/full-id-range

fix: give out ids up to the maximum
This commit is contained in:
cjkas 2026-10-17 23:12:31 +02:00 • committed by GitHub
commit 29211630f2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 17 additions and 8 deletions

View file

@ -126,18 +126,18 @@ void writeGroup(JsonFormatter &json, const group_snapshot_t &group, shade_lookup
uint8_t nextRoomId(const model_snapshot_t &snap) { uint8_t nextRoomId(const model_snapshot_t &snap) {
uint8_t ids[SOMFY_MAX_ROOMS]; uint8_t ids[SOMFY_MAX_ROOMS];
for(uint8_t i = 0; i < snap.roomCount; i++) ids[i] = snap.rooms[i].roomId; for(uint8_t i = 0; i < snap.roomCount; i++) ids[i] = snap.rooms[i].roomId;
return firstFreeId(ids, snap.roomCount, SOMFY_MAX_ROOMS - 2); return firstFreeId(ids, snap.roomCount, SOMFY_MAX_ROOMS);
} }
uint8_t nextShadeId(const model_snapshot_t &snap) { uint8_t nextShadeId(const model_snapshot_t &snap) {
uint8_t ids[SOMFY_MAX_SHADES]; uint8_t ids[SOMFY_MAX_SHADES];
for(uint8_t i = 0; i < snap.shadeCount; i++) ids[i] = snap.shades[i].shadeId; for(uint8_t i = 0; i < snap.shadeCount; i++) ids[i] = snap.shades[i].shadeId;
const uint8_t id = firstFreeId(ids, snap.shadeCount, SOMFY_MAX_SHADES - 2); const uint8_t id = firstFreeId(ids, snap.shadeCount, SOMFY_MAX_SHADES);
return id == 0 ? 255 : id; return id == 0 ? 255 : id;
} }
uint8_t nextGroupId(const model_snapshot_t &snap) { uint8_t nextGroupId(const model_snapshot_t &snap) {
uint8_t ids[SOMFY_MAX_GROUPS]; uint8_t ids[SOMFY_MAX_GROUPS];
for(uint8_t i = 0; i < snap.groupCount; i++) ids[i] = snap.groups[i].groupId; for(uint8_t i = 0; i < snap.groupCount; i++) ids[i] = snap.groups[i].groupId;
const uint8_t id = firstFreeId(ids, snap.groupCount, SOMFY_MAX_GROUPS - 2); const uint8_t id = firstFreeId(ids, snap.groupCount, SOMFY_MAX_GROUPS);
return id == 0 ? 255 : id; return id == 0 ? 255 : id;
} }
uint32_t nextRemoteAddress(const model_snapshot_t &snap, uint8_t id) { uint32_t nextRemoteAddress(const model_snapshot_t &snap, uint8_t id) {

View file

@ -151,11 +151,11 @@ void SomfyShadeController::processWaitingFrame() {
if(this->shades[i].getShadeId() != 255) this->shades[i].processWaitingFrame(); if(this->shades[i].getShadeId() != 255) this->shades[i].processWaitingFrame();
} }
// A deleted shade, group or room leaves a gap, so a new one takes the lowest // A deleted shade, group or room leaves a gap, so a new one takes the lowest
// free id. Ids stop two short of the maximum, as they always have. // free id, from 1 up to the maximum.
uint8_t SomfyShadeController::getNextShadeId() { uint8_t SomfyShadeController::getNextShadeId() {
uint8_t ids[SOMFY_MAX_SHADES]; uint8_t ids[SOMFY_MAX_SHADES];
for(uint8_t i = 0; i < SOMFY_MAX_SHADES; i++) ids[i] = this->shades[i].getShadeId(); for(uint8_t i = 0; i < SOMFY_MAX_SHADES; i++) ids[i] = this->shades[i].getShadeId();
const uint8_t id = firstFreeId(ids, SOMFY_MAX_SHADES, SOMFY_MAX_SHADES - 2); const uint8_t id = firstFreeId(ids, SOMFY_MAX_SHADES, SOMFY_MAX_SHADES);
return id == 0 ? 255 : id; return id == 0 ? 255 : id;
} }
int8_t SomfyShadeController::getMaxShadeOrder() { int8_t SomfyShadeController::getMaxShadeOrder() {
@ -175,13 +175,13 @@ int8_t SomfyShadeController::getMaxGroupOrder() {
uint8_t SomfyShadeController::getNextGroupId() { uint8_t SomfyShadeController::getNextGroupId() {
uint8_t ids[SOMFY_MAX_GROUPS]; uint8_t ids[SOMFY_MAX_GROUPS];
for(uint8_t i = 0; i < SOMFY_MAX_GROUPS; i++) ids[i] = this->groups[i].getGroupId(); for(uint8_t i = 0; i < SOMFY_MAX_GROUPS; i++) ids[i] = this->groups[i].getGroupId();
const uint8_t id = firstFreeId(ids, SOMFY_MAX_GROUPS, SOMFY_MAX_GROUPS - 2); const uint8_t id = firstFreeId(ids, SOMFY_MAX_GROUPS, SOMFY_MAX_GROUPS);
return id == 0 ? 255 : id; return id == 0 ? 255 : id;
} }
uint8_t SomfyShadeController::getNextRoomId() { uint8_t SomfyShadeController::getNextRoomId() {
uint8_t ids[SOMFY_MAX_ROOMS]; uint8_t ids[SOMFY_MAX_ROOMS];
for(uint8_t i = 0; i < SOMFY_MAX_ROOMS; i++) ids[i] = this->rooms[i].roomId; for(uint8_t i = 0; i < SOMFY_MAX_ROOMS; i++) ids[i] = this->rooms[i].roomId;
return firstFreeId(ids, SOMFY_MAX_ROOMS, SOMFY_MAX_ROOMS - 2); return firstFreeId(ids, SOMFY_MAX_ROOMS, SOMFY_MAX_ROOMS);
} }
int8_t SomfyShadeController::getMaxRoomOrder() { int8_t SomfyShadeController::getMaxRoomOrder() {
int8_t orders[SOMFY_MAX_ROOMS]; int8_t orders[SOMFY_MAX_ROOMS];

View file

@ -242,9 +242,17 @@ static void test_next_group() {
TEST_ASSERT_EQUAL_STRING("{\"groupId\":1,\"remoteAddress\":78,\"bitLength\":0,\"proto\":0}", TEST_ASSERT_EQUAL_STRING("{\"groupId\":1,\"remoteAddress\":78,\"bitLength\":0,\"proto\":0}",
document(snapshot_doc_t::nextGroup).c_str()); document(snapshot_doc_t::nextGroup).c_str());
} }
static void test_no_room_for_another_shade() { static void test_the_last_ids_are_given_out() {
// Ids used to stop two short: 30 shades where the limit says 32.
snap.shadeCount = 0; snap.shadeCount = 0;
for(uint8_t id = 1; id <= SOMFY_MAX_SHADES - 2; id++) snap.shades[snap.shadeCount++] = shade(id, "S"); for(uint8_t id = 1; id <= SOMFY_MAX_SHADES - 2; id++) snap.shades[snap.shadeCount++] = shade(id, "S");
TEST_ASSERT_EQUAL_UINT8(SOMFY_MAX_SHADES - 1, nextShadeId(snap));
snap.shades[snap.shadeCount++] = shade(SOMFY_MAX_SHADES - 1, "S");
TEST_ASSERT_EQUAL_UINT8(SOMFY_MAX_SHADES, nextShadeId(snap));
}
static void test_no_room_for_another_shade() {
snap.shadeCount = 0;
for(uint8_t id = 1; id <= SOMFY_MAX_SHADES; id++) snap.shades[snap.shadeCount++] = shade(id, "S");
TEST_ASSERT_EQUAL_UINT8(255, nextShadeId(snap)); TEST_ASSERT_EQUAL_UINT8(255, nextShadeId(snap));
} }
static void test_group_options_lists_the_shades_not_in_it() { static void test_group_options_lists_the_shades_not_in_it() {
@ -334,6 +342,7 @@ int main(int argc, char **argv) {
RUN_TEST(test_next_shade); RUN_TEST(test_next_shade);
RUN_TEST(test_next_address_skips_one_already_used); RUN_TEST(test_next_address_skips_one_already_used);
RUN_TEST(test_next_group); RUN_TEST(test_next_group);
RUN_TEST(test_the_last_ids_are_given_out);
RUN_TEST(test_no_room_for_another_shade); RUN_TEST(test_no_room_for_another_shade);
RUN_TEST(test_group_options_lists_the_shades_not_in_it); RUN_TEST(test_group_options_lists_the_shades_not_in_it);
RUN_TEST(test_group_options_of_a_group_gone_by_the_snapshot); RUN_TEST(test_group_options_of_a_group_gone_by_the_snapshot);