From 268790408681e5e39ed07e39141ea6a7c3aa2155 Mon Sep 17 00:00:00 2001 From: William Date: Fri, 23 Aug 2024 07:46:55 +0100 Subject: [PATCH] Remove DuplicatedAreas error (#35126) * Removed the DuplicatedAreas error from the XML * Generated code after XML update. * The service are server ignores any duplicate values before calling the delegate. Example was updated accodingly. * Updated test SEAR-1.3 following changes to the duplicated areas error. * Restyled by clang-format * Made select areas const. --------- Co-authored-by: Restyled.io --- .../include/rvc-service-area-delegate.h | 4 +- examples/rvc-app/rvc-common/rvc-app.matter | 5 +- .../src/rvc-service-area-delegate.cpp | 63 +++++------- .../service-area-delegate.h | 6 +- .../service-area-server.cpp | 99 ++++++++++--------- .../data-model/chip/service-area-cluster.xml | 5 +- .../data_model/controller-clusters.matter | 5 +- .../python/chip/clusters/Objects.py | 7 +- .../CHIP/zap-generated/MTRBaseClusters.h | 5 +- src/python_testing/TC_SEAR_1_3.py | 26 ++--- .../zap-generated/cluster-enums-check.h | 1 - .../app-common/zap-generated/cluster-enums.h | 7 +- 12 files changed, 108 insertions(+), 125 deletions(-) diff --git a/examples/rvc-app/rvc-common/include/rvc-service-area-delegate.h b/examples/rvc-app/rvc-common/include/rvc-service-area-delegate.h index c6be8aa5bb55f0..a87d345cb506ba 100644 --- a/examples/rvc-app/rvc-common/include/rvc-service-area-delegate.h +++ b/examples/rvc-app/rvc-common/include/rvc-service-area-delegate.h @@ -79,8 +79,8 @@ class RvcServiceAreaDelegate : public Delegate // command support bool IsSetSelectedAreasAllowed(MutableCharSpan & statusText) override; - bool IsValidSelectAreasSet(const ServiceArea::Commands::SelectAreas::DecodableType & req, - ServiceArea::SelectAreasStatus & areaStatus, MutableCharSpan & statusText) override; + bool IsValidSelectAreasSet(const Span & selectedAreas, ServiceArea::SelectAreasStatus & areaStatus, + MutableCharSpan & statusText) override; bool HandleSkipArea(uint32_t skippedArea, MutableCharSpan & skipStatusText) override; diff --git a/examples/rvc-app/rvc-common/rvc-app.matter b/examples/rvc-app/rvc-common/rvc-app.matter index 29460e1f43c7a1..ee4d751919be22 100644 --- a/examples/rvc-app/rvc-common/rvc-app.matter +++ b/examples/rvc-app/rvc-common/rvc-app.matter @@ -1438,9 +1438,8 @@ provisional cluster ServiceArea = 336 { enum SelectAreasStatus : enum8 { kSuccess = 0; kUnsupportedArea = 1; - kDuplicatedAreas = 2; - kInvalidInMode = 3; - kInvalidSet = 4; + kInvalidInMode = 2; + kInvalidSet = 3; } enum SkipAreaStatus : enum8 { diff --git a/examples/rvc-app/rvc-common/src/rvc-service-area-delegate.cpp b/examples/rvc-app/rvc-common/src/rvc-service-area-delegate.cpp index 9041efd3d9105b..2f2594e17d7686 100644 --- a/examples/rvc-app/rvc-common/src/rvc-service-area-delegate.cpp +++ b/examples/rvc-app/rvc-common/src/rvc-service-area-delegate.cpp @@ -113,23 +113,12 @@ bool RvcServiceAreaDelegate::IsSetSelectedAreasAllowed(MutableCharSpan & statusT return (mIsSetSelectedAreasAllowedDeviceInstance->*mIsSetSelectedAreasAllowedCallback)(statusText); }; -bool RvcServiceAreaDelegate::IsValidSelectAreasSet(const Commands::SelectAreas::DecodableType & req, SelectAreasStatus & areaStatus, +bool RvcServiceAreaDelegate::IsValidSelectAreasSet(const Span & selectedAreas, SelectAreasStatus & areaStatus, MutableCharSpan & statusText) { - // if req is empty list return true. + if (selectedAreas.empty()) { - size_t reqSize; - if (req.newAreas.ComputeSize(&reqSize) != CHIP_NO_ERROR) - { - areaStatus = SelectAreasStatus::kInvalidSet; // todo Not sure this is the correct error to use here - CopyCharSpanToMutableCharSpan("error computing number of selected areas"_span, statusText); - return false; - } - - if (reqSize == 0) - { - return true; - } + return true; } // If there is 1 or 0 supported maps, any combination of areas is valid. @@ -139,42 +128,34 @@ bool RvcServiceAreaDelegate::IsValidSelectAreasSet(const Commands::SelectAreas:: } // Check that all the requested areas are in the same map. - auto newAreasIter = req.newAreas.begin(); - newAreasIter.Next(); - - AreaStructureWrapper tempArea; - uint32_t ignoredIndex; - if (!GetSupportedAreaById(newAreasIter.GetValue(), ignoredIndex, tempArea)) { - areaStatus = SelectAreasStatus::kUnsupportedArea; - CopyCharSpanToMutableCharSpan("unable to find selected area in supported areas"_span, statusText); - return false; - } - - auto mapId = tempArea.mapID.Value(); // It is safe to call `.Value()` as we confirmed that there are at least 2 maps. - - while (newAreasIter.Next()) - { - if (!GetSupportedAreaById(newAreasIter.GetValue(), ignoredIndex, tempArea)) + AreaStructureWrapper tempArea; + uint32_t ignoredIndex; + if (!GetSupportedAreaById(selectedAreas[0], ignoredIndex, tempArea)) { areaStatus = SelectAreasStatus::kUnsupportedArea; CopyCharSpanToMutableCharSpan("unable to find selected area in supported areas"_span, statusText); return false; } - if (tempArea.mapID.Value() != mapId) + auto mapId = tempArea.mapID.Value(); // It is safe to call `.Value()` as we confirmed that there are at least 2 maps. + + for (const auto & areaId : selectedAreas.SubSpan(1)) { - areaStatus = SelectAreasStatus::kInvalidSet; - CopyCharSpanToMutableCharSpan("all selected areas must be in the same map"_span, statusText); - return false; - } - } + if (!GetSupportedAreaById(areaId, ignoredIndex, tempArea)) + { + areaStatus = SelectAreasStatus::kUnsupportedArea; + CopyCharSpanToMutableCharSpan("unable to find selected area in supported areas"_span, statusText); + return false; + } - if (CHIP_NO_ERROR != newAreasIter.GetStatus()) - { - areaStatus = SelectAreasStatus::kInvalidSet; - CopyCharSpanToMutableCharSpan("error processing new areas."_span, statusText); - return false; + if (tempArea.mapID.Value() != mapId) + { + areaStatus = SelectAreasStatus::kInvalidSet; + CopyCharSpanToMutableCharSpan("all selected areas must be in the same map"_span, statusText); + return false; + } + } } return true; diff --git a/src/app/clusters/service-area-server/service-area-delegate.h b/src/app/clusters/service-area-server/service-area-delegate.h index 2e9422840aa847..7fe40bb8fe16f4 100644 --- a/src/app/clusters/service-area-server/service-area-delegate.h +++ b/src/app/clusters/service-area-server/service-area-delegate.h @@ -80,10 +80,10 @@ class Delegate * If the set of locations is invalid, the locationStatus should be set to InvalidSet and * the statusText SHALL include a vendor-defined error description. * - * The caller of this method will ensure that there are no duplicates is the list + * The caller of this method will ensure that there are no duplicates in the list * and that all the locations in the set are valid supported locations. * - * @param[in] req List of new selected locations. + * @param[in] selectedAreas List of new selected locations. * @param[out] locationStatus Success if all checks pass, error code if failure. * @param[out] statusText text describing failure (see description above), size kMaxSizeStatusText. * @return true if success. @@ -91,7 +91,7 @@ class Delegate * @note If the SelectAreas command is allowed when the device is operating and the selected locations change to none, the * device must stop. */ - virtual bool IsValidSelectAreasSet(const Commands::SelectAreas::DecodableType & req, SelectAreasStatus & locationStatus, + virtual bool IsValidSelectAreasSet(const Span & selectedAreas, SelectAreasStatus & locationStatus, MutableCharSpan & statusText) = 0; /** diff --git a/src/app/clusters/service-area-server/service-area-server.cpp b/src/app/clusters/service-area-server/service-area-server.cpp index 2f2efceddd903d..4de8f942e0251d 100644 --- a/src/app/clusters/service-area-server/service-area-server.cpp +++ b/src/app/clusters/service-area-server/service-area-server.cpp @@ -240,64 +240,72 @@ void Instance::HandleSelectAreasCmd(HandlerContext & ctx, const Commands::Select } } + uint32_t selectedAreasBuffer[kMaxNumSelectedAreas]; + auto selectedAreasSpan = Span(selectedAreasBuffer, kMaxNumSelectedAreas); + uint32_t numberOfSelectedAreas = 0; + + // Closure for checking if an area ID exists in the selectedAreasSpan + auto areaAlreadyExists = [&numberOfSelectedAreas, &selectedAreasSpan](uint32_t areaId) { + for (uint32_t i = 0; i < numberOfSelectedAreas; i++) + { + if (areaId == selectedAreasSpan[i]) + { + return true; + } + } + return false; + }; + // if number of selected locations in parameter matches number in attribute - the locations *might* be the same bool matchesCurrentSelectedAreas = (numberOfAreas == mDelegate->GetNumberOfSelectedAreas()); + // do as much parameter validation as we can if (numberOfAreas != 0) { - // do as much parameter validation as we can + uint32_t ignoredIndex = 0; + uint32_t oldSelectedArea; + auto iAreaIter = req.newAreas.begin(); + while (iAreaIter.Next()) { - uint32_t ignoredIndex = 0; - uint32_t oldSelectedArea; - uint32_t i = 0; - auto iAreaIter = req.newAreas.begin(); - while (iAreaIter.Next()) - { - uint32_t aSelectedArea = iAreaIter.GetValue(); + uint32_t selectedArea = iAreaIter.GetValue(); - // each item in this list SHALL match the AreaID field of an entry on the SupportedAreas attribute's list - // If the Status field is set to UnsupportedArea, the StatusText field SHALL be an empty string. - if (!IsSupportedArea(aSelectedArea)) - { - exitResponse(SelectAreasStatus::kUnsupportedArea, ""_span); - return; - } + // If aSelectedArea is already in selectedAreasSpan skip + if (areaAlreadyExists(selectedArea)) + { + continue; + } - // Checking for duplicate locations. - uint32_t j = 0; - auto jAreaIter = req.newAreas.begin(); - while (j < i) - { - jAreaIter.Next(); // Since j < i and i is valid, we can safely call Next() without checking the return value. - if (jAreaIter.GetValue() == aSelectedArea) - { - exitResponse(SelectAreasStatus::kDuplicatedAreas, ""_span); - return; - } - j += 1; - } + // each item in this list SHALL match the AreaID field of an entry on the SupportedAreas attribute's list + // If the Status field is set to UnsupportedArea, the StatusText field SHALL be an empty string. + if (!IsSupportedArea(selectedArea)) + { + exitResponse(SelectAreasStatus::kUnsupportedArea, ""_span); + return; + } - // check to see if parameter list and attribute still match - if (matchesCurrentSelectedAreas) + // check to see if parameter list and attribute still match + if (matchesCurrentSelectedAreas) + { + if (!mDelegate->GetSelectedAreaByIndex(ignoredIndex, oldSelectedArea) || (selectedArea != oldSelectedArea)) { - if (!mDelegate->GetSelectedAreaByIndex(ignoredIndex, oldSelectedArea) || (aSelectedArea != oldSelectedArea)) - { - matchesCurrentSelectedAreas = false; - } + matchesCurrentSelectedAreas = false; } - - i += 1; } - // after iterating with Next through DecodableType - check for failure - if (CHIP_NO_ERROR != iAreaIter.GetStatus()) - { - ctx.mCommandHandler.AddStatus(ctx.mRequestPath, Status::InvalidCommand); - return; - } + selectedAreasSpan[numberOfSelectedAreas] = selectedArea; + numberOfSelectedAreas += 1; + } + + // after iterating with Next through DecodableType - check for failure + if (CHIP_NO_ERROR != iAreaIter.GetStatus()) + { + ctx.mCommandHandler.AddStatus(ctx.mRequestPath, Status::InvalidCommand); + return; } } + selectedAreasSpan.reduce_size(numberOfSelectedAreas); + // If the newAreas field is the same as the value of the SelectedAreas attribute // the SelectAreasResponse command SHALL have the Status field set to Success and // the StatusText field MAY be supplied with a human-readable string or include an empty string. @@ -327,7 +335,7 @@ void Instance::HandleSelectAreasCmd(HandlerContext & ctx, const Commands::Select // ask the device to handle SelectAreas Command // (note - locationStatusText to be filled out by delegated function for kInvalidInMode and InvalidSet) auto locationStatus = SelectAreasStatus::kSuccess; - if (!mDelegate->IsValidSelectAreasSet(req, locationStatus, delegateStatusText)) + if (!mDelegate->IsValidSelectAreasSet(selectedAreasSpan, locationStatus, delegateStatusText)) { exitResponse(locationStatus, delegateStatusText); return; @@ -342,11 +350,10 @@ void Instance::HandleSelectAreasCmd(HandlerContext & ctx, const Commands::Select if (numberOfAreas != 0) { - auto locationIter = req.newAreas.begin(); uint32_t ignored; - while (locationIter.Next()) + for (uint32_t areaId : selectedAreasSpan) { - mDelegate->AddSelectedArea(locationIter.GetValue(), ignored); + mDelegate->AddSelectedArea(areaId, ignored); } } diff --git a/src/app/zap-templates/zcl/data-model/chip/service-area-cluster.xml b/src/app/zap-templates/zcl/data-model/chip/service-area-cluster.xml index e4457c3745e2a7..8c2ba832c85604 100644 --- a/src/app/zap-templates/zcl/data-model/chip/service-area-cluster.xml +++ b/src/app/zap-templates/zcl/data-model/chip/service-area-cluster.xml @@ -63,9 +63,8 @@ limitations under the License. - - - + + diff --git a/src/controller/data_model/controller-clusters.matter b/src/controller/data_model/controller-clusters.matter index ede6f1117ed37f..1413833c1b14c7 100644 --- a/src/controller/data_model/controller-clusters.matter +++ b/src/controller/data_model/controller-clusters.matter @@ -6463,9 +6463,8 @@ provisional cluster ServiceArea = 336 { enum SelectAreasStatus : enum8 { kSuccess = 0; kUnsupportedArea = 1; - kDuplicatedAreas = 2; - kInvalidInMode = 3; - kInvalidSet = 4; + kInvalidInMode = 2; + kInvalidSet = 3; } enum SkipAreaStatus : enum8 { diff --git a/src/controller/python/chip/clusters/Objects.py b/src/controller/python/chip/clusters/Objects.py index 391765f3838e7b..9808b113f234b7 100644 --- a/src/controller/python/chip/clusters/Objects.py +++ b/src/controller/python/chip/clusters/Objects.py @@ -31358,14 +31358,13 @@ class OperationalStatusEnum(MatterIntEnum): class SelectAreasStatus(MatterIntEnum): kSuccess = 0x00 kUnsupportedArea = 0x01 - kDuplicatedAreas = 0x02 - kInvalidInMode = 0x03 - kInvalidSet = 0x04 + kInvalidInMode = 0x02 + kInvalidSet = 0x03 # All received enum values that are not listed above will be mapped # to kUnknownEnumValue. This is a helper enum value that should only # be used by code to process how it handles receiving an unknown # enum value. This specific value should never be transmitted. - kUnknownEnumValue = 5, + kUnknownEnumValue = 4, class SkipAreaStatus(MatterIntEnum): kSuccess = 0x00 diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h index c00233470f81d6..f15337ff56f41c 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h +++ b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h @@ -19787,9 +19787,8 @@ typedef NS_ENUM(uint8_t, MTRServiceAreaOperationalStatus) { typedef NS_ENUM(uint8_t, MTRServiceAreaSelectAreasStatus) { MTRServiceAreaSelectAreasStatusSuccess MTR_PROVISIONALLY_AVAILABLE = 0x00, MTRServiceAreaSelectAreasStatusUnsupportedArea MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRServiceAreaSelectAreasStatusDuplicatedAreas MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRServiceAreaSelectAreasStatusInvalidInMode MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTRServiceAreaSelectAreasStatusInvalidSet MTR_PROVISIONALLY_AVAILABLE = 0x04, + MTRServiceAreaSelectAreasStatusInvalidInMode MTR_PROVISIONALLY_AVAILABLE = 0x02, + MTRServiceAreaSelectAreasStatusInvalidSet MTR_PROVISIONALLY_AVAILABLE = 0x03, } MTR_PROVISIONALLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRServiceAreaSkipAreaStatus) { diff --git a/src/python_testing/TC_SEAR_1_3.py b/src/python_testing/TC_SEAR_1_3.py index 2ea2e86b7d198d..867cdcbe234353 100644 --- a/src/python_testing/TC_SEAR_1_3.py +++ b/src/python_testing/TC_SEAR_1_3.py @@ -109,15 +109,17 @@ async def test_TC_SEAR_1_3(self): duplicated_areas = [valid_area_id, valid_area_id] - # FIXME need to check if this is the correct name of this status code - await self.send_cmd_select_areas_expect_response(step=3, new_areas=duplicated_areas, expected_response=Clusters.ServiceArea.Enums.SelectAreasStatus.kDuplicatedAreas) + await self.send_cmd_select_areas_expect_response(step=3, new_areas=duplicated_areas, expected_response=Clusters.ServiceArea.Enums.SelectAreasStatus.kSuccess) - await self.send_cmd_select_areas_expect_response(step=4, new_areas=[], expected_response=Clusters.ServiceArea.Enums.SelectAreasStatus.kSuccess) + selected_areas = await self.read_selected_areas(step=4) + asserts.assert_true(selected_areas == [valid_area_id], "SelectedAreas should be empty") - selected_areas = await self.read_selected_areas(step=5) + await self.send_cmd_select_areas_expect_response(step=5, new_areas=[], expected_response=Clusters.ServiceArea.Enums.SelectAreasStatus.kSuccess) + + selected_areas = await self.read_selected_areas(step=6) asserts.assert_true(len(selected_areas) == 0, "SelectedAreas should be empty") - await self.send_cmd_select_areas_expect_response(step=6, new_areas=[invalid_area_id], expected_response=Clusters.ServiceArea.Enums.SelectAreasStatus.kUnsupportedArea) + await self.send_cmd_select_areas_expect_response(step=8, new_areas=[invalid_area_id], expected_response=Clusters.ServiceArea.Enums.SelectAreasStatus.kUnsupportedArea) if self.check_pics("SEAR.S.M.INVALID_STATE_FOR_SELECT_AREAS") and self.check_pics("SEAR.S.M.HAS_MANUAL_SELAREA_STATE_CONTROL"): test_step = "Manually intervene to put the device in a state that prevents it from executing the SelectAreas command" @@ -127,7 +129,7 @@ async def test_TC_SEAR_1_3(self): else: self.wait_for_user_input(prompt_msg=f"{test_step}, and press Enter when done.\n") - await self.send_cmd_select_areas_expect_response(step=8, new_areas=[valid_area_id], expected_response=Clusters.ServiceArea.Enums.SelectAreasStatus.kInvalidInMode) + await self.send_cmd_select_areas_expect_response(step=10, new_areas=[valid_area_id], expected_response=Clusters.ServiceArea.Enums.SelectAreasStatus.kInvalidInMode) if self.check_pics("SEAR.S.M.VALID_STATE_FOR_SELECT_AREAS") and self.check_pics("SEAR.S.M.HAS_MANUAL_SELAREA_STATE_CONTROL"): test_step = f"Manually intervene to put the device in a state that allows it to execute the SelectAreas({supported_area_ids}) command" @@ -137,17 +139,17 @@ async def test_TC_SEAR_1_3(self): else: self.wait_for_user_input(prompt_msg=f"{test_step}, and press Enter when done.\n") - await self.send_cmd_select_areas_expect_response(step=10, new_areas=supported_area_ids, expected_response=Clusters.ServiceArea.Enums.SelectAreasStatus.kSuccess) + await self.send_cmd_select_areas_expect_response(step=11, new_areas=supported_area_ids, expected_response=Clusters.ServiceArea.Enums.SelectAreasStatus.kSuccess) - selected_areas = await self.read_selected_areas(step=11) + selected_areas = await self.read_selected_areas(step=12) asserts.assert_true(len(selected_areas) == len(supported_area_ids), f"SelectedAreas({selected_areas}) should match SupportedAreas({supported_area_ids})") - await self.send_cmd_select_areas_expect_response(step=12, new_areas=supported_area_ids, expected_response=Clusters.ServiceArea.Enums.SelectAreasStatus.kSuccess) + await self.send_cmd_select_areas_expect_response(step=13, new_areas=supported_area_ids, expected_response=Clusters.ServiceArea.Enums.SelectAreasStatus.kSuccess) if self.check_pics("SEAR.S.M.VALID_STATE_FOR_SELECT_AREAS") and self.check_pics("SEAR.S.M.HAS_MANUAL_SELAREA_STATE_CONTROL") and self.check_pics("SEAR.S.M.SELECT_AREAS_WHILE_NON_IDLE"): test_step = f"Manually intervene to put the device in a state that allows it to execute the SelectAreas({valid_area_id}) command, and put the device in a non-idle state" - self.print_step("13", test_step) + self.print_step("14", test_step) if self.is_ci: self.write_to_app_pipe('{"Name": "Reset"}') await self.send_single_cmd(cmd=Clusters.Objects.RvcRunMode.Commands.ChangeToMode(newMode=1), endpoint=self.endpoint) @@ -155,9 +157,9 @@ async def test_TC_SEAR_1_3(self): self.wait_for_user_input(prompt_msg=f"{test_step}, and press Enter when done.\n") if self.check_pics("SEAR.S.F00"): - await self.send_cmd_select_areas_expect_response(step=14, new_areas=[valid_area_id], expected_response=Clusters.ServiceArea.Enums.SelectAreasStatus.kSuccess) + await self.send_cmd_select_areas_expect_response(step=15, new_areas=[valid_area_id], expected_response=Clusters.ServiceArea.Enums.SelectAreasStatus.kSuccess) else: - await self.send_cmd_select_areas_expect_response(step=14, new_areas=[valid_area_id], expected_response=Clusters.ServiceArea.Enums.SelectAreasStatus.kInvalidInMode) + await self.send_cmd_select_areas_expect_response(step=15, new_areas=[valid_area_id], expected_response=Clusters.ServiceArea.Enums.SelectAreasStatus.kInvalidInMode) if __name__ == "__main__": diff --git a/zzz_generated/app-common/app-common/zap-generated/cluster-enums-check.h b/zzz_generated/app-common/app-common/zap-generated/cluster-enums-check.h index f63782c221d827..90d399b8e6fde7 100644 --- a/zzz_generated/app-common/app-common/zap-generated/cluster-enums-check.h +++ b/zzz_generated/app-common/app-common/zap-generated/cluster-enums-check.h @@ -2598,7 +2598,6 @@ static auto __attribute__((unused)) EnsureKnownEnumValue(ServiceArea::SelectArea { case EnumType::kSuccess: case EnumType::kUnsupportedArea: - case EnumType::kDuplicatedAreas: case EnumType::kInvalidInMode: case EnumType::kInvalidSet: return val; diff --git a/zzz_generated/app-common/app-common/zap-generated/cluster-enums.h b/zzz_generated/app-common/app-common/zap-generated/cluster-enums.h index e78f8f4d064648..998a3c931b42b1 100644 --- a/zzz_generated/app-common/app-common/zap-generated/cluster-enums.h +++ b/zzz_generated/app-common/app-common/zap-generated/cluster-enums.h @@ -3825,14 +3825,13 @@ enum class SelectAreasStatus : uint8_t { kSuccess = 0x00, kUnsupportedArea = 0x01, - kDuplicatedAreas = 0x02, - kInvalidInMode = 0x03, - kInvalidSet = 0x04, + kInvalidInMode = 0x02, + kInvalidSet = 0x03, // All received enum values that are not listed above will be mapped // to kUnknownEnumValue. This is a helper enum value that should only // be used by code to process how it handles receiving and unknown // enum value. This specific should never be transmitted. - kUnknownEnumValue = 5, + kUnknownEnumValue = 4, }; // Enum for SkipAreaStatus