From 987a1e5bc86c2815088c2736e11c8842fe1dd6bd Mon Sep 17 00:00:00 2001 From: Aleksander Nowakowski Date: Thu, 29 Feb 2024 22:54:11 +0100 Subject: [PATCH] Group controls for Light LC Server model --- .../ groups_light_lc_occupancy_mode.png | Bin 0 -> 7441 bytes .../Contents.json | 24 ++ .../Contents.json | 24 ++ .../groups_light_lc_mode.png | Bin 0 -> 7228 bytes .../Source/UI/Base.lproj/Groups.storyboard | 258 +++++++++++++++--- .../Groups/GroupControlViewController.swift | 34 ++- .../Model/LightLCLightOnOffGroupCell.swift | 80 ++++++ .../Groups/Model/LightLCModeGroupCell.swift | 80 ++++++ .../Model/LightLCOccupancyModeGroupCell.swift | 80 ++++++ Example/nRF Mesh.xcodeproj/project.pbxproj | 12 + 10 files changed, 546 insertions(+), 46 deletions(-) create mode 100644 Example/Source/Images.xcassets/ groups_light_lc_occupancy_mode.imageset/ groups_light_lc_occupancy_mode.png create mode 100644 Example/Source/Images.xcassets/ groups_light_lc_occupancy_mode.imageset/Contents.json create mode 100644 Example/Source/Images.xcassets/groups_light_lc_mode.imageset/Contents.json create mode 100644 Example/Source/Images.xcassets/groups_light_lc_mode.imageset/groups_light_lc_mode.png create mode 100644 Example/Source/View Controllers/Groups/Model/LightLCLightOnOffGroupCell.swift create mode 100644 Example/Source/View Controllers/Groups/Model/LightLCModeGroupCell.swift create mode 100644 Example/Source/View Controllers/Groups/Model/LightLCOccupancyModeGroupCell.swift diff --git a/Example/Source/Images.xcassets/ groups_light_lc_occupancy_mode.imageset/ groups_light_lc_occupancy_mode.png b/Example/Source/Images.xcassets/ groups_light_lc_occupancy_mode.imageset/ groups_light_lc_occupancy_mode.png new file mode 100644 index 0000000000000000000000000000000000000000..d14858d8e69be4957b0594315753afb62b91b5c7 GIT binary patch literal 7441 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 JE2Ygt{s++$%2xmY literal 0 HcmV?d00001 diff --git a/Example/Source/Images.xcassets/ groups_light_lc_occupancy_mode.imageset/Contents.json b/Example/Source/Images.xcassets/ groups_light_lc_occupancy_mode.imageset/Contents.json new file mode 100644 index 000000000..94256e4b5 --- /dev/null +++ b/Example/Source/Images.xcassets/ groups_light_lc_occupancy_mode.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : " groups_light_lc_occupancy_mode.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/Example/Source/Images.xcassets/groups_light_lc_mode.imageset/Contents.json b/Example/Source/Images.xcassets/groups_light_lc_mode.imageset/Contents.json new file mode 100644 index 000000000..13586233b --- /dev/null +++ b/Example/Source/Images.xcassets/groups_light_lc_mode.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "groups_light_lc_mode.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/Example/Source/Images.xcassets/groups_light_lc_mode.imageset/groups_light_lc_mode.png b/Example/Source/Images.xcassets/groups_light_lc_mode.imageset/groups_light_lc_mode.png new file mode 100644 index 0000000000000000000000000000000000000000..decc69f4fd35d8b9f8e0e4f5ef78fd43a1f4e778 GIT binary patch literal 7228 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 TEE@d%C#IpMty-mQ{rvv{lB{6g literal 0 HcmV?d00001 diff --git a/Example/Source/UI/Base.lproj/Groups.storyboard b/Example/Source/UI/Base.lproj/Groups.storyboard index 95fe448d1..0d6649895 100644 --- a/Example/Source/UI/Base.lproj/Groups.storyboard +++ b/Example/Source/UI/Base.lproj/Groups.storyboard @@ -1,9 +1,9 @@ - + - + @@ -13,24 +13,24 @@ - + - + - - + + - + diff --git a/Example/Source/View Controllers/Groups/GroupControlViewController.swift b/Example/Source/View Controllers/Groups/GroupControlViewController.swift index 222e8f9e7..8707c8afd 100644 --- a/Example/Source/View Controllers/Groups/GroupControlViewController.swift +++ b/Example/Source/View Controllers/Groups/GroupControlViewController.swift @@ -33,7 +33,7 @@ import NordicMesh private class Section { let applicationKey: ApplicationKey - var items: [(modelId: UInt32, models: [Model])] = [] + var items: [(modelId: UInt32, messageIndex: Int, models: [Model])] = [] init(_ applicationKey: ApplicationKey) { self.applicationKey = applicationKey @@ -71,7 +71,8 @@ class GroupControlViewController: ProgressCollectionViewController { + "- Generic OnOff Server,\n" + "- Generic Level Server,\n" + "- Scene Server,\n" - + "- Scene Setup Server.\n\n" + + "- Scene Setup Server,\n" + + "- Light LC Server.\n\n" + "This limitation only applies to the app,\n" + "not the underlying mesh library.", messageImage: #imageLiteral(resourceName: "baseline-groups")) @@ -89,10 +90,12 @@ class GroupControlViewController: ProgressCollectionViewController { section = Section(key) sections.append(section) } - if let index = section.items.firstIndex(where: { $0.modelId == model.modelId }) { - section.items[index].models.append(model) - } else { - section.items.append((modelId: model.modelId, models: [model])) + for messageIndex in 0.. UICollectionViewCell { let section = sections[indexPath.section] let item = section.items[indexPath.row] - let identifier = String(format: "%08X", item.modelId) + let identifier = String(format: "%08X_%d", item.modelId, item.messageIndex) let cell = collectionView.dequeueReusableCell(withReuseIdentifier: identifier, for: indexPath) as! ModelGroupCell cell.group = group cell.applicationKey = section.applicationKey @@ -242,13 +245,28 @@ extension GroupControlViewController: MeshNetworkDelegate { private extension Model { + // Whether the model has dedicated UI for sending messages. var isSupported: Bool { return modelIdentifier == .genericOnOffServerModelId || modelIdentifier == .genericLevelServerModelId || modelIdentifier == .sceneServerModelId || - modelIdentifier == .sceneSetupServerModelId + modelIdentifier == .sceneSetupServerModelId || + modelIdentifier == .lightLCServerModelId } + // Number of different messages which may be sent to a model + // using dedicated UI. + var messageCount: Int { + guard isSupported else { return 0 } + if modelIdentifier == .lightLCServerModelId { + // Light LC Mode, Light LC Occupancy Mode, Light LC Light OnOff + return 3 + } + return 1 + } + + // The 32-bit Model Identifier, including the Company ID (or 0x0000) + // for Bluetooth SIG assigned models. var modelId: UInt32 { let companyId = isBluetoothSIGAssigned ? 0 : companyIdentifier! return (UInt32(companyId) << 16) | UInt32(modelIdentifier) diff --git a/Example/Source/View Controllers/Groups/Model/LightLCLightOnOffGroupCell.swift b/Example/Source/View Controllers/Groups/Model/LightLCLightOnOffGroupCell.swift new file mode 100644 index 000000000..797e9aadd --- /dev/null +++ b/Example/Source/View Controllers/Groups/Model/LightLCLightOnOffGroupCell.swift @@ -0,0 +1,80 @@ +/* +* Copyright (c) 2019, Nordic Semiconductor +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* +* 1. Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* 2. Redistributions in binary form must reproduce the above copyright notice, this +* list of conditions and the following disclaimer in the documentation and/or +* other materials provided with the distribution. +* +* 3. Neither the name of the copyright holder nor the names of its contributors may +* be used to endorse or promote products derived from this software without +* specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import UIKit +import NordicMesh + +class LightLCLightOnOffGroupCell: ModelGroupCell { + + // MARK: - Outlets and Actions + + @IBOutlet weak var icon: UIImageView! + @IBOutlet weak var title: UILabel! + + @IBOutlet weak var onButton: UIButton! + @IBAction func onTapped(_ sender: UIButton) { + sendLightLCLightOnOffMessage(turnOn: true) + } + @IBOutlet weak var offButton: UIButton! + @IBAction func offTapped(_ sender: UIButton) { + sendLightLCLightOnOffMessage(turnOn: false) + } + + // MARK: - Implementation + + override func reload() { + // On iOS 12.x tinted icons are initially black. + // Forcing adjustment mode fixes the bug. + icon.tintAdjustmentMode = .normal + + let numberOfDevices = models.count + if numberOfDevices == 1 { + title.text = "1 device" + } else { + title.text = "\(numberOfDevices) devices" + } + + let localProvisioner = MeshNetworkManager.instance.meshNetwork?.localProvisioner + let isEnabled = localProvisioner?.hasConfigurationCapabilities ?? false + + onButton.isEnabled = isEnabled + offButton.isEnabled = isEnabled + } +} + +private extension LightLCLightOnOffGroupCell { + + func sendLightLCLightOnOffMessage(turnOn: Bool) { + let label = turnOn ? "Enabling occupancy sensor binging..." : "Disabling occupancy sensor binging..." + delegate?.send(LightLCLightOnOffSetUnacknowledged(turnOn), + description: label, using: applicationKey) + } + +} diff --git a/Example/Source/View Controllers/Groups/Model/LightLCModeGroupCell.swift b/Example/Source/View Controllers/Groups/Model/LightLCModeGroupCell.swift new file mode 100644 index 000000000..afba77974 --- /dev/null +++ b/Example/Source/View Controllers/Groups/Model/LightLCModeGroupCell.swift @@ -0,0 +1,80 @@ +/* +* Copyright (c) 2019, Nordic Semiconductor +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* +* 1. Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* 2. Redistributions in binary form must reproduce the above copyright notice, this +* list of conditions and the following disclaimer in the documentation and/or +* other materials provided with the distribution. +* +* 3. Neither the name of the copyright holder nor the names of its contributors may +* be used to endorse or promote products derived from this software without +* specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import UIKit +import NordicMesh + +class LightLCModeGroupCell: ModelGroupCell { + + // MARK: - Outlets and Actions + + @IBOutlet weak var icon: UIImageView! + @IBOutlet weak var title: UILabel! + + @IBOutlet weak var onButton: UIButton! + @IBAction func onTapped(_ sender: UIButton) { + sendLightLCModeMessage(turnOn: true) + } + @IBOutlet weak var offButton: UIButton! + @IBAction func offTapped(_ sender: UIButton) { + sendLightLCModeMessage(turnOn: false) + } + + // MARK: - Implementation + + override func reload() { + // On iOS 12.x tinted icons are initially black. + // Forcing adjustment mode fixes the bug. + icon.tintAdjustmentMode = .normal + + let numberOfDevices = models.count + if numberOfDevices == 1 { + title.text = "1 device" + } else { + title.text = "\(numberOfDevices) devices" + } + + let localProvisioner = MeshNetworkManager.instance.meshNetwork?.localProvisioner + let isEnabled = localProvisioner?.hasConfigurationCapabilities ?? false + + onButton.isEnabled = isEnabled + offButton.isEnabled = isEnabled + } +} + +private extension LightLCModeGroupCell { + + func sendLightLCModeMessage(turnOn: Bool) { + let label = turnOn ? "Enabling binding..." : "Disabling binding..." + delegate?.send(LightLCModeSetUnacknowledged(turnOn), + description: label, using: applicationKey) + } + +} diff --git a/Example/Source/View Controllers/Groups/Model/LightLCOccupancyModeGroupCell.swift b/Example/Source/View Controllers/Groups/Model/LightLCOccupancyModeGroupCell.swift new file mode 100644 index 000000000..775270b65 --- /dev/null +++ b/Example/Source/View Controllers/Groups/Model/LightLCOccupancyModeGroupCell.swift @@ -0,0 +1,80 @@ +/* +* Copyright (c) 2019, Nordic Semiconductor +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* +* 1. Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* 2. Redistributions in binary form must reproduce the above copyright notice, this +* list of conditions and the following disclaimer in the documentation and/or +* other materials provided with the distribution. +* +* 3. Neither the name of the copyright holder nor the names of its contributors may +* be used to endorse or promote products derived from this software without +* specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import UIKit +import NordicMesh + +class LightLCOccupancyModeGroupCell: ModelGroupCell { + + // MARK: - Outlets and Actions + + @IBOutlet weak var icon: UIImageView! + @IBOutlet weak var title: UILabel! + + @IBOutlet weak var onButton: UIButton! + @IBAction func onTapped(_ sender: UIButton) { + sendLightLCOccupancyModeMessage(turnOn: true) + } + @IBOutlet weak var offButton: UIButton! + @IBAction func offTapped(_ sender: UIButton) { + sendLightLCOccupancyModeMessage(turnOn: false) + } + + // MARK: - Implementation + + override func reload() { + // On iOS 12.x tinted icons are initially black. + // Forcing adjustment mode fixes the bug. + icon.tintAdjustmentMode = .normal + + let numberOfDevices = models.count + if numberOfDevices == 1 { + title.text = "1 device" + } else { + title.text = "\(numberOfDevices) devices" + } + + let localProvisioner = MeshNetworkManager.instance.meshNetwork?.localProvisioner + let isEnabled = localProvisioner?.hasConfigurationCapabilities ?? false + + onButton.isEnabled = isEnabled + offButton.isEnabled = isEnabled + } +} + +private extension LightLCOccupancyModeGroupCell { + + func sendLightLCOccupancyModeMessage(turnOn: Bool) { + let label = turnOn ? "Enabling occupancy sensor binging..." : "Disabling occupancy sensor binging..." + delegate?.send(LightLCOccupancyModeSetUnacknowledged(turnOn), + description: label, using: applicationKey) + } + +} diff --git a/Example/nRF Mesh.xcodeproj/project.pbxproj b/Example/nRF Mesh.xcodeproj/project.pbxproj index 17a3edb65..a93623d4f 100644 --- a/Example/nRF Mesh.xcodeproj/project.pbxproj +++ b/Example/nRF Mesh.xcodeproj/project.pbxproj @@ -171,6 +171,9 @@ A7B526A7277B210000F5C60D /* GenericPowerOnOffSetupViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7B526A5277B210000F5C60D /* GenericPowerOnOffSetupViewCell.swift */; }; A7B526A8277B210000F5C60D /* GenericPowerOnOffSetup.xib in Resources */ = {isa = PBXBuildFile; fileRef = A7B526A6277B210000F5C60D /* GenericPowerOnOffSetup.xib */; }; C5D0E3889048D952B61974DA /* Pods_nRF_Mesh.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 41E003FABAE6DD367FEC93B5 /* Pods_nRF_Mesh.framework */; }; + F03414832B912F95009DD792 /* LightLCModeGroupCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F03414822B912F95009DD792 /* LightLCModeGroupCell.swift */; }; + F03414852B9131BA009DD792 /* LightLCOccupancyModeGroupCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F03414842B9131BA009DD792 /* LightLCOccupancyModeGroupCell.swift */; }; + F03414872B91373E009DD792 /* LightLCLightOnOffGroupCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F03414862B91373E009DD792 /* LightLCLightOnOffGroupCell.swift */; }; F063C01A29C2774300A445A9 /* SelectKeysViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F063C01929C2774300A445A9 /* SelectKeysViewController.swift */; }; F063C01D29C27EAB00A445A9 /* IntroViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F063C01C29C27EAB00A445A9 /* IntroViewController.swift */; }; F085C9FB29C496AB00C2DF89 /* SelectModelsForBindingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F085C9FA29C496AB00C2DF89 /* SelectModelsForBindingViewController.swift */; }; @@ -377,6 +380,9 @@ A7B526A6277B210000F5C60D /* GenericPowerOnOffSetup.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = GenericPowerOnOffSetup.xib; sourceTree = ""; }; C775BBAAAC42952ED786BABF /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; E7CB7DCE18F6E38D2240310F /* nRFMeshProvision.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = nRFMeshProvision.podspec; path = ../nRFMeshProvision.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + F03414822B912F95009DD792 /* LightLCModeGroupCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LightLCModeGroupCell.swift; sourceTree = ""; }; + F03414842B9131BA009DD792 /* LightLCOccupancyModeGroupCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LightLCOccupancyModeGroupCell.swift; sourceTree = ""; }; + F03414862B91373E009DD792 /* LightLCLightOnOffGroupCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LightLCLightOnOffGroupCell.swift; sourceTree = ""; }; F063C01929C2774300A445A9 /* SelectKeysViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectKeysViewController.swift; sourceTree = ""; }; F063C01C29C27EAB00A445A9 /* IntroViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntroViewController.swift; sourceTree = ""; }; F085C9FA29C496AB00C2DF89 /* SelectModelsForBindingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectModelsForBindingViewController.swift; sourceTree = ""; }; @@ -437,6 +443,9 @@ 521215302316C36B0059FB3D /* GenericLevelGroupCell.swift */, 5292F8A6250652BB00EA0F2A /* SceneServerGroupCell.swift */, 5292F8A8250654C600EA0F2A /* SceneSetupServerGroupCell.swift */, + F03414822B912F95009DD792 /* LightLCModeGroupCell.swift */, + F03414842B9131BA009DD792 /* LightLCOccupancyModeGroupCell.swift */, + F03414862B91373E009DD792 /* LightLCLightOnOffGroupCell.swift */, ); path = Model; sourceTree = ""; @@ -1285,11 +1294,13 @@ A7B526A7277B210000F5C60D /* GenericPowerOnOffSetupViewCell.swift in Sources */, F063C01A29C2774300A445A9 /* SelectKeysViewController.swift in Sources */, 5212152D231545D40059FB3D /* ModelGroupCell.swift in Sources */, + F03414852B9131BA009DD792 /* LightLCOccupancyModeGroupCell.swift in Sources */, F09DE4CA29DC68900073969A /* MulticolorProgressView.swift in Sources */, 52A8EA8D24E6A470004C14C7 /* SetHeartbeatPublicationViewController.swift in Sources */, A7A59BD7277225E70045A8ED /* GenericPowerOnOffViewCell.swift in Sources */, F0FB18F72B8E90CF00683C3F /* LightLCViewCell.swift in Sources */, F085CA0829D70ACB00C2DF89 /* ConfigurationViewController.swift in Sources */, + F03414872B91373E009DD792 /* LightLCLightOnOffGroupCell.swift in Sources */, 52547F26232A3F470002AA7B /* ProvisionersViewController.swift in Sources */, 529EC8DA2A309C640056BB48 /* CompanyIdentifier.swift in Sources */, 5267FDCD2A02937E00ECD38B /* CustomConfigCell.swift in Sources */, @@ -1303,6 +1314,7 @@ 5288C20A2371A89900321ED3 /* SimpleOnOffClientDelegate.swift in Sources */, 529B759C2243BA10008F1CE7 /* NetworkKeysViewController.swift in Sources */, 521599D525E91F9300F602FA /* SensorValueCell.swift in Sources */, + F03414832B912F95009DD792 /* LightLCModeGroupCell.swift in Sources */, 52518B3122E0B18400A1FD1E /* GroupsViewController.swift in Sources */, 52A8EA9424EE6D18004C14C7 /* HeartbeatSubscriptionPeriodCell.swift in Sources */, 5283528222806D7C0097B949 /* NetworkKeySelectionViewController.swift in Sources */,