From eaee6b05fcc0ccc8bd8d970a07ddef9c2e04969d Mon Sep 17 00:00:00 2001 From: Shubham Patil Date: Tue, 30 Aug 2022 13:33:19 +0530 Subject: [PATCH 1/2] Expose AppDelegate callback APIs as events --- components/esp_matter/esp_matter.h | 21 ++++++++++++ components/esp_matter/esp_matter_core.cpp | 42 +++++++++++++++++++++-- 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/components/esp_matter/esp_matter.h b/components/esp_matter/esp_matter.h index e95c6ab09..75d334a74 100644 --- a/components/esp_matter/esp_matter.h +++ b/components/esp_matter/esp_matter.h @@ -103,3 +103,24 @@ typedef enum command_flags { } command_flags_t; } /* esp_matter */ + +#include + +namespace chip { +namespace DeviceLayer { +namespace DeviceEventType { + +/** + * Enumerates platform-specific event types that are visible to the application. + */ +enum +{ + kCommissioningSessionStarted = kRange_PublicPlatformSpecific + 0x1000, + kCommissioningSessionStopped, + kCommissioningWindowOpened, + kCommissioningWindowClosed, +}; + +} // DeviceEventType +} // DeviceLayer +} // chip diff --git a/components/esp_matter/esp_matter_core.cpp b/components/esp_matter/esp_matter_core.cpp index 1a763e0bf..5b3566bba 100644 --- a/components/esp_matter/esp_matter_core.cpp +++ b/components/esp_matter/esp_matter_core.cpp @@ -62,6 +62,45 @@ namespace { #if CONFIG_ENABLE_ESP32_FACTORY_DATA_PROVIDER chip::DeviceLayer::ESP32FactoryDataProvider factory_data_provider; #endif // CONFIG_ENABLE_ESP32_FACTORY_DATA_PROVIDER + +class AppDelegateImpl : public AppDelegate +{ +public: + void OnCommissioningSessionStarted() + { + PostEvent(chip::DeviceLayer::DeviceEventType::kCommissioningSessionStarted); + } + + void OnCommissioningSessionStopped() + { + PostEvent(chip::DeviceLayer::DeviceEventType::kCommissioningSessionStopped); + } + + void OnCommissioningWindowOpened() + { + PostEvent(chip::DeviceLayer::DeviceEventType::kCommissioningWindowOpened); + } + + void OnCommissioningWindowClosed() + { + PostEvent(chip::DeviceLayer::DeviceEventType::kCommissioningWindowClosed); + } + +private: + void PostEvent(uint16_t eventType) + { + chip::DeviceLayer::ChipDeviceEvent event; + event.Type = eventType; + CHIP_ERROR error = chip::DeviceLayer::PlatformMgr().PostEvent(&event); + if (error != CHIP_NO_ERROR) + { + ESP_LOGE(TAG, "Failed to post event from AppDelegate, err:%" CHIP_ERROR_FORMAT, error.Format()); + } + } +}; + +AppDelegateImpl s_app_delegate; + } // namespace typedef struct _attribute { @@ -648,8 +687,7 @@ static void esp_matter_chip_init_task(intptr_t context) static chip::CommonCaseDeviceServerInitParams initParams; initParams.InitializeStaticResourcesBeforeServerInit(); - /** TODO: Add these callbacks and pass them on to the application */ - // initParams.appDelegate = &sCallbacks; + initParams.appDelegate = &s_app_delegate; chip::Server::GetInstance().Init(initParams); #if CHIP_DEVICE_CONFIG_ENABLE_THREAD From 64a44ba04d4e49f209086fcd9870a20e196a9ef1 Mon Sep 17 00:00:00 2001 From: Shubham Patil Date: Tue, 30 Aug 2022 14:07:48 +0530 Subject: [PATCH 2/2] Handle the commissioning events in examples --- components/esp_matter/esp_matter.h | 7 +++++-- examples/blemesh_bridge/main/app_main.cpp | 24 +++++++++++++++++++++-- examples/light/main/app_main.cpp | 24 +++++++++++++++++++++-- examples/light_switch/main/app_main.cpp | 24 +++++++++++++++++++++-- examples/zap_light/main/app_main.cpp | 24 +++++++++++++++++++++-- examples/zigbee_bridge/main/app_main.cpp | 24 +++++++++++++++++++++-- 6 files changed, 115 insertions(+), 12 deletions(-) diff --git a/components/esp_matter/esp_matter.h b/components/esp_matter/esp_matter.h index 75d334a74..fda20102b 100644 --- a/components/esp_matter/esp_matter.h +++ b/components/esp_matter/esp_matter.h @@ -32,6 +32,7 @@ application. #include #include +#include #include namespace esp_matter { @@ -104,8 +105,6 @@ typedef enum command_flags { } /* esp_matter */ -#include - namespace chip { namespace DeviceLayer { namespace DeviceEventType { @@ -115,9 +114,13 @@ namespace DeviceEventType { */ enum { + /** Signals that Commissioning session has started */ kCommissioningSessionStarted = kRange_PublicPlatformSpecific + 0x1000, + /** Signals that Commissioning session has stopped */ kCommissioningSessionStopped, + /** Signals that Commissioning window is now opend */ kCommissioningWindowOpened, + /** Signals that Commissioning window is now closed */ kCommissioningWindowClosed, }; diff --git a/examples/blemesh_bridge/main/app_main.cpp b/examples/blemesh_bridge/main/app_main.cpp index 4260af7b2..8fbe97ef6 100644 --- a/examples/blemesh_bridge/main/app_main.cpp +++ b/examples/blemesh_bridge/main/app_main.cpp @@ -29,17 +29,37 @@ using namespace esp_matter::attribute; static void app_event_cb(const ChipDeviceEvent *event, intptr_t arg) { switch (event->Type) { - case chip::DeviceLayer::DeviceEventType::PublicEventTypes::kInterfaceIpAddressChanged: + case chip::DeviceLayer::DeviceEventType::kInterfaceIpAddressChanged: #if !CHIP_DEVICE_CONFIG_ENABLE_THREAD chip::app::DnssdServer::Instance().StartServer(); esp_route_hook_init(esp_netif_get_handle_from_ifkey("WIFI_STA_DEF")); #endif break; - case chip::DeviceLayer::DeviceEventType::PublicEventTypes::kCommissioningComplete: + case chip::DeviceLayer::DeviceEventType::kCommissioningComplete: ESP_LOGI(TAG, "Commissioning complete"); break; + case chip::DeviceLayer::DeviceEventType::kFailSafeTimerExpired: + ESP_LOGI(TAG, "Commissioning failed, fail safe timer expired"); + break; + + case chip::DeviceLayer::DeviceEventType::kCommissioningSessionStarted: + ESP_LOGI(TAG, "Commissioning session started"); + break; + + case chip::DeviceLayer::DeviceEventType::kCommissioningSessionStopped: + ESP_LOGI(TAG, "Commissioning session stopped"); + break; + + case chip::DeviceLayer::DeviceEventType::kCommissioningWindowOpened: + ESP_LOGI(TAG, "Commissioning window opened"); + break; + + case chip::DeviceLayer::DeviceEventType::kCommissioningWindowClosed: + ESP_LOGI(TAG, "Commissioning window closed"); + break; + default: break; } diff --git a/examples/light/main/app_main.cpp b/examples/light/main/app_main.cpp index ddf6937d0..a5592f1d0 100644 --- a/examples/light/main/app_main.cpp +++ b/examples/light/main/app_main.cpp @@ -30,17 +30,37 @@ using namespace chip::app::Clusters; static void app_event_cb(const ChipDeviceEvent *event, intptr_t arg) { switch (event->Type) { - case chip::DeviceLayer::DeviceEventType::PublicEventTypes::kInterfaceIpAddressChanged: + case chip::DeviceLayer::DeviceEventType::kInterfaceIpAddressChanged: #if !CHIP_DEVICE_CONFIG_ENABLE_THREAD chip::app::DnssdServer::Instance().StartServer(); esp_route_hook_init(esp_netif_get_handle_from_ifkey("WIFI_STA_DEF")); #endif break; - case chip::DeviceLayer::DeviceEventType::PublicEventTypes::kCommissioningComplete: + case chip::DeviceLayer::DeviceEventType::kCommissioningComplete: ESP_LOGI(TAG, "Commissioning complete"); break; + case chip::DeviceLayer::DeviceEventType::kFailSafeTimerExpired: + ESP_LOGI(TAG, "Commissioning failed, fail safe timer expired"); + break; + + case chip::DeviceLayer::DeviceEventType::kCommissioningSessionStarted: + ESP_LOGI(TAG, "Commissioning session started"); + break; + + case chip::DeviceLayer::DeviceEventType::kCommissioningSessionStopped: + ESP_LOGI(TAG, "Commissioning session stopped"); + break; + + case chip::DeviceLayer::DeviceEventType::kCommissioningWindowOpened: + ESP_LOGI(TAG, "Commissioning window opened"); + break; + + case chip::DeviceLayer::DeviceEventType::kCommissioningWindowClosed: + ESP_LOGI(TAG, "Commissioning window closed"); + break; + default: break; } diff --git a/examples/light_switch/main/app_main.cpp b/examples/light_switch/main/app_main.cpp index aa8ff05f5..010c336ae 100644 --- a/examples/light_switch/main/app_main.cpp +++ b/examples/light_switch/main/app_main.cpp @@ -29,17 +29,37 @@ using namespace esp_matter::endpoint; static void app_event_cb(const ChipDeviceEvent *event, intptr_t arg) { switch (event->Type) { - case chip::DeviceLayer::DeviceEventType::PublicEventTypes::kInterfaceIpAddressChanged: + case chip::DeviceLayer::DeviceEventType::kInterfaceIpAddressChanged: #if !CHIP_DEVICE_CONFIG_ENABLE_THREAD chip::app::DnssdServer::Instance().StartServer(); esp_route_hook_init(esp_netif_get_handle_from_ifkey("WIFI_STA_DEF")); #endif break; - case chip::DeviceLayer::DeviceEventType::PublicEventTypes::kCommissioningComplete: + case chip::DeviceLayer::DeviceEventType::kCommissioningComplete: ESP_LOGI(TAG, "Commissioning complete"); break; + case chip::DeviceLayer::DeviceEventType::kFailSafeTimerExpired: + ESP_LOGI(TAG, "Commissioning failed, fail safe timer expired"); + break; + + case chip::DeviceLayer::DeviceEventType::kCommissioningSessionStarted: + ESP_LOGI(TAG, "Commissioning session started"); + break; + + case chip::DeviceLayer::DeviceEventType::kCommissioningSessionStopped: + ESP_LOGI(TAG, "Commissioning session stopped"); + break; + + case chip::DeviceLayer::DeviceEventType::kCommissioningWindowOpened: + ESP_LOGI(TAG, "Commissioning window opened"); + break; + + case chip::DeviceLayer::DeviceEventType::kCommissioningWindowClosed: + ESP_LOGI(TAG, "Commissioning window closed"); + break; + default: break; } diff --git a/examples/zap_light/main/app_main.cpp b/examples/zap_light/main/app_main.cpp index d41923648..f16d63613 100644 --- a/examples/zap_light/main/app_main.cpp +++ b/examples/zap_light/main/app_main.cpp @@ -28,17 +28,37 @@ app_driver_handle_t light_handle = NULL; static void app_event_cb(const ChipDeviceEvent *event, intptr_t arg) { switch (event->Type) { - case chip::DeviceLayer::DeviceEventType::PublicEventTypes::kInterfaceIpAddressChanged: + case chip::DeviceLayer::DeviceEventType::kInterfaceIpAddressChanged: #if !CHIP_DEVICE_CONFIG_ENABLE_THREAD chip::app::DnssdServer::Instance().StartServer(); esp_route_hook_init(esp_netif_get_handle_from_ifkey("WIFI_STA_DEF")); #endif break; - case chip::DeviceLayer::DeviceEventType::PublicEventTypes::kCommissioningComplete: + case chip::DeviceLayer::DeviceEventType::kCommissioningComplete: ESP_LOGI(TAG, "Commissioning complete"); break; + case chip::DeviceLayer::DeviceEventType::kFailSafeTimerExpired: + ESP_LOGI(TAG, "Commissioning failed, fail safe timer expired"); + break; + + case chip::DeviceLayer::DeviceEventType::kCommissioningSessionStarted: + ESP_LOGI(TAG, "Commissioning session started"); + break; + + case chip::DeviceLayer::DeviceEventType::kCommissioningSessionStopped: + ESP_LOGI(TAG, "Commissioning session stopped"); + break; + + case chip::DeviceLayer::DeviceEventType::kCommissioningWindowOpened: + ESP_LOGI(TAG, "Commissioning window opened"); + break; + + case chip::DeviceLayer::DeviceEventType::kCommissioningWindowClosed: + ESP_LOGI(TAG, "Commissioning window closed"); + break; + default: break; } diff --git a/examples/zigbee_bridge/main/app_main.cpp b/examples/zigbee_bridge/main/app_main.cpp index 1c1de2a19..bb40871dc 100644 --- a/examples/zigbee_bridge/main/app_main.cpp +++ b/examples/zigbee_bridge/main/app_main.cpp @@ -28,17 +28,37 @@ using namespace esp_matter::attribute; static void app_event_cb(const ChipDeviceEvent *event, intptr_t arg) { switch (event->Type) { - case chip::DeviceLayer::DeviceEventType::PublicEventTypes::kInterfaceIpAddressChanged: + case chip::DeviceLayer::DeviceEventType::kInterfaceIpAddressChanged: #if !CHIP_DEVICE_CONFIG_ENABLE_THREAD chip::app::DnssdServer::Instance().StartServer(); esp_route_hook_init(esp_netif_get_handle_from_ifkey("WIFI_STA_DEF")); #endif break; - case chip::DeviceLayer::DeviceEventType::PublicEventTypes::kCommissioningComplete: + case chip::DeviceLayer::DeviceEventType::kCommissioningComplete: ESP_LOGI(TAG, "Commissioning complete"); break; + case chip::DeviceLayer::DeviceEventType::kFailSafeTimerExpired: + ESP_LOGI(TAG, "Commissioning failed, fail safe timer expired"); + break; + + case chip::DeviceLayer::DeviceEventType::kCommissioningSessionStarted: + ESP_LOGI(TAG, "Commissioning session started"); + break; + + case chip::DeviceLayer::DeviceEventType::kCommissioningSessionStopped: + ESP_LOGI(TAG, "Commissioning session stopped"); + break; + + case chip::DeviceLayer::DeviceEventType::kCommissioningWindowOpened: + ESP_LOGI(TAG, "Commissioning window opened"); + break; + + case chip::DeviceLayer::DeviceEventType::kCommissioningWindowClosed: + ESP_LOGI(TAG, "Commissioning window closed"); + break; + default: break; }