11//
2- // Copyright (c) 2024 PADL Software Pty Ltd
2+ // Copyright (c) 2024-2026 PADL Software Pty Ltd
33//
44// Licensed under the Apache License, Version 2.0 (the License);
55// you may not use this file except in compliance with the License.
@@ -28,7 +28,16 @@ open class OcaGroup<Member: OcaRoot>: OcaAgent {
2828 override open class var classID : OcaClassID { OcaClassID ( " 1.2.22 " ) }
2929 override open class var classVersion : OcaClassVersionNumber { 3 }
3030
31- public private( set) var members = [ Member] ( )
31+ @OcaDeviceProperty (
32+ propertyID: OcaPropertyID ( " 3.1 " )
33+ )
34+ public var members : OcaList < Member > = [ ]
35+
36+ @OcaDeviceProperty (
37+ propertyID: OcaPropertyID ( " 3.2 " ) ,
38+ getMethodID: OcaMethodID ( " 3.5 " )
39+ )
40+ public var groupController : OcaONo = OcaInvalidONo
3241
3342 @OcaDeviceProperty (
3443 propertyID: OcaPropertyID ( " 3.3 " ) ,
@@ -83,11 +92,11 @@ open class OcaGroup<Member: OcaRoot>: OcaAgent {
8392 from controller: any OcaController
8493 ) async throws -> Ocp1Response {
8594 switch command. methodID {
86- case OcaMethodID ( " 3.1 " ) :
95+ case OcaMethodID ( " 3.1 " ) : // GetMembers
8796 try decodeNullCommand ( command)
8897 try await ensureReadable ( by: controller, command: command)
8998 return try encodeResponse ( members. map ( \. objectNumber) )
90- case OcaMethodID ( " 3.2 " ) :
99+ case OcaMethodID ( " 3.2 " ) : // SetMembers
91100 let memberONos : [ OcaONo ] = try decodeCommand ( command)
92101 let members = try await memberONos. asyncMap { @Sendable memberONo in
93102 guard let member = await deviceDelegate?
@@ -100,7 +109,7 @@ open class OcaGroup<Member: OcaRoot>: OcaAgent {
100109 try await ensureWritable ( by: controller, command: command)
101110 try await set ( members: members)
102111 return Ocp1Response ( )
103- case OcaMethodID ( " 3.3 " ) :
112+ case OcaMethodID ( " 3.3 " ) : // AddMember
104113 let memberONo : OcaONo = try decodeCommand ( command)
105114 guard let member = await deviceDelegate? . resolve ( objectNumber: memberONo) as? Member
106115 else {
@@ -109,7 +118,7 @@ open class OcaGroup<Member: OcaRoot>: OcaAgent {
109118 try await ensureWritable ( by: controller, command: command)
110119 try await add ( member: member)
111120 return Ocp1Response ( )
112- case OcaMethodID ( " 3.4 " ) :
121+ case OcaMethodID ( " 3.4 " ) : // DeleteMember
113122 let memberONo : OcaONo = try decodeCommand ( command)
114123 guard let member = await deviceDelegate? . resolve ( objectNumber: memberONo) as? Member
115124 else {
@@ -118,6 +127,10 @@ open class OcaGroup<Member: OcaRoot>: OcaAgent {
118127 try await ensureWritable ( by: controller, command: command)
119128 try await delete ( member: member)
120129 return Ocp1Response ( )
130+ case OcaMethodID ( " 3.5 " ) : // GroupControllerONo
131+ try decodeNullCommand ( command)
132+ try await ensureReadable ( by: controller, command: command)
133+ return try encodeResponse ( groupController)
121134 default :
122135 return try await super. handleCommand ( command, from: controller)
123136 }
@@ -199,28 +212,10 @@ open class _OcaPeerToPeerGroup<Member: OcaGroupPeerToPeerMember>: OcaGroup<Membe
199212 member. group = nil
200213 try await super. delete ( member: member)
201214 }
202-
203- override open func handleCommand(
204- _ command: Ocp1Command ,
205- from controller: any OcaController
206- ) async throws -> Ocp1Response {
207- switch command. methodID {
208- case OcaMethodID ( " 3.5 " ) :
209- try decodeNullCommand ( command)
210- try await ensureReadable ( by: controller, command: command)
211- return try encodeResponse ( OcaInvalidONo)
212- case OcaMethodID ( " 3.6 " ) :
213- let _: OcaONo = try decodeCommand ( command)
214- try await ensureWritable ( by: controller, command: command)
215- throw Ocp1Error . status ( . invalidRequest)
216- default :
217- return try await super. handleCommand ( command, from: controller)
218- }
219- }
220215}
221216
222217open class _OcaGroupControllerGroup < Member: OcaRoot > : OcaGroup < Member > {
223- private var groupController : GroupController ?
218+ private var _groupController : GroupController ?
224219
225220 public init (
226221 objectNumber: OcaONo ? = nil ,
@@ -237,31 +232,14 @@ open class _OcaGroupControllerGroup<Member: OcaRoot>: OcaGroup<Member> {
237232 addToRootBlock: addToRootBlock
238233 )
239234
240- groupController = try await GroupController ( self )
235+ _groupController = try await GroupController ( self )
236+ groupController = _groupController!. objectNumber
241237 }
242238
243239 public required init ( from decoder: Decoder ) throws {
244240 throw Ocp1Error . notImplemented
245241 }
246242
247- override open func handleCommand(
248- _ command: Ocp1Command ,
249- from controller: any OcaController
250- ) async throws -> Ocp1Response {
251- switch command. methodID {
252- case OcaMethodID ( " 3.5 " ) :
253- try decodeNullCommand ( command)
254- try await ensureReadable ( by: controller, command: command)
255- return try encodeResponse ( groupController? . objectNumber ?? OcaInvalidONo)
256- case OcaMethodID ( " 3.6 " ) :
257- let _: OcaONo = try decodeCommand ( command)
258- try await ensureWritable ( by: controller, command: command)
259- throw Ocp1Error . status ( . notImplemented)
260- default :
261- return try await super. handleCommand ( command, from: controller)
262- }
263- }
264-
265243 @OcaDevice
266244 public class GroupController : OcaRoot {
267245 weak var group : _OcaGroupControllerGroup ?
0 commit comments