Issue 18505 - Darwin: synchronous API part 1: basic structure and serial read (#20519)
diff --git a/src/darwin/Framework/CHIP/MTRDevice.h b/src/darwin/Framework/CHIP/MTRDevice.h
new file mode 100644
index 0000000..5b4bcc9
--- /dev/null
+++ b/src/darwin/Framework/CHIP/MTRDevice.h
@@ -0,0 +1,152 @@
+/**
+ *
+ * Copyright (c) 2022 Project CHIP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import <Foundation/Foundation.h>
+#import <Matter/MTRBaseDevice.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@class MTRDeviceController;
+@class MTRAsyncCallbackWorkQueue;
+
+@protocol MTRDeviceSubscriptionDelegate;
+
+@interface MTRDevice : NSObject
+- (instancetype)init NS_UNAVAILABLE;
++ (instancetype)new NS_UNAVAILABLE;
+
+/**
+ * Directly instantiate a MTRDevice with a MTRDeviceController as a shim.
+ *
+ * All device-specific information would be stored on the device controller, and
+ * retrieved when performing actions using a combination of MTRBaseDevice
+ * and MTRAsyncCallbackQueue.
+ */
++ (instancetype)deviceWithDeviceID:(uint64_t)deviceID deviceController:(MTRDeviceController *)deviceController;
+
+/**
+ * Subscribe to receive attribute reports for everything (all endpoints, all
+ * clusters, all attributes, all events) on the device.
+ *
+ * The subscriber provides a delegate object conforming to MTRDeviceSubscriptionDelegate
+ */
+- (void)subscribeWithDelegate:(id<MTRDeviceSubscriptionDelegate>)delegate
+ queue:(dispatch_queue_t)queue
+ minInterval:(uint16_t)minInterval
+ maxInterval:(uint16_t)maxInterval
+ params:(MTRSubscribeParams * _Nullable)params;
+
+/**
+ * Read attribute in a designated attribute path
+ *
+ * @return a data-value dictionary of the attribute as described in MTRDeviceResponseHandler
+ */
+- (NSDictionary<NSString *, id> *)readAttributeWithEndpointId:(NSNumber * _Nullable)endpointId
+ clusterId:(NSNumber * _Nullable)clusterId
+ attributeId:(NSNumber * _Nullable)attributeId
+ params:(MTRReadParams * _Nullable)params;
+
+/**
+ * Write to attribute in a designated attribute path
+ *
+ * @param value A data-value NSDictionary object as described in
+ * MTRDeviceResponseHandler.
+ *
+ * @param expectedValueIntervalMs interval that the write value is assumed to hold true before actual interaction happens. This
+ * value will be clamped to timeoutMs.
+ *
+ * @param timeoutMs timeout in milliseconds for timed write, or nil.
+ *
+ * Received values are an NSArray object with response-value element as described in
+ * readAttributeWithEndpointId:clusterId:attributeId:clientQueue:completion:.
+ */
+- (void)writeAttributeWithEndpointId:(NSNumber *)endpointId
+ clusterId:(NSNumber *)clusterId
+ attributeId:(NSNumber *)attributeId
+ value:(id)value
+ expectedValueInterval:(NSNumber *)expectedValueIntervalMs
+ timedWriteTimeout:(NSNumber * _Nullable)timeoutMs;
+
+/**
+ * Invoke a command with a designated command path
+ *
+ * @param commandFields command fields object. The object must be a data-value NSDictionary object
+ * as described in the MTRDeviceResponseHandler.
+ * The attribute must be a Structure, i.e.,
+ * the NSDictionary MTRTypeKey key must have the value MTRStructureValueType.
+ *
+ * @param expectedValues array of dictionaries containing the expected values in the same format as
+ * attribute read completion handler. Requires MTRAttributePathKey values.
+ * See MTRDeviceResponseHandler definition for dictionary details.
+ *
+ * @param expectedValueIntervalMs interval that the write value is assumed to hold true before actual interaction happens. This
+ * value will be clamped to timeoutMs.
+ *
+ * @param timeoutMs timeout in milliseconds for timed invoke, or nil.
+ *
+ * @param completion response handler will receive either values or error.
+ */
+- (void)invokeCommandWithEndpointId:(NSNumber *)endpointId
+ clusterId:(NSNumber *)clusterId
+ commandId:(NSNumber *)commandId
+ commandFields:(id)commandFields
+ expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
+ expectedValueInterval:(NSNumber *)expectedValueIntervalMs
+ timedInvokeTimeout:(NSNumber * _Nullable)timeoutMs
+ clientQueue:(dispatch_queue_t)clientQueue
+ completion:(MTRDeviceResponseHandler)completion;
+
+@end
+
+@protocol MTRDeviceSubscriptionDelegate <NSObject>
+@required
+/**
+ * subscriptionEstablished
+ *
+ * Called once the subscription is established. This will
+ * be _after_ the first (priming) call to both report callbacks.
+ */
+- (void)subscriptionEstablished;
+
+/**
+ * subscriptionReceivedAttributeReport:
+ *
+ * Notifies delegate of attribute reports from the MTRDevice
+ *
+ * @param attributeReport An array of response-value objects as described in MTRDeviceResponseHandler
+ */
+- (void)subscriptionReceivedAttributeReport:(NSArray *)attributeReport;
+
+/**
+ * subscriptionReceivedEventReport:
+ *
+ * Notifies delegate of event reports from the MTRDevice
+ *
+ * @param eventReport An array of MTREventReport objects
+ */
+- (void)subscriptionReceivedEventReport:(NSArray *)eventReport;
+
+/**
+ * subscriptionEndedWithError:
+ *
+ * Called any time there is an error for the
+ * entire subscription (with a non-nil "error"), and terminate the subscription
+ */
+- (void)subscriptionEndedWithError:(NSError *)error;
+@end
+
+NS_ASSUME_NONNULL_END