From 55887600ad17a2b512fc537e247940947519b592 Mon Sep 17 00:00:00 2001 From: Lukas Zeller Date: Fri, 27 Jan 2023 08:00:47 +0100 Subject: [PATCH] chip_data_model.gni: add option for custom-implemented clusters (#22042) * chip_data_model.gni: add option for custom-implemented clusters Add `zap_clusters_with_custom_implementation` option to `chip_data_model()` template, which allows to list clusters that need to be available in a device, but don't use the standard implementation in `src/app/clusters//.cpp`. # Usage To exclude a particular cluster's standard implementation in favor of an application level implementation: - in the BUILD.gn file for the application specific `.zap` file - in the instantiation of the `chip_data_model` template - add a variable `zap_clusters_with_custom_implementation` - assign it a list of strings with cluster names, corresponding to directories in the `src/app/clusters` directory. - this causes the cluster implementation file(s) not to be included in the build, allowing re-implementation at the application level. Example, excluding standard implementation of level-control: ``` chip_data_model("zap") { zap_file = "myproject.zap" zap_clusters_with_custom_implementation = [ "level-control" ] zap_pregenerated_dir = "//zap-generated" } ``` # Background Some clusters, for example Level Control, are implemented with the assumption of direct low-level access to the device hardware. For bridged devices, the actual interface might be much more high level, as in my case where I have lights which are fully capable of performing parametrized smooth transitions but are NOT capable of receiving output changes in millisecond intervals. In such cases, a cluster might need application-specific re-implementation. This changeset allows, from the application's ZAP BUILD.gn, to exclude the standard cluster implementation file, allowing re-implementation of the needed ember callbacks in a application specific file outside the connectedhomeip repo. * Include suggestions from @bzbarsky-apple --- src/app/chip_data_model.gni | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/app/chip_data_model.gni b/src/app/chip_data_model.gni index 4cdbac8c7850f8..ff42f7c1b195ee 100644 --- a/src/app/chip_data_model.gni +++ b/src/app/chip_data_model.gni @@ -134,6 +134,7 @@ template("chip_data_model") { "*", [ "zap_pregenerated_dir", + "zap_clusters_with_custom_implementation", "zap_file", "is_server", ]) @@ -188,8 +189,22 @@ template("chip_data_model") { [ invoker.zap_file ]) } + _custom_impl_clusters = [] + if (defined(invoker.zap_clusters_with_custom_implementation)) { + _custom_impl_clusters = invoker.zap_clusters_with_custom_implementation + } + foreach(cluster, _cluster_sources) { - if (cluster == "door-lock-server") { + _custom_impl = false + foreach(ci, _custom_impl_clusters) { + if (cluster == ci) { + _custom_impl = true + } + } + + if (_custom_impl) { + # do not include any sources, we have a custom implementation for this cluster + } else if (cluster == "door-lock-server") { sources += [ "${_app_root}/clusters/${cluster}/door-lock-server-callback.cpp", "${_app_root}/clusters/${cluster}/door-lock-server.cpp",