@@ -37,38 +37,56 @@ namespace esp_matter {
3737namespace client {
3838
3939static command_callback_t client_command_callback = NULL ;
40- static void *client_command_callback_priv_data = NULL ;
40+ static group_command_callback_t client_group_command_callback = NULL ;
41+ static void *command_callback_priv_data;
4142static bool initialize_binding_manager = false ;
4243
43- esp_err_t set_command_callback (command_callback_t callback, void *priv_data)
44+ esp_err_t set_command_callback (command_callback_t callback, group_command_callback_t g_callback, void *priv_data)
4445{
4546 client_command_callback = callback;
46- client_command_callback_priv_data = priv_data;
47+ client_group_command_callback = g_callback;
48+ command_callback_priv_data = priv_data;
4749 return ESP_OK;
4850}
4951
50- /* * TODO: Change g_remote_endpoint_id to something better. */
51- uint16_t g_remote_endpoint_id = kInvalidEndpointId ;
5252void esp_matter_connection_success_callback (void *context, ExchangeManager & exchangeMgr, SessionHandle & sessionHandle)
5353{
54+ command_handle_t *cmd_handle = static_cast <command_handle_t *>(context);
55+ if (!cmd_handle) {
56+ ESP_LOGE (TAG, " Failed to call connect_success_callback since the command handle is NULL" );
57+ return ;
58+ }
5459 ESP_LOGI (TAG, " New connection success" );
60+ // Only unicast binding needs to establish the connection
5561 if (client_command_callback) {
5662 OperationalDeviceProxy device (&exchangeMgr, sessionHandle);
57- client_command_callback (&device, g_remote_endpoint_id, client_command_callback_priv_data );
63+ client_command_callback (&device, cmd_handle-> endpoint_id , cmd_handle, command_callback_priv_data );
5864 }
65+ chip::Platform::Delete (cmd_handle);
5966}
6067
6168void esp_matter_connection_failure_callback (void *context, const ScopedNodeId & peerId, CHIP_ERROR error)
6269{
70+ command_handle_t *cmd_handle = static_cast <command_handle_t *>(context);
6371 ESP_LOGI (TAG, " New connection failure" );
72+ if (cmd_handle) {
73+ chip::Platform::Delete (cmd_handle);
74+ }
6475}
6576
66- esp_err_t connect (uint8_t fabric_index, uint64_t node_id, uint16_t remote_endpoint_id )
77+ esp_err_t connect (uint8_t fabric_index, uint64_t node_id, command_handle_t *cmd_handle )
6778{
6879 static Callback<chip::OnDeviceConnected> success_callback (esp_matter_connection_success_callback, NULL );
6980 static Callback<chip::OnDeviceConnectionFailure> failure_callback (esp_matter_connection_failure_callback, NULL );
81+
82+ command_handle_t *context = chip::Platform::New<command_handle_t >(cmd_handle);
83+ if (!context) {
84+ ESP_LOGE (TAG, " failed to alloc memory for the command handle" );
85+ return ESP_ERR_NO_MEM;
86+ }
87+ success_callback.mContext = static_cast <void *>(context);
88+ failure_callback.mContext = static_cast <void *>(context);
7089 Server * server = &(chip::Server::GetInstance ());
71- g_remote_endpoint_id = remote_endpoint_id;
7290 server->GetCASESessionManager ()->FindOrEstablishSession (ScopedNodeId (node_id, fabric_index), &success_callback,
7391 &failure_callback);
7492 return ESP_OK;
@@ -77,14 +95,44 @@ esp_err_t connect(uint8_t fabric_index, uint64_t node_id, uint16_t remote_endpoi
7795static void esp_matter_command_client_binding_callback (const EmberBindingTableEntry &binding, OperationalDeviceProxy *peer_device,
7896 void *context)
7997{
80- if (client_command_callback) {
81- client_command_callback (peer_device, binding.remote , client_command_callback_priv_data);
98+ command_handle_t *cmd_handle = static_cast <command_handle_t *>(context);
99+ if (!cmd_handle) {
100+ ESP_LOGE (TAG, " Failed to call the binding callback since command handle is NULL" );
101+ return ;
102+ }
103+ if (binding.type == EMBER_UNICAST_BINDING && !cmd_handle->is_group && peer_device) {
104+ if (client_command_callback) {
105+ client_command_callback (peer_device, binding.remote , cmd_handle, command_callback_priv_data);
106+ }
107+ } else if (binding.type == EMBER_MULTICAST_BINDING && cmd_handle->is_group && !peer_device) {
108+ if (client_group_command_callback) {
109+ client_group_command_callback (binding.fabricIndex , binding.groupId , cmd_handle, command_callback_priv_data);
110+ }
111+ }
112+ }
113+
114+ static void esp_matter_binding_context_release (void *context)
115+ {
116+ if (context) {
117+ chip::Platform::Delete (static_cast <command_handle_t *>(context));
82118 }
83119}
84120
85- esp_err_t cluster_update (uint16_t endpoint_id, uint32_t cluster_id )
121+ esp_err_t cluster_update (uint16_t local_endpoint_id, command_handle_t *cmd_handle )
86122{
87- chip::BindingManager::GetInstance ().NotifyBoundClusterChanged (endpoint_id, cluster_id, NULL );
123+ command_handle_t *context = chip::Platform::New<command_handle_t >(cmd_handle);
124+ if (!context) {
125+ ESP_LOGE (TAG, " failed to alloc memory for the command handle" );
126+ return ESP_ERR_NO_MEM;
127+ }
128+ if (CHIP_NO_ERROR !=
129+ chip::BindingManager::GetInstance ().NotifyBoundClusterChanged (local_endpoint_id, cmd_handle->cluster_id ,
130+ static_cast <void *>(context))) {
131+ chip::Platform::Delete (context);
132+ ESP_LOGE (TAG, " failed to notify the bound cluster changed" );
133+ return ESP_FAIL;
134+ }
135+
88136 return ESP_OK;
89137}
90138
@@ -99,6 +147,7 @@ static void __binding_manager_init(intptr_t arg)
99147
100148 chip::BindingManager::GetInstance ().Init (binding_init_params);
101149 chip::BindingManager::GetInstance ().RegisterBoundDeviceChangedHandler (esp_matter_command_client_binding_callback);
150+ chip::BindingManager::GetInstance ().RegisterBoundDeviceContextReleaseHandler (esp_matter_binding_context_release);
102151}
103152
104153void binding_manager_init ()
@@ -139,6 +188,15 @@ esp_err_t send_on(peer_device_t *remote_device, uint16_t remote_endpoint_id)
139188 return ESP_OK;
140189}
141190
191+ esp_err_t group_send_on (uint8_t fabric_index, uint16_t group_id)
192+ {
193+ OnOff::Commands::On::Type command_data;
194+ chip::Messaging::ExchangeManager & exchange_mgr = chip::Server::GetInstance ().GetExchangeManager ();
195+
196+ chip::Controller::InvokeGroupCommandRequest (&exchange_mgr, fabric_index, group_id, command_data);
197+ return ESP_OK;
198+ }
199+
142200esp_err_t send_off (peer_device_t *remote_device, uint16_t remote_endpoint_id)
143201{
144202 OnOff::Commands::Off::Type command_data;
@@ -148,6 +206,15 @@ esp_err_t send_off(peer_device_t *remote_device, uint16_t remote_endpoint_id)
148206 return ESP_OK;
149207}
150208
209+ esp_err_t group_send_off (uint8_t fabric_index, uint16_t group_id)
210+ {
211+ OnOff::Commands::Off::Type command_data;
212+ chip::Messaging::ExchangeManager & exchange_mgr = chip::Server::GetInstance ().GetExchangeManager ();
213+
214+ chip::Controller::InvokeGroupCommandRequest (&exchange_mgr, fabric_index, group_id, command_data);
215+ return ESP_OK;
216+ }
217+
151218esp_err_t send_toggle (peer_device_t *remote_device, uint16_t remote_endpoint_id)
152219{
153220 OnOff::Commands::Toggle::Type command_data;
@@ -157,6 +224,15 @@ esp_err_t send_toggle(peer_device_t *remote_device, uint16_t remote_endpoint_id)
157224 return ESP_OK;
158225}
159226
227+ esp_err_t group_send_toggle (uint8_t fabric_index, uint16_t group_id)
228+ {
229+ OnOff::Commands::Toggle::Type command_data;
230+ chip::Messaging::ExchangeManager & exchange_mgr = chip::Server::GetInstance ().GetExchangeManager ();
231+
232+ chip::Controller::InvokeGroupCommandRequest (&exchange_mgr, fabric_index, group_id, command_data);
233+ return ESP_OK;
234+ }
235+
160236} /* command */
161237} /* on_off */
162238
0 commit comments