diff --git a/src/platform/nxp/common/CHIPDevicePlatformEvent.h b/src/platform/nxp/common/CHIPDevicePlatformEvent.h index e3167f5cc2240f..4ea4ffcd304dbe 100644 --- a/src/platform/nxp/common/CHIPDevicePlatformEvent.h +++ b/src/platform/nxp/common/CHIPDevicePlatformEvent.h @@ -69,6 +69,7 @@ enum InternalPlatformSpecificEventTypes kPlatformNxpWlanEvent, kPlatformNxpIpChangeEvent, kPlatformNxpStartWlanConnectEvent, + kPlatformNxpScanWiFiNetworkDoneEvent, }; } // namespace DeviceEventType @@ -116,6 +117,7 @@ struct ChipDevicePlatformEvent final #if CHIP_DEVICE_CONFIG_ENABLE_WPA enum wlan_event_reason WlanEventReason; struct wlan_network * pNetworkDataEvent; + unsigned int ScanWiFiNetworkCount; #endif }; }; diff --git a/src/platform/nxp/common/ConnectivityManagerImpl.cpp b/src/platform/nxp/common/ConnectivityManagerImpl.cpp index 79abd4e9648dca..0386de643455ef 100644 --- a/src/platform/nxp/common/ConnectivityManagerImpl.cpp +++ b/src/platform/nxp/common/ConnectivityManagerImpl.cpp @@ -153,6 +153,11 @@ void ConnectivityManagerImpl::_OnPlatformEvent(const ChipDeviceEvent * event) free(event->Platform.pNetworkDataEvent); } } + else if (event->Type == kPlatformNxpScanWiFiNetworkDoneEvent) + { + NetworkCommissioning::NXPWiFiDriver::GetInstance().ScanWiFINetworkDoneFromMatterTaskContext( + event->Platform.ScanWiFiNetworkCount); + } #endif } diff --git a/src/platform/nxp/common/NetworkCommissioningDriver.h b/src/platform/nxp/common/NetworkCommissioningDriver.h index 33d7d5bc1ed3af..a9f5807018d631 100644 --- a/src/platform/nxp/common/NetworkCommissioningDriver.h +++ b/src/platform/nxp/common/NetworkCommissioningDriver.h @@ -92,7 +92,8 @@ class NXPWiFiDriver final : public WiFiDriver CHIP_ERROR ConnectWiFiNetwork(const char * ssid, uint8_t ssidLen, const char * key, uint8_t keyLen); void OnConnectWiFiNetwork(Status commissioningError, CharSpan debugText, int32_t connectStatus); - static int OnScanWiFiNetworkDone(unsigned int count); + int ScanWiFINetworkDoneFromMatterTaskContext(unsigned int count); + static int _OnScanWiFiNetworkDoneCallBack(unsigned int count); static NXPWiFiDriver & GetInstance() { static NXPWiFiDriver instance; diff --git a/src/platform/nxp/common/NetworkCommissioningWiFiDriver.cpp b/src/platform/nxp/common/NetworkCommissioningWiFiDriver.cpp index c201dad7a6661c..e1348f946c1865 100644 --- a/src/platform/nxp/common/NetworkCommissioningWiFiDriver.cpp +++ b/src/platform/nxp/common/NetworkCommissioningWiFiDriver.cpp @@ -270,7 +270,7 @@ CHIP_ERROR NXPWiFiDriver::StartScanWiFiNetworks(ByteSpan ssid) ChipLogProgress(DeviceLayer, "Scan for WiFi network(s) requested"); (void) memset(&wlan_scan_param, 0, sizeof(wlan_scan_params_v2_t)); - wlan_scan_param.cb = &NXPWiFiDriver::OnScanWiFiNetworkDone; + wlan_scan_param.cb = &NXPWiFiDriver::_OnScanWiFiNetworkDoneCallBack; if ((ssid.size() > 0) && (ssid.size() < MLAN_MAX_SSID_LENGTH)) { @@ -291,8 +291,23 @@ CHIP_ERROR NXPWiFiDriver::StartScanWiFiNetworks(ByteSpan ssid) return CHIP_NO_ERROR; } -// TODO should be modified to do it in the context of the Matter stack -int NXPWiFiDriver::OnScanWiFiNetworkDone(unsigned int count) +int NXPWiFiDriver::_OnScanWiFiNetworkDoneCallBack(unsigned int count) +{ + ChipDeviceEvent event; + event.Type = DeviceEventType::kPlatformNxpScanWiFiNetworkDoneEvent; + event.Platform.ScanWiFiNetworkCount = count; + CHIP_ERROR err = PlatformMgr().PostEvent(&event); + if (err != CHIP_NO_ERROR) + { + ChipLogError(DeviceLayer, "Failed to schedule work: %" CHIP_ERROR_FORMAT, err.Format()); + return WM_FAIL; + } + return WM_SUCCESS; +} + +// The processing of the scan callback should be done in the context of the Matter stack, as the scan callback will call Matter +// stack APIs +int NXPWiFiDriver::ScanWiFINetworkDoneFromMatterTaskContext(unsigned int count) { ChipLogProgress(DeviceLayer, "Scan for WiFi network(s) done, found: %u", count);