From c7a0d02baa4818ebb68e85b5a2a7010adc9e3b96 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Sep 2024 09:48:25 -0400 Subject: [PATCH 01/38] Bump cryptography from 41.0.4 to 43.0.1 in /scripts/tools/telink (#35387) Bumps [cryptography](https://github.com/pyca/cryptography) from 41.0.4 to 43.0.1. - [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pyca/cryptography/compare/41.0.4...43.0.1) --- updated-dependencies: - dependency-name: cryptography dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Andrei Litvin --- scripts/tools/telink/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/tools/telink/requirements.txt b/scripts/tools/telink/requirements.txt index bb4359b5319da3..58b519dc924bfa 100644 --- a/scripts/tools/telink/requirements.txt +++ b/scripts/tools/telink/requirements.txt @@ -1,4 +1,4 @@ -cryptography==41.0.4 +cryptography==43.0.1 cffi==1.15.0 future==0.18.3 pycparser==2.21 From 0140a72909d35cad24230aadb52dbe88a22c0a03 Mon Sep 17 00:00:00 2001 From: Jerry-ESP <107675966+Jerry-ESP@users.noreply.github.com> Date: Tue, 10 Sep 2024 21:48:51 +0800 Subject: [PATCH 02/38] [ESP32] Add a configurable device type for commissionable advertising. (#35344) * add commissionable device type config * Restyled by autopep8 * update the function logic --------- Co-authored-by: Restyled.io --- .../tools/generate_esp32_chip_factory_bin.py | 9 +++++++++ src/platform/ESP32/ConfigurationManagerImpl.cpp | 17 +++++++++++++++++ src/platform/ESP32/ConfigurationManagerImpl.h | 1 + src/platform/ESP32/ESP32Config.cpp | 1 + src/platform/ESP32/ESP32Config.h | 1 + 5 files changed, 29 insertions(+) diff --git a/scripts/tools/generate_esp32_chip_factory_bin.py b/scripts/tools/generate_esp32_chip_factory_bin.py index 892f0609927cd2..ef23dc61b337ef 100755 --- a/scripts/tools/generate_esp32_chip_factory_bin.py +++ b/scripts/tools/generate_esp32_chip_factory_bin.py @@ -209,6 +209,11 @@ class Product_Color_Enum(Enum): 'encoding': 'string', 'value': None, }, + 'device-type': { + 'type': 'data', + 'encoding': 'u32', + 'value': None, + }, } @@ -372,6 +377,8 @@ def populate_factory_data(args, spake2p_params): FACTORY_DATA['product-url']['value'] = args.product_url if args.product_label: FACTORY_DATA['product-label']['value'] = args.product_label + if args.device_type is not None: + FACTORY_DATA['device-type']['value'] = args.device_type # SupportedModes are stored as multiple entries # - sm-sz/ : number of supported modes for the endpoint @@ -554,6 +561,8 @@ def any_base_int(s): return int(s, 0) parser.add_argument("--product-label", type=str, help='human readable product label') parser.add_argument("--product-url", type=str, help='link to product specific web page') + parser.add_argument("--device-type", type=any_base_int, help='commissionable device type') + parser.add_argument('-s', '--size', type=any_base_int, default=0x6000, help='The size of the partition.bin, default: 0x6000') parser.add_argument('--target', default='esp32', diff --git a/src/platform/ESP32/ConfigurationManagerImpl.cpp b/src/platform/ESP32/ConfigurationManagerImpl.cpp index 31c7cb714f96c0..78446432c58b0a 100644 --- a/src/platform/ESP32/ConfigurationManagerImpl.cpp +++ b/src/platform/ESP32/ConfigurationManagerImpl.cpp @@ -269,6 +269,23 @@ CHIP_ERROR ConfigurationManagerImpl::GetLocationCapability(uint8_t & location) #endif // CONFIG_ENABLE_ESP32_LOCATIONCAPABILITY } +CHIP_ERROR ConfigurationManagerImpl::GetDeviceTypeId(uint32_t & deviceType) +{ + uint32_t value = 0; + CHIP_ERROR err = ReadConfigValue(ESP32Config::kConfigKey_PrimaryDeviceType, value); + + if (err == CHIP_DEVICE_ERROR_CONFIG_NOT_FOUND) + { + deviceType = CHIP_DEVICE_CONFIG_DEVICE_TYPE; + } + else + { + deviceType = value; + } + + return CHIP_NO_ERROR; +} + CHIP_ERROR ConfigurationManagerImpl::StoreCountryCode(const char * code, size_t codeLen) { // As per spec, codeLen has to be 2 diff --git a/src/platform/ESP32/ConfigurationManagerImpl.h b/src/platform/ESP32/ConfigurationManagerImpl.h index 63b3e094763a75..648c150fc01a44 100644 --- a/src/platform/ESP32/ConfigurationManagerImpl.h +++ b/src/platform/ESP32/ConfigurationManagerImpl.h @@ -58,6 +58,7 @@ class ConfigurationManagerImpl : public Internal::GenericConfigurationManagerImp CHIP_ERROR GetSoftwareVersionString(char * buf, size_t bufSize); CHIP_ERROR GetSoftwareVersion(uint32_t & softwareVer) override; CHIP_ERROR GetLocationCapability(uint8_t & location) override; + CHIP_ERROR GetDeviceTypeId(uint32_t & deviceType) override; static ConfigurationManagerImpl & GetDefaultInstance(); // Set the country code to esp_phy layer and also store it to NVS diff --git a/src/platform/ESP32/ESP32Config.cpp b/src/platform/ESP32/ESP32Config.cpp index c94de5c04b85b2..df48f5f2955793 100644 --- a/src/platform/ESP32/ESP32Config.cpp +++ b/src/platform/ESP32/ESP32Config.cpp @@ -81,6 +81,7 @@ const ESP32Config::Key ESP32Config::kConfigKey_ProductFinish = { kConfig const ESP32Config::Key ESP32Config::kConfigKey_ProductColor = { kConfigNamespace_ChipFactory, "product-color" }; const ESP32Config::Key ESP32Config::kConfigKey_PartNumber = { kConfigNamespace_ChipFactory, "part-number" }; const ESP32Config::Key ESP32Config::kConfigKey_LocationCapability = { kConfigNamespace_ChipFactory, "loc-capability" }; +const ESP32Config::Key ESP32Config::kConfigKey_PrimaryDeviceType = { kConfigNamespace_ChipFactory, "device-type" }; // Keys stored in the chip-config namespace const ESP32Config::Key ESP32Config::kConfigKey_ServiceConfig = { kConfigNamespace_ChipConfig, "service-config" }; diff --git a/src/platform/ESP32/ESP32Config.h b/src/platform/ESP32/ESP32Config.h index 218f2354b2b358..f2f03cf7f9074b 100644 --- a/src/platform/ESP32/ESP32Config.h +++ b/src/platform/ESP32/ESP32Config.h @@ -83,6 +83,7 @@ class ESP32Config static const Key kConfigKey_ProductFinish; static const Key kConfigKey_ProductColor; static const Key kConfigKey_LocationCapability; + static const Key kConfigKey_PrimaryDeviceType; // CHIP Config keys static const Key kConfigKey_ServiceConfig; From dfa0987e73cd58f1c75eaa466d365e91d28fec27 Mon Sep 17 00:00:00 2001 From: Rohan Sahay Date: Tue, 10 Sep 2024 20:48:11 +0530 Subject: [PATCH 03/38] [Silabs] Cleanup of logs and checks for WiFi products (#34430) * Clean up of logs and added checks * Apply suggestions from code review Co-authored-by: Junior Martinez <67972863+jmartinez-silabs@users.noreply.github.com> * Added changes from code review * Replace with chip::platform memory functions * Reduce logs * chore: Fix logging statements and improve error handling in BaseApplication.cpp * Sanitize provisioning WiFi network credentials * Sanitize SSID and SSID length * use CodeUtils min functions * refactor: add void parameter to functions * refactor: fix logging format in wfx_rsi_join_fail_cb and wfx_rsi_init functions * Simplify SSID processing and improve memory handling --------- Co-authored-by: brosahay <3526930+brosahay@users.noreply.github.com> Co-authored-by: Junior Martinez <67972863+jmartinez-silabs@users.noreply.github.com> --- examples/platform/silabs/BaseApplication.cpp | 4 +- .../silabs/SiWx917/SiWx917/sl_wifi_if.cpp | 79 ++-- .../platform/silabs/efr32/rs911x/rsi_if.cpp | 352 +++++++++--------- .../platform/silabs/efr32/wf200/host_if.cpp | 312 +++++++--------- examples/platform/silabs/wfx_rsi.h | 1 + examples/platform/silabs/wifi/wfx_notify.cpp | 4 +- .../platform/silabs/wifi/wfx_rsi_host.cpp | 144 +++---- .../silabs/ConnectivityManagerImpl_WIFI.cpp | 2 +- .../silabs/NetworkCommissioningWiFiDriver.cpp | 11 +- .../silabs/SiWx917/wifi/ethernetif.cpp | 20 +- .../silabs/SiWx917/wifi/wfx_host_events.h | 3 + src/platform/silabs/efr32/wifi/ethernetif.cpp | 6 +- .../silabs/efr32/wifi/wfx_host_events.h | 3 + 13 files changed, 437 insertions(+), 504 deletions(-) diff --git a/examples/platform/silabs/BaseApplication.cpp b/examples/platform/silabs/BaseApplication.cpp index cbef67996c4528..c61b91f7400879 100644 --- a/examples/platform/silabs/BaseApplication.cpp +++ b/examples/platform/silabs/BaseApplication.cpp @@ -621,7 +621,7 @@ void BaseApplication::CancelFactoryResetSequence() if (sIsFactoryResetTriggered) { sIsFactoryResetTriggered = false; - ChipLogProgress(AppServer, "Factory Reset has been Canceled"); + ChipLogProgress(AppServer, "Factory Reset has been cancelled"); } } @@ -854,7 +854,7 @@ void BaseApplication::OnPlatformEvent(const ChipDeviceEvent * event, intptr_t) VerifyOrReturn(event->InternetConnectivityChange.IPv4 == kConnectivity_Established); if (DIC_OK != dic_init(dic::control::subscribeCB)) { - SILABS_LOG("Failed to initialize DIC module\n"); + ChipLogError(AppServer, "dic_init failed"); } #endif // DIC_ENABLE #ifdef DISPLAY_ENABLED diff --git a/examples/platform/silabs/SiWx917/SiWx917/sl_wifi_if.cpp b/examples/platform/silabs/SiWx917/SiWx917/sl_wifi_if.cpp index ad3e15f6715c43..d283f05162bd54 100644 --- a/examples/platform/silabs/SiWx917/SiWx917/sl_wifi_if.cpp +++ b/examples/platform/silabs/SiWx917/SiWx917/sl_wifi_if.cpp @@ -36,8 +36,12 @@ #include "task.h" #include "wfx_host_events.h" #include "wfx_rsi.h" + #include #include +#include +#include +#include #include extern "C" { @@ -120,7 +124,7 @@ static void DHCPTimerEventHandler(void * arg) WfxPostEvent(&event); } -static void CancelDHCPTimer() +static void CancelDHCPTimer(void) { osStatus_t status; @@ -164,8 +168,10 @@ int32_t wfx_rsi_get_ap_info(wfx_wifi_scan_result_t * ap) { sl_status_t status = SL_STATUS_OK; int32_t rssi = 0; + ap->ssid_length = wfx_rsi.sec.ssid_length; ap->security = wfx_rsi.sec.security; ap->chan = wfx_rsi.ap_chan; + chip::Platform::CopyString(ap->ssid, ap->ssid_length, wfx_rsi.sec.ssid); memcpy(&ap->bssid[0], &wfx_rsi.ap_mac.octet[0], BSSID_LEN); sl_wifi_get_signal_strength(SL_WIFI_CLIENT_INTERFACE, &rssi); ap->rssi = rssi; @@ -197,14 +203,14 @@ int32_t wfx_rsi_get_ap_ext(wfx_wifi_scan_ext_t * extra_info) } /****************************************************************** - * @fn int32_t wfx_rsi_reset_count() + * @fn int32_t wfx_rsi_reset_count(void) * @brief * Getting the driver reset count * @param[in] None * @return * status *********************************************************************/ -int32_t wfx_rsi_reset_count() +int32_t wfx_rsi_reset_count(void) { sl_wifi_statistics_t test = { 0 }; sl_status_t status = SL_STATUS_OK; @@ -221,14 +227,14 @@ int32_t wfx_rsi_reset_count() } /****************************************************************** - * @fn wfx_rsi_disconnect() + * @fn wfx_rsi_disconnect(void) * @brief * Getting the driver disconnect status * @param[in] None * @return * status *********************************************************************/ -int32_t wfx_rsi_disconnect() +int32_t wfx_rsi_disconnect(void) { return sl_wifi_disconnect(SL_WIFI_CLIENT_INTERFACE); } @@ -251,18 +257,17 @@ sl_status_t join_callback_handler(sl_wifi_event_t event, char * result, uint32_t */ ChipLogDetail(DeviceLayer, "join_callback_handler: success"); memset(&temp_reset, 0, sizeof(temp_reset)); - - WfxEvent.eventType = WFX_EVT_STA_CONN; - WfxPostEvent(&WfxEvent); wfx_rsi.join_retries = 0; callback_status = SL_STATUS_OK; + WfxEvent.eventType = WFX_EVT_STA_CONN; + WfxPostEvent(&WfxEvent); return SL_STATUS_OK; } #if CHIP_CONFIG_ENABLE_ICD_SERVER #if SLI_SI91X_MCU_INTERFACE // Required to invoke button press event during sleep as falling edge is not detected -void sl_si91x_invoke_btn_press_event() +void sl_si91x_invoke_btn_press_event(void) { // TODO: should be removed once we are getting the press interrupt for button 0 with sleep if (!RSI_NPSSGPIO_GetPin(SL_BUTTON_BTN0_PIN) && !btn0_pressed) @@ -298,12 +303,12 @@ void sl_si91x_invoke_btn_press_event() #endif // SLI_SI91X_MCU_INTERFACE /****************************************************************** - * @fn wfx_rsi_power_save() + * @fn wfx_rsi_power_save(rsi_power_save_profile_mode_t sl_si91x_ble_state, sl_si91x_performance_profile_t sl_si91x_wifi_state) * @brief * Setting the RS911x in DTIM sleep based mode * * @param[in] sl_si91x_ble_state : State to set for the BLE - sl_si91x_wifi_state : State to set for the WiFi + * @param[in] sl_si91x_wifi_state : State to set for the WiFi * @return * None *********************************************************************/ @@ -339,7 +344,7 @@ int32_t wfx_rsi_power_save(rsi_power_save_profile_mode_t sl_si91x_ble_state, sl_ *****************************************************************************************/ int32_t wfx_wifi_rsi_init(void) { - ChipLogDetail(DeviceLayer, "wfx_wifi_rsi_init started"); + ChipLogDetail(DeviceLayer, "wfx_wifi_rsi_init: started"); sl_status_t status; status = sl_wifi_init(&config, NULL, sl_wifi_default_event_handler); VerifyOrReturnError(status == SL_STATUS_OK, status); @@ -534,7 +539,10 @@ sl_status_t show_scan_results(sl_wifi_scan_result_t * scan_result) for (int idx = 0; idx < (int) scan_result->scan_count; idx++) { memset(&cur_scan_result, 0, sizeof(cur_scan_result)); - strncpy(cur_scan_result.ssid, (char *) &scan_result->scan_info[idx].ssid, WFX_MAX_SSID_LENGTH); + + cur_scan_result.ssid_length = strnlen((char *) scan_result->scan_info[idx].ssid, + chip::min(sizeof(scan_result->scan_info[idx].ssid), WFX_MAX_SSID_LENGTH)); + chip::Platform::CopyString(cur_scan_result.ssid, cur_scan_result.ssid_length, (char *) scan_result->scan_info[idx].ssid); // if user has provided ssid, then check if the current scan result ssid matches the user provided ssid if (wfx_rsi.scan_ssid != NULL && @@ -559,10 +567,10 @@ sl_status_t show_scan_results(sl_wifi_scan_result_t * scan_result) // cleanup and return wfx_rsi.dev_state &= ~WFX_RSI_ST_SCANSTARTED; wfx_rsi.scan_cb((wfx_wifi_scan_result_t *) 0); - wfx_rsi.scan_cb = NULL; + wfx_rsi.scan_cb = nullptr; if (wfx_rsi.scan_ssid) { - vPortFree(wfx_rsi.scan_ssid); + chip::Platform::MemoryFree(wfx_rsi.scan_ssid); wfx_rsi.scan_ssid = NULL; } return SL_STATUS_OK; @@ -576,14 +584,14 @@ sl_status_t bg_scan_callback_handler(sl_wifi_event_t event, sl_wifi_scan_result_ return SL_STATUS_OK; } /*************************************************************************************** - * @fn static void wfx_rsi_save_ap_info() + * @fn static void wfx_rsi_save_ap_info(void) * @brief * Saving the details of the AP * @param[in] None * @return * None *******************************************************************************************/ -static void wfx_rsi_save_ap_info() // translation +static void wfx_rsi_save_ap_info(void) // translation { sl_status_t status = SL_STATUS_OK; #ifndef EXP_BOARD @@ -592,8 +600,8 @@ static void wfx_rsi_save_ap_info() // translation #endif sl_wifi_ssid_t ssid_arg; memset(&ssid_arg, 0, sizeof(ssid_arg)); - ssid_arg.length = strnlen(wfx_rsi.sec.ssid, WFX_MAX_SSID_LENGTH); - strncpy((char *) &ssid_arg.value[0], wfx_rsi.sec.ssid, WFX_MAX_SSID_LENGTH); + ssid_arg.length = wfx_rsi.sec.ssid_length; + chip::Platform::CopyString((char *) &ssid_arg.value[0], ssid_arg.length, wfx_rsi.sec.ssid); sl_wifi_set_scan_callback(scan_callback_handler, NULL); scan_results_complete = false; #ifndef EXP_BOARD @@ -619,7 +627,7 @@ static sl_status_t wfx_rsi_do_join(void) sl_status_t status = SL_STATUS_OK; sl_wifi_client_configuration_t ap; memset(&ap, 0, sizeof(ap)); - WfxEvent_t event; + switch (wfx_rsi.sec.security) { case WFX_SEC_WEP: @@ -662,19 +670,17 @@ static sl_status_t wfx_rsi_do_join(void) status = sl_wifi_set_advanced_client_configuration(SL_WIFI_CLIENT_INTERFACE, &client_config); VerifyOrReturnError(status == SL_STATUS_OK, status); #endif // CHIP_CONFIG_ENABLE_ICD_SERVER - size_t psk_length = strlen(wfx_rsi.sec.passkey); - VerifyOrReturnError(psk_length <= SL_WIFI_MAX_PSK_LENGTH, SL_STATUS_SI91X_INVALID_PSK_LENGTH); sl_net_credential_id_t id = SL_NET_DEFAULT_WIFI_CLIENT_CREDENTIAL_ID; - status = sl_net_set_credential(id, SL_NET_WIFI_PSK, &wfx_rsi.sec.passkey[0], psk_length); + status = sl_net_set_credential(id, SL_NET_WIFI_PSK, &wfx_rsi.sec.passkey[0], wfx_rsi.sec.passkey_length); VerifyOrReturnError(status == SL_STATUS_OK, status); uint32_t timeout_ms = 0; - ap.ssid.length = strnlen(wfx_rsi.sec.ssid, WFX_MAX_SSID_LENGTH); + ap.ssid.length = wfx_rsi.sec.ssid_length; ap.encryption = SL_WIFI_NO_ENCRYPTION; ap.credential_id = id; - memset(&ap.ssid.value, 0, (sizeof(ap.ssid.value) / sizeof(ap.ssid.value[0]))); - strncpy((char *) &ap.ssid.value[0], wfx_rsi.sec.ssid, WFX_MAX_SSID_LENGTH); + memcpy((char *) &ap.ssid.value[0], wfx_rsi.sec.ssid, wfx_rsi.sec.ssid_length); ChipLogDetail(DeviceLayer, "wfx_rsi_do_join: SSID: %s, SECURITY: %d(%d)", ap.ssid.value, ap.security, wfx_rsi.sec.security); + status = sl_wifi_connect(SL_WIFI_CLIENT_INTERFACE, &ap, timeout_ms); // sl_wifi_connect returns SL_STATUS_IN_PROGRESS if join is in progress // after the initial scan is done, the scan does not check for SSID @@ -687,24 +693,25 @@ static sl_status_t wfx_rsi_do_join(void) wfx_rsi.dev_state &= ~(WFX_RSI_ST_STA_CONNECTING | WFX_RSI_ST_STA_CONNECTED); ChipLogProgress(DeviceLayer, "wfx_rsi_do_join: retry attempt %d", wfx_rsi.join_retries); wfx_retry_connection(++wfx_rsi.join_retries); + + WfxEvent_t event; event.eventType = WFX_EVT_STA_START_JOIN; WfxPostEvent(&event); + return status; } /// NotifyConnectivity /// @brief Notify the application about the connectivity status if it has not been notified yet. /// Helper function for HandleDHCPPolling. -void NotifyConnectivity() +void NotifyConnectivity(void) { - if (!hasNotifiedWifiConnectivity) - { - wfx_connected_notify(CONNECTION_STATUS_SUCCESS, &wfx_rsi.ap_mac); - hasNotifiedWifiConnectivity = true; - } + VerifyOrReturn(!hasNotifiedWifiConnectivity); + wfx_connected_notify(CONNECTION_STATUS_SUCCESS, &wfx_rsi.ap_mac); + hasNotifiedWifiConnectivity = true; } -void HandleDHCPPolling() +void HandleDHCPPolling(void) { struct netif * sta_netif; WfxEvent_t event; @@ -722,6 +729,8 @@ void HandleDHCPPolling() { wfx_dhcp_got_ipv4((uint32_t) sta_netif->ip_addr.u_addr.ip4.addr); hasNotifiedIPV4 = true; + event.eventType = WFX_EVT_STA_DHCP_DONE; + WfxPostEvent(&event); NotifyConnectivity(); } else if (dhcp_state == DHCP_OFF) @@ -760,7 +769,7 @@ void WfxPostEvent(WfxEvent_t * event) /// ResetDHCPNotificationFlags /// @brief Reset the flags that are used to notify the application about DHCP connectivity /// and emits a WFX_EVT_STA_DO_DHCP event to trigger DHCP polling checks. Helper function for ProcessEvent. -void ResetDHCPNotificationFlags() +void ResetDHCPNotificationFlags(void) { WfxEvent_t outEvent; @@ -877,7 +886,7 @@ void ProcessEvent(WfxEvent_t inEvent) /********************************************************************************* * @fn void wfx_rsi_task(void *arg) * @brief - * The main WLAN task - started by wfx_wifi_start () that interfaces with RSI. + * The main WLAN task - started by wfx_wifi_start() that interfaces with RSI. * The rest of RSI stuff come in call-backs. * The initialization has been already done. * @param[in] arg: diff --git a/examples/platform/silabs/efr32/rs911x/rsi_if.cpp b/examples/platform/silabs/efr32/rs911x/rsi_if.cpp index d5560d69e97219..02500c80f78e35 100644 --- a/examples/platform/silabs/efr32/rs911x/rsi_if.cpp +++ b/examples/platform/silabs/efr32/rs911x/rsi_if.cpp @@ -54,10 +54,10 @@ extern "C" { #include "silabs_utils.h" #include "wfx_rsi.h" -// TODO convert this file to cpp and use CodeUtils.h -#ifndef MIN -#define MIN(a, b) ((a) < (b) ? (a) : (b)) -#endif +#include +#include +#include +#include #define WFX_QUEUE_SIZE 10 @@ -112,21 +112,21 @@ static void DHCPTimerEventHandler(void * arg) WfxPostEvent(&event); } -static void CancelDHCPTimer() +static void CancelDHCPTimer(void) { osStatus_t status; // Check if timer started if (!osTimerIsRunning(sDHCPTimer)) { - SILABS_LOG("CancelDHCPTimer: timer not running"); + ChipLogError(DeviceLayer, "CancelDHCPTimer: timer not running"); return; } status = osTimerStop(sDHCPTimer); if (status != osOK) { - SILABS_LOG("CancelDHCPTimer: failed to stop timer with status: %d", status); + ChipLogError(DeviceLayer, "CancelDHCPTimer: failed to stop timer with status: %d", status); } } @@ -140,7 +140,7 @@ static void StartDHCPTimer(uint32_t timeout) status = osTimerStart(sDHCPTimer, pdMS_TO_TICKS(timeout)); if (status != osOK) { - SILABS_LOG("StartDHCPTimer: failed to start timer with status: %d", status); + ChipLogError(DeviceLayer, "StartDHCPTimer: failed to start timer with status: %d", status); } } @@ -154,7 +154,7 @@ static void StartDHCPTimer(uint32_t timeout) *********************************************************************/ int32_t wfx_rsi_get_ap_info(wfx_wifi_scan_result_t * ap) { - int32_t status; + int32_t status = RSI_SUCCESS; uint8_t rssi; ap->security = wfx_rsi.sec.security; ap->chan = wfx_rsi.ap_chan; @@ -182,70 +182,65 @@ int32_t wfx_rsi_get_ap_ext(wfx_wifi_scan_ext_t * extra_info) status = rsi_wlan_get(RSI_WLAN_EXT_STATS, buff, sizeof(buff)); if (status != RSI_SUCCESS) { - SILABS_LOG("Failed, Error Code : 0x%lX", status); - } - else - { - rsi_wlan_ext_stats_t * test = (rsi_wlan_ext_stats_t *) buff; - extra_info->beacon_lost_count = test->beacon_lost_count - temp_reset.beacon_lost_count; - extra_info->beacon_rx_count = test->beacon_rx_count - temp_reset.beacon_rx_count; - extra_info->mcast_rx_count = test->mcast_rx_count - temp_reset.mcast_rx_count; - extra_info->mcast_tx_count = test->mcast_tx_count - temp_reset.mcast_tx_count; - extra_info->ucast_rx_count = test->ucast_rx_count - temp_reset.ucast_rx_count; - extra_info->ucast_tx_count = test->ucast_tx_count - temp_reset.ucast_tx_count; - extra_info->overrun_count = test->overrun_count - temp_reset.overrun_count; + ChipLogError(DeviceLayer, "Failed, Error Code : 0x%lX", status); + return status; } + rsi_wlan_ext_stats_t * test = (rsi_wlan_ext_stats_t *) buff; + extra_info->beacon_lost_count = test->beacon_lost_count - temp_reset.beacon_lost_count; + extra_info->beacon_rx_count = test->beacon_rx_count - temp_reset.beacon_rx_count; + extra_info->mcast_rx_count = test->mcast_rx_count - temp_reset.mcast_rx_count; + extra_info->mcast_tx_count = test->mcast_tx_count - temp_reset.mcast_tx_count; + extra_info->ucast_rx_count = test->ucast_rx_count - temp_reset.ucast_rx_count; + extra_info->ucast_tx_count = test->ucast_tx_count - temp_reset.ucast_tx_count; + extra_info->overrun_count = test->overrun_count - temp_reset.overrun_count; return status; } /****************************************************************** - * @fn int32_t wfx_rsi_reset_count() + * @fn int32_t wfx_rsi_reset_count(void) * @brief * Getting the driver reset count * @param[in] None * @return * status *********************************************************************/ -int32_t wfx_rsi_reset_count() +int32_t wfx_rsi_reset_count(void) { int32_t status; uint8_t buff[RSI_RESPONSE_MAX_SIZE] = { 0 }; status = rsi_wlan_get(RSI_WLAN_EXT_STATS, buff, sizeof(buff)); if (status != RSI_SUCCESS) { - SILABS_LOG("Failed, Error Code : 0x%lX", status); - } - else - { - rsi_wlan_ext_stats_t * test = (rsi_wlan_ext_stats_t *) buff; - temp_reset.beacon_lost_count = test->beacon_lost_count; - temp_reset.beacon_rx_count = test->beacon_rx_count; - temp_reset.mcast_rx_count = test->mcast_rx_count; - temp_reset.mcast_tx_count = test->mcast_tx_count; - temp_reset.ucast_rx_count = test->ucast_rx_count; - temp_reset.ucast_tx_count = test->ucast_tx_count; - temp_reset.overrun_count = test->overrun_count; + ChipLogError(DeviceLayer, "Failed, Error Code : 0x%lX", status); + return status; } + rsi_wlan_ext_stats_t * test = (rsi_wlan_ext_stats_t *) buff; + temp_reset.beacon_lost_count = test->beacon_lost_count; + temp_reset.beacon_rx_count = test->beacon_rx_count; + temp_reset.mcast_rx_count = test->mcast_rx_count; + temp_reset.mcast_tx_count = test->mcast_tx_count; + temp_reset.ucast_rx_count = test->ucast_rx_count; + temp_reset.ucast_tx_count = test->ucast_tx_count; + temp_reset.overrun_count = test->overrun_count; return status; } /****************************************************************** - * @fn wfx_rsi_disconnect() + * @fn wfx_rsi_disconnect(void) * @brief * Getting the driver disconnect status * @param[in] None * @return * status *********************************************************************/ -int32_t wfx_rsi_disconnect() +int32_t wfx_rsi_disconnect(void) { - int32_t status = rsi_wlan_disconnect(); - return status; + return rsi_wlan_disconnect(); } #if SL_ICD_ENABLED /****************************************************************** - * @fn wfx_rsi_power_save() + * @fn wfx_rsi_power_save(void) * @brief * Setting the RS911x in DTIM sleep based mode * @@ -253,14 +248,14 @@ int32_t wfx_rsi_disconnect() * @return * None *********************************************************************/ -int32_t wfx_rsi_power_save() +int32_t wfx_rsi_power_save(void) { int32_t status; #ifdef RSI_BLE_ENABLE status = rsi_bt_power_save_profile(RSI_SLEEP_MODE_2, RSI_MAX_PSP); if (status != RSI_SUCCESS) { - SILABS_LOG("BT Powersave Config Failed, Error Code : 0x%lX", status); + ChipLogError(DeviceLayer, "BT Powersave Config Failed, Error Code : 0x%lX", status); return status; } #endif /* RSI_BLE_ENABLE */ @@ -268,10 +263,10 @@ int32_t wfx_rsi_power_save() status = rsi_wlan_power_save_profile(RSI_SLEEP_MODE_2, RSI_MAX_PSP); if (status != RSI_SUCCESS) { - SILABS_LOG("Powersave Config Failed, Error Code : 0x%lX", status); + ChipLogError(DeviceLayer, "Powersave Config Failed, Error Code : 0x%lX", status); return status; } - SILABS_LOG("Powersave Config Success"); + ChipLogDetail(DeviceLayer, "Powersave Config Success"); return status; } #endif /* SL_ICD_ENABLED */ @@ -295,20 +290,19 @@ static void wfx_rsi_join_cb(uint16_t status, const uint8_t * buf, const uint16_t /* * We should enable retry.. (Need config variable for this) */ - SILABS_LOG("wfx_rsi_join_cb: failed. retry: %d", wfx_rsi.join_retries); + ChipLogProgress(DeviceLayer, "wfx_rsi_join_cb: failed. retry: %d", wfx_rsi.join_retries); wfx_retry_connection(++wfx_rsi.join_retries); + return; } - else - { - /* - * Join was complete - Do the DHCP - */ - memset(&temp_reset, 0, sizeof(wfx_wifi_scan_ext_t)); - SILABS_LOG("wfx_rsi_join_cb: join completed."); - WfxEvent.eventType = WFX_EVT_STA_CONN; - WfxPostEvent(&WfxEvent); - wfx_rsi.join_retries = 0; - } + + /* + * Join was complete - Do the DHCP + */ + ChipLogProgress(DeviceLayer, "wfx_rsi_join_cb: success"); + memset(&temp_reset, 0, sizeof(wfx_wifi_scan_ext_t)); + WfxEvent.eventType = WFX_EVT_STA_CONN; + WfxPostEvent(&WfxEvent); + wfx_rsi.join_retries = 0; } /****************************************************************** @@ -323,7 +317,7 @@ static void wfx_rsi_join_cb(uint16_t status, const uint8_t * buf, const uint16_t *********************************************************************/ static void wfx_rsi_join_fail_cb(uint16_t status, uint8_t * buf, uint32_t len) { - SILABS_LOG("wfx_rsi_join_fail_cb: error: failed status: %02x", status); + ChipLogError(DeviceLayer, "wfx_rsi_join_fail_cb: status: %d", status); WfxEvent_t WfxEvent; wfx_rsi.join_retries += 1; wfx_rsi.dev_state &= ~(WFX_RSI_ST_STA_CONNECTING | WFX_RSI_ST_STA_CONNECTED); @@ -363,30 +357,27 @@ static int32_t wfx_rsi_init(void) uint8_t buf[RSI_RESPONSE_HOLD_BUFF_SIZE]; extern void rsi_hal_board_init(void); - SILABS_LOG("wfx_rsi_init: starting(HEAP_SZ = %d)", SL_HEAP_SIZE); + ChipLogProgress(DeviceLayer, "wfx_rsi_init: starting(HEAP_SZ = %d)", SL_HEAP_SIZE); //! Driver initialization status = rsi_driver_init(wfx_rsi_drv_buf, WFX_RSI_BUF_SZ); if ((status < RSI_DRIVER_STATUS) || (status > WFX_RSI_BUF_SZ)) { - SILABS_LOG("wfx_rsi_init: error: RSI Driver initialization failed with status: %02x", status); + ChipLogError(DeviceLayer, "wfx_rsi_init: rsi_driver_init failed: %ld", status); return status; } - - SILABS_LOG("wfx_rsi_init: rsi_device_init", __func__); /* ! Redpine module intialisation */ if ((status = rsi_device_init(LOAD_NWP_FW)) != RSI_SUCCESS) { - SILABS_LOG("wfx_rsi_init: error: rsi_device_init failed with status: %02x", status); + ChipLogError(DeviceLayer, "wfx_rsi_init: rsi_device_init failed: %ld", status); return status; } - SILABS_LOG("wfx_rsi_init: start wireless drv task", __func__); /* * Create the driver wrapper thread */ sDrvThread = osThreadNew(rsi_wireless_driver_task_wrapper, NULL, &kDrvTaskAttr); if (NULL == sDrvThread) { - SILABS_LOG("wfx_rsi_init: error: rsi_wireless_driver_task failed", __func__); + ChipLogError(DeviceLayer, "wfx_rsi_init: failed to create task"); return RSI_ERROR_INVALID_PARAM; } @@ -397,41 +388,40 @@ static int32_t wfx_rsi_init(void) if ((status = rsi_wireless_init(OPER_MODE_0, COEX_MODE_0)) != RSI_SUCCESS) { #endif - SILABS_LOG("wfx_rsi_init: error: Initialize WiSeConnect failed with status: %02x", status); + ChipLogError(DeviceLayer, "wfx_rsi_init: rsi_wireless_init failed: %ld", status); return status; } - SILABS_LOG("wfx_rsi_init: get FW version..", __func__); /* * Get the MAC and other info to let the user know about it. */ if (rsi_wlan_get(RSI_FW_VERSION, buf, sizeof(buf)) != RSI_SUCCESS) { - SILABS_LOG("wfx_rsi_init: error: rsi_wlan_get(RSI_FW_VERSION) failed with status: %02x", status); + ChipLogError(DeviceLayer, "wfx_rsi_init: rsi_wlan_get(RSI_FW_VERSION) failed: %ld", status); return status; } buf[sizeof(buf) - 1] = 0; - SILABS_LOG("wfx_rsi_init: RSI firmware version: %s", buf); + ChipLogProgress(DeviceLayer, "RSI firmware version: %s", buf); //! Send feature frame if ((status = rsi_send_feature_frame()) != RSI_SUCCESS) { - SILABS_LOG("wfx_rsi_init: error: rsi_send_feature_frame failed with status: %02x", status); + ChipLogError(DeviceLayer, "error: rsi_send_feature_frame failed: %ld", status); return status; } - SILABS_LOG("wfx_rsi_init: sent rsi_send_feature_frame", __func__); /* initializes wlan radio parameters and WLAN supplicant parameters. */ (void) rsi_wlan_radio_init(); /* Required so we can get MAC address */ if ((status = rsi_wlan_get(RSI_MAC_ADDRESS, &wfx_rsi.sta_mac.octet[0], RESP_BUFF_SIZE)) != RSI_SUCCESS) { - SILABS_LOG("wfx_rsi_init: error: rsi_wlan_get failed with status: %02x", status); + ChipLogError(DeviceLayer, "wfx_rsi_init: rsi_wlan_get(RSI_MAC_ADDRESS) failed: %ld", status); return status; } - SILABS_LOG("wfx_rsi_init: WLAN: MAC %02x:%02x:%02x %02x:%02x:%02x", wfx_rsi.sta_mac.octet[0], wfx_rsi.sta_mac.octet[1], - wfx_rsi.sta_mac.octet[2], wfx_rsi.sta_mac.octet[3], wfx_rsi.sta_mac.octet[4], wfx_rsi.sta_mac.octet[5]); + ChipLogDetail(DeviceLayer, "wfx_rsi_init: MAC: %02x:%02x:%02x %02x:%02x:%02x", wfx_rsi.sta_mac.octet[0], + wfx_rsi.sta_mac.octet[1], wfx_rsi.sta_mac.octet[2], wfx_rsi.sta_mac.octet[3], wfx_rsi.sta_mac.octet[4], + wfx_rsi.sta_mac.octet[5]); // Create the message queue sWifiEventQueue = osMessageQueueNew(WFX_QUEUE_SIZE, sizeof(WfxEvent_t), NULL); @@ -453,12 +443,12 @@ static int32_t wfx_rsi_init(void) */ if ((status = rsi_wlan_register_callbacks(RSI_JOIN_FAIL_CB, wfx_rsi_join_fail_cb)) != RSI_SUCCESS) { - SILABS_LOG("wfx_rsi_init: RSI callback register join failed with status: %02x", status); + ChipLogError(DeviceLayer, "wfx_rsi_init: rsi_wlan_register_callbacks failed: %ld", status); return status; } if ((status = rsi_wlan_register_callbacks(RSI_WLAN_DATA_RECEIVE_NOTIFY_CB, wfx_rsi_wlan_pkt_cb)) != RSI_SUCCESS) { - SILABS_LOG("wfx_rsi_init: RSI callback register data-notify failed with status: %02x", status); + ChipLogError(DeviceLayer, "wfx_rsi_init: rsi_wlan_register_callbacks failed: %ld", status); return status; } @@ -467,26 +457,26 @@ static int32_t wfx_rsi_init(void) #endif wfx_rsi.dev_state |= WFX_RSI_ST_DEV_READY; - SILABS_LOG("wfx_rsi_init: RSI: OK", __func__); + ChipLogProgress(DeviceLayer, "wfx_rsi_init: success"); return RSI_SUCCESS; } /*************************************************************************************** - * @fn static void wfx_rsi_save_ap_info() + * @fn static void wfx_rsi_save_ap_info(void) * @brief * Saving the details of the AP * @param[in] None * @return * None *******************************************************************************************/ -static void wfx_rsi_save_ap_info() // translation +static void wfx_rsi_save_ap_info(void) // translation { int32_t status; rsi_rsp_scan_t rsp; status = rsi_wlan_scan_with_bitmap_options((int8_t *) &wfx_rsi.sec.ssid[0], AP_CHANNEL_NO_0, &rsp, sizeof(rsp), SCAN_BITMAP_OPTN_1); - if (status) + if (status != RSI_SUCCESS) { /* * Scan is done - failed @@ -496,7 +486,7 @@ static void wfx_rsi_save_ap_info() // translation #else /* !WIFI_ENABLE_SECURITY_WPA3_TRANSITION */ wfx_rsi.sec.security = WFX_SEC_WPA2; #endif /* WIFI_ENABLE_SECURITY_WPA3_TRANSITION */ - SILABS_LOG("wfx_rsi_save_ap_info: warn: failed with status: %02x", status); + ChipLogProgress(DeviceLayer, "warn: scan failed: %ld", status); return; } wfx_rsi.sec.security = WFX_SEC_UNSPECIFIED; @@ -532,8 +522,8 @@ static void wfx_rsi_save_ap_info() // translation break; } - SILABS_LOG("wfx_rsi_save_ap_info: WLAN: connecting to %s, sec=%d, status=%02x", &wfx_rsi.sec.ssid[0], wfx_rsi.sec.security, - status); + ChipLogProgress(DeviceLayer, "wfx_rsi_save_ap_info: connecting to %s, sec=%d, status=%ld", &wfx_rsi.sec.ssid[0], + wfx_rsi.sec.security, status); } /******************************************************************************************** @@ -550,58 +540,56 @@ static void wfx_rsi_do_join(void) if (wfx_rsi.dev_state & (WFX_RSI_ST_STA_CONNECTING | WFX_RSI_ST_STA_CONNECTED)) { - SILABS_LOG("wfx_rsi_do_join: not joining - already in progress"); + ChipLogProgress(DeviceLayer, "wfx_rsi_do_join: already in progress"); + return; } - else - { - switch (wfx_rsi.sec.security) - { - case WFX_SEC_WEP: - connect_security_mode = RSI_WEP; - break; - case WFX_SEC_WPA: - case WFX_SEC_WPA2: - connect_security_mode = RSI_WPA_WPA2_MIXED; - break; + switch (wfx_rsi.sec.security) + { + case WFX_SEC_WEP: + connect_security_mode = RSI_WEP; + break; + case WFX_SEC_WPA: + case WFX_SEC_WPA2: + connect_security_mode = RSI_WPA_WPA2_MIXED; + break; #if WIFI_ENABLE_SECURITY_WPA3_TRANSITION - case WFX_SEC_WPA3: - connect_security_mode = RSI_WPA3_PERSONAL_TRANSITION; - break; + case WFX_SEC_WPA3: + connect_security_mode = RSI_WPA3_PERSONAL_TRANSITION; + break; #endif // WIFI_ENABLE_SECURITY_WPA3_TRANSITION - case WFX_SEC_NONE: - connect_security_mode = RSI_OPEN; - break; - default: - SILABS_LOG("wfx_rsi_do_join: error: unknown security type."); - return; - } + case WFX_SEC_NONE: + connect_security_mode = RSI_OPEN; + break; + default: + ChipLogError(DeviceLayer, "wfx_rsi_do_join: error: unknown security type."); + return; + } - SILABS_LOG("wfx_rsi_do_join: WLAN: connecting to %s, sec=%d", &wfx_rsi.sec.ssid[0], wfx_rsi.sec.security); + ChipLogProgress(DeviceLayer, "wfx_rsi_do_join: connecting to %s, sec=%d", &wfx_rsi.sec.ssid[0], wfx_rsi.sec.security); - /* - * Join the network - */ - /* TODO - make the WFX_SECURITY_xxx - same as RSI_xxx - * Right now it's done by hand - we need something better - */ - wfx_rsi.dev_state |= WFX_RSI_ST_STA_CONNECTING; + /* + * Join the network + */ + /* TODO - make the WFX_SECURITY_xxx - same as RSI_xxx + * Right now it's done by hand - we need something better + */ + wfx_rsi.dev_state |= WFX_RSI_ST_STA_CONNECTING; - if ((status = rsi_wlan_register_callbacks(RSI_JOIN_FAIL_CB, wfx_rsi_join_fail_cb)) != RSI_SUCCESS) - { - SILABS_LOG("wfx_rsi_do_join: RSI callback register join failed with status: %02x", status); - } + if ((status = rsi_wlan_register_callbacks(RSI_JOIN_FAIL_CB, wfx_rsi_join_fail_cb)) != RSI_SUCCESS) + { + ChipLogError(DeviceLayer, "wfx_rsi_do_join: rsi_wlan_register_callbacks failed: %ld", status); + } - /* Try to connect Wifi with given Credentials - * untill there is a success or maximum number of tries allowed - */ - if ((status = rsi_wlan_connect_async((int8_t *) &wfx_rsi.sec.ssid[0], connect_security_mode, &wfx_rsi.sec.passkey[0], - wfx_rsi_join_cb)) != RSI_SUCCESS) - { - wfx_rsi.dev_state &= ~WFX_RSI_ST_STA_CONNECTING; - SILABS_LOG("wfx_rsi_do_join: rsi_wlan_connect_async failed with status: %02x on try %d", status, wfx_rsi.join_retries); - wfx_retry_connection(++wfx_rsi.join_retries); - } + /* Try to connect Wifi with given Credentials + * until there is a success or maximum number of tries allowed + */ + if ((status = rsi_wlan_connect_async((int8_t *) &wfx_rsi.sec.ssid[0], connect_security_mode, &wfx_rsi.sec.passkey[0], + wfx_rsi_join_cb)) != RSI_SUCCESS) + { + wfx_rsi.dev_state &= ~WFX_RSI_ST_STA_CONNECTING; + ChipLogProgress(DeviceLayer, "wfx_rsi_do_join: rsi_wlan_connect_async failed: %ld on try %d", status, wfx_rsi.join_retries); + wfx_retry_connection(++wfx_rsi.join_retries); } } @@ -609,7 +597,7 @@ static void wfx_rsi_do_join(void) * @brief Notify the application about the connectivity status if it has not been notified yet. * Helper function for HandleDHCPPolling. */ -void NotifyConnectivity() +void NotifyConnectivity(void) { if (!hasNotifiedWifiConnectivity) { @@ -618,7 +606,7 @@ void NotifyConnectivity() } } -void HandleDHCPPolling() +void HandleDHCPPolling(void) { struct netif * sta_netif; WfxEvent_t event; @@ -628,7 +616,7 @@ void HandleDHCPPolling() { // TODO: Notify the application that the interface is not set up or Chipdie here because we // are in an unkonwn state - SILABS_LOG("HandleDHCPPolling: failed to get STA netif"); + ChipLogError(DeviceLayer, "HandleDHCPPolling: failed to get STA netif"); return; } #if (CHIP_DEVICE_CONFIG_ENABLE_IPV4) @@ -662,7 +650,7 @@ void HandleDHCPPolling() * @brief Reset the flags that are used to notify the application about DHCP connectivity * and emits a WFX_EVT_STA_DO_DHCP event to trigger DHCP polling checks. Helper function for ProcessEvent. */ -void ResetDHCPNotificationFlags() +void ResetDHCPNotificationFlags(void) { WfxEvent_t outEvent; @@ -685,19 +673,27 @@ void WfxPostEvent(WfxEvent_t * event) if (status != osOK) { - SILABS_LOG("WfxPostEvent: failed to post event with status: %d", status); + ChipLogError(DeviceLayer, "WfxPostEvent: failed to post event with status: %ld", status); // TODO: Handle error, requeue event depending on queue size or notify relevant task, // Chipdie, etc. } } +/** + * @brief Process the Wi-Fi event. + * + * This function is responsible for processing different types of Wi-Fi events and taking appropriate actions based on the event + * type. + * + * @param inEvent The input Wi-Fi event to be processed. + */ void ProcessEvent(WfxEvent_t inEvent) { // Process event switch (inEvent.eventType) { case WFX_EVT_STA_CONN: { - SILABS_LOG("Starting LwIP STA"); + ChipLogDetail(DeviceLayer, "_onWFXEvent: WFX_EVT_STA_CONN"); wfx_rsi.dev_state |= WFX_RSI_ST_STA_CONNECTED; ResetDHCPNotificationFlags(); wfx_lwip_set_sta_link_up(); @@ -709,10 +705,10 @@ void ProcessEvent(WfxEvent_t inEvent) } break; case WFX_EVT_STA_DISCONN: { + ChipLogDetail(DeviceLayer, "_onWFXEvent: WFX_EVT_STA_DISCONN"); // TODO: This event is not being posted anywhere, seems to be a dead code or we are missing something wfx_rsi.dev_state &= ~(WFX_RSI_ST_STA_READY | WFX_RSI_ST_STA_CONNECTING | WFX_RSI_ST_STA_CONNECTED | WFX_RSI_ST_STA_DHCP_DONE); - SILABS_LOG("Disconnect notify"); /* TODO: Implement disconnect notify */ ResetDHCPNotificationFlags(); wfx_lwip_set_sta_link_down(); // Internally dhcpclient_poll(netif) -> @@ -732,48 +728,64 @@ void ProcessEvent(WfxEvent_t inEvent) case WFX_EVT_SCAN: { #ifdef SL_WFX_CONFIG_SCAN rsi_rsp_scan_t scan_rsp = { 0 }; - int32_t status = rsi_wlan_bgscan_profile(1, &scan_rsp, sizeof(scan_rsp)); + memset(&scan_rsp, 0, sizeof(scan_rsp)); + int32_t status = rsi_wlan_bgscan_profile(1, &scan_rsp, sizeof(scan_rsp)); - if (status) + if (status != RSI_SUCCESS) { - SILABS_LOG("SSID scan failed: %02x ", status); + ChipLogError(DeviceLayer, "rsi_wlan_bgscan failed: %ld ", status); + return; } - else + + if (wfx_rsi.scan_cb == NULL) + { + ChipLogError(DeviceLayer, "wfx_rsi.scan_cb is NULL"); + return; + } + + rsi_scan_info_t * scan; + wfx_wifi_scan_result_t ap; + + for (int x = 0; x < scan_rsp.scan_count[0]; x++) { - rsi_scan_info_t * scan; - wfx_wifi_scan_result_t ap; - for (int x = 0; x < scan_rsp.scan_count[0]; x++) + scan = &scan_rsp.scan_info[x]; + // clear structure and calculate size of SSID + memset(&ap, 0, sizeof(ap)); + ap.ssid_length = + strnlen(reinterpret_cast(scan->ssid), chip::min(sizeof(scan->ssid), WFX_MAX_SSID_LENGTH)); + chip::Platform::CopyString(ap.ssid, ap.ssid_length, reinterpret_cast(scan->ssid)); + + // check if the scanned ssid is the one we are looking for + if (wfx_rsi.scan_ssid_length != 0 && strncmp(wfx_rsi.scan_ssid, ap.ssid, WFX_MAX_SSID_LENGTH) != CMP_SUCCESS) { - scan = &scan_rsp.scan_info[x]; - // is it a scan all or target scan - if (wfx_rsi.scan_ssid != NULL && - (strncmp(wfx_rsi.scan_ssid, (char *) scan->ssid, MIN(strlen(wfx_rsi.scan_ssid), sizeof(scan->ssid))) == - CMP_SUCCESS)) - { - strncpy(ap.ssid, (char *) scan->ssid, MIN(sizeof(ap.ssid), sizeof(scan->ssid))); - ap.security = static_cast(scan->security_mode); - ap.rssi = (-1) * scan->rssi_val; - configASSERT(sizeof(ap.bssid) >= BSSID_LEN); - configASSERT(sizeof(scan->bssid) >= BSSID_LEN); - memcpy(ap.bssid, scan->bssid, BSSID_LEN); - (*wfx_rsi.scan_cb)(&ap); - - if (wfx_rsi.scan_ssid) - { - break; // we found the targeted ssid. - } - } + continue; // we found the targeted ssid. } + // TODO: convert security mode from RSI to WFX + ap.security = static_cast(scan->security_mode); + ap.rssi = (-1) * scan->rssi_val; + + configASSERT(sizeof(ap.bssid) == BSSID_LEN); + configASSERT(sizeof(scan->bssid) == BSSID_LEN); + memcpy(ap.bssid, scan->bssid, BSSID_LEN); + (*wfx_rsi.scan_cb)(&ap); + + // no ssid filter set, return all results + if (wfx_rsi.scan_ssid_length == 0) + { + continue; + } + + break; } /* Terminate with end of scan which is no ap sent back */ - (*wfx_rsi.scan_cb)((wfx_wifi_scan_result_t *) 0); - wfx_rsi.scan_cb = (void (*)(wfx_wifi_scan_result_t *)) 0; + (*wfx_rsi.scan_cb)((wfx_wifi_scan_result_t *) NULL); + wfx_rsi.scan_cb = nullptr; if (wfx_rsi.scan_ssid) { - vPortFree(wfx_rsi.scan_ssid); - wfx_rsi.scan_ssid = (char *) 0; + chip::Platform::MemoryFree(wfx_rsi.scan_ssid); + wfx_rsi.scan_ssid = NULL; } #endif /* SL_WFX_CONFIG_SCAN */ } @@ -819,14 +831,14 @@ void wfx_rsi_task(void * arg) uint32_t rsi_status = wfx_rsi_init(); if (rsi_status != RSI_SUCCESS) { - SILABS_LOG("wfx_rsi_task: error: wfx_rsi_init with status: %02x", rsi_status); + ChipLogError(DeviceLayer, "wfx_rsi_task: wfx_rsi_init failed: %ld", rsi_status); return; } WfxEvent_t wfxEvent; wfx_lwip_start(); wfx_started_notify(); - SILABS_LOG("Starting event loop"); + ChipLogProgress(DeviceLayer, "wfx_rsi_task: starting event loop"); for (;;) { osStatus_t status = osMessageQueueGet(sWifiEventQueue, &wfxEvent, NULL, osWaitForever); @@ -836,7 +848,7 @@ void wfx_rsi_task(void * arg) } else { - SILABS_LOG("Failed to get event with status: %x", status); + ChipLogProgress(DeviceLayer, "wfx_rsi_task: get event failed: %x", status); } } } @@ -859,8 +871,8 @@ void wfx_dhcp_got_ipv4(uint32_t ip) wfx_rsi.ip4_addr[1] = (ip >> 8) & HEX_VALUE_FF; wfx_rsi.ip4_addr[2] = (ip >> 16) & HEX_VALUE_FF; wfx_rsi.ip4_addr[3] = (ip >> 24) & HEX_VALUE_FF; - SILABS_LOG("wfx_dhcp_got_ipv4: DHCP OK: IP=%d.%d.%d.%d", wfx_rsi.ip4_addr[0], wfx_rsi.ip4_addr[1], wfx_rsi.ip4_addr[2], - wfx_rsi.ip4_addr[3]); + ChipLogProgress(DeviceLayer, "DHCP OK: IP=%d.%d.%d.%d", wfx_rsi.ip4_addr[0], wfx_rsi.ip4_addr[1], wfx_rsi.ip4_addr[2], + wfx_rsi.ip4_addr[3]); /* Notify the Connectivity Manager - via the app */ wfx_rsi.dev_state |= WFX_RSI_ST_STA_DHCP_DONE; wfx_ip_changed_notify(IP_STATUS_SUCCESS); @@ -875,14 +887,14 @@ void wfx_dhcp_got_ipv4(uint32_t ip) * see also: int32_t rsi_wlan_send_data_xx(uint8_t *buffer, uint32_t length) */ /******************************************************************************************** - * @fn void *wfx_rsi_alloc_pkt() + * @fn void *wfx_rsi_alloc_pkt(void) * @brief * Allocate packet to send data * @param[in] None * @return * None **********************************************************************************************/ -void * wfx_rsi_alloc_pkt() +void * wfx_rsi_alloc_pkt(void) { rsi_pkt_t * pkt; diff --git a/examples/platform/silabs/efr32/wf200/host_if.cpp b/examples/platform/silabs/efr32/wf200/host_if.cpp index 8247e385f61bcf..044ecc6e978cbd 100644 --- a/examples/platform/silabs/efr32/wf200/host_if.cpp +++ b/examples/platform/silabs/efr32/wf200/host_if.cpp @@ -42,6 +42,9 @@ #include "dhcp_client.h" #include "ethernetif.h" +#include +#include +#include #include using namespace ::chip; @@ -91,7 +94,7 @@ struct netif * sta_netif; wfx_wifi_provision_t wifi_provision; sl_wfx_get_counters_cnf_t * counters; sl_wfx_get_counters_cnf_t * Tempcounters; -#define PUT_COUNTER(name) SILABS_LOG("%-24s %lu\r\n", #name, (unsigned long) counters->body.count_##name); +#define PUT_COUNTER(name) ChipLogDetail(DeviceLayer, "%-24s %lu", #name, (unsigned long) counters->body.count_##name); bool hasNotifiedIPV6 = false; bool hasNotifiedIPV4 = false; @@ -108,6 +111,7 @@ static struct scan_result_holder static uint8_t scan_count = 0; static void (*scan_cb)(wfx_wifi_scan_result_t *); /* user-callback - when scan is done */ static char * scan_ssid; /* Which one are we scanning for */ +size_t scan_ssid_length = 0; static void sl_wfx_scan_result_callback(sl_wfx_scan_result_ind_body_t * scan_result); static void sl_wfx_scan_complete_callback(uint32_t status); #endif /* SL_WFX_CONFIG_SCAN */ @@ -133,7 +137,7 @@ extern uint32_t gOverrunCount; * @brief * Creates WFX events processing task. ******************************************************************************/ -static void wfx_events_task_start() +static void wfx_events_task_start(void) { /* create an event group to track Wi-Fi events */ sl_wfx_event_group = xEventGroupCreateStatic(&wfxEventGroup); @@ -142,7 +146,7 @@ static void wfx_events_task_start() wfxEventTaskStack, &wfxEventTaskBuffer); if (NULL == wfx_events_task_handle) { - SILABS_LOG("Failed to create WFX wfx_events"); + ChipLogError(DeviceLayer, "Failed to create WFX wfx_events"); } } @@ -159,7 +163,7 @@ sl_status_t sl_wfx_host_process_event(sl_wfx_generic_message_t * event_payload) { /******** INDICATION ********/ case SL_WFX_STARTUP_IND_ID: { - SILABS_LOG("WFX Startup Completed\r\n"); + ChipLogProgress(DeviceLayer, "startup completed."); PlatformMgrImpl().HandleWFXSystemEvent(WIFI_EVENT, event_payload); break; } @@ -237,34 +241,21 @@ sl_status_t sl_wfx_host_process_event(sl_wfx_generic_message_t * event_payload) } case SL_WFX_EXCEPTION_IND_ID: { sl_wfx_exception_ind_t * firmware_exception = (sl_wfx_exception_ind_t *) event_payload; - uint8_t * exception_tmp = (uint8_t *) firmware_exception; - SILABS_LOG("firmware exception\r\n"); - for (uint16_t i = 0; i < firmware_exception->header.length; i += 16) - { - SILABS_LOG("hif: %.8x:", i); - for (uint8_t j = 0; (j < 16) && ((i + j) < firmware_exception->header.length); j++) - { - SILABS_LOG(" %.2x", *exception_tmp); - exception_tmp++; - } - SILABS_LOG("\r\n"); - } + ChipLogError(DeviceLayer, "event: SL_WFX_EXCEPTION_IND_ID"); + ChipLogError(DeviceLayer, "firmware_exception->header.length: %d", firmware_exception->header.length); + // create a bytespan header.length with exception payload + ByteSpan exception_byte_span = ByteSpan((uint8_t *) firmware_exception, firmware_exception->header.length); + ChipLogByteSpan(DeviceLayer, exception_byte_span); break; } case SL_WFX_ERROR_IND_ID: { sl_wfx_error_ind_t * firmware_error = (sl_wfx_error_ind_t *) event_payload; - uint8_t * error_tmp = (uint8_t *) firmware_error; - SILABS_LOG("firmware error %lu\r\n", firmware_error->body.type); - for (uint16_t i = 0; i < firmware_error->header.length; i += 16) - { - SILABS_LOG("hif: %.8x:", i); - for (uint8_t j = 0; (j < 16) && ((i + j) < firmware_error->header.length); j++) - { - SILABS_LOG(" %.2x", *error_tmp); - error_tmp++; - } - SILABS_LOG("\r\n"); - } + ChipLogError(DeviceLayer, "event: SL_WFX_ERROR_IND_ID"); + ChipLogError(DeviceLayer, "firmware_error->type: %lu", firmware_error->body.type); + ChipLogError(DeviceLayer, "firmware_error->header.length: %d", firmware_error->header.length); + // create a bytespan header.length with error payload + ByteSpan error_byte_span = ByteSpan((uint8_t *) firmware_error, firmware_error->header.length); + ChipLogByteSpan(DeviceLayer, error_byte_span); break; } } @@ -282,28 +273,26 @@ static void sl_wfx_scan_result_callback(sl_wfx_scan_result_ind_body_t * scan_res { struct scan_result_holder * ap; - SILABS_LOG("# %2d %2d %03d %02X:%02X:%02X:%02X:%02X:%02X %s", scan_count, scan_result->channel, - ((int16_t) (scan_result->rcpi - 220) / 2), scan_result->mac[0], scan_result->mac[1], scan_result->mac[2], - scan_result->mac[3], scan_result->mac[4], scan_result->mac[5], scan_result->ssid_def.ssid); - /*Report one AP information*/ - SILABS_LOG("\r\n"); + ChipLogDetail(DeviceLayer, "# %2d %2d %03d %02X:%02X:%02X:%02X:%02X:%02X %s", scan_count, scan_result->channel, + ((int16_t) (scan_result->rcpi - 220) / 2), scan_result->mac[0], scan_result->mac[1], scan_result->mac[2], + scan_result->mac[3], scan_result->mac[4], scan_result->mac[5], scan_result->ssid_def.ssid); + /* Report one AP information */ /* don't save if filter only wants specific ssid */ - if (scan_ssid != (char *) 0) + if (scan_ssid != nullptr) { if (strcmp(scan_ssid, (char *) &scan_result->ssid_def.ssid[0]) != CMP_SUCCESS) return; } - if ((ap = (struct scan_result_holder *) pvPortMalloc(sizeof(*ap))) == (struct scan_result_holder *) 0) + if ((ap = (struct scan_result_holder *) (chip::Platform::MemoryAlloc(sizeof(*ap)))) == (struct scan_result_holder *) 0) { - SILABS_LOG("*ERR*Scan: No Mem"); + ChipLogError(DeviceLayer, "Scan: No Mem"); } else { ap->next = scan_save; scan_save = ap; /* Not checking if scan_result->ssid_length is < 33 */ - memcpy(ap->scan.ssid, scan_result->ssid_def.ssid, scan_result->ssid_def.ssid_length); - ap->scan.ssid[scan_result->ssid_def.ssid_length] = 0; /* make sure about null terminate */ + chip::Platform::CopyString(ap->scan.ssid, sizeof(ap->scan.ssid), (char *) &scan_result->ssid_def.ssid[0]); /* We do it in this order WPA3 first */ /* No EAP supported - Is this required */ ap->scan.security = WFX_SEC_UNSPECIFIED; @@ -363,7 +352,7 @@ static void sl_wfx_connect_callback(sl_wfx_connect_ind_body_t connect_indication switch (status) { case WFM_STATUS_SUCCESS: { - SILABS_LOG("STA-Connected\r\n"); + ChipLogProgress(DeviceLayer, "STA-Connected"); memcpy(&ap_mac.octet[0], mac, MAC_ADDRESS_FIRST_OCTET); sl_wfx_context->state = static_cast(static_cast(sl_wfx_context->state) | static_cast(SL_WFX_STA_INTERFACE_CONNECTED)); @@ -371,27 +360,27 @@ static void sl_wfx_connect_callback(sl_wfx_connect_ind_body_t connect_indication break; } case WFM_STATUS_NO_MATCHING_AP: { - SILABS_LOG("WFX Connection failed, access point not found\r\n"); + ChipLogError(DeviceLayer, "Connection failed, access point not found"); break; } case WFM_STATUS_CONNECTION_ABORTED: { - SILABS_LOG("WFX Connection aborted\r\n"); + ChipLogError(DeviceLayer, "Connection aborted"); break; } case WFM_STATUS_CONNECTION_TIMEOUT: { - SILABS_LOG("WFX Connection timeout\r\n"); + ChipLogError(DeviceLayer, "Connection timeout"); break; } case WFM_STATUS_CONNECTION_REJECTED_BY_AP: { - SILABS_LOG("WFX Connection rejected by the access point\r\n"); + ChipLogError(DeviceLayer, "Connection rejected by the access point"); break; } case WFM_STATUS_CONNECTION_AUTH_FAILURE: { - SILABS_LOG("WFX Connection authentication failure\r\n"); + ChipLogError(DeviceLayer, "Connection authentication failure"); break; } default: { - SILABS_LOG("WF Connection attempt error\r\n"); + ChipLogError(DeviceLayer, "Connection attempt error"); } } @@ -399,7 +388,7 @@ static void sl_wfx_connect_callback(sl_wfx_connect_ind_body_t connect_indication { retryJoin += 1; retryInProgress = false; - SILABS_LOG("WFX Retry to connect to network count: %d", retryJoin); + ChipLogProgress(DeviceLayer, "Retry to connect to network count: %d", retryJoin); sl_wfx_context->state = static_cast(static_cast(sl_wfx_context->state) & ~static_cast(SL_WFX_STARTED)); wfx_retry_connection(retryJoin); @@ -415,7 +404,7 @@ static void sl_wfx_connect_callback(sl_wfx_connect_ind_body_t connect_indication static void sl_wfx_disconnect_callback(uint8_t * mac, uint16_t reason) { (void) (mac); - SILABS_LOG("WFX Disconnected %d\r\n", reason); + ChipLogProgress(DeviceLayer, "Disconnected %d", reason); sl_wfx_context->state = static_cast(static_cast(sl_wfx_context->state) & ~static_cast(SL_WFX_STA_INTERFACE_CONNECTED)); retryInProgress = false; @@ -430,18 +419,10 @@ static void sl_wfx_disconnect_callback(uint8_t * mac, uint16_t reason) *****************************************************************************/ static void sl_wfx_start_ap_callback(uint32_t status) { - if (status == AP_START_SUCCESS) - { - SILABS_LOG("AP started\r\n"); - sl_wfx_context->state = - static_cast(static_cast(sl_wfx_context->state) | static_cast(SL_WFX_AP_INTERFACE_UP)); - xEventGroupSetBits(sl_wfx_event_group, SL_WFX_START_AP); - } - else - { - SILABS_LOG("AP start failed\r\n"); - strcpy(event_log, "AP start failed"); - } + VerifyOrReturnLogError(status == AP_START_SUCCESS, CHIP_ERROR_INTERNAL); + sl_wfx_context->state = + static_cast(static_cast(sl_wfx_context->state) | static_cast(SL_WFX_AP_INTERFACE_UP)); + xEventGroupSetBits(sl_wfx_event_group, SL_WFX_START_AP); } /**************************************************************************** @@ -452,7 +433,7 @@ static void sl_wfx_stop_ap_callback(void) { // TODO // dhcpserver_clear_stored_mac(); - SILABS_LOG("SoftAP stopped\r\n"); + ChipLogProgress(DeviceLayer, "SoftAP stopped"); sl_wfx_context->state = static_cast(static_cast(sl_wfx_context->state) & ~static_cast(SL_WFX_AP_INTERFACE_UP)); xEventGroupSetBits(sl_wfx_event_group, SL_WFX_STOP_AP); @@ -465,9 +446,8 @@ static void sl_wfx_stop_ap_callback(void) *****************************************************************************/ static void sl_wfx_client_connected_callback(uint8_t * mac) { - SILABS_LOG("Client connected, MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); - // TODO - SILABS_LOG("Open a web browser and go to http://%d.%d.%d.%d\r\n", ap_ip_addr0, ap_ip_addr1, ap_ip_addr2, ap_ip_addr3); + ChipLogProgress(DeviceLayer, "Client connected, MAC: %02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], + mac[5]); } /**************************************************************************** @@ -478,8 +458,8 @@ static void sl_wfx_client_connected_callback(uint8_t * mac) *****************************************************************************/ static void sl_wfx_ap_client_rejected_callback(uint32_t status, uint8_t * mac) { - SILABS_LOG("Client rejected, reason: %d, MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n", (int) status, mac[0], mac[1], mac[2], mac[3], - mac[4], mac[5]); + ChipLogError(DeviceLayer, "Client rejected, reason: %d, MAC: %02X:%02X:%02X:%02X:%02X:%02X", (int) status, mac[0], mac[1], + mac[2], mac[3], mac[4], mac[5]); } /**************************************************************************** @@ -490,9 +470,8 @@ static void sl_wfx_ap_client_rejected_callback(uint32_t status, uint8_t * mac) *****************************************************************************/ static void sl_wfx_ap_client_disconnected_callback(uint32_t status, uint8_t * mac) { - // TODO - SILABS_LOG("Client disconnected, reason: %d, MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n", (int) status, mac[0], mac[1], mac[2], - mac[3], mac[4], mac[5]); + ChipLogError(DeviceLayer, "Client disconnected, reason: %d, MAC: %02X:%02X:%02X:%02X:%02X:%02X", (int) status, mac[0], mac[1], + mac[2], mac[3], mac[4], mac[5]); } #endif /* SL_WFX_CONFIG_SOFTAP */ @@ -504,7 +483,6 @@ static void sl_wfx_ap_client_disconnected_callback(uint32_t status, uint8_t * ma static void sl_wfx_generic_status_callback(sl_wfx_generic_ind_t * frame) { (void) (frame); - SILABS_LOG("WFX Generic status received\r\n"); } /*************************************************************************** @@ -534,7 +512,7 @@ static void wfx_events_task(void * p_arg) pdTRUE, pdFALSE, pdMS_TO_TICKS(250)); /* 250 msec delay converted to ticks */ if (flags & SL_WFX_RETRY_CONNECT) { - SILABS_LOG("WFX sending the connect command"); + ChipLogProgress(DeviceLayer, "sending the connect command"); wfx_connect_to_ap(); } @@ -551,7 +529,7 @@ static void wfx_events_task(void * p_arg) hasNotifiedIPV4 = true; if (!hasNotifiedWifiConnectivity) { - SILABS_LOG("WIFI: Has Notified Wifi Connectivity"); + ChipLogProgress(DeviceLayer, "will notify WiFi connectivity"); wfx_connected_notify(CONNECTION_STATUS_SUCCESS, &ap_mac); hasNotifiedWifiConnectivity = true; } @@ -585,7 +563,7 @@ static void wfx_events_task(void * p_arg) wfx_ipv6_notify(GET_IPV6_FAIL); hasNotifiedIPV6 = false; hasNotifiedWifiConnectivity = false; - SILABS_LOG("WIFI: Connected to AP"); + ChipLogProgress(DeviceLayer, "connected to AP"); wifi_extra |= WE_ST_STA_CONN; retryJoin = 0; wfx_lwip_set_sta_link_up(); @@ -593,7 +571,7 @@ static void wfx_events_task(void * p_arg) if (!(wfx_get_wifi_state() & SL_WFX_AP_INTERFACE_UP)) { // Enable the power save - SILABS_LOG("WF200 going to DTIM based sleep"); + ChipLogProgress(DeviceLayer, "WF200 going to DTIM based sleep"); sl_wfx_set_power_mode(WFM_PM_MODE_DTIM, WFM_PM_POLL_FAST_PS, BEACON_1, 0 /*timeout*/); sl_wfx_enable_device_power_save(); } @@ -637,9 +615,10 @@ static void wfx_events_task(void * p_arg) sp = (sl_wfx_ssid_def_t *) 0; } - SILABS_LOG("WIFI Scan Paramter set to Active channel time %d, Passive " - "Channel Time: %d, Number of prob: %d", - ACTIVE_CHANNEL_TIME, PASSIVE_CHANNEL_TIME, NUM_PROBE_REQUEST); + ChipLogDetail(DeviceLayer, + "WIFI Scan Paramter set to Active channel time %d, Passive " + "Channel Time: %d, Number of prob: %d", + ACTIVE_CHANNEL_TIME, PASSIVE_CHANNEL_TIME, NUM_PROBE_REQUEST); (void) sl_wfx_set_scan_parameters(ACTIVE_CHANNEL_TIME, PASSIVE_CHANNEL_TIME, NUM_PROBE_REQUEST); (void) sl_wfx_send_scan_command(WFM_SCAN_MODE_ACTIVE, CHANNEL_LIST, /* Channel list */ CHANNEL_COUNT, /* Scan all chans */ @@ -650,20 +629,20 @@ static void wfx_events_task(void * p_arg) { struct scan_result_holder *hp, *next; - SILABS_LOG("WIFI: Return %d scan results", scan_count); + ChipLogDetail(DeviceLayer, "WIFI: Return %d scan results", scan_count); for (hp = scan_save; hp; hp = next) { next = hp->next; (*scan_cb)(&hp->scan); - vPortFree(hp); + chip::Platform::MemoryFree(hp); } (*scan_cb)((wfx_wifi_scan_result *) 0); scan_save = (struct scan_result_holder *) 0; scan_count = 0; if (scan_ssid) { - vPortFree(scan_ssid); - scan_ssid = (char *) 0; + chip::Platform::MemoryFree(scan_ssid); + scan_ssid = NULL; } /* Terminate scan */ scan_cb = 0; @@ -681,15 +660,15 @@ static sl_status_t wfx_init(void) /* Initialize the WF200 used by the two interfaces */ wfx_events_task_start(); sl_status_t status = sl_wfx_init(&wifiContext); - SILABS_LOG("FMAC Driver version %s", FMAC_DRIVER_VERSION_STRING); + ChipLogProgress(DeviceLayer, "FMAC Driver version: %s", FMAC_DRIVER_VERSION_STRING); switch (status) { case SL_STATUS_OK: - SILABS_LOG("WF200 FW ver:%d.%d.%d [MAC %02x:%02x:%02x-%02x:%02x:%02x]", wifiContext.firmware_major, - wifiContext.firmware_minor, wifiContext.firmware_build, wifiContext.mac_addr_0.octet[0], - wifiContext.mac_addr_0.octet[1], wifiContext.mac_addr_0.octet[2], wifiContext.mac_addr_0.octet[3], - wifiContext.mac_addr_0.octet[4], wifiContext.mac_addr_0.octet[5]); - SILABS_LOG("WF200 Init OK"); + ChipLogProgress(DeviceLayer, "WF200 FW ver:%d.%d.%d [MAC %02x:%02x:%02x-%02x:%02x:%02x]", wifiContext.firmware_major, + wifiContext.firmware_minor, wifiContext.firmware_build, wifiContext.mac_addr_0.octet[0], + wifiContext.mac_addr_0.octet[1], wifiContext.mac_addr_0.octet[2], wifiContext.mac_addr_0.octet[3], + wifiContext.mac_addr_0.octet[4], wifiContext.mac_addr_0.octet[5]); + ChipLogProgress(DeviceLayer, "WF200 Init OK"); if (wifiContext.state == SL_WFX_STA_INTERFACE_CONNECTED) { @@ -698,19 +677,19 @@ static sl_status_t wfx_init(void) break; case SL_STATUS_WIFI_INVALID_KEY: - SILABS_LOG("*ERR*WF200: F/W keyset invalid"); + ChipLogError(DeviceLayer, "WF200: F/W keyset invalid"); break; case SL_STATUS_WIFI_FIRMWARE_DOWNLOAD_TIMEOUT: - SILABS_LOG("*ERR*WF200: F/W download timo"); + ChipLogError(DeviceLayer, "WF200: F/W download timo"); break; case SL_STATUS_TIMEOUT: - SILABS_LOG("*ERR*WF200: Poll for value timo"); + ChipLogError(DeviceLayer, "WF200: Poll for value timo"); break; case SL_STATUS_FAIL: - SILABS_LOG("*ERR*WF200: Error"); + ChipLogError(DeviceLayer, "WF200: Error"); break; default: - SILABS_LOG("*ERR*WF200: Unknown"); + ChipLogError(DeviceLayer, "WF200: Unknown"); } return status; @@ -728,22 +707,22 @@ static void wfx_wifi_hw_start(void) if (wifi_extra & WE_ST_HW_STARTED) return; - SILABS_LOG("STARTING WF200\n"); + ChipLogDetail(DeviceLayer, "STARTING WF200"); wifi_extra |= WE_ST_HW_STARTED; sl_wfx_host_gpio_init(); if ((status = wfx_init()) == SL_STATUS_OK) { /* Initialize the LwIP stack */ - SILABS_LOG("WF200:Start LWIP"); + ChipLogDetail(DeviceLayer, "WF200:Start LWIP"); wfx_lwip_start(); wfx_started_notify(); wifiContext.state = SL_WFX_STARTED; /* Really this is a bit mask */ - SILABS_LOG("WF200:ready.."); + ChipLogDetail(DeviceLayer, "WF200:ready.."); } else { - SILABS_LOG("*ERR*WF200:init failed"); + ChipLogError(DeviceLayer, "WF200:init failed"); } } @@ -756,23 +735,22 @@ static void wfx_wifi_hw_start(void) int32_t wfx_get_ap_info(wfx_wifi_scan_result_t * ap) { int32_t signal_strength; - SILABS_LOG("WIFI:SSID:: %s", &ap_info.ssid[0]); - memcpy(ap->ssid, ap_info.ssid, sizeof(ap_info.ssid)); - SILABS_LOG("WIFI:Mac addr:: %02x:%02x:%02x:%02x:%02x:%02x", ap_info.bssid[0], ap_info.bssid[1], ap_info.bssid[2], - ap_info.bssid[3], ap_info.bssid[4], ap_info.bssid[5]); + + ap->ssid_length = strnlen(ap_info.ssid, chip::min(sizeof(ap_info.ssid), WFX_MAX_SSID_LENGTH)); + chip::Platform::CopyString(ap->ssid, ap->ssid_length, ap_info.ssid); memcpy(ap->bssid, ap_info.bssid, sizeof(ap_info.bssid)); ap->security = ap_info.security; - SILABS_LOG("WIFI:security:: %d", ap->security); - ap->chan = ap_info.chan; - SILABS_LOG("WIFI:Channel:: to %d", ap->chan); + ap->chan = ap_info.chan; + ChipLogDetail(DeviceLayer, "WIFI:SSID :: %s", &ap_info.ssid[0]); + ChipLogDetail(DeviceLayer, "WIFI:BSSID :: %02x:%02x:%02x:%02x:%02x:%02x", ap_info.bssid[0], ap_info.bssid[1], + ap_info.bssid[2], ap_info.bssid[3], ap_info.bssid[4], ap_info.bssid[5]); + ChipLogDetail(DeviceLayer, "WIFI:security :: %d", ap->security); + ChipLogDetail(DeviceLayer, "WIFI:channel :: %d", ap->chan); sl_status_t status = sl_wfx_get_signal_strength((uint32_t *) &signal_strength); - - if (status == SL_STATUS_OK) - { - SILABS_LOG("status SL_STATUS_OK & signal_strength:: %d", signal_strength); - ap->rssi = (signal_strength - 220) / 2; - } + VerifyOrReturnError(status == SL_STATUS_OK, status); + ChipLogDetail(DeviceLayer, "signal_strength: %ld", signal_strength); + ap->rssi = (signal_strength - 220) / 2; return status; } @@ -788,7 +766,7 @@ int32_t wfx_get_ap_ext(wfx_wifi_scan_ext_t * extra_info) status = get_all_counters(); if (status != SL_STATUS_OK) { - SILABS_LOG("Failed to get the couters"); + ChipLogError(DeviceLayer, "Failed to get the couters"); } else { @@ -808,15 +786,13 @@ sl_status_t get_all_counters(void) sl_status_t result; uint8_t command_id = 0x05; uint16_t mib_id = 0x2035; - sl_wfx_mib_req_t * request = NULL; + sl_wfx_mib_req_t * request = nullptr; uint32_t request_length = SL_WFX_ROUND_UP_EVEN(sizeof(sl_wfx_header_mib_t) + sizeof(sl_wfx_mib_req_body_t)); result = sl_wfx_allocate_command_buffer((sl_wfx_generic_message_t **) &request, command_id, SL_WFX_CONTROL_BUFFER, request_length); - if (request == NULL) - { - } + VerifyOrReturnError(request != nullptr, SL_STATUS_NULL_POINTER); request->body.mib_id = mib_id; request->header.interface = 0x2; @@ -828,8 +804,8 @@ sl_status_t get_all_counters(void) result = sl_wfx_host_wait_for_confirmation(command_id, SL_WFX_DEFAULT_REQUEST_TIMEOUT_MS, (void **) &counters); SL_WFX_ERROR_CHECK(result); - SILABS_LOG("%-24s %12s \r\n", "", "Debug Counters Content"); - SILABS_LOG("%-24s %lu\r\n", "rcpi", (unsigned long) counters->body.rcpi); + ChipLogDetail(DeviceLayer, "%-24s %12s ", "", "Debug Counters Content"); + ChipLogDetail(DeviceLayer, "%-24s %lu", "rcpi", (unsigned long) counters->body.rcpi); PUT_COUNTER(plcp_errors); PUT_COUNTER(fcs_errors); PUT_COUNTER(tx_packets); @@ -865,7 +841,7 @@ sl_status_t get_all_counters(void) sl_wfx_context->used_buffers--; } } - if (request != NULL) + if (request != nullptr) { sl_wfx_free_command_buffer((sl_wfx_generic_message_t *) request, command_id, SL_WFX_CONTROL_BUFFER); } @@ -878,7 +854,7 @@ sl_status_t get_all_counters(void) * reset the count * @return returns -1 **************************************************************************/ -int32_t wfx_reset_counts() +int32_t wfx_reset_counts(void) { /* TODO */ return -1; @@ -893,7 +869,7 @@ sl_status_t wfx_wifi_start(void) { if (wifi_extra & WE_ST_STARTED) { - SILABS_LOG("WIFI: Already started"); + ChipLogDetail(DeviceLayer, "WIFI: Already started"); return SL_STATUS_OK; } wifi_extra |= WE_ST_STARTED; @@ -921,7 +897,7 @@ sl_wfx_state_t wfx_get_wifi_state(void) *****************************************************************************/ struct netif * wfx_GetNetif(sl_wfx_interface_t interface) { - struct netif * SelectedNetif = NULL; + struct netif * SelectedNetif = nullptr; if (interface == SL_WFX_STA_INTERFACE) { SelectedNetif = sta_netif; @@ -955,10 +931,10 @@ sl_wfx_mac_address_t wfx_get_wifi_mac_addr(sl_wfx_interface_t interface) *****************************************************************************/ void wfx_set_wifi_provision(wfx_wifi_provision_t * wifiConfig) { - memcpy(wifi_provision.ssid, wifiConfig->ssid, sizeof(wifiConfig->ssid)); - memcpy(wifi_provision.passkey, wifiConfig->passkey, sizeof(wifiConfig->passkey)); + Platform::CopyString(wifi_provision.ssid, sizeof(wifi_provision.ssid), wifiConfig->ssid); + Platform::CopyString(wifi_provision.passkey, sizeof(wifi_provision.passkey), wifiConfig->passkey); wifi_provision.security = wifiConfig->security; - SILABS_LOG("WIFI: Provision SSID=%s", &wifi_provision.ssid[0]); + ChipLogProgress(DeviceLayer, "WIFI: Provision SSID=%s", &wifi_provision.ssid[0]); } /**************************************************************************** @@ -970,12 +946,8 @@ void wfx_set_wifi_provision(wfx_wifi_provision_t * wifiConfig) *****************************************************************************/ bool wfx_get_wifi_provision(wfx_wifi_provision_t * wifiConfig) { - if (wifiConfig == NULL) - { - return false; - } + VerifyOrReturnError(wifiConfig != nullptr, false); memcpy(wifiConfig, &wifi_provision, sizeof(wfx_wifi_provision_t)); - return true; } @@ -1012,15 +984,13 @@ sl_status_t wfx_connect_to_ap(void) sl_status_t result; sl_wfx_security_mode_t connect_security_mode; - if (wifi_provision.ssid[0] == 0) - { - return SL_STATUS_NOT_AVAILABLE; - } - SILABS_LOG("WIFI:JOIN to %s", &wifi_provision.ssid[0]); + VerifyOrReturnError(wifi_provision.ssid[0], SL_STATUS_NOT_AVAILABLE); + ChipLogDetail(DeviceLayer, "WIFI:JOIN to %s", &wifi_provision.ssid[0]); - SILABS_LOG("WIFI Scan Paramter set to Active channel time %d, Passive Channel " - "Time: %d, Number of prob: %d", - ACTIVE_CHANNEL_TIME, PASSIVE_CHANNEL_TIME, NUM_PROBE_REQUEST); + ChipLogDetail(DeviceLayer, + "WIFI Scan Paramter set to Active channel time %d, Passive Channel " + "Time: %d, Number of prob: %d", + ACTIVE_CHANNEL_TIME, PASSIVE_CHANNEL_TIME, NUM_PROBE_REQUEST); (void) sl_wfx_set_scan_parameters(ACTIVE_CHANNEL_TIME, PASSIVE_CHANNEL_TIME, NUM_PROBE_REQUEST); switch (wifi_provision.security) { @@ -1038,7 +1008,7 @@ sl_status_t wfx_connect_to_ap(void) connect_security_mode = sl_wfx_security_mode_e::WFM_SECURITY_MODE_OPEN; break; default: - SILABS_LOG("%s: error: unknown security type."); + ChipLogError(DeviceLayer, "error: unknown security type."); return SL_STATUS_INVALID_STATE; } result = sl_wfx_send_join_command((uint8_t *) wifi_provision.ssid, strlen(wifi_provision.ssid), NULL, CHANNEL_0, @@ -1064,8 +1034,8 @@ void wfx_get_wifi_mac_addr(sl_wfx_interface_t interface, sl_wfx_mac_address_t * mac = &wifiContext.mac_addr_0; #endif *addr = *mac; - SILABS_LOG("WLAN:Get WiFi Mac addr %02x:%02x:%02x:%02x:%02x:%02x", mac->octet[0], mac->octet[1], mac->octet[2], mac->octet[3], - mac->octet[4], mac->octet[5]); + ChipLogDetail(DeviceLayer, "WLAN:Get WiFi Mac addr %02x:%02x:%02x:%02x:%02x:%02x", mac->octet[0], mac->octet[1], mac->octet[2], + mac->octet[3], mac->octet[4], mac->octet[5]); memcpy(&ap_info.bssid[0], &mac->octet[0], 6); } @@ -1078,14 +1048,8 @@ void wfx_get_wifi_mac_addr(sl_wfx_interface_t interface, sl_wfx_mac_address_t * *****************************************************************************/ bool wfx_have_ipv4_addr(sl_wfx_interface_t which_if) { - if (which_if == SL_WFX_STA_INTERFACE) - { - return (sta_ip == STA_IP_FAIL) ? false : true; - } - else - { - return false; /* TODO */ - } + VerifyOrReturnError(which_if == SL_WFX_STA_INTERFACE, false); + return (sta_ip == STA_IP_FAIL) ? false : true; } /**************************************************************************** @@ -1097,18 +1061,8 @@ bool wfx_have_ipv4_addr(sl_wfx_interface_t which_if) *****************************************************************************/ bool wfx_have_ipv6_addr(sl_wfx_interface_t which_if) { - SILABS_LOG("%s: started.", __func__); - bool status = false; - if (which_if == SL_WFX_STA_INTERFACE) - { - status = wfx_is_sta_connected(); - } - else - { - status = false; /* TODO */ - } - SILABS_LOG("%s: status: %d", __func__, status); - return status; + VerifyOrReturnError(which_if == SL_WFX_STA_INTERFACE, false); + return wfx_is_sta_connected(); } /**************************************************************************** @@ -1119,7 +1073,7 @@ bool wfx_have_ipv6_addr(sl_wfx_interface_t which_if) *****************************************************************************/ sl_status_t wfx_sta_discon(void) { - SILABS_LOG("STA-Disconnecting"); + ChipLogProgress(DeviceLayer, "STA-Disconnecting"); int32_t status = sl_wfx_send_disconnect_command(); wifi_extra &= ~WE_ST_STA_CONN; xEventGroupSetBits(sl_wfx_event_group, SL_WFX_RETRY_CONNECT); @@ -1145,11 +1099,7 @@ bool wfx_is_sta_mode_enabled(void) bool wfx_is_sta_connected(void) { bool val; - val = (wifi_extra & WE_ST_STA_CONN) ? true : false; - - SILABS_LOG("WLAN: STA %s connected", (val ? "IS" : "NOT")); - return val; } @@ -1159,10 +1109,7 @@ bool wfx_is_sta_connected(void) * @return returns true if sucessful, * false otherwise *****************************************************************************/ -void wfx_setup_ip6_link_local(sl_wfx_interface_t whichif) -{ - SILABS_LOG("Setup-IP6: TODO"); /* It is automatically done when lwip link up */ -} +void wfx_setup_ip6_link_local(sl_wfx_interface_t whichif) {} /**************************************************************************** * @brief @@ -1170,7 +1117,7 @@ void wfx_setup_ip6_link_local(sl_wfx_interface_t whichif) * @return returns WIFI_MODE_NULL if sucessful, * WIFI_MODE_STA otherwise *****************************************************************************/ -wifi_mode_t wfx_get_wifi_mode() +wifi_mode_t wfx_get_wifi_mode(void) { if (wifiContext.state & SL_WFX_STARTED) return WIFI_MODE_STA; @@ -1234,22 +1181,16 @@ void wfx_enable_sta_mode(void) #ifdef SL_WFX_CONFIG_SCAN bool wfx_start_scan(char * ssid, void (*callback)(wfx_wifi_scan_result_t *)) { - int sz; - - if (scan_cb) - return false; /* Already in progress */ + VerifyOrReturnError(scan_cb != nullptr, false); if (ssid) { - sz = strlen(ssid); - if ((scan_ssid = (char *) pvPortMalloc(sz + 1)) == (char *) 0) - { - return false; - } - strcpy(scan_ssid, ssid); + scan_ssid_length = strnlen(ssid, WFX_MAX_SSID_LENGTH); + scan_ssid = reinterpret_cast(chip::Platform::MemoryAlloc(scan_ssid_length)); + VerifyOrReturnError(scan_ssid != nullptr, false); + Platform::CopyString(scan_ssid, scan_ssid_length, ssid); } scan_cb = callback; xEventGroupSetBits(sl_wfx_event_group, SL_WFX_SCAN_START); - return true; } @@ -1261,23 +1202,20 @@ void wfx_cancel_scan(void) { struct scan_result_holder *hp, *next; /* Not possible */ - if (!scan_cb) - { - return; - } + VerifyOrReturn(scan_cb != nullptr); sl_wfx_send_stop_scan_command(); for (hp = scan_save; hp; hp = next) { next = hp->next; - vPortFree(hp); + chip::Platform::MemoryFree(hp); } scan_save = (struct scan_result_holder *) 0; scan_count = 0; if (scan_ssid) { - vPortFree(scan_ssid); - scan_ssid = (char *) 0; + chip::Platform::MemoryFree(scan_ssid); + scan_ssid = nullptr; } - scan_cb = 0; + scan_cb = nullptr; } #endif /* SL_WFX_CONFIG_SCAN */ diff --git a/examples/platform/silabs/wfx_rsi.h b/examples/platform/silabs/wfx_rsi.h index 5e7358e0d02cb1..0e62cb78029a79 100644 --- a/examples/platform/silabs/wfx_rsi.h +++ b/examples/platform/silabs/wfx_rsi.h @@ -77,6 +77,7 @@ typedef struct wfx_rsi_s #ifdef SL_WFX_CONFIG_SCAN void (*scan_cb)(wfx_wifi_scan_result_t *); char * scan_ssid; /* Which one are we scanning for */ + size_t scan_ssid_length; #endif #ifdef SL_WFX_CONFIG_SOFTAP sl_wfx_mac_address_t softap_mac; diff --git a/examples/platform/silabs/wifi/wfx_notify.cpp b/examples/platform/silabs/wifi/wfx_notify.cpp index e1d3c81abf8504..de1becacb33b30 100644 --- a/examples/platform/silabs/wifi/wfx_notify.cpp +++ b/examples/platform/silabs/wifi/wfx_notify.cpp @@ -60,13 +60,13 @@ static void RetryConnectionTimerHandler(void * arg) } } /*********************************************************************************** - * @fn wfx_started_notify() + * @fn wfx_started_notify(void) * @brief * Wifi device started notification * @param[in]: None * @return None *************************************************************************************/ -void wfx_started_notify() +void wfx_started_notify(void) { sl_wfx_startup_ind_t evt; sl_wfx_mac_address_t mac; diff --git a/examples/platform/silabs/wifi/wfx_rsi_host.cpp b/examples/platform/silabs/wifi/wfx_rsi_host.cpp index 921ec82587fe77..130d9c90d19817 100644 --- a/examples/platform/silabs/wifi/wfx_rsi_host.cpp +++ b/examples/platform/silabs/wifi/wfx_rsi_host.cpp @@ -15,16 +15,20 @@ * limitations under the License. */ -#include "stdbool.h" +#include #include #include #include #include "FreeRTOS.h" #include "event_groups.h" -#include "silabs_utils.h" -#include "sl_status.h" #include "task.h" + +#include +#include +#include +#include + #include "wfx_host_events.h" #include "wfx_rsi.h" @@ -54,22 +58,15 @@ constexpr osThreadAttr_t kWlanTaskAttr = { .name = "wlan_rsi", ***********************************************************************/ sl_status_t wfx_wifi_start(void) { - if (wfx_rsi.dev_state & WFX_RSI_ST_STARTED) - { - return SL_STATUS_OK; - } - + VerifyOrReturnError(!(wfx_rsi.dev_state & WFX_RSI_ST_STARTED), SL_STATUS_OK); wfx_rsi.dev_state |= WFX_RSI_ST_STARTED; - SILABS_LOG("%s: starting..", __func__); - /* - * Create the Wifi driver task - */ // Creating a Wi-Fi driver thread sWlanThread = osThreadNew(wfx_rsi_task, NULL, &kWlanTaskAttr); VerifyOrReturnError(sWlanThread != NULL, SL_STATUS_FAIL); + ChipLogProgress(DeviceLayer, "wfx_rsi_task created successfully"); return SL_STATUS_OK; } @@ -110,14 +107,12 @@ bool wfx_is_sta_mode_enabled(void) ***********************************************************************/ void wfx_get_wifi_mac_addr(sl_wfx_interface_t interface, sl_wfx_mac_address_t * addr) { - if (addr) - { + VerifyOrReturn(addr != nullptr); #ifdef SL_WFX_CONFIG_SOFTAP - *addr = (interface == SL_WFX_SOFTAP_INTERFACE) ? wfx_rsi.softap_mac : wfx_rsi.sta_mac; + *addr = (interface == SL_WFX_SOFTAP_INTERFACE) ? wfx_rsi.softap_mac : wfx_rsi.sta_mac; #else - *addr = wfx_rsi.sta_mac; + *addr = wfx_rsi.sta_mac; #endif - } } /********************************************************************* @@ -130,11 +125,9 @@ void wfx_get_wifi_mac_addr(sl_wfx_interface_t interface, sl_wfx_mac_address_t * ***********************************************************************/ void wfx_set_wifi_provision(wfx_wifi_provision_t * cfg) { - if (cfg) - { - wfx_rsi.sec = *cfg; - wfx_rsi.dev_state |= WFX_RSI_ST_STA_PROVISIONED; - } + VerifyOrReturn(cfg != nullptr); + wfx_rsi.sec = *cfg; + wfx_rsi.dev_state |= WFX_RSI_ST_STA_PROVISIONED; } /********************************************************************* @@ -147,15 +140,10 @@ void wfx_set_wifi_provision(wfx_wifi_provision_t * cfg) ***********************************************************************/ bool wfx_get_wifi_provision(wfx_wifi_provision_t * wifiConfig) { - if (wifiConfig != NULL) - { - if (wfx_rsi.dev_state & WFX_RSI_ST_STA_PROVISIONED) - { - *wifiConfig = wfx_rsi.sec; - return true; - } - } - return false; + VerifyOrReturnError(wifiConfig != nullptr, false); + VerifyOrReturnError(wfx_rsi.dev_state & WFX_RSI_ST_STA_PROVISIONED, false); + *wifiConfig = wfx_rsi.sec; + return true; } /********************************************************************* @@ -169,7 +157,7 @@ void wfx_clear_wifi_provision(void) { memset(&wfx_rsi.sec, 0, sizeof(wfx_rsi.sec)); wfx_rsi.dev_state &= ~WFX_RSI_ST_STA_PROVISIONED; - SILABS_LOG("%s: completed.", __func__); + ChipLogProgress(DeviceLayer, "Clear WiFi Provision"); } /************************************************************************* @@ -177,30 +165,25 @@ void wfx_clear_wifi_provision(void) * @brief * Start a JOIN command to the AP - Done by the wfx_rsi task * @param[in] None - * @return returns SL_STATUS_OK if successful, - * SL_STATUS_INVALID_CONFIGURATION otherwise + * @return returns SL_STATUS_OK if successful ****************************************************************************/ sl_status_t wfx_connect_to_ap(void) { + VerifyOrReturnError(wfx_rsi.dev_state & WFX_RSI_ST_STA_PROVISIONED, SL_STATUS_INVALID_CONFIGURATION); + VerifyOrReturnError(wfx_rsi.sec.ssid_length, SL_STATUS_INVALID_CREDENTIALS); + VerifyOrReturnError(wfx_rsi.sec.ssid_length <= WFX_MAX_SSID_LENGTH, SL_STATUS_HAS_OVERFLOWED); + ChipLogProgress(DeviceLayer, "connect to access point: %s", wfx_rsi.sec.ssid); WfxEvent_t event; - if (wfx_rsi.dev_state & WFX_RSI_ST_STA_PROVISIONED) - { - SILABS_LOG("Connecting to access point -> SSID: %s", &wfx_rsi.sec.ssid[0]); - event.eventType = WFX_EVT_STA_START_JOIN; - WfxPostEvent(&event); - } - else - { - SILABS_LOG("Error: access point not provisioned."); - return SL_STATUS_INVALID_CONFIGURATION; - } + event.eventType = WFX_EVT_STA_START_JOIN; + WfxPostEvent(&event); return SL_STATUS_OK; } #if SL_ICD_ENABLED #if SLI_SI917 /********************************************************************* - * @fn sl_status_t wfx_power_save() + * @fn sl_status_t wfx_power_save(rsi_power_save_profile_mode_t sl_si91x_ble_state, sl_si91x_performance_profile_t + sl_si91x_wifi_state) * @brief * Implements the power save in sleepy application * @param[in] sl_si91x_ble_state : State to set for the BLE @@ -214,14 +197,14 @@ sl_status_t wfx_power_save(rsi_power_save_profile_mode_t sl_si91x_ble_state, sl_ } #else // For RS9116 /********************************************************************* - * @fn sl_status_t wfx_power_save() + * @fn sl_status_t wfx_power_save(void) * @brief * Implements the power save in sleepy application * @param[in] None * @return SL_STATUS_OK if successful, * SL_STATUS_FAIL otherwise ***********************************************************************/ -sl_status_t wfx_power_save() +sl_status_t wfx_power_save(void) { return (wfx_rsi_power_save() ? SL_STATUS_FAIL : SL_STATUS_OK); } @@ -241,7 +224,6 @@ void wfx_setup_ip6_link_local(sl_wfx_interface_t whichif) * TODO: Implement IPV6 setup, currently in wfx_rsi_task() * This is hooked with MATTER code. */ - SILABS_LOG("%s: warning: not implemented.", __func__); } /********************************************************************* @@ -255,19 +237,18 @@ void wfx_setup_ip6_link_local(sl_wfx_interface_t whichif) bool wfx_is_sta_connected(void) { bool status = (wfx_rsi.dev_state & WFX_RSI_ST_STA_CONNECTED) > 0; - SILABS_LOG("%s: %s", __func__, (status ? "Connected" : "Disconnected")); return status; } /********************************************************************* - * @fn wifi_mode_t wfx_get_wifi_mode() + * @fn wifi_mode_t wfx_get_wifi_mode(void) * @brief * get the wifi mode * @param[in] None * @return return WIFI_MODE_NULL if successful, * WIFI_MODE_STA otherwise ***********************************************************************/ -wifi_mode_t wfx_get_wifi_mode() +wifi_mode_t wfx_get_wifi_mode(void) { if (wfx_rsi.dev_state & WFX_RSI_ST_DEV_READY) return WIFI_MODE_STA; @@ -284,11 +265,9 @@ wifi_mode_t wfx_get_wifi_mode() ***********************************************************************/ sl_status_t wfx_sta_discon(void) { - SILABS_LOG("%s: started.", __func__); - int32_t status; + sl_status_t status; status = wfx_rsi_disconnect(); wfx_rsi.dev_state &= ~WFX_RSI_ST_STA_CONNECTED; - SILABS_LOG("%s: completed.", __func__); return status; } #if CHIP_DEVICE_CONFIG_ENABLE_IPV4 @@ -302,17 +281,8 @@ sl_status_t wfx_sta_discon(void) ***********************************************************************/ bool wfx_have_ipv4_addr(sl_wfx_interface_t which_if) { - bool status = false; - if (which_if == SL_WFX_STA_INTERFACE) - { - status = (wfx_rsi.dev_state & WFX_RSI_ST_STA_DHCP_DONE) > 0; - } - else - { - status = false; /* TODO */ - } - SILABS_LOG("%s: status: %d", __func__, status); - return status; + VerifyOrReturnError(which_if == SL_WFX_STA_INTERFACE, false); + return ((wfx_rsi.dev_state & WFX_RSI_ST_STA_DHCP_DONE) > 0); } #endif /* CHIP_DEVICE_CONFIG_ENABLE_IPV4 */ @@ -326,17 +296,9 @@ bool wfx_have_ipv4_addr(sl_wfx_interface_t which_if) ***********************************************************************/ bool wfx_have_ipv6_addr(sl_wfx_interface_t which_if) { - bool status = false; - if (which_if == SL_WFX_STA_INTERFACE) - { - status = (wfx_rsi.dev_state & WFX_RSI_ST_STA_CONNECTED) > 0; - } - else - { - status = false; /* TODO */ - } - SILABS_LOG("%s: %d", __func__, status); - return status; + VerifyOrReturnError(which_if == SL_WFX_STA_INTERFACE, false); + // TODO: WFX_RSI_ST_STA_CONNECTED does not guarantee SLAAC IPv6 LLA, maybe use a different FLAG + return ((wfx_rsi.dev_state & WFX_RSI_ST_STA_CONNECTED) > 0); } /********************************************************************* @@ -379,14 +341,14 @@ int32_t wfx_get_ap_ext(wfx_wifi_scan_ext_t * extra_info) } /*************************************************************************** - * @fn int32_t wfx_reset_counts(){ + * @fn int32_t wfx_reset_counts(void) * @brief * get the driver reset count * @param[in] None * @return * reset count *****************************************************************************/ -int32_t wfx_reset_counts() +int32_t wfx_reset_counts(void) { return wfx_rsi_reset_count(); } @@ -402,21 +364,17 @@ int32_t wfx_reset_counts() *******************************************************************************/ bool wfx_start_scan(char * ssid, void (*callback)(wfx_wifi_scan_result_t *)) { - int sz; - WfxEvent_t event; - if (wfx_rsi.scan_cb) - return false; /* Already in progress */ - if (ssid) - { - sz = strlen(ssid); - if ((wfx_rsi.scan_ssid = (char *) pvPortMalloc(sz + 1)) == (char *) 0) - { - return false; - } - strcpy(wfx_rsi.scan_ssid, ssid); - } + // check if already in progress + VerifyOrReturnError(wfx_rsi.scan_cb != nullptr, false); wfx_rsi.scan_cb = callback; + VerifyOrReturnError(ssid != nullptr, false); + wfx_rsi.scan_ssid_length = strnlen(ssid, chip::min(sizeof(ssid), WFX_MAX_SSID_LENGTH)); + wfx_rsi.scan_ssid = reinterpret_cast(chip::Platform::MemoryAlloc(wfx_rsi.scan_ssid_length)); + VerifyOrReturnError(wfx_rsi.scan_ssid != nullptr, false); + chip::Platform::CopyString(wfx_rsi.scan_ssid, wfx_rsi.scan_ssid_length, ssid); + + WfxEvent_t event; event.eventType = WFX_EVT_SCAN; WfxPostEvent(&event); @@ -434,6 +392,6 @@ bool wfx_start_scan(char * ssid, void (*callback)(wfx_wifi_scan_result_t *)) void wfx_cancel_scan(void) { /* Not possible */ - SILABS_LOG("%s: cannot cancel scan", __func__); + ChipLogError(DeviceLayer, "cannot cancel scan"); } #endif /* SL_WFX_CONFIG_SCAN */ diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp index b5a9c1eb56a3f8..6e5470f7d05f26 100644 --- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp +++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp @@ -327,7 +327,7 @@ void ConnectivityManagerImpl::DriveStationState() ChipLogProgress(DeviceLayer, "Attempting to connect WiFi"); if ((serr = wfx_connect_to_ap()) != SL_STATUS_OK) { - ChipLogError(DeviceLayer, "wfx_connect_to_ap() failed."); + ChipLogError(DeviceLayer, "wfx_connect_to_ap() failed: %" PRId32, serr); } SuccessOrExit(serr); diff --git a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp index 614a121280eaef..7f6240c32c5858 100644 --- a/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp +++ b/src/platform/silabs/NetworkCommissioningWiFiDriver.cpp @@ -147,10 +147,19 @@ CHIP_ERROR SlWiFiDriver::ConnectWiFiNetwork(const char * ssid, uint8_t ssidLen, } } ReturnErrorOnFailure(ConnectivityMgr().SetWiFiStationMode(ConnectivityManager::kWiFiStationMode_Disabled)); + // Set the wifi configuration - wfx_wifi_provision_t wifiConfig = {}; + wfx_wifi_provision_t wifiConfig; + memset(&wifiConfig, 0, sizeof(wifiConfig)); + + VerifyOrReturnError(ssidLen <= WFX_MAX_SSID_LENGTH, CHIP_ERROR_BUFFER_TOO_SMALL); memcpy(wifiConfig.ssid, ssid, ssidLen); + wifiConfig.ssid_length = ssidLen; + + VerifyOrReturnError(keyLen < WFX_MAX_PASSKEY_LENGTH, CHIP_ERROR_BUFFER_TOO_SMALL); memcpy(wifiConfig.passkey, key, keyLen); + wifiConfig.passkey_length = keyLen; + wifiConfig.security = WFX_SEC_WPA2; ChipLogProgress(NetworkProvisioning, "Setting up connection for WiFi SSID: %.*s", static_cast(ssidLen), ssid); diff --git a/src/platform/silabs/SiWx917/wifi/ethernetif.cpp b/src/platform/silabs/SiWx917/wifi/ethernetif.cpp index 72725102d6da48..2860b895ce7fae 100644 --- a/src/platform/silabs/SiWx917/wifi/ethernetif.cpp +++ b/src/platform/silabs/SiWx917/wifi/ethernetif.cpp @@ -44,7 +44,7 @@ extern "C" { #include "lwip/ethip6.h" #include "lwip/timeouts.h" #include "netif/etharp.h" -#include "silabs_utils.h" +#include StaticSemaphore_t xEthernetIfSemaBuffer; @@ -131,13 +131,13 @@ static void low_level_input(struct netif * netif, uint8_t * b, uint16_t len) (memcmp(netif->hwaddr, dst_mac, netif->hwaddr_len) != 0)) { #ifdef WIFI_DEBUG_ENABLED - SILABS_LOG("%s: DROP, [%02x:%02x:%02x:%02x:%02x:%02x]<-[%02x:%02x:%02x:%02x:%02x:%02x] type=%02x%02x", __func__, + ChipLogDetail(DeviceLayer, "DROP: [%02x:%02x:%02x:%02x:%02x:%02x]->[%02x:%02x:%02x:%02x:%02x:%02x] type=%02x%02x", - dst_mac[0], dst_mac[1], dst_mac[2], dst_mac[3], dst_mac[4], dst_mac[5], + src_mac[0], src_mac[1], src_mac[2], src_mac[3], src_mac[4], src_mac[5], - src_mac[0], src_mac[1], src_mac[2], src_mac[3], src_mac[4], src_mac[5], + dst_mac[0], dst_mac[1], dst_mac[2], dst_mac[3], dst_mac[4], dst_mac[5], - b[12], b[13]); + b[12], b[13]); #endif return; } @@ -153,14 +153,14 @@ static void low_level_input(struct netif * netif, uint8_t * b, uint16_t len) bufferoffset += q->len; } #ifdef WIFI_DEBUG_ENABLED - SILABS_LOG("%s: ACCEPT %d, [%02x:%02x:%02x:%02x:%02x:%02x]<-[%02x:%02x:%02x:%02x:%02x:%02x] type=%02x%02x", __func__, - bufferoffset, + ChipLogDetail(DeviceLayer, "ACCEPT(%d): [%02x:%02x:%02x:%02x:%02x:%02x]->[%02x:%02x:%02x:%02x:%02x:%02x] type=%02x%02x", + bufferoffset, - dst_mac[0], dst_mac[1], dst_mac[2], dst_mac[3], dst_mac[4], dst_mac[5], + src_mac[0], src_mac[1], src_mac[2], src_mac[3], src_mac[4], src_mac[5], - src_mac[0], src_mac[1], src_mac[2], src_mac[3], src_mac[4], src_mac[5], + dst_mac[0], dst_mac[1], dst_mac[2], dst_mac[3], dst_mac[4], dst_mac[5], - b[12], b[13]); + b[12], b[13]); #endif if (netif->input(p, netif) != ERR_OK) diff --git a/src/platform/silabs/SiWx917/wifi/wfx_host_events.h b/src/platform/silabs/SiWx917/wifi/wfx_host_events.h index 319a1c508e658d..42a5dfffc1c381 100644 --- a/src/platform/silabs/SiWx917/wifi/wfx_host_events.h +++ b/src/platform/silabs/SiWx917/wifi/wfx_host_events.h @@ -159,7 +159,9 @@ typedef enum typedef struct { char ssid[WFX_MAX_SSID_LENGTH + 1]; + size_t ssid_length; char passkey[WFX_MAX_PASSKEY_LENGTH + 1]; + size_t passkey_length; wfx_sec_t security; } wfx_wifi_provision_t; @@ -175,6 +177,7 @@ typedef enum typedef struct wfx_wifi_scan_result { char ssid[WFX_MAX_SSID_LENGTH + 1]; + size_t ssid_length; wfx_sec_t security; uint8_t bssid[BSSID_LEN]; uint8_t chan; diff --git a/src/platform/silabs/efr32/wifi/ethernetif.cpp b/src/platform/silabs/efr32/wifi/ethernetif.cpp index 0388337939a3e2..d0f0ec6daf47f7 100644 --- a/src/platform/silabs/efr32/wifi/ethernetif.cpp +++ b/src/platform/silabs/efr32/wifi/ethernetif.cpp @@ -148,8 +148,8 @@ static void low_level_input(struct netif * netif, uint8_t * b, uint16_t len) (memcmp(netif->hwaddr, dst_mac, netif->hwaddr_len) != 0)) { #ifdef WIFI_DEBUG_ENABLED - ChipLogProgress(DeviceLayer, "%s: DROP, [%02x:%02x:%02x:%02x:%02x:%02x]<-[%02x:%02x:%02x:%02x:%02x:%02x] type=%02x%02x", - __func__, + ChipLogProgress(DeviceLayer, + "lwip_input: DROP, [%02x:%02x:%02x:%02x:%02x:%02x]<-[%02x:%02x:%02x:%02x:%02x:%02x] type=%02x%02x", dst_mac[0], dst_mac[1], dst_mac[2], dst_mac[3], dst_mac[4], dst_mac[5], @@ -172,7 +172,7 @@ static void low_level_input(struct netif * netif, uint8_t * b, uint16_t len) } #ifdef WIFI_DEBUG_ENABLED ChipLogProgress(DeviceLayer, - "%s: ACCEPT %ld, [%02x:%02x:%02x:%02x:%02x:%02x]<-[%02x:%02x:%02x:%02x:%02x:%02x] type=%02x%02x", __func__, + "lwip_input: ACCEPT %ld, [%02x:%02x:%02x:%02x:%02x:%02x]<-[%02x:%02x:%02x:%02x:%02x:%02x] type=%02x%02x", bufferoffset, dst_mac[0], dst_mac[1], dst_mac[2], dst_mac[3], dst_mac[4], dst_mac[5], diff --git a/src/platform/silabs/efr32/wifi/wfx_host_events.h b/src/platform/silabs/efr32/wifi/wfx_host_events.h index 51f96d7b9dbc73..4686931eafac4e 100644 --- a/src/platform/silabs/efr32/wifi/wfx_host_events.h +++ b/src/platform/silabs/efr32/wifi/wfx_host_events.h @@ -254,7 +254,9 @@ typedef enum typedef struct { char ssid[WFX_MAX_SSID_LENGTH + 1]; + size_t ssid_length; char passkey[WFX_MAX_PASSKEY_LENGTH + 1]; + size_t passkey_length; wfx_sec_t security; } wfx_wifi_provision_t; @@ -270,6 +272,7 @@ typedef enum typedef struct wfx_wifi_scan_result { char ssid[WFX_MAX_SSID_LENGTH + 1]; + size_t ssid_length; wfx_sec_t security; uint8_t bssid[BSSID_LEN]; uint8_t chan; From f5216e8ec34cabbfd1c0f450871d52ae574c1357 Mon Sep 17 00:00:00 2001 From: Terence Hampson Date: Tue, 10 Sep 2024 13:30:56 -0400 Subject: [PATCH 04/38] Clean up subscriptions from fabric sync tests (#35485) --- src/python_testing/TC_BRBINFO_4_1.py | 9 +++++++-- src/python_testing/TC_MCORE_FS_1_2.py | 11 ++++++++--- src/python_testing/TC_MCORE_FS_1_5.py | 20 +++++++++++++++----- 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/src/python_testing/TC_BRBINFO_4_1.py b/src/python_testing/TC_BRBINFO_4_1.py index df922748999dd0..8b064a775f358b 100644 --- a/src/python_testing/TC_BRBINFO_4_1.py +++ b/src/python_testing/TC_BRBINFO_4_1.py @@ -123,6 +123,7 @@ async def setup_class(self): self.set_of_dut_endpoints_before_adding_device = set(root_part_list) super().setup_class() + self._active_change_event_subscription = None self.app_process = None self.app_process_paused = False app = self.user_params.get("th_icd_server_app_path", None) @@ -156,6 +157,10 @@ async def setup_class(self): params.commissioningParameters.setupManualCode, params.commissioningParameters.setupQRCode) def teardown_class(self): + if self._active_change_event_subscription is not None: + self._active_change_event_subscription.Shutdown() + self._active_change_event_subscription = None + # In case the th_icd_server_app_path does not exist, then we failed the test # and there is nothing to remove if self.app_process is not None: @@ -239,8 +244,8 @@ async def test_TC_BRBINFO_4_1(self): self.q = queue.Queue() urgent = 1 cb = SimpleEventCallback("ActiveChanged", event.cluster_id, event.event_id, self.q) - subscription = await self.default_controller.ReadEvent(nodeid=self.dut_node_id, events=[(dynamic_endpoint_id, event, urgent)], reportInterval=[1, 3]) - subscription.SetEventUpdateCallback(callback=cb) + self._active_change_event_subscription = await self.default_controller.ReadEvent(nodeid=self.dut_node_id, events=[(dynamic_endpoint_id, event, urgent)], reportInterval=[1, 3]) + self._active_change_event_subscription.SetEventUpdateCallback(callback=cb) self.step("3") stay_active_duration_ms = 1000 diff --git a/src/python_testing/TC_MCORE_FS_1_2.py b/src/python_testing/TC_MCORE_FS_1_2.py index 816abe5d876b00..b18dcc5b42ef64 100644 --- a/src/python_testing/TC_MCORE_FS_1_2.py +++ b/src/python_testing/TC_MCORE_FS_1_2.py @@ -63,10 +63,15 @@ class TC_MCORE_FS_1_2(MatterBaseTest): @async_test_body async def setup_class(self): super().setup_class() + self._partslist_subscription = None self._app_th_server_process = None self._th_server_kvs = None def teardown_class(self): + if self._partslist_subscription is not None: + self._partslist_subscription.Shutdown() + self._partslist_subscription = None + if self._app_th_server_process is not None: logging.warning("Stopping app with SIGTERM") self._app_th_server_process.send_signal(signal.SIGTERM.value) @@ -142,7 +147,7 @@ async def test_TC_MCORE_FS_1_2(self): subscription_contents = [ (root_endpoint, Clusters.Descriptor.Attributes.PartsList) ] - sub = await self.default_controller.ReadAttribute( + self._partslist_subscription = await self.default_controller.ReadAttribute( nodeid=self.dut_node_id, attributes=subscription_contents, reportInterval=(min_report_interval_sec, max_report_interval_sec), @@ -152,8 +157,8 @@ async def test_TC_MCORE_FS_1_2(self): parts_list_queue = queue.Queue() attribute_handler = AttributeChangeAccumulator( name=self.default_controller.name, expected_attribute=Clusters.Descriptor.Attributes.PartsList, output=parts_list_queue) - sub.SetAttributeUpdateCallback(attribute_handler) - cached_attributes = sub.GetAttributes() + self._partslist_subscription.SetAttributeUpdateCallback(attribute_handler) + cached_attributes = self._partslist_subscription.GetAttributes() step_1_dut_parts_list = cached_attributes[root_endpoint][Clusters.Descriptor][Clusters.Descriptor.Attributes.PartsList] asserts.assert_true(type_matches(step_1_dut_parts_list, list), "PartsList is expected to be a list") diff --git a/src/python_testing/TC_MCORE_FS_1_5.py b/src/python_testing/TC_MCORE_FS_1_5.py index df80072d5126e3..22654c994bf41f 100755 --- a/src/python_testing/TC_MCORE_FS_1_5.py +++ b/src/python_testing/TC_MCORE_FS_1_5.py @@ -61,10 +61,20 @@ class TC_MCORE_FS_1_5(MatterBaseTest): @async_test_body async def setup_class(self): super().setup_class() + self._partslist_subscription = None + self._cadmin_subscription = None self._app_th_server_process = None self._th_server_kvs = None def teardown_class(self): + if self._partslist_subscription is not None: + self._partslist_subscription.Shutdown() + self._partslist_subscription = None + + if self._cadmin_subscription is not None: + self._cadmin_subscription.Shutdown() + self._cadmin_subscription = None + if self._app_th_server_process is not None: logging.warning("Stopping app with SIGTERM") self._app_th_server_process.send_signal(signal.SIGTERM.value) @@ -142,7 +152,7 @@ async def test_TC_MCORE_FS_1_5(self): parts_list_subscription_contents = [ (root_endpoint, Clusters.Descriptor.Attributes.PartsList) ] - parts_list_sub = await self.default_controller.ReadAttribute( + self._partslist_subscription = await self.default_controller.ReadAttribute( nodeid=self.dut_node_id, attributes=parts_list_subscription_contents, reportInterval=(min_report_interval_sec, max_report_interval_sec), @@ -152,8 +162,8 @@ async def test_TC_MCORE_FS_1_5(self): parts_list_queue = queue.Queue() parts_list_attribute_handler = AttributeChangeAccumulator( name=self.default_controller.name, expected_attribute=Clusters.Descriptor.Attributes.PartsList, output=parts_list_queue) - parts_list_sub.SetAttributeUpdateCallback(parts_list_attribute_handler) - parts_list_cached_attributes = parts_list_sub.GetAttributes() + self._partslist_subscription.SetAttributeUpdateCallback(parts_list_attribute_handler) + parts_list_cached_attributes = self._partslist_subscription.GetAttributes() step_1_dut_parts_list = parts_list_cached_attributes[root_endpoint][Clusters.Descriptor][Clusters.Descriptor.Attributes.PartsList] asserts.assert_true(type_matches(step_1_dut_parts_list, list), "PartsList is expected to be a list") @@ -219,7 +229,7 @@ async def test_TC_MCORE_FS_1_5(self): cadmin_subscription_contents = [ (newly_added_endpoint, Clusters.AdministratorCommissioning) ] - cadmin_sub = await self.default_controller.ReadAttribute( + self._cadmin_subscription = await self.default_controller.ReadAttribute( nodeid=self.dut_node_id, attributes=cadmin_subscription_contents, reportInterval=(min_report_interval_sec, max_report_interval_sec), @@ -230,7 +240,7 @@ async def test_TC_MCORE_FS_1_5(self): # This AttributeChangeAccumulator is really just to let us know when new subscription came in cadmin_attribute_handler = AttributeChangeAccumulator( name=self.default_controller.name, expected_attribute=Clusters.AdministratorCommissioning.Attributes.WindowStatus, output=cadmin_queue) - cadmin_sub.SetAttributeUpdateCallback(cadmin_attribute_handler) + self._cadmin_subscription.SetAttributeUpdateCallback(cadmin_attribute_handler) time.sleep(1) self.step(7) From cbd15a16f5feadec2bdf02b63d2e65659cb3e822 Mon Sep 17 00:00:00 2001 From: Petru Lauric <81822411+plauric@users.noreply.github.com> Date: Tue, 10 Sep 2024 13:55:24 -0400 Subject: [PATCH 05/38] initial commit (#35513) --- src/python_testing/TC_SEAR_1_2.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/python_testing/TC_SEAR_1_2.py b/src/python_testing/TC_SEAR_1_2.py index 2c253efa860038..1bed2c8d12cac8 100644 --- a/src/python_testing/TC_SEAR_1_2.py +++ b/src/python_testing/TC_SEAR_1_2.py @@ -180,12 +180,12 @@ async def read_and_validate_progress(self, step): progareaid_list.append(p.areaID) asserts.assert_true(p.areaID in self.areaid_list, f"Progress entry has invalid AreaID value ({p.areaID})") - asserts.assert_true(p.status in (Clusters.ServiceArea.OperationalStatusEnum.kPending, - Clusters.ServiceArea.OperationalStatusEnum.kOperating, - Clusters.ServiceArea.OperationalStatusEnum.kSkipped, - Clusters.ServiceArea.OperationalStatusEnum.kCompleted), + asserts.assert_true(p.status in (Clusters.ServiceArea.Enums.OperationalStatusEnum.kPending, + Clusters.ServiceArea.Enums.OperationalStatusEnum.kOperating, + Clusters.ServiceArea.Enums.OperationalStatusEnum.kSkipped, + Clusters.ServiceArea.Enums.OperationalStatusEnum.kCompleted), f"Progress entry has invalid Status value ({p.status})") - if p.status not in (Clusters.ServiceArea.OperationalStatusEnum.kSkipped, Clusters.ServiceArea.OperationalStatusEnum.kCompleted): + if p.status not in (Clusters.ServiceArea.Enums.OperationalStatusEnum.kSkipped, Clusters.ServiceArea.Enums.OperationalStatusEnum.kCompleted): asserts.assert_true(p.totalOperationalTime is NullValue, f"Progress entry should have a null TotalOperationalTime value (Status is {p.status})") # TODO how to check that InitialTimeEstimate is either null or uint32? From d1279a83eacd21f5d084ca1883c852e98ff89dad Mon Sep 17 00:00:00 2001 From: Karsten Sperling <113487422+ksperling-apple@users.noreply.github.com> Date: Wed, 11 Sep 2024 06:43:17 +1200 Subject: [PATCH 06/38] Add matter_enable_recommended meta-setting (#34942) * Add matter_enable_recommended meta-setting This setting defaults to true which leaves current behavior unchanged. However it can be set to false to achieve a more conservative / minimal set of defaults, without having to manually disable an ever-increasing set of features. Consider using this setting as the default value for other settings that increase code size or add debugging / tracing or similar features that are not always desired. Especially settings that default to true on Linux and Mac ("because you're probably building for development") should likely use this option for their default, e.g. matter_foo = matter_enable_recommended && (current_os == "linux" || current_os == "mac") * Add more documentation and turn off the setting for minimal CI builds * Move matter_enable_recommended into /config/recommended.gni This allows it to be uesd from args.gni (i.e. in the context of a default_args scope, where variables like current_os are not defined) as well as within a build / toolchain context. --- .github/workflows/minimal-build.yaml | 10 ++++----- config/recommended.gni | 31 ++++++++++++++++++++++++++++ examples/shell/shell_common/BUILD.gn | 7 +++---- src/app/common_flags.gni | 5 ++++- src/lib/core/core.gni | 15 ++++++++++---- src/tracing/tracing_args.gni | 6 +++--- 6 files changed, 57 insertions(+), 17 deletions(-) create mode 100644 config/recommended.gni diff --git a/.github/workflows/minimal-build.yaml b/.github/workflows/minimal-build.yaml index 9ba9565b44c25b..ade1bd56ea36ff 100644 --- a/.github/workflows/minimal-build.yaml +++ b/.github/workflows/minimal-build.yaml @@ -17,7 +17,7 @@ name: Minimal Build (Linux / configure) on: push: branches-ignore: - - 'dependabot/**' + - "dependabot/**" pull_request: merge_group: @@ -42,11 +42,11 @@ jobs: - name: Checkout submodules # but don't bootstrap! uses: ./.github/actions/checkout-submodules with: - platform: linux + platform: linux - name: Configure and build All Clusters App run: | - CC=gcc CXX=g++ scripts/configure --project=examples/all-clusters-app/linux && ./ninja-build + CC=gcc CXX=g++ scripts/configure --project=examples/all-clusters-app/linux --enable-recommended=no && ./ninja-build minimal-network-manager: name: Linux / configure build of network-manager-app @@ -64,8 +64,8 @@ jobs: - name: Checkout submodules # but don't bootstrap! uses: ./.github/actions/checkout-submodules with: - platform: linux + platform: linux - name: Configure and build Network Manager App run: | - CC=gcc CXX=g++ scripts/configure --project=examples/network-manager-app/linux && ./ninja-build + CC=gcc CXX=g++ scripts/configure --project=examples/network-manager-app/linux --enable-recommended=no && ./ninja-build diff --git a/config/recommended.gni b/config/recommended.gni new file mode 100644 index 00000000000000..a30045ced7814e --- /dev/null +++ b/config/recommended.gni @@ -0,0 +1,31 @@ +# Copyright (c) 2024 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. + +declare_args() { + # Note for SDK developers: As additional features with their own settings + # are added to the SDK, consider using the `matter_enable_recommended` + # meta-setting instead of a default value of 'true', especially where a + # different default is used based on platform (current_os): Often various + # debugging features have previously been defaulted to on for Linux and/or + # Mac but off for embedded platforms (on the assumption that Linux / Mac + # don't have resource constraints?); build settings of that nature should + # instead reference this meta-setting. E.g. + # enable_flux_capacitor = matter_enable_recommended && current_os == "linux" + + # Enable recommended settings by default. This is a meta-setting + # that is enabled by default, and acts as a default for various + # other settings. Setting it to false produces a more conservative / + # minimal set of defaults. + matter_enable_recommended = true +} diff --git a/examples/shell/shell_common/BUILD.gn b/examples/shell/shell_common/BUILD.gn index e4aa2973f8cc04..645c8ddb510220 100644 --- a/examples/shell/shell_common/BUILD.gn +++ b/examples/shell/shell_common/BUILD.gn @@ -13,13 +13,12 @@ # limitations under the License. import("//build_overrides/chip.gni") -import("//build_overrides/openthread.gni") - +import("${chip_root}/config/recommended.gni") import("${chip_root}/src/platform/device.gni") declare_args() { - # Enable server command only on linux for now. - chip_shell_cmd_server = current_os == "linux" || current_os == "mac" + chip_shell_cmd_server = matter_enable_recommended && + (current_os == "linux" || current_os == "mac") } config("shell_common_config") { diff --git a/src/app/common_flags.gni b/src/app/common_flags.gni index 953afc23a20650..d3e7ce34bf0338 100644 --- a/src/app/common_flags.gni +++ b/src/app/common_flags.gni @@ -12,6 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. +import("//build_overrides/chip.gni") +import("${chip_root}/config/recommended.gni") + declare_args() { # Temporary flag for interaction model and echo protocols, set it to true to enable chip_app_use_echo = false @@ -26,7 +29,7 @@ declare_args() { # - disabled: does not use data model interface at all # - check: runs BOTH datamodel and non-data-model (if possible) functionality and compares results # - enabled: runs only the data model interface (does not use the legacy code) - if (current_os == "linux") { + if (matter_enable_recommended && current_os == "linux") { chip_use_data_model_interface = "check" } else { chip_use_data_model_interface = "disabled" diff --git a/src/lib/core/core.gni b/src/lib/core/core.gni index f2189198e36131..eea73a5c56f7b3 100644 --- a/src/lib/core/core.gni +++ b/src/lib/core/core.gni @@ -12,6 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. +import("//build_overrides/chip.gni") +import("${chip_root}/config/recommended.gni") + declare_args() { # Enable logging. Shorthand for chip_error_logging, etc. chip_logging = true @@ -28,13 +31,16 @@ declare_args() { chip_progress_logging = chip_logging # Enable detail logging. - chip_detail_logging = chip_logging + chip_detail_logging = matter_enable_recommended && chip_logging # Enable automation logging. - chip_automation_logging = chip_logging + chip_automation_logging = matter_enable_recommended && chip_logging +} +declare_args() { # Configure the maximum size for logged messages - if (current_os == "linux" || current_os == "mac" || current_os == "ios") { + if ((matter_enable_recommended || chip_detail_logging) && + (current_os == "linux" || current_os == "mac" || current_os == "ios")) { # Allow base64 encoding of 1 MTU (4 * (1280 / 3) + padding chip_log_message_max_size = 1708 } else { @@ -88,7 +94,8 @@ declare_args() { chip_config_memory_debug_dmalloc = false # When enabled trace messages using tansport trace hook. - chip_enable_transport_trace = current_os == "linux" || current_os == "mac" + chip_enable_transport_trace = matter_enable_recommended && + (current_os == "linux" || current_os == "mac") # When this is enabled trace messages will be sent to pw_trace. chip_enable_transport_pw_trace = false diff --git a/src/tracing/tracing_args.gni b/src/tracing/tracing_args.gni index d6ddb1fd2e99b8..085844e4a53605 100644 --- a/src/tracing/tracing_args.gni +++ b/src/tracing/tracing_args.gni @@ -11,9 +11,8 @@ # 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("//build_overrides/build.gni") import("//build_overrides/chip.gni") -import("${build_root}/config/compiler/compiler.gni") +import("${chip_root}/config/recommended.gni") import("${chip_root}/src/platform/device.gni") declare_args() { @@ -24,7 +23,8 @@ declare_args() { # Additionally, if tracing is enabled, the main() function has to add # backends explicitly matter_enable_tracing_support = - current_os == "android" || chip_device_platform == "darwin" + matter_enable_recommended && + (current_os == "android" || chip_device_platform == "darwin") # Defines the trace backend. Current matter tracing splits the logic # into two parts: From bd6ae0980fde3d20a49385caa6d64adb6aee3276 Mon Sep 17 00:00:00 2001 From: Junior Martinez <67972863+jmartinez-silabs@users.noreply.github.com> Date: Tue, 10 Sep 2024 15:01:55 -0400 Subject: [PATCH 07/38] [Silabs] Increase the max supported KVS entries (#35480) * Increase the maximum KVS entries our implementation can handle * add gn argument to configure the nvm3 max object size --- src/platform/silabs/KeyValueStoreManagerImpl.cpp | 10 +++++----- src/platform/silabs/SilabsConfig.h | 16 +++++++++++----- third_party/silabs/SiWx917_sdk.gni | 2 +- third_party/silabs/efr32_sdk.gni | 3 ++- 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/platform/silabs/KeyValueStoreManagerImpl.cpp b/src/platform/silabs/KeyValueStoreManagerImpl.cpp index 012c951aaaa729..34d88388badf22 100644 --- a/src/platform/silabs/KeyValueStoreManagerImpl.cpp +++ b/src/platform/silabs/KeyValueStoreManagerImpl.cpp @@ -88,9 +88,9 @@ uint16_t KeyValueStoreManagerImpl::hashKvsKeyString(const char * key) const CHIP_ERROR KeyValueStoreManagerImpl::MapKvsKeyToNvm3(const char * key, uint16_t hash, uint32_t & nvm3Key, bool isSlotNeeded) const { CHIP_ERROR err; - char * strPrefix = nullptr; - uint8_t firstEmptyKeySlot = kMaxEntries; - for (uint8_t keyIndex = 0; keyIndex < kMaxEntries; keyIndex++) + char * strPrefix = nullptr; + uint16_t firstEmptyKeySlot = kMaxEntries; + for (uint16_t keyIndex = 0; keyIndex < kMaxEntries; keyIndex++) { if (mKvsKeyMap[keyIndex] == hash) { @@ -165,7 +165,7 @@ void KeyValueStoreManagerImpl::ScheduleKeyMapSave(void) Commit the key map in nvm once it as stabilized. */ SystemLayer().StartTimer( - std::chrono::duration_cast(System::Clock::Seconds32(SILABS_KVS_SAVE_DELAY_SECONDS)), + std::chrono::duration_cast(System::Clock::Seconds32(SL_KVS_SAVE_DELAY_SECONDS)), KeyValueStoreManagerImpl::OnScheduledKeyMapSave, NULL); } @@ -247,7 +247,7 @@ CHIP_ERROR KeyValueStoreManagerImpl::_Delete(const char * key) void KeyValueStoreManagerImpl::ErasePartition(void) { // Iterate over all the Matter Kvs nvm3 records and delete each one... - for (uint32_t nvm3Key = SilabsConfig::kMinConfigKey_MatterKvs; nvm3Key <= SilabsConfig::kMaxConfigKey_MatterKvs; nvm3Key++) + for (uint32_t nvm3Key = SilabsConfig::kMinConfigKey_MatterKvs; nvm3Key <= SilabsConfig::kConfigKey_KvsLastKeySlot; nvm3Key++) { SilabsConfig::ClearConfigValue(nvm3Key); } diff --git a/src/platform/silabs/SilabsConfig.h b/src/platform/silabs/SilabsConfig.h index ccb14beeb8f177..cef9ca323f74d2 100644 --- a/src/platform/silabs/SilabsConfig.h +++ b/src/platform/silabs/SilabsConfig.h @@ -35,9 +35,11 @@ #endif // Delay before Key/Value is actually saved in NVM -#define SILABS_KVS_SAVE_DELAY_SECONDS 5 +#ifndef SL_KVS_SAVE_DELAY_SECONDS +#define SL_KVS_SAVE_DELAY_SECONDS 2 +#endif -static_assert((KVS_MAX_ENTRIES <= 255), "Implementation supports up to 255 Kvs entries"); +static_assert((KVS_MAX_ENTRIES <= 511), "Implementation supports up to 511 Kvs entries"); static_assert((KVS_MAX_ENTRIES >= 30), "Mininimal Kvs entries requirement is not met"); namespace chip { @@ -89,7 +91,8 @@ class SilabsConfig // Persistent counter values set at runtime. Retained during factory reset. static constexpr uint8_t kMatterCounter_KeyBase = 0x74; // Persistent config values set at runtime. Cleared during factory reset. - static constexpr uint8_t kMatterKvs_KeyBase = 0x75; + static constexpr uint8_t kMatterKvs_KeyBase = 0x75; + static constexpr uint8_t kMatterKvs_ExtendedRange = 0x76; // Key definitions for well-known configuration values. // Factory config keys @@ -167,7 +170,8 @@ class SilabsConfig // Matter KVS storage Keys static constexpr Key kConfigKey_KvsStringKeyMap = SilabsConfigKey(kMatterKvs_KeyBase, 0x00); static constexpr Key kConfigKey_KvsFirstKeySlot = SilabsConfigKey(kMatterKvs_KeyBase, 0x01); - static constexpr Key kConfigKey_KvsLastKeySlot = SilabsConfigKey(kMatterKvs_KeyBase, KVS_MAX_ENTRIES); + static constexpr Key kConfigKey_KvsLastKeySlot = + SilabsConfigKey(kMatterKvs_KeyBase + (KVS_MAX_ENTRIES >> 8), KVS_MAX_ENTRIES & UINT8_MAX); // Set key id limits for each group. static constexpr Key kMinConfigKey_MatterFactory = SilabsConfigKey(kMatterFactory_KeyBase, 0x00); @@ -180,7 +184,9 @@ class SilabsConfig static constexpr Key kMaxConfigKey_MatterCounter = SilabsConfigKey(kMatterCounter_KeyBase, 0x1F); static constexpr Key kMinConfigKey_MatterKvs = kConfigKey_KvsStringKeyMap; - static constexpr Key kMaxConfigKey_MatterKvs = kConfigKey_KvsLastKeySlot; + static constexpr Key kMaxConfigKey_MatterKvs = SilabsConfigKey(kMatterKvs_ExtendedRange, 0xFF); + static_assert(kConfigKey_KvsLastKeySlot <= kMaxConfigKey_MatterKvs, + "Configured KVS_MAX_ENTRIES overflows the reserved KVS Key range"); static CHIP_ERROR Init(void); static void DeInit(void); diff --git a/third_party/silabs/SiWx917_sdk.gni b/third_party/silabs/SiWx917_sdk.gni index 30e1595493c60c..e91afe7483b3fa 100644 --- a/third_party/silabs/SiWx917_sdk.gni +++ b/third_party/silabs/SiWx917_sdk.gni @@ -187,7 +187,7 @@ template("siwx917_sdk") { # 1->SOC and 0->NCP "RSI_WLAN_API_ENABLE", "NVM3_DEFAULT_NVM_SIZE=40960", - "NVM3_DEFAULT_MAX_OBJECT_SIZE=4092", + "NVM3_DEFAULT_MAX_OBJECT_SIZE=${sl_nvm3_max_object_size}", "KVS_MAX_ENTRIES=${kvs_max_entries}", "${silabs_mcu}=1", "${silabs_board}=1", diff --git a/third_party/silabs/efr32_sdk.gni b/third_party/silabs/efr32_sdk.gni index 1cd69d31e7084b..3f30a0ca52f867 100644 --- a/third_party/silabs/efr32_sdk.gni +++ b/third_party/silabs/efr32_sdk.gni @@ -38,6 +38,7 @@ declare_args() { # enable by default for thread/non-wifi-ncp builds enable_openthread_cli = !(use_rs9116 || use_wf200 || use_SiWx917) kvs_max_entries = 255 + sl_nvm3_max_object_size = 4092 # Use Silabs factory data provider example. # Users can implement their own. @@ -421,7 +422,7 @@ template("efr32_sdk") { "HARD_FAULT_LOG_ENABLE", "CORTEXM3_EFM32_MICRO", "NVM3_DEFAULT_NVM_SIZE=40960", - "NVM3_DEFAULT_MAX_OBJECT_SIZE=4092", + "NVM3_DEFAULT_MAX_OBJECT_SIZE=${sl_nvm3_max_object_size}", "KVS_MAX_ENTRIES=${kvs_max_entries}", "CORTEXM3=1", "MICRO=EMBER_MICRO_CORTEXM3_EFR32", From 2b7965d9e3fc9423f9ad6530b610bb994b6c63e5 Mon Sep 17 00:00:00 2001 From: Terence Hampson Date: Tue, 10 Sep 2024 15:22:11 -0400 Subject: [PATCH 08/38] Change TC_CCTRL_2_3.py to no longer use per_endpoint_test (#35516) --- src/python_testing/TC_CCTRL_2_3.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/python_testing/TC_CCTRL_2_3.py b/src/python_testing/TC_CCTRL_2_3.py index 224f283f46d27b..6fa5e7038f88ef 100644 --- a/src/python_testing/TC_CCTRL_2_3.py +++ b/src/python_testing/TC_CCTRL_2_3.py @@ -34,7 +34,7 @@ from chip import ChipDeviceCtrl from chip.interaction_model import InteractionModelError, Status from matter_testing_support import (MatterBaseTest, TestStep, async_test_body, default_matter_test_main, has_cluster, - per_endpoint_test) + run_if_endpoint_matches) from mobly import asserts @@ -109,7 +109,7 @@ def steps_TC_CCTRL_2_3(self) -> list[TestStep]: def default_timeout(self) -> int: return 3*60 - @per_endpoint_test(has_cluster(Clusters.CommissionerControl)) + @run_if_endpoint_matches(has_cluster(Clusters.CommissionerControl)) async def test_TC_CCTRL_2_3(self): self.is_ci = self.check_pics('PICS_SDK_CI_ONLY') From dc397c2a0cd29532a2763b655ff73a81b32deed6 Mon Sep 17 00:00:00 2001 From: Terence Hampson Date: Tue, 10 Sep 2024 15:49:51 -0400 Subject: [PATCH 09/38] Fix fabric sync tests after name update (#35518) --- src/python_testing/TC_CCTRL_2_2.py | 26 +++++++++---------- src/python_testing/TC_CCTRL_2_3.py | 12 ++++----- src/python_testing/TC_MCORE_FS_1_1.py | 8 +++--- src/python_testing/TC_MCORE_FS_1_3.py | 8 +++--- .../test_testing/test_TC_CCNTL_2_2.py | 4 +-- .../test_testing/test_TC_MCORE_FS_1_1.py | 2 +- 6 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/python_testing/TC_CCTRL_2_2.py b/src/python_testing/TC_CCTRL_2_2.py index 8e7a8f1fde6ac3..87849e40443d01 100644 --- a/src/python_testing/TC_CCTRL_2_2.py +++ b/src/python_testing/TC_CCTRL_2_2.py @@ -141,7 +141,7 @@ async def test_TC_CCTRL_2_2(self): events = await self.default_controller.ReadEvent(nodeid=self.dut_node_id, events=event_path) self.step(5) - cmd = Clusters.CommissionerControl.Commands.CommissionNode(requestId=1, responseTimeoutSeconds=30) + cmd = Clusters.CommissionerControl.Commands.CommissionNode(requestID=1, responseTimeoutSeconds=30) try: await self.send_single_cmd(cmd) asserts.fail("Unexpected success on CommissionNode") @@ -162,7 +162,7 @@ async def test_TC_CCTRL_2_2(self): self.step(8) good_request_id = 0x1234567887654321 cmd = Clusters.CommissionerControl.Commands.RequestCommissioningApproval( - requestId=good_request_id, vendorId=th_server_vid, productId=th_server_pid) + requestID=good_request_id, vendorID=th_server_vid, productID=th_server_pid) try: await self.send_single_cmd(cmd=cmd, node_id=pase_nodeid) asserts.fail("Unexpected success on RequestCommissioningApproval over PASE") @@ -187,7 +187,7 @@ async def test_TC_CCTRL_2_2(self): not_th_server_vid = 0x6006 asserts.assert_not_equal(not_th_server_vid, th_server_vid, "Test implementation assumption incorrect") cmd = Clusters.CommissionerControl.Commands.RequestCommissioningApproval( - requestId=good_request_id, vendorId=not_th_server_vid, productId=th_server_pid) + requestID=good_request_id, vendorID=not_th_server_vid, productID=th_server_pid) # If no exception is raised, this is success await self.send_single_cmd(cmd) @@ -203,13 +203,13 @@ async def test_TC_CCTRL_2_2(self): new_event = await self.default_controller.ReadEvent(nodeid=self.dut_node_id, events=event_path, eventNumberFilter=max(event_nums)+1) asserts.assert_equal(len(new_event), 1, "Unexpected event list len") asserts.assert_equal(new_event[0].Data.statusCode, 0, "Unexpected status code") - asserts.assert_equal(new_event[0].Data.clientNodeId, + asserts.assert_equal(new_event[0].Data.clientNodeID, self.matter_test_config.controller_node_id, "Unexpected client node id") - asserts.assert_equal(new_event[0].Data.requestId, good_request_id, "Unexpected request ID") + asserts.assert_equal(new_event[0].Data.requestID, good_request_id, "Unexpected request ID") self.step(14) bad_request_id = 0x1234567887654322 - cmd = Clusters.CommissionerControl.Commands.CommissionNode(requestId=bad_request_id, responseTimeoutSeconds=30) + cmd = Clusters.CommissionerControl.Commands.CommissionNode(requestID=bad_request_id, responseTimeoutSeconds=30) try: await self.send_single_cmd(cmd=cmd) asserts.fail("Unexpected success on CommissionNode") @@ -217,7 +217,7 @@ async def test_TC_CCTRL_2_2(self): asserts.assert_equal(e.status, Status.Failure, "Incorrect error returned") self.step(15) - cmd = Clusters.CommissionerControl.Commands.CommissionNode(requestId=good_request_id, responseTimeoutSeconds=29) + cmd = Clusters.CommissionerControl.Commands.CommissionNode(requestID=good_request_id, responseTimeoutSeconds=29) try: await self.send_single_cmd(cmd=cmd) asserts.fail("Unexpected success on CommissionNode") @@ -225,7 +225,7 @@ async def test_TC_CCTRL_2_2(self): asserts.assert_equal(e.status, Status.ConstraintError, "Incorrect error returned") self.step(16) - cmd = Clusters.CommissionerControl.Commands.CommissionNode(requestId=good_request_id, responseTimeoutSeconds=121) + cmd = Clusters.CommissionerControl.Commands.CommissionNode(requestID=good_request_id, responseTimeoutSeconds=121) try: await self.send_single_cmd(cmd=cmd) asserts.fail("Unexpected success on CommissionNode") @@ -233,7 +233,7 @@ async def test_TC_CCTRL_2_2(self): asserts.assert_equal(e.status, Status.ConstraintError, "Incorrect error returned") self.step(17) - cmd = Clusters.CommissionerControl.Commands.CommissionNode(requestId=good_request_id, responseTimeoutSeconds=30) + cmd = Clusters.CommissionerControl.Commands.CommissionNode(requestID=good_request_id, responseTimeoutSeconds=30) resp: Clusters.CommissionerControl.Commands.ReverseOpenCommissioningWindow = await self.send_single_cmd(cmd) asserts.assert_equal(type(resp), Clusters.CommissionerControl.Commands.ReverseOpenCommissioningWindow, "Incorrect response type") @@ -263,7 +263,7 @@ async def test_TC_CCTRL_2_2(self): self.step(22) good_request_id = 0x1234567812345678 cmd = Clusters.CommissionerControl.Commands.RequestCommissioningApproval( - requestId=good_request_id, vendorId=th_server_vid, productId=th_server_pid, label="Test Ecosystem") + requestID=good_request_id, vendorID=th_server_vid, productID=th_server_pid, label="Test Ecosystem") await self.send_single_cmd(cmd) self.step(23) @@ -276,12 +276,12 @@ async def test_TC_CCTRL_2_2(self): new_event = await self.default_controller.ReadEvent(nodeid=self.dut_node_id, events=event_path, eventNumberFilter=max(event_nums)+1) asserts.assert_equal(len(new_event), 1, "Unexpected event list len") asserts.assert_equal(new_event[0].Data.statusCode, 0, "Unexpected status code") - asserts.assert_equal(new_event[0].Data.clientNodeId, + asserts.assert_equal(new_event[0].Data.clientNodeID, self.matter_test_config.controller_node_id, "Unexpected client node id") - asserts.assert_equal(new_event[0].Data.requestId, good_request_id, "Unexpected request ID") + asserts.assert_equal(new_event[0].Data.requestID, good_request_id, "Unexpected request ID") self.step(25) - cmd = Clusters.CommissionerControl.Commands.CommissionNode(requestId=good_request_id, responseTimeoutSeconds=30) + cmd = Clusters.CommissionerControl.Commands.CommissionNode(requestID=good_request_id, responseTimeoutSeconds=30) resp = await self.send_single_cmd(cmd) asserts.assert_equal(type(resp), Clusters.CommissionerControl.Commands.ReverseOpenCommissioningWindow, "Incorrect response type") diff --git a/src/python_testing/TC_CCTRL_2_3.py b/src/python_testing/TC_CCTRL_2_3.py index 6fa5e7038f88ef..2c1c20e17f309f 100644 --- a/src/python_testing/TC_CCTRL_2_3.py +++ b/src/python_testing/TC_CCTRL_2_3.py @@ -125,7 +125,7 @@ async def test_TC_CCTRL_2_3(self): self.step(4) good_request_id = 0x1234567812345678 cmd = Clusters.CommissionerControl.Commands.RequestCommissioningApproval( - requestId=good_request_id, vendorId=th_server_vid, productId=th_server_pid, label="Test Ecosystem") + requestID=good_request_id, vendorID=th_server_vid, productID=th_server_pid, label="Test Ecosystem") await self.send_single_cmd(cmd=cmd) self.step(5) @@ -137,13 +137,13 @@ async def test_TC_CCTRL_2_3(self): events = await self.default_controller.ReadEvent(nodeid=self.dut_node_id, events=event_path) asserts.assert_equal(len(events), 1, "Unexpected event list len") asserts.assert_equal(events[0].Data.statusCode, 0, "Unexpected status code") - asserts.assert_equal(events[0].Data.clientNodeId, + asserts.assert_equal(events[0].Data.clientNodeID, self.matter_test_config.controller_node_id, "Unexpected client node id") - asserts.assert_equal(events[0].Data.requestId, good_request_id, "Unexpected request ID") + asserts.assert_equal(events[0].Data.requestID, good_request_id, "Unexpected request ID") self.step(7) cmd = Clusters.CommissionerControl.Commands.RequestCommissioningApproval( - requestId=good_request_id, vendorId=th_server_vid, productId=th_server_pid) + requestID=good_request_id, vendorID=th_server_vid, productID=th_server_pid) try: await self.send_single_cmd(cmd=cmd) asserts.fail("Unexpected success on CommissionNode") @@ -151,13 +151,13 @@ async def test_TC_CCTRL_2_3(self): asserts.assert_equal(e.status, Status.Failure, "Incorrect error returned") self.step(8) - cmd = Clusters.CommissionerControl.Commands.CommissionNode(requestId=good_request_id, responseTimeoutSeconds=30) + cmd = Clusters.CommissionerControl.Commands.CommissionNode(requestID=good_request_id, responseTimeoutSeconds=30) resp = await self.send_single_cmd(cmd) asserts.assert_equal(type(resp), Clusters.CommissionerControl.Commands.ReverseOpenCommissioningWindow, "Incorrect response type") self.step(9) - cmd = Clusters.CommissionerControl.Commands.CommissionNode(requestId=good_request_id, responseTimeoutSeconds=30) + cmd = Clusters.CommissionerControl.Commands.CommissionNode(requestID=good_request_id, responseTimeoutSeconds=30) try: await self.send_single_cmd(cmd=cmd) asserts.fail("Unexpected success on CommissionNode") diff --git a/src/python_testing/TC_MCORE_FS_1_1.py b/src/python_testing/TC_MCORE_FS_1_1.py index e56a1fb8246b56..4ea9d362655884 100755 --- a/src/python_testing/TC_MCORE_FS_1_1.py +++ b/src/python_testing/TC_MCORE_FS_1_1.py @@ -111,7 +111,7 @@ async def test_TC_MCORE_FS_1_1(self): self.step("3a") good_request_id = 0x1234567812345678 cmd = Clusters.CommissionerControl.Commands.RequestCommissioningApproval( - requestId=good_request_id, vendorId=th_fsa_server_vid, productId=th_fsa_server_pid, label="Test Ecosystem") + requestID=good_request_id, vendorID=th_fsa_server_vid, productID=th_fsa_server_pid, label="Test Ecosystem") await self.send_single_cmd(cmd, endpoint=dut_commissioning_control_endpoint) if not self.is_ci: @@ -125,12 +125,12 @@ async def test_TC_MCORE_FS_1_1(self): asserts.assert_equal(len(new_event), 1, "Unexpected event list len") asserts.assert_equal(new_event[0].Data.statusCode, 0, "Unexpected status code") - asserts.assert_equal(new_event[0].Data.clientNodeId, + asserts.assert_equal(new_event[0].Data.clientNodeID, self.matter_test_config.controller_node_id, "Unexpected client node id") - asserts.assert_equal(new_event[0].Data.requestId, good_request_id, "Unexpected request ID") + asserts.assert_equal(new_event[0].Data.requestID, good_request_id, "Unexpected request ID") self.step("3b") - cmd = Clusters.CommissionerControl.Commands.CommissionNode(requestId=good_request_id, responseTimeoutSeconds=30) + cmd = Clusters.CommissionerControl.Commands.CommissionNode(requestID=good_request_id, responseTimeoutSeconds=30) resp = await self.send_single_cmd(cmd, endpoint=dut_commissioning_control_endpoint) asserts.assert_equal(type(resp), Clusters.CommissionerControl.Commands.ReverseOpenCommissioningWindow, "Incorrect response type") diff --git a/src/python_testing/TC_MCORE_FS_1_3.py b/src/python_testing/TC_MCORE_FS_1_3.py index 1a18896c055952..2a21c977c9fc8b 100644 --- a/src/python_testing/TC_MCORE_FS_1_3.py +++ b/src/python_testing/TC_MCORE_FS_1_3.py @@ -170,9 +170,9 @@ async def commission_via_commissioner_control(self, controller_node_id: int, dev await self.send_single_cmd( node_id=controller_node_id, cmd=Clusters.CommissionerControl.Commands.RequestCommissioningApproval( - requestId=request_id, - vendorId=vendor_id, - productId=product_id, + requestID=request_id, + vendorID=vendor_id, + productID=product_id, ), ) @@ -182,7 +182,7 @@ async def commission_via_commissioner_control(self, controller_node_id: int, dev resp = await self.send_single_cmd( node_id=controller_node_id, cmd=Clusters.CommissionerControl.Commands.CommissionNode( - requestId=request_id, + requestID=request_id, responseTimeoutSeconds=30, ), ) diff --git a/src/python_testing/test_testing/test_TC_CCNTL_2_2.py b/src/python_testing/test_testing/test_TC_CCNTL_2_2.py index d528b5652e1b45..bd28023b8e32e8 100644 --- a/src/python_testing/test_testing/test_TC_CCNTL_2_2.py +++ b/src/python_testing/test_testing/test_TC_CCNTL_2_2.py @@ -94,14 +94,14 @@ def dynamic_event_return(*args, **argv): header = Attribute.EventHeader(EndpointId=0, ClusterId=Clusters.CommissionerControl.id, EventId=Clusters.CommissionerControl.Events.CommissioningRequestResult.event_id, EventNumber=1) data = Clusters.CommissionerControl.Events.CommissioningRequestResult( - requestId=0x1234567887654321, clientNodeId=112233, statusCode=0) + requestID=0x1234567887654321, clientNodeID=112233, statusCode=0) result = Attribute.EventReadResult(Header=header, Status=Status.Success, Data=data) return [result] elif event_call_count == 4: # returned event with new request header = Attribute.EventHeader(EndpointId=0, ClusterId=Clusters.CommissionerControl.id, EventId=Clusters.CommissionerControl.Events.CommissioningRequestResult.event_id, EventNumber=1) data = Clusters.CommissionerControl.Events.CommissioningRequestResult( - requestId=0x1234567812345678, clientNodeId=112233, statusCode=0) + requestID=0x1234567812345678, clientNodeID=112233, statusCode=0) result = Attribute.EventReadResult(Header=header, Status=Status.Success, Data=data) return [result] else: diff --git a/src/python_testing/test_testing/test_TC_MCORE_FS_1_1.py b/src/python_testing/test_testing/test_TC_MCORE_FS_1_1.py index 5b2e29b71915b1..d79b4125309e11 100644 --- a/src/python_testing/test_testing/test_TC_MCORE_FS_1_1.py +++ b/src/python_testing/test_testing/test_TC_MCORE_FS_1_1.py @@ -72,7 +72,7 @@ def dynamic_event_return(*args, **argv): header = Attribute.EventHeader(EndpointId=0, ClusterId=Clusters.CommissionerControl.id, EventId=Clusters.CommissionerControl.Events.CommissioningRequestResult.event_id, EventNumber=1) data = Clusters.CommissionerControl.Events.CommissioningRequestResult( - requestId=0x1234567812345678, clientNodeId=112233, statusCode=0) + requestID=0x1234567812345678, clientNodeID=112233, statusCode=0) result = Attribute.EventReadResult(Header=header, Status=Status.Success, Data=data) return [result] else: From 3d3784ecd5c93141e51dddd8c1f8e2f095313feb Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Tue, 10 Sep 2024 17:01:12 -0400 Subject: [PATCH 10/38] Fix MTRCommissionableBrowserTests when remove/add happen after we found all the devices. (#35515) --- .../CHIPTests/MTRCommissionableBrowserTests.m | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/darwin/Framework/CHIPTests/MTRCommissionableBrowserTests.m b/src/darwin/Framework/CHIPTests/MTRCommissionableBrowserTests.m index 15ef7a839de97a..0acfbd9a580371 100644 --- a/src/darwin/Framework/CHIPTests/MTRCommissionableBrowserTests.m +++ b/src/darwin/Framework/CHIPTests/MTRCommissionableBrowserTests.m @@ -55,6 +55,7 @@ @interface DeviceScannerDelegate : NSObject @property (nonatomic, nullable) XCTestExpectation * expectation; @property (nonatomic) NSMutableArray *> * results; @property (nonatomic) NSMutableArray *> * removedResults; +@property (nonatomic) BOOL expectedResultsCountReached; - (instancetype)initWithExpectation:(XCTestExpectation *)expectation; - (void)controller:(MTRDeviceController *)controller didFindCommissionableDevice:(MTRCommissionableBrowserResult *)device; @@ -71,6 +72,7 @@ - (instancetype)initWithExpectation:(XCTestExpectation *)expectation _expectation = expectation; _results = [[NSMutableArray alloc] init]; _removedResults = [[NSMutableArray alloc] init]; + _expectedResultsCountReached = NO; return self; } @@ -83,6 +85,7 @@ - (instancetype)init _expectation = nil; _results = [[NSMutableArray alloc] init]; _removedResults = [[NSMutableArray alloc] init]; + _expectedResultsCountReached = NO; return self; } @@ -111,7 +114,14 @@ - (void)controller:(MTRDeviceController *)controller didFindCommissionableDevice // Ensure that we just saw the same results as our final set popping in and out if things // ever got removed here. XCTAssertEqualObjects(finalResultsSet, allResultsSet); - [self.expectation fulfill]; + + // If we have a remove and re-add after the result count reached the + // expected one, we can end up in this branch again. Doing the above + // checks is fine, but we shouldn't double-fulfill the expectation. + if (self.expectedResultsCountReached == NO) { + self.expectedResultsCountReached = YES; + [self.expectation fulfill]; + } } XCTAssertLessThanOrEqual(_results.count, kExpectedDiscoveredDevicesCount); From 02316de18c09f246a4ecb1fabf4db46ebbd08a96 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Tue, 10 Sep 2024 17:55:17 -0400 Subject: [PATCH 11/38] Document mask argument of DECLARE_DYNAMIC_ATTRIBUTE. (#35228) People keep forgetting ATTRIBUTE_MASK_WRITABLE here, then being confused why writes do not work. --- src/app/util/attribute-storage.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/app/util/attribute-storage.h b/src/app/util/attribute-storage.h index b45bfe43cff43e..23a9b9b5fd20c3 100644 --- a/src/app/util/attribute-storage.h +++ b/src/app/util/attribute-storage.h @@ -60,6 +60,12 @@ static constexpr uint16_t kEmberInvalidEndpointIndex = 0xFFFF; } /* cluster revision */ \ } +// The attrMask must contain the relevant ATTRIBUTE_MASK_* bits from +// attribute-metadata.h. Specifically: +// +// * Writable attributes must have ATTRIBUTE_MASK_WRITABLE +// * Nullable attributes (have X in the quality column in the spec) must have ATTRIBUTE_MASK_NULLABLE +// * Attributes that have T in the Access column in the spec must have ATTRIBUTE_MASK_MUST_USE_TIMED_WRITE #define DECLARE_DYNAMIC_ATTRIBUTE(attId, attType, attSizeBytes, attrMask) \ { \ ZAP_EMPTY_DEFAULT(), attId, attSizeBytes, ZAP_TYPE(attType), attrMask | ZAP_ATTRIBUTE_MASK(EXTERNAL_STORAGE) \ From b1829ff5ee77449db5dfee62aa7b81eb9f129601 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mi=C5=82osz=20Tomkiel?= Date: Wed, 11 Sep 2024 00:02:51 +0200 Subject: [PATCH 12/38] [chip-tool] Print DeviceType names next to ids (#35445) * Add DeviceTypeIdToText and it's usage * Update Zap-generated files * Minor ZAP fixes * Update Zap-generated files * Revert empty line * Update missing Zap-generated files --- .../logging/DataModelLogger-src.zapt | 1 + .../templates/logging/EntryToText-src.zapt | 10 ++ .../templates/logging/EntryToText.zapt | 4 +- .../templates/partials/StructLoggerImpl.zapt | 22 +++ .../cluster/logging/DataModelLogger.cpp | 25 +-- .../cluster/logging/EntryToText.cpp | 143 ++++++++++++++++++ .../cluster/logging/EntryToText.h | 2 + 7 files changed, 196 insertions(+), 11 deletions(-) diff --git a/examples/chip-tool/templates/logging/DataModelLogger-src.zapt b/examples/chip-tool/templates/logging/DataModelLogger-src.zapt index 3f76143ffab36c..cbce6c27abf767 100644 --- a/examples/chip-tool/templates/logging/DataModelLogger-src.zapt +++ b/examples/chip-tool/templates/logging/DataModelLogger-src.zapt @@ -1,6 +1,7 @@ {{> header}} #include +#include using namespace chip::app::Clusters; diff --git a/examples/chip-tool/templates/logging/EntryToText-src.zapt b/examples/chip-tool/templates/logging/EntryToText-src.zapt index 646ee2ad872eaf..f7cf8ab51c533b 100644 --- a/examples/chip-tool/templates/logging/EntryToText-src.zapt +++ b/examples/chip-tool/templates/logging/EntryToText-src.zapt @@ -81,4 +81,14 @@ char const * GeneratedCommandIdToText(chip::ClusterId cluster, chip::CommandId i {{/zcl_clusters}} default: return "Unknown"; } +} + +char const * DeviceTypeIdToText(chip::DeviceTypeId id) { + switch(id) + { +{{#zcl_device_types}} + case {{asHex code 8}}: return "{{caption}}"; +{{/zcl_device_types}} + default: return "Unknown"; + } } \ No newline at end of file diff --git a/examples/chip-tool/templates/logging/EntryToText.zapt b/examples/chip-tool/templates/logging/EntryToText.zapt index d1a78f84dc218c..fa77ffc916dced 100644 --- a/examples/chip-tool/templates/logging/EntryToText.zapt +++ b/examples/chip-tool/templates/logging/EntryToText.zapt @@ -10,4 +10,6 @@ char const * AttributeIdToText(chip::ClusterId cluster, chip::AttributeId id); char const * AcceptedCommandIdToText(chip::ClusterId cluster, chip::CommandId id); -char const * GeneratedCommandIdToText(chip::ClusterId cluster, chip::CommandId id); \ No newline at end of file +char const * GeneratedCommandIdToText(chip::ClusterId cluster, chip::CommandId id); + +char const * DeviceTypeIdToText(chip::DeviceTypeId id); \ No newline at end of file diff --git a/examples/chip-tool/templates/partials/StructLoggerImpl.zapt b/examples/chip-tool/templates/partials/StructLoggerImpl.zapt index 3dbd99e7400ef4..e4da56005b8064 100644 --- a/examples/chip-tool/templates/partials/StructLoggerImpl.zapt +++ b/examples/chip-tool/templates/partials/StructLoggerImpl.zapt @@ -3,12 +3,34 @@ CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent, const ch DataModelLogger::LogString(label, indent, "{"); {{#zcl_struct_items}} { +{{#if (isEqual type "devtype_id") }} +{{#if isNullable }} + if (value.{{asLowerCamelCase label}}.IsNull()) + { + CHIP_ERROR err = LogValue("{{asUpperCamelCase label}}", indent + 1, value.{{asLowerCamelCase label}}); + if (err != CHIP_NO_ERROR) + { + DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for '{{asUpperCamelCase label}}'"); + return err; + } + } + else + { + std::string item = std::to_string(value.{{asLowerCamelCase label}}.Value()) + " (" + DeviceTypeIdToText(value.{{asLowerCamelCase label}}.Value()) + ")"; + DataModelLogger::LogString("{{asUpperCamelCase label}}", indent + 1, item); + } +{{else}} + std::string item = std::to_string(value.{{asLowerCamelCase label}}) + " (" + DeviceTypeIdToText(value.{{asLowerCamelCase label}}) + ")"; + DataModelLogger::LogString("{{asUpperCamelCase label}}", indent + 1, item); +{{/if}} +{{else}} CHIP_ERROR err = LogValue("{{asUpperCamelCase label}}", indent + 1, value.{{asLowerCamelCase label}}); if (err != CHIP_NO_ERROR) { DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for '{{asUpperCamelCase label}}'"); return err; } +{{/if}} } {{/zcl_struct_items}} DataModelLogger::LogString(indent, "}"); diff --git a/zzz_generated/chip-tool/zap-generated/cluster/logging/DataModelLogger.cpp b/zzz_generated/chip-tool/zap-generated/cluster/logging/DataModelLogger.cpp index 2d788bd2613215..8def02781d4b9a 100644 --- a/zzz_generated/chip-tool/zap-generated/cluster/logging/DataModelLogger.cpp +++ b/zzz_generated/chip-tool/zap-generated/cluster/logging/DataModelLogger.cpp @@ -18,6 +18,7 @@ // THIS FILE IS GENERATED BY ZAP #include +#include using namespace chip::app::Clusters; @@ -273,12 +274,8 @@ CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent, { DataModelLogger::LogString(label, indent, "{"); { - CHIP_ERROR err = LogValue("DeviceType", indent + 1, value.deviceType); - if (err != CHIP_NO_ERROR) - { - DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'DeviceType'"); - return err; - } + std::string item = std::to_string(value.deviceType) + " (" + DeviceTypeIdToText(value.deviceType) + ")"; + DataModelLogger::LogString("DeviceType", indent + 1, item); } { CHIP_ERROR err = LogValue("Revision", indent + 1, value.revision); @@ -641,11 +638,19 @@ DataModelLogger::LogValue(const char * label, size_t indent, } } { - CHIP_ERROR err = LogValue("DeviceType", indent + 1, value.deviceType); - if (err != CHIP_NO_ERROR) + if (value.deviceType.IsNull()) { - DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'DeviceType'"); - return err; + CHIP_ERROR err = LogValue("DeviceType", indent + 1, value.deviceType); + if (err != CHIP_NO_ERROR) + { + DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'DeviceType'"); + return err; + } + } + else + { + std::string item = std::to_string(value.deviceType.Value()) + " (" + DeviceTypeIdToText(value.deviceType.Value()) + ")"; + DataModelLogger::LogString("DeviceType", indent + 1, item); } } DataModelLogger::LogString(indent, "}"); diff --git a/zzz_generated/chip-tool/zap-generated/cluster/logging/EntryToText.cpp b/zzz_generated/chip-tool/zap-generated/cluster/logging/EntryToText.cpp index 07bac4319c7c61..8f320e64e682b8 100644 --- a/zzz_generated/chip-tool/zap-generated/cluster/logging/EntryToText.cpp +++ b/zzz_generated/chip-tool/zap-generated/cluster/logging/EntryToText.cpp @@ -6700,3 +6700,146 @@ char const * GeneratedCommandIdToText(chip::ClusterId cluster, chip::CommandId i return "Unknown"; } } + +char const * DeviceTypeIdToText(chip::DeviceTypeId id) +{ + switch (id) + { + case 0x0000000A: + return "Matter Door Lock"; + case 0x0000000B: + return "Matter Door Lock Controller"; + case 0x0000000E: + return "Matter Aggregator"; + case 0x0000000F: + return "Matter Generic Switch"; + case 0x00000011: + return "Matter Power Source"; + case 0x00000012: + return "Matter OTA Requestor"; + case 0x00000013: + return "Matter Bridged Device"; + case 0x00000014: + return "Matter OTA Provider"; + case 0x00000015: + return "Matter Contact Sensor"; + case 0x00000016: + return "Matter Root Node"; + case 0x00000019: + return "Matter Secondary Network Interface Device Type"; + case 0x00000022: + return "Matter Speaker"; + case 0x00000023: + return "Matter Casting Video Player"; + case 0x00000024: + return "Matter Content App"; + case 0x00000027: + return "Matter Mode Select"; + case 0x00000028: + return "Matter Basic Video Player"; + case 0x00000029: + return "Matter Casting Video Client"; + case 0x0000002A: + return "Matter Video Remote Control"; + case 0x0000002B: + return "Matter Fan"; + case 0x0000002C: + return "Matter Air Quality Sensor"; + case 0x0000002D: + return "Matter Air Purifier"; + case 0x00000041: + return "Matter Water Freeze Detector"; + case 0x00000042: + return "Matter Water Valve"; + case 0x00000043: + return "Matter Water Leak Detector"; + case 0x00000044: + return "Matter Rain Sensor"; + case 0x00000070: + return "Matter Refrigerator"; + case 0x00000071: + return "Matter Temperature Controlled Cabinet"; + case 0x00000072: + return "Matter Room Air Conditioner"; + case 0x00000073: + return "Matter Laundry Washer"; + case 0x00000074: + return "Matter Robotic Vacuum Cleaner"; + case 0x00000075: + return "Matter Dishwasher"; + case 0x00000076: + return "Matter Smoke CO Alarm"; + case 0x00000077: + return "Matter Cook Surface"; + case 0x00000078: + return "Matter Cooktop"; + case 0x00000079: + return "Matter Microwave Oven"; + case 0x0000007A: + return "Matter Extractor Hood"; + case 0x0000007B: + return "Matter Oven"; + case 0x0000007C: + return "Matter Laundry Dryer"; + case 0x00000090: + return "Matter Network Infrastructure Manager"; + case 0x00000091: + return "Matter Thread Border Router"; + case 0x00000100: + return "Matter On/Off Light"; + case 0x00000101: + return "Matter Dimmable Light"; + case 0x00000103: + return "Matter On/Off Light Switch"; + case 0x00000104: + return "Matter Dimmer Switch"; + case 0x00000105: + return "Matter Color Dimmer Switch"; + case 0x00000106: + return "Matter Light Sensor"; + case 0x00000107: + return "Matter Occupancy Sensor"; + case 0x0000010A: + return "Matter On/Off Plug-in Unit"; + case 0x0000010B: + return "Matter Dimmable Plug-in Unit"; + case 0x0000010C: + return "Matter Color Temperature Light"; + case 0x0000010D: + return "Matter Extended Color Light"; + case 0x00000202: + return "Matter Window Covering"; + case 0x00000203: + return "Matter Window Covering Controller"; + case 0x00000300: + return "Matter Heating/Cooling Unit"; + case 0x00000301: + return "Matter Thermostat"; + case 0x00000302: + return "Matter Temperature Sensor"; + case 0x00000303: + return "Matter Pump"; + case 0x00000304: + return "Matter Pump Controller"; + case 0x00000305: + return "Matter Pressure Sensor"; + case 0x00000306: + return "Matter Flow Sensor"; + case 0x00000307: + return "Matter Humidity Sensor"; + case 0x0000050C: + return "Matter EVSE"; + case 0x00000510: + return "Matter Electrical Sensor"; + case 0x00000840: + return "Matter Control Bridge"; + case 0x00000850: + return "Matter On/Off Sensor"; + case 0xFFF10001: + return "Matter Orphan Clusters"; + case 0xFFF10003: + return "Matter All-clusters-app Server Example"; + default: + return "Unknown"; + } +} diff --git a/zzz_generated/chip-tool/zap-generated/cluster/logging/EntryToText.h b/zzz_generated/chip-tool/zap-generated/cluster/logging/EntryToText.h index 27fa6512fbdd01..f65ab6e45f549a 100644 --- a/zzz_generated/chip-tool/zap-generated/cluster/logging/EntryToText.h +++ b/zzz_generated/chip-tool/zap-generated/cluster/logging/EntryToText.h @@ -28,3 +28,5 @@ char const * AttributeIdToText(chip::ClusterId cluster, chip::AttributeId id); char const * AcceptedCommandIdToText(chip::ClusterId cluster, chip::CommandId id); char const * GeneratedCommandIdToText(chip::ClusterId cluster, chip::CommandId id); + +char const * DeviceTypeIdToText(chip::DeviceTypeId id); From 702fae3c22e6c0b19066a8487b3a411971be9a53 Mon Sep 17 00:00:00 2001 From: Jeff Tung <100387939+jtung-apple@users.noreply.github.com> Date: Tue, 10 Sep 2024 17:47:45 -0700 Subject: [PATCH 13/38] [Darwin] MTRDeviceController initial device retain should not depend on matter queue (#35498) --- src/darwin/Framework/CHIP/MTRDeviceController.mm | 2 +- src/darwin/Framework/CHIP/MTRDeviceController_Concrete.mm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/darwin/Framework/CHIP/MTRDeviceController.mm b/src/darwin/Framework/CHIP/MTRDeviceController.mm index 69bb02d5f1f03d..246955afdfd55b 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceController.mm +++ b/src/darwin/Framework/CHIP/MTRDeviceController.mm @@ -859,7 +859,7 @@ - (BOOL)startup:(MTRDeviceControllerStartupParamsInternal *)startupParams // // Note that this is just an optimization to avoid throwing the information away and immediately // re-reading it from storage. - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t) (kSecondsToWaitBeforeAPIClientRetainsMTRDevice * NSEC_PER_SEC)), self.chipWorkQueue, ^{ + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t) (kSecondsToWaitBeforeAPIClientRetainsMTRDevice * NSEC_PER_SEC)), dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0), ^{ MTR_LOG("%@ un-retain devices loaded at startup %lu", self, static_cast(deviceList.count)); }); }]; diff --git a/src/darwin/Framework/CHIP/MTRDeviceController_Concrete.mm b/src/darwin/Framework/CHIP/MTRDeviceController_Concrete.mm index c8f8950579b350..bdcbafae1b6c9d 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceController_Concrete.mm +++ b/src/darwin/Framework/CHIP/MTRDeviceController_Concrete.mm @@ -761,7 +761,7 @@ - (BOOL)startup:(MTRDeviceControllerStartupParamsInternal *)startupParams // // Note that this is just an optimization to avoid throwing the information away and immediately // re-reading it from storage. - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t) (kSecondsToWaitBeforeAPIClientRetainsMTRDevice * NSEC_PER_SEC)), self.chipWorkQueue, ^{ + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t) (kSecondsToWaitBeforeAPIClientRetainsMTRDevice * NSEC_PER_SEC)), dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0), ^{ MTR_LOG("%@ un-retain devices loaded at startup %lu", self, static_cast(deviceList.count)); }); }]; From 1f2f6be08137d7c9117920afbedb69cf3dff7241 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Tue, 10 Sep 2024 21:08:20 -0400 Subject: [PATCH 14/38] Add a step timeout for Matter.framework unit tests. (#35530) If a test hangs, we end up running until job timeout after 6 hours. But that skips later steps, including log uploads, which makes it harder to figure out why the hang happened. The fix is to use a timeout on the test job that is somewhat shorter than the 6-hour job timeout, so we allow time for the log upload too. --- .github/workflows/darwin.yaml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/darwin.yaml b/.github/workflows/darwin.yaml index 360c5bb6963217..9eeac9118ef9d3 100644 --- a/.github/workflows/darwin.yaml +++ b/.github/workflows/darwin.yaml @@ -105,10 +105,9 @@ jobs: run: | scripts/examples/gn_build_example.sh examples/ota-requestor-app/linux out/debug/ota-requestor-app chip_config_network_layer_ble=false non_spec_compliant_ota_action_delay_floor=0 - name: Run Framework Tests - # For now disable unguarded-availability-new warnings because we - # internally use APIs that we are annotating as only available on - # new enough versions. Maybe we should change out deployment - # target versions instead? + # We want to ensure that our log upload runs on timeout, so use a timeout here shorter + # than the 6-hour overall job timeout. 4.5 hours should be plenty. + timeout-minutes: 270 working-directory: src/darwin/Framework run: | mkdir -p /tmp/darwin/framework-tests From 9257ca775ebb50467eae0678b9751c4162800b10 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Tue, 10 Sep 2024 21:43:06 -0400 Subject: [PATCH 15/38] Fix deadlock in MTRDeviceController suspend/resume. (#35526) If a resume happened before the async work from a suspend finished running on the Matter queue, we could deadlock: the Matter queue would be holding the device lock and try to acquire the lock to read "suspended" from the controller, while the controller would be holding the "suspended" lock and trying to acquire the device lock as part of synchronous resume work. The fix is to: 1) Stop trying to read the suspended state of the controller in MTRDevice_Concrete except during MTRDevice_Concrete initialization. Instead, store the suspended state directly in MTRDevice_Concrete at init time and update it when the controller notifies about suspend/resume. 2) Fix controller suspend/resume to guarantee that we create the device list snapshot and set our suspended state in one atomic operation, so that devices are either created before that op (and then end up in the list) or after it (and then pick up the new controller suspended state. 3) Remove the locking around controller suspend/resume, because it's proving hard to reason about. This will be replaced by something better once we figure out how threadsafety should work in controller API in general. In the meantime, suspend/resume on a given controller should only be done on a single serial queue. 4) Use an atomic for the suspended state, so reading it can be done from any thread/queue even without locking. --- .../Framework/CHIP/MTRDeviceController.mm | 71 ++++++++++--------- .../Framework/CHIP/MTRDevice_Concrete.mm | 16 +++-- 2 files changed, 49 insertions(+), 38 deletions(-) diff --git a/src/darwin/Framework/CHIP/MTRDeviceController.mm b/src/darwin/Framework/CHIP/MTRDeviceController.mm index 246955afdfd55b..2f40df76a7086d 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceController.mm +++ b/src/darwin/Framework/CHIP/MTRDeviceController.mm @@ -154,7 +154,11 @@ @implementation MTRDeviceController { MTRP256KeypairBridge _signingKeypairBridge; MTRP256KeypairBridge _operationalKeypairBridge; - BOOL _suspended; + // For now, we just ensure that access to _suspended is atomic, but don't + // guarantee atomicity of the the entire suspend/resume operation. The + // expectation is that suspend/resume on a given controller happen on some + // specific queue, so can't race against each other. + std::atomic _suspended; // Counters to track assertion status and access controlled by the _assertionLock NSUInteger _keepRunningAssertionCounter; @@ -378,9 +382,7 @@ - (BOOL)isRunning - (BOOL)isSuspended { - @synchronized(self) { - return _suspended; - } + return _suspended; } - (void)_notifyDelegatesOfSuspendState @@ -397,48 +399,49 @@ - (void)suspend { MTR_LOG("%@ suspending", self); - @synchronized(self) { + NSArray * devicesToSuspend; + { + std::lock_guard lock(*self.deviceMapLock); + // Set _suspended under the device map lock. This guarantees that + // for any given device exactly one of two things is true: + // * It is in the snapshot we are creating + // * It is created after we have changed our _suspended state. _suspended = YES; + devicesToSuspend = [self.nodeIDToDeviceMap objectEnumerator].allObjects; + } - NSArray * devicesToSuspend; - { - std::lock_guard lock(*self.deviceMapLock); - devicesToSuspend = [self.nodeIDToDeviceMap objectEnumerator].allObjects; - } - - for (MTRDevice * device in devicesToSuspend) { - [device controllerSuspended]; - } - - // TODO: In the concrete class, consider what should happen with: - // - // * Active commissioning sessions (presumably close them?) - // * CASE sessions in general. - // * Possibly try to see whether we can change our fabric entry to not advertise and restart advertising. - - [self _notifyDelegatesOfSuspendState]; + for (MTRDevice * device in devicesToSuspend) { + [device controllerSuspended]; } + + // TODO: In the concrete class, consider what should happen with: + // + // * Active commissioning sessions (presumably close them?) + // * CASE sessions in general. + // * Possibly try to see whether we can change our fabric entry to not advertise and restart advertising. + [self _notifyDelegatesOfSuspendState]; } - (void)resume { MTR_LOG("%@ resuming", self); - @synchronized(self) { + NSArray * devicesToResume; + { + std::lock_guard lock(*self.deviceMapLock); + // Set _suspended under the device map lock. This guarantees that + // for any given device exactly one of two things is true: + // * It is in the snapshot we are creating + // * It is created after we have changed our _suspended state. _suspended = NO; + devicesToResume = [self.nodeIDToDeviceMap objectEnumerator].allObjects; + } - NSArray * devicesToResume; - { - std::lock_guard lock(*self.deviceMapLock); - devicesToResume = [self.nodeIDToDeviceMap objectEnumerator].allObjects; - } - - for (MTRDevice * device in devicesToResume) { - [device controllerResumed]; - } - - [self _notifyDelegatesOfSuspendState]; + for (MTRDevice * device in devicesToResume) { + [device controllerResumed]; } + + [self _notifyDelegatesOfSuspendState]; } - (BOOL)matchesPendingShutdownControllerWithOperationalCertificate:(nullable MTRCertificateDERBytes)operationalCertificate andRootCertificate:(nullable MTRCertificateDERBytes)rootCertificate diff --git a/src/darwin/Framework/CHIP/MTRDevice_Concrete.mm b/src/darwin/Framework/CHIP/MTRDevice_Concrete.mm index 055c8a31ac45c5..64ba651f0ce192 100644 --- a/src/darwin/Framework/CHIP/MTRDevice_Concrete.mm +++ b/src/darwin/Framework/CHIP/MTRDevice_Concrete.mm @@ -62,6 +62,7 @@ @interface MTRDevice_Concrete () @property (nonatomic, readwrite) MTRDeviceState state; @property (nonatomic, readwrite, nullable) NSDate * estimatedStartTime; @property (nonatomic, readwrite, nullable, copy) NSNumber * estimatedSubscriptionLatency; +@property (nonatomic, readwrite, assign) BOOL suspended; @end @@ -395,6 +396,8 @@ - (instancetype)initWithNodeID:(NSNumber *)nodeID controller:(MTRDeviceControlle }]; } + self.suspended = controller.suspended; + MTR_LOG_DEBUG("%@ init with hex nodeID 0x%016llX", self, _nodeID.unsignedLongLongValue); } return self; @@ -719,8 +722,8 @@ - (BOOL)_subscriptionsAllowed { os_unfair_lock_assert_owner(&self->_lock); - // We should not allow a subscription for suspended controllers or device controllers over XPC. - return _deviceController.isSuspended == NO && ![_deviceController isKindOfClass:MTRDeviceControllerOverXPC.class]; + // We should not allow a subscription when we are suspended or for device controllers over XPC. + return self.suspended == NO && ![_deviceController isKindOfClass:MTRDeviceControllerOverXPC.class]; } - (void)_delegateAdded @@ -1290,7 +1293,7 @@ - (void)_doHandleSubscriptionReset:(NSNumber * _Nullable)retryDelay os_unfair_lock_assert_owner(&_lock); - if (_deviceController.isSuspended) { + if (self.suspended) { MTR_LOG("%@ ignoring expected subscription reset on controller suspend", self); return; } @@ -1378,7 +1381,6 @@ - (void)_reattemptSubscriptionNowIfNeededWithReason:(NSString *)reason } MTR_LOG("%@ reattempting subscription with reason %@", self, reason); - self.reattemptingSubscription = NO; [self _setupSubscriptionWithReason:reason]; } @@ -2302,6 +2304,10 @@ - (void)_setupSubscriptionWithReason:(NSString *)reason os_unfair_lock_assert_owner(&self->_lock); + // If we have a pending subscription reattempt, make sure it does not + // actually happen, since we are trying to do a subscription now. + self.reattemptingSubscription = NO; + if (![self _subscriptionsAllowed]) { MTR_LOG("%@ _setupSubscription: Subscriptions not allowed. Do not set up subscription (reason: %@)", self, reason); return; @@ -3991,6 +3997,7 @@ - (void)controllerSuspended [super controllerSuspended]; std::lock_guard lock(self->_lock); + self.suspended = YES; [self _resetSubscriptionWithReasonString:@"Controller suspended"]; // Ensure that any pre-existing resubscribe attempts we control don't try to @@ -4003,6 +4010,7 @@ - (void)controllerResumed [super controllerResumed]; std::lock_guard lock(self->_lock); + self.suspended = NO; if (![self _delegateExists]) { MTR_LOG("%@ ignoring controller resume: no delegates", self); From 9a6694fca3ee23ed4af5bfa168c4851e0dca00cf Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Wed, 11 Sep 2024 00:47:25 -0400 Subject: [PATCH 16/38] Add better logging when doing Matter frameworks controller suspend/resume. (#35520) --- src/darwin/Framework/CHIP/MTRDeviceController.mm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/darwin/Framework/CHIP/MTRDeviceController.mm b/src/darwin/Framework/CHIP/MTRDeviceController.mm index 2f40df76a7086d..dc36aeb694d1e7 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceController.mm +++ b/src/darwin/Framework/CHIP/MTRDeviceController.mm @@ -410,6 +410,7 @@ - (void)suspend devicesToSuspend = [self.nodeIDToDeviceMap objectEnumerator].allObjects; } + MTR_LOG("%@ found %lu devices to suspend", self, static_cast(devicesToSuspend.count)); for (MTRDevice * device in devicesToSuspend) { [device controllerSuspended]; } @@ -437,6 +438,7 @@ - (void)resume devicesToResume = [self.nodeIDToDeviceMap objectEnumerator].allObjects; } + MTR_LOG("%@ found %lu devices to resume", self, static_cast(devicesToResume.count)); for (MTRDevice * device in devicesToResume) { [device controllerResumed]; } From edf1f6559658963fd196273fcbf88a51efebcb70 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Wed, 11 Sep 2024 01:46:11 -0400 Subject: [PATCH 17/38] Add documentation for adding a new libfuzzer fuzzer. (#35158) --- .github/.wordlist.txt | 1 + docs/testing/fuzz_testing.md | 108 ++++++++++++++++++++++++++++++++++- 2 files changed, 108 insertions(+), 1 deletion(-) diff --git a/.github/.wordlist.txt b/.github/.wordlist.txt index c84d4038352101..f317901e450aa6 100644 --- a/.github/.wordlist.txt +++ b/.github/.wordlist.txt @@ -572,6 +572,7 @@ fsync ftd fullclean fuzzer +fuzzers fuzztest FW gbl diff --git a/docs/testing/fuzz_testing.md b/docs/testing/fuzz_testing.md index b7faeae463a10e..7660e18032ef9a 100644 --- a/docs/testing/fuzz_testing.md +++ b/docs/testing/fuzz_testing.md @@ -7,13 +7,119 @@ thousands of different inputs. - Fuzz testing is often done with sanitizers enabled; to catch memory errors and undefined behavior. -- The most commonly used fuzz testing frameworks for C/C++ are LibFuzzer and +- The most commonly used fuzz testing frameworks for C/C++ are libFuzzer and AFL. - [Google's FuzzTest](https://github.com/google/fuzztest) is a newer framework that simplifies writing fuzz tests with user-friendly APIs and offers more control over input generation. It also integrates seamlessly with Google Test (GTest). +## Fuzz testing with libFuzzer + +The following example demonstrates how to use libFuzzer to write a simple fuzz +test. Each fuzzer function is defined using +`LLVMFuzzerTestOneInput(const uint8_t * data, size_t len)`. + +The Fuzzer must be located in a Test Folder : `src/some_directory/tests/` + +``` +#include +#include + +/** + * @file + * This file describes a Fuzzer for ... + */ + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t * data, size_t len) +{ + + // Instantiate values as needed + // Call target function for the fuzzer with the fuzzing input (data and len) + + return 0; +} + +``` + +See +[FuzzBase38Decode.cpp](https://github.com/project-chip/connectedhomeip/blob/master/src/setup_payload/tests/FuzzBase38Decode.cpp) +for an example of a simple fuzz test. + +### Compiling and running + +- Add to `src/some_directory/tests/BUILD.gn` + + - Example + + ``` + import("${chip_root}/build/chip/fuzz_test.gni") + + if (enable_fuzz_test_targets) { + chip_fuzz_target("FuzzTargetName1") { + sources = [ "Fuzzer1.cpp" ] + public_deps = [ + // Dependencies go here. + ] + } + chip_fuzz_target("FuzzTargetName2") { + sources = [ "Fuzzer2.cpp" ] + public_deps = [ + // Dependencies go here. + ] + } + } + ``` + + - CHIP_FUZZ_TARGET : the name of the fuzz target + - SOURCES : file in the test folder containing the fuzzer + implementation + - PUBLIC_DEPS : Code Dependencies needed to build fuzzer + + - Another example: + [src/setup_payload/tests/BUILD.gn](https://github.com/project-chip/connectedhomeip/blob/b367512f519e5e109346e81a0d84fd85cd9192f7/src/setup_payload/tests/BUILD.gn#L43) + +- Add to `src/BUILD.gn` + + - Add the Fuzzing Target in this part of the code : + [src/BUILD.gn](https://github.com/project-chip/connectedhomeip/blob/b367512f519e5e109346e81a0d84fd85cd9192f7/BUILD.gn#L52) + + - Add Fuzzing Target like that + + ``` + if (enable_fuzz_test_targets) { + group("fuzz_tests") { + deps = [ + "${chip_root}/src/credentials/tests:fuzz-chip-cert", + "${chip_root}/src/lib/core/tests:fuzz-tlv-reader", + "${chip_root}/src/lib/dnssd/minimal_mdns/tests:fuzz-minmdns-packet-parsing", + "${chip_root}/src/lib/format/tests:fuzz-payload-decoder", + "${chip_root}/src/setup_payload/tests:fuzz-setup-payload-base38", + "${chip_root}/src/setup_payload/tests:fuzz-setup-payload-base38-decode", + // ADD HERE YOUR FUZZING TARGET + "${chip_root}/some_directory/tests:FuzzTargetName" + ] + } + } + ``` + +- Build all fuzzers + ``` + ./scripts/build/build_examples.py --target --tests-asan-libfuzzer-clang build + ``` + e.g. + ``` + ./scripts/build/build_examples.py --target darwin-arm64-tests-asan-libfuzzer-clang build + ``` + \*\* Make sure to put the right host and compiler +- Fuzzers binaries are compiled into: + + - `out/--tests-asan-libfuzzer-clang/tests` + - e.g. `darwin-arm64-tests-asan-libfuzzer-clang` + +- Running the fuzzer with a corpus + - `path_to_fuzzer_in_test_folder path_to_corpus` + ## `Google's FuzzTest` - Google FuzzTest is integrated through Pigweed From 4f25d84136a67f67c499dad237e9be567cf10fdd Mon Sep 17 00:00:00 2001 From: William Date: Wed, 11 Sep 2024 13:06:01 +0100 Subject: [PATCH 18/38] encourage the use of CopyCharSpanToMutableCharSpanWithTruncation (#35444) * Updated the service area documentation to encourage the use of CopyCharSpanToMutableCharSpanWithTruncation for memory safety. Updated the rvc-app example to use this method. * Restyled by whitespace --------- Co-authored-by: Restyled.io --- .../rvc-app/rvc-common/src/rvc-device.cpp | 6 ++--- .../src/rvc-service-area-delegate.cpp | 6 ++--- .../service-area-delegate.h | 23 +++++++++++-------- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/examples/rvc-app/rvc-common/src/rvc-device.cpp b/examples/rvc-app/rvc-common/src/rvc-device.cpp index 88b8095ddf8bdd..02a75c51f56074 100644 --- a/examples/rvc-app/rvc-common/src/rvc-device.cpp +++ b/examples/rvc-app/rvc-common/src/rvc-device.cpp @@ -168,7 +168,7 @@ bool RvcDevice::SaIsSetSelectedAreasAllowed(MutableCharSpan & statusText) { if (mOperationalStateInstance.GetCurrentOperationalState() == to_underlying(OperationalState::OperationalStateEnum::kRunning)) { - CopyCharSpanToMutableCharSpan("cannot set the Selected Areas while the device is running"_span, statusText); + CopyCharSpanToMutableCharSpanWithTruncation("cannot set the Selected Areas while the device is running"_span, statusText); return false; } return true; @@ -179,14 +179,14 @@ bool RvcDevice::SaHandleSkipArea(uint32_t skippedArea, MutableCharSpan & skipSta if (mServiceAreaInstance.GetCurrentArea() != skippedArea) { // This device only supports skipping the current location. - CopyCharSpanToMutableCharSpan("the skipped area does not match the current area"_span, skipStatusText); + CopyCharSpanToMutableCharSpanWithTruncation("the skipped area does not match the current area"_span, skipStatusText); return false; } if (mOperationalStateInstance.GetCurrentOperationalState() != to_underlying(OperationalState::OperationalStateEnum::kRunning)) { // This device only accepts the skip are command while in the running state - CopyCharSpanToMutableCharSpan("skip area is only accepted when the device is running"_span, skipStatusText); + CopyCharSpanToMutableCharSpanWithTruncation("skip area is only accepted when the device is running"_span, skipStatusText); return false; } diff --git a/examples/rvc-app/rvc-common/src/rvc-service-area-delegate.cpp b/examples/rvc-app/rvc-common/src/rvc-service-area-delegate.cpp index b46206ec50ee75..1a6ba6d8c95999 100644 --- a/examples/rvc-app/rvc-common/src/rvc-service-area-delegate.cpp +++ b/examples/rvc-app/rvc-common/src/rvc-service-area-delegate.cpp @@ -134,7 +134,7 @@ bool RvcServiceAreaDelegate::IsValidSelectAreasSet(const Span & if (!GetInstance()->GetSupportedAreaById(selectedAreas[0], ignoredIndex, tempArea)) { areaStatus = SelectAreasStatus::kUnsupportedArea; - CopyCharSpanToMutableCharSpan("unable to find selected area in supported areas"_span, statusText); + CopyCharSpanToMutableCharSpanWithTruncation("unable to find selected area in supported areas"_span, statusText); return false; } @@ -145,14 +145,14 @@ bool RvcServiceAreaDelegate::IsValidSelectAreasSet(const Span & if (!GetInstance()->GetSupportedAreaById(areaId, ignoredIndex, tempArea)) { areaStatus = SelectAreasStatus::kUnsupportedArea; - CopyCharSpanToMutableCharSpan("unable to find selected area in supported areas"_span, statusText); + CopyCharSpanToMutableCharSpanWithTruncation("unable to find selected area in supported areas"_span, statusText); return false; } if (tempArea.mapID.Value() != mapId) { areaStatus = SelectAreasStatus::kInvalidSet; - CopyCharSpanToMutableCharSpan("all selected areas must be in the same map"_span, statusText); + CopyCharSpanToMutableCharSpanWithTruncation("all selected areas must be in the same map"_span, statusText); return false; } } diff --git a/src/app/clusters/service-area-server/service-area-delegate.h b/src/app/clusters/service-area-server/service-area-delegate.h index 3983e8d6ed7c25..f82f71fea31d13 100644 --- a/src/app/clusters/service-area-server/service-area-delegate.h +++ b/src/app/clusters/service-area-server/service-area-delegate.h @@ -55,9 +55,10 @@ class Delegate * @brief Can the selected locations be set by the client in the current operating mode? * @param[out] statusText text describing why the selected locations cannot be set (if return is false). * Max size kMaxSizeStatusText. - * Note: If the return is false and statusText is not successfully set, for example due to a string that can be longer than - * kMaxSizeStatusText, the size of this value should be set to 0 with .reduce_size(0) to avoid callers using un-initialized - * memory. + * Note: statusText must be successfully set if the return is false. Use CopyCharSpanToMutableCharSpanWithTruncation to + * ensure that a message is copied successfully. Otherwise, ensure that if setting the statusText can fail (e.g., due + * to exceeding kMaxSizeStatusText) the size of this value is set to 0 with .reduce_size(0) to avoid callers using + * un-initialized memory. * @return true if the current device state allows selected locations to be set by user. * * @note The statusText field SHOULD indicate why the request is not allowed, given the current mode @@ -77,9 +78,10 @@ class Delegate * @param[in] selectedAreas List of new selected locations. * @param[out] locationStatus Success if all checks pass, error code if failure. * @param[out] statusText text describing failure (see description above). Max size kMaxSizeStatusText. - * Note: If the return is false and statusText is not successfully set, for example due to a string that can be longer than - * kMaxSizeStatusText, the size of this value should be set to 0 with .reduce_size(0) to avoid callers using un-initialized - * memory. + * Note: statusText must be successfully set if the return is false. Use CopyCharSpanToMutableCharSpanWithTruncation to + * ensure that a message is copied successfully. Otherwise, ensure that if setting the statusText can fail (e.g., due + * to exceeding kMaxSizeStatusText) the size of this value is set to 0 with .reduce_size(0) to avoid callers using + * un-initialized memory. * @return true if success. * * @note If the SelectAreas command is allowed when the device is operating and the selected locations change to none, the @@ -93,9 +95,10 @@ class Delegate * calling this method. * @param[in] skippedArea the area ID to skip. * @param[out] skipStatusText text describing why the current location cannot be skipped. Max size kMaxSizeStatusText. - * Note: If the return is false and skipStatusText is not successfully set, for example due to a string that can be longer than - * kMaxSizeStatusText, the size of this value should be set to 0 with .reduce_size(0) to avoid callers using un-initialized - * memory. + * Note: skipStatusText must be successfully set if the return is false. Use CopyCharSpanToMutableCharSpanWithTruncation to + * ensure that a message is copied successfully. Otherwise, ensure that if setting the skipStatusText can fail (e.g., due + * to exceeding kMaxSizeStatusText) the size of this value is set to 0 with .reduce_size(0) to avoid callers using + * un-initialized memory. * @return true if command is successful, false if the received skip request cannot be handled due to the current mode of the * device. * @@ -120,7 +123,7 @@ class Delegate virtual bool HandleSkipArea(uint32_t skippedArea, MutableCharSpan & skipStatusText) { // device support of this command is optional - CopyCharSpanToMutableCharSpan("Skip Current Area command not supported by device"_span, skipStatusText); + CopyCharSpanToMutableCharSpanWithTruncation("Skip Current Area command not supported by device"_span, skipStatusText); return false; } From 4541956b589eb2200c4a7d357df8f30a0d980d3b Mon Sep 17 00:00:00 2001 From: Marius Tache <102153746+marius-alex-tache@users.noreply.github.com> Date: Wed, 11 Sep 2024 15:27:47 +0300 Subject: [PATCH 19/38] [NXP] Add mcxw71 examples (#35514) * [nxp][platform][common] Add BLE related headers in common area Signed-off-by: marius-alex-tache (cherry picked from commit f67f7a16e42127badff01b8af84543810b81b3d7) * [nxp][examples][common] Add mcxw71/k32w1 references in common readme Signed-off-by: marius-alex-tache * [nxp][examples][mcxw71] Add lighting-app and contact-sensor-app Signed-off-by: marius-alex-tache [nxp noup][examples][mcxw71] Disable status led from BUILD.gn * CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR is not propagated in examples folder causing LED_MANAGER_ENABLE_STATUS_LED to always be se to 1. This makes the OTA fail due to status led and ext flash CS pin being wired together. Signed-off-by: Andrei Menzopol (cherry picked from commit 188301ab68c348c6ff2c0207b19fc0a7291a1b17) * [nxp][scripts] Add mcxw71 build_examples support Signed-off-by: marius-alex-tache * [nxp][docs][common] Update manufacturing flow * Update factory data write address to APP section * Add hw_params option info * Add reference command for k32w1 factory data generation * Update k32w1 related paths after removing parent folder k32w Signed-off-by: Andrei Menzopol (cherry picked from commit a2927b74419ed090595993447c40991befd7d6d6) * Add mcxw71 in workflow Signed-off-by: marius-alex-tache * [nxp][examples][mcxw71_k32w1] Rename app linker script Signed-off-by: marius-alex-tache * [nxp][examples][k32w1] Update reference to linker script Signed-off-by: marius-alex-tache * [nxp][examples][mcxw71] Remove k32w1 references Update instructions related to NBU flash. Signed-off-by: marius-alex-tache * Restyled by gn * Restyled by prettier-markdown * [nxp] Fix readme misspell errors Signed-off-by: marius-alex-tache * [nxp] Fix lighting app build gn import order Signed-off-by: marius-alex-tache --------- Signed-off-by: marius-alex-tache Co-authored-by: Restyled.io --- .github/workflows/examples-nxp.yaml | 54 ++++ docs/guides/nxp/nxp_manufacturing_flow.md | 16 +- examples/contact-sensor-app/nxp/README.md | 1 + examples/contact-sensor-app/nxp/mcxw71/.gn | 31 ++ .../contact-sensor-app/nxp/mcxw71/BUILD.gn | 260 +++++++++++++++++ .../contact-sensor-app/nxp/mcxw71/README.md | 194 +++++++++++++ .../contact-sensor-app/nxp/mcxw71/args.gni | 43 +++ .../nxp/mcxw71/build_overrides | 1 + .../nxp/mcxw71/include/config/AppConfig.h | 29 ++ .../mcxw71/include/config/CHIPProjectConfig.h | 233 +++++++++++++++ .../nxp/mcxw71/third_party/connectedhomeip | 1 + examples/lighting-app/nxp/README.md | 1 + examples/lighting-app/nxp/k32w1/BUILD.gn | 2 +- examples/lighting-app/nxp/k32w1/README.md | 6 +- examples/lighting-app/nxp/mcxw71/.gn | 31 ++ examples/lighting-app/nxp/mcxw71/BUILD.gn | 268 +++++++++++++++++ examples/lighting-app/nxp/mcxw71/README.md | 270 ++++++++++++++++++ examples/lighting-app/nxp/mcxw71/args.gni | 39 +++ .../lighting-app/nxp/mcxw71/build_overrides | 1 + .../nxp/mcxw71/include/config/AppConfig.h | 29 ++ .../mcxw71/include/config/CHIPProjectConfig.h | 235 +++++++++++++++ .../nxp/mcxw71/third_party/connectedhomeip | 1 + .../lighting-app/nxp/mcxw71/with_pw_rpc.gni | 37 +++ .../app/ldscripts/{k32w1_app.ld => app.ld} | 0 .../mcxw71_k32w1/doc/images/frdm-mcxw71.jpg | Bin 0 -> 922296 bytes .../mcxw71_k32w1/doc/images/mcxw71_debug.jpg | Bin 0 -> 68145 bytes .../doc/images/mcxw71_installed_sdks.jpg | Bin 0 -> 42462 bytes scripts/build/build/targets.py | 9 +- scripts/build/builders/nxp.py | 5 + .../build/testdata/all_targets_linux_x64.txt | 2 +- src/platform/nxp/common/legacy/gatt_db.h | 30 ++ src/platform/nxp/common/legacy/gatt_uuid128.h | 26 ++ 32 files changed, 1840 insertions(+), 15 deletions(-) create mode 100644 examples/contact-sensor-app/nxp/mcxw71/.gn create mode 100644 examples/contact-sensor-app/nxp/mcxw71/BUILD.gn create mode 100644 examples/contact-sensor-app/nxp/mcxw71/README.md create mode 100644 examples/contact-sensor-app/nxp/mcxw71/args.gni create mode 120000 examples/contact-sensor-app/nxp/mcxw71/build_overrides create mode 100644 examples/contact-sensor-app/nxp/mcxw71/include/config/AppConfig.h create mode 100644 examples/contact-sensor-app/nxp/mcxw71/include/config/CHIPProjectConfig.h create mode 120000 examples/contact-sensor-app/nxp/mcxw71/third_party/connectedhomeip create mode 100644 examples/lighting-app/nxp/mcxw71/.gn create mode 100644 examples/lighting-app/nxp/mcxw71/BUILD.gn create mode 100644 examples/lighting-app/nxp/mcxw71/README.md create mode 100644 examples/lighting-app/nxp/mcxw71/args.gni create mode 120000 examples/lighting-app/nxp/mcxw71/build_overrides create mode 100644 examples/lighting-app/nxp/mcxw71/include/config/AppConfig.h create mode 100644 examples/lighting-app/nxp/mcxw71/include/config/CHIPProjectConfig.h create mode 120000 examples/lighting-app/nxp/mcxw71/third_party/connectedhomeip create mode 100644 examples/lighting-app/nxp/mcxw71/with_pw_rpc.gni rename examples/platform/nxp/mcxw71_k32w1/app/ldscripts/{k32w1_app.ld => app.ld} (100%) create mode 100755 examples/platform/nxp/mcxw71_k32w1/doc/images/frdm-mcxw71.jpg create mode 100755 examples/platform/nxp/mcxw71_k32w1/doc/images/mcxw71_debug.jpg create mode 100755 examples/platform/nxp/mcxw71_k32w1/doc/images/mcxw71_installed_sdks.jpg create mode 100644 src/platform/nxp/common/legacy/gatt_db.h create mode 100644 src/platform/nxp/common/legacy/gatt_uuid128.h diff --git a/.github/workflows/examples-nxp.yaml b/.github/workflows/examples-nxp.yaml index 050751457645d4..d09e893f2909dd 100644 --- a/.github/workflows/examples-nxp.yaml +++ b/.github/workflows/examples-nxp.yaml @@ -140,6 +140,60 @@ jobs: if: ${{ !env.ACT }} with: platform-name: K32W1 + mcxw71: + name: MCXW71 + + env: + BUILD_TYPE: gn_k32w + + runs-on: ubuntu-latest + if: github.actor != 'restyled-io[bot]' + + container: + image: ghcr.io/project-chip/chip-build-nxp:71 + volumes: + - "/tmp/bloat_reports:/tmp/bloat_reports" + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Checkout submodules & Bootstrap + uses: ./.github/actions/checkout-submodules-and-bootstrap + with: + platform: nxp + extra-submodule-parameters: --recursive + + - name: Set up environment for size reports + uses: ./.github/actions/setup-size-reports + if: ${{ !env.ACT }} + with: + gh-context: ${{ toJson(github) }} + + - name: Build examples + run: | + scripts/run_in_build_env.sh "\ + ./scripts/build/build_examples.py \ + --target nxp-mcxw71-freertos-lighting \ + --target nxp-mcxw71-freertos-contact-sensor-low-power \ + build \ + --copy-artifacts-to out/artifacts \ + " + - name: Get lighting app size stats + run: | + .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ + nxp mcxw71+release light \ + out/artifacts/nxp-mcxw71-freertos-lighting/chip-mcxw71-light-example.elf \ + /tmp/bloat_reports/ + - name: Get contact sensor size stats + run: | + .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ + nxp mcxw71+release contact \ + out/artifacts/nxp-mcxw71-freertos-contact-sensor-low-power/chip-mcxw71-contact-example.elf \ + /tmp/bloat_reports/ + - name: Uploading Size Reports + uses: ./.github/actions/upload-size-reports + if: ${{ !env.ACT }} + with: + platform-name: MCXW71 rw61x: name: RW61X diff --git a/docs/guides/nxp/nxp_manufacturing_flow.md b/docs/guides/nxp/nxp_manufacturing_flow.md index cb8431cc3b3083..0551d43966f08e 100644 --- a/docs/guides/nxp/nxp_manufacturing_flow.md +++ b/docs/guides/nxp/nxp_manufacturing_flow.md @@ -132,6 +132,7 @@ Here is the interpretation of the **optional** parameters: --unique_id -> Unique id used for rotating device id generation --product_finish -> Visible finish of the product --product_primary_color -> Representative color of the visible parts of the product +--hw_params -> Use application factory data from Hardware Parameters component ``` ## 3. Write provisioning data @@ -144,15 +145,12 @@ DK6Programmer.exe -Y -V2 -s -P 1000000 -Y -p FLASH@0x9D600="factory_d ``` For **K32W1** platform, the binary needs to be written in the internal flash at -location given by `__MATTER_FACTORY_DATA_START`, using `JLink`: +location given by **0xFE080**, using `JLink`: ``` -loadfile factory_data.bin 0xf4000 +loadfile factory_data.bin 0xFE080 ``` -where `0xf4000` is the value of `__MATTER_FACTORY_DATA_START` in the -corresponding .map file (can be different if using a custom linker script). - For **RW61X** platform, the binary needs to be written in the internal flash at location given by `__MATTER_FACTORY_DATA_START`, using `JLink`: @@ -208,7 +206,7 @@ Also, demo **DAC**, **PAI** and **PAA** certificates needed in case Supported platforms: -- K32W1 - `src/plaftorm/nxp/k32w/k32w1/FactoryDataProviderImpl.h` +- K32W1 - `src/plaftorm/nxp/k32w1/FactoryDataProviderImpl.h` For platforms that have a secure subsystem (`SSS`), the DAC private key can be converted to an encrypted blob. This blob will overwrite the DAC private key in @@ -219,6 +217,12 @@ The application will check at initialization whether the DAC private key has been converted or not and convert it if needed. However, the conversion process should be done at manufacturing time for security reasons. +Reference factory data generation command: + +```shell +python3 ./scripts/tools/nxp/factory_data_generator/generate.py -i 10000 -s UXKLzwHdN3DZZLBaL2iVGhQi/OoQwIwJRQV4rpEalbA= -p 14014 -d 1000 --vid "0x1037" --pid "0xA221" --vendor_name "NXP Semiconductors" --product_name "Lighting app" --serial_num "12345678" --date "2023-01-01" --hw_version 1 --hw_version_str "1.0" --cert_declaration ./Chip-Test-CD-1037-A221.der --dac_cert ./Chip-DAC-NXP-1037-A221-Cert.der --dac_key ./Chip-DAC-NXP-1037-A221-Key.der --pai_cert ./Chip-PAI-NXP-1037-A221-Cert.der --spake2p_path ./out/spake2p --unique_id "00112233445566778899aabbccddeeff" --hw_params --out ./factory_data.bin +``` + There is no need for an extra binary. - Write factory data binary. diff --git a/examples/contact-sensor-app/nxp/README.md b/examples/contact-sensor-app/nxp/README.md index 473afb793f9700..133539e44ce3ec 100644 --- a/examples/contact-sensor-app/nxp/README.md +++ b/examples/contact-sensor-app/nxp/README.md @@ -24,6 +24,7 @@ The example is based on: ## Supported devices - [k32w1](k32w1/README.md) +- [mcxw71](mcxw71/README.md) ## Introduction diff --git a/examples/contact-sensor-app/nxp/mcxw71/.gn b/examples/contact-sensor-app/nxp/mcxw71/.gn new file mode 100644 index 00000000000000..146e2b9c27ec06 --- /dev/null +++ b/examples/contact-sensor-app/nxp/mcxw71/.gn @@ -0,0 +1,31 @@ +# Copyright (c) 2020-2024 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("//build_overrides/build.gni") + +# The location of the build configuration file. +buildconfig = "${build_root}/config/BUILDCONFIG.gn" + +# CHIP uses angle bracket includes. +check_system_includes = true + +default_args = { + target_cpu = "arm" + target_os = "freertos" + + import("//args.gni") + + # Import default platform configs + import("${chip_root}/src/platform/nxp/mcxw71_k32w1/args.gni") +} diff --git a/examples/contact-sensor-app/nxp/mcxw71/BUILD.gn b/examples/contact-sensor-app/nxp/mcxw71/BUILD.gn new file mode 100644 index 00000000000000..02a0d7a78768dc --- /dev/null +++ b/examples/contact-sensor-app/nxp/mcxw71/BUILD.gn @@ -0,0 +1,260 @@ +# Copyright (c) 2021-2024 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("//build_overrides/chip.gni") +import("//build_overrides/nxp_sdk.gni") +import("//build_overrides/openthread.gni") + +import("${nxp_sdk_build_root}/nxp_sdk.gni") + +import("${nxp_sdk_build_root}/${nxp_sdk_name}/nxp_executable.gni") + +import("${nxp_sdk_build_root}/${nxp_sdk_name}/${nxp_sdk_name}.gni") + +import("${chip_root}/src/app/icd/icd.gni") +import("${chip_root}/src/crypto/crypto.gni") +import("${chip_root}/src/platform/device.gni") +import("${chip_root}/src/platform/nxp/${nxp_platform}/args.gni") + +declare_args() { + # Setup discriminator as argument + setup_discriminator = 3840 + chip_with_diag_logs_demo = true +} + +assert(current_os == "freertos") +assert(target_os == "freertos") + +example_platform_dir = "${chip_root}/examples/platform/nxp/${nxp_platform}" +common_example_dir = "${chip_root}/examples/platform/nxp/common" + +mcxw71_k32w1_sdk("sdk") { + defines = [] + include_dirs = [] + sources = [] + + # Indicate the path to CHIPProjectConfig.h + include_dirs += [ "include/config" ] + + # Indicate the default path to FreeRTOSConfig.h + include_dirs += [ "${example_platform_dir}/app/project_include/freeRTOS" ] + + # Indicate the default path to OpenThreadConfig.h + include_dirs += [ "${example_platform_dir}/app/project_include/openthread" ] + + include_dirs += [ + "${nxp_sdk_root}/middleware/wireless/framework/boards/kw45_k32w1", + "${nxp_sdk_root}/middleware/wireless/framework/boards/kw45_k32w1/MCXW716C", + ] + + sources += [ + "${nxp_sdk_root}/middleware/wireless/framework/boards/kw45_k32w1/MCXW716C/clock_config.c", + "${nxp_sdk_root}/middleware/wireless/framework/boards/kw45_k32w1/MCXW716C/pin_mux.c", + "${nxp_sdk_root}/middleware/wireless/framework/boards/kw45_k32w1/app_services_init.c", + "${nxp_sdk_root}/middleware/wireless/framework/boards/kw45_k32w1/board.c", + "${nxp_sdk_root}/middleware/wireless/framework/boards/kw45_k32w1/board_comp.c", + "${nxp_sdk_root}/middleware/wireless/framework/boards/kw45_k32w1/board_dcdc.c", + "${nxp_sdk_root}/middleware/wireless/framework/boards/kw45_k32w1/board_extflash.c", + "${nxp_sdk_root}/middleware/wireless/framework/boards/kw45_k32w1/board_lp.c", + "${nxp_sdk_root}/middleware/wireless/framework/boards/kw45_k32w1/hardware_init.c", + ] + + if (is_debug) { + defines += [ "BUILD_RELEASE=0" ] + } else { + defines += [ "BUILD_RELEASE=1" ] + } + + defines += [ + "CHIP_DEVICE_CONFIG_USE_TEST_SETUP_DISCRIMINATOR=${setup_discriminator}", + ] + + if (chip_key_storage == "littlefs") { + include_dirs += [ "${example_platform_dir}/board" ] + sources += [ + "${example_platform_dir}/board/peripherals.c", + "${example_platform_dir}/board/peripherals.h", + ] + } +} + +mcxw71_k32w1_executable("contact_sensor_app") { + output_name = "chip-mcxw71-contact-example" + + defines = [] + deps = [] + include_dirs = [] + sources = [] + + # Defines used by common code + defines += [ + "CONFIG_NET_L2_OPENTHREAD=1", + "CONFIG_NETWORK_LAYER_BLE=1", + "CONFIG_THREAD_DEVICE_TYPE=kThreadDeviceType_SleepyEndDevice", + "CONFIG_OPERATIONAL_KEYSTORE=1", + "EXTERNAL_FACTORY_DATA_PROVIDER_HEADER=\"platform/nxp/common/legacy/FactoryDataProvider.h\"", + ] + + if (chip_with_diag_logs_demo) { + defines += [ "CONFIG_DIAG_LOGS_DEMO=1" ] + } + + if (chip_with_low_power == 1) { + defines += [ "CONFIG_LOW_POWER=1" ] + } else { + defines += [ + "CONFIG_ENABLE_FEEDBACK=1", + "APP_QUEUE_TICKS_TO_WAIT=pdMS_TO_TICKS(10)", + ] + } + + # App common files + include_dirs += [ + "${common_example_dir}/app_task/include", + "${common_example_dir}/matter_button/include", + "${common_example_dir}/clusters/include", + "${common_example_dir}/device_callbacks/include", + "${common_example_dir}/device_manager/include", + "${common_example_dir}/diagnostic_logs/include", + "${common_example_dir}/factory_data/include", + "${common_example_dir}/led_widget/include", + "${common_example_dir}/low_power/include", + "${common_example_dir}/operational_keystore/include", + "${common_example_dir}/ui_feedback/include", + ] + + sources += [ + "${common_example_dir}/app_task/source/AppTaskBase.cpp", + "${common_example_dir}/app_task/source/AppTaskFreeRTOS.cpp", + "${common_example_dir}/clusters/source/ZclCallbacks.cpp", + "${common_example_dir}/device_callbacks/source/CommonDeviceCallbacks.cpp", + "${common_example_dir}/device_manager/source/CHIPDeviceManager.cpp", + "${example_platform_dir}/factory_data/source/AppFactoryDataExample.cpp", + ] + + if (chip_with_low_power == 1) { + sources += [ "${common_example_dir}/low_power/source/LowPower.cpp" ] + } + + if (chip_with_factory_data == 1) { + include_dirs += [ "${chip_root}/src/platform/nxp/common/legacy" ] + deps += [ "${chip_root}/src/platform/nxp:nxp_factory_data" ] + } + + if (chip_enable_ota_requestor) { + defines += [ + "CONFIG_CHIP_OTA_IMAGE_PROCESSOR_HEADER=\"platform/nxp/common/legacy/OTAImageProcessorImpl.h\"", + + # The status LED and the external flash CS pin are wired together. The OTA image writing may fail if used together. + "LED_MANAGER_ENABLE_STATUS_LED=0", + ] + + include_dirs += [ "${common_example_dir}/ota_requestor/include" ] + sources += [ "${common_example_dir}/ota_requestor/source/OTARequestorInitiatorMultiImage.cpp" ] + deps += [ "${chip_root}/src/platform/nxp:nxp_ota" ] + } + + if (chip_with_diag_logs_demo) { + sources += [ + "${common_example_dir}/diagnostic_logs/source/DiagnosticLogsDemo.cpp", + "${common_example_dir}/diagnostic_logs/source/DiagnosticLogsProviderDelegateImpl.cpp", + ] + } + + # Platform specific files + include_dirs += [ + "${example_platform_dir}/util", + "${example_platform_dir}/app/support", + "${example_platform_dir}/button", + ] + + sources += [ + "${example_platform_dir}/button/ButtonManager.cpp", + "${example_platform_dir}/clusters/Identify.cpp", + "${example_platform_dir}/operational_keystore/OperationalKeystore.cpp", + ] + + if (chip_enable_ota_requestor) { + sources += [ "${example_platform_dir}/ota/OtaUtils.cpp" ] + } + + include_dirs += [ + "include/config", + "../common/include", + ] + + sources += [ + "../common/AppTask.cpp", + "../common/DeviceCallbacks.cpp", + "../common/ZclCallbacks.cpp", + "../common/main.cpp", + ] + + if (chip_with_low_power == 0) { + sources += [ + "${common_example_dir}/ui_feedback/source/LedManager.cpp", + "${example_platform_dir}/util/LedOnOff.cpp", + ] + } + + deps += [ + "${chip_root}/examples/providers:device_info_provider", + "${chip_root}/src/platform/logging:default", + ] + + #lit and sit are using different zap files + if (chip_enable_icd_lit) { + deps += [ "${chip_root}/examples/contact-sensor-app/nxp/zap-lit/" ] + } else { + deps += [ "${chip_root}/examples/contact-sensor-app/nxp/zap-sit/" ] + } + + if (chip_openthread_ftd) { + deps += [ + "${openthread_root}:libopenthread-cli-ftd", + "${openthread_root}:libopenthread-ftd", + ] + } else { + deps += [ + "${openthread_root}:libopenthread-cli-mtd", + "${openthread_root}:libopenthread-mtd", + ] + } + + cflags = [ "-Wconversion" ] + + ldscript = "${nxp_sdk_root}/middleware/wireless/framework/Common/devices/kw45_k32w1/gcc/connectivity.ld" + + inputs = [ ldscript ] + + ldflags = [ + "-Wl,--defsym=__heap_size__=0", + "-Wl,--defsym=__stack_size__=0x480", + "-Wl,--defsym=lp_ram_lower_limit=0x04000000", + "-Wl,--defsym=lp_ram_upper_limit=0x2001C000", + "-Wl,-print-memory-usage", + "-Wl,--no-warn-rwx-segments", + "-T" + rebase_path(ldscript, root_build_dir), + ] + + if (chip_with_factory_data == 1) { + ldflags += [ "-Wl,--defsym=gUseFactoryData_d=1" ] + } + + output_dir = root_out_dir +} + +group("default") { + deps = [ ":contact_sensor_app" ] +} diff --git a/examples/contact-sensor-app/nxp/mcxw71/README.md b/examples/contact-sensor-app/nxp/mcxw71/README.md new file mode 100644 index 00000000000000..50d33e10e1b841 --- /dev/null +++ b/examples/contact-sensor-app/nxp/mcxw71/README.md @@ -0,0 +1,194 @@ +# Matter `MCXW71` Contact Sensor Example Application + +For generic information related to contact sensor application, please see the +[common README](../README.md). + +- [Matter `MCXW71` Contact Sensor Example Application](#matter-mcxw71-contact-sensor-example-application) + - [Introduction](#introduction) + - [Device UI](#device-ui) + - [Building](#building) + - [Flashing](#flashing) + - [Flashing the `NBU` image](#flashing-the-nbu-image) + - [Flashing the host image](#flashing-the-host-image) + - [Debugging](#debugging) + - [OTA](#ota) + +## Introduction + +This is a contact sensor application implemented for an `mcxw71` device. + +The following board was used when testing this Matter reference app for an +`mcxw71` device: +![FRDM-MCXW71](../../../platform/nxp/mcxw71_k32w1/doc/images/frdm-mcxw71.jpg) + +## Device UI + +The state feedback is provided through LED effects: + +| widget | effect | description | +| ------- | ----------------------------------- | ----------------------------------------------------------------------------------------------------- | +| LED2 | short flash on (50ms on/950ms off) | The device is in an unprovisioned (unpaired) state and is waiting for a commissioner to connect. | +| LED2 | rapid even flashing (100ms period) | The device is in an unprovisioned state and a commissioner is connected via BLE. | +| LED2 | short flash off (950ms on/50ms off) | The device is fully provisioned, but does not yet have full network (Thread) or service connectivity. | +| LED2 | solid on | The device is fully provisioned and has full network and service connectivity. | +| RGB LED | on | The `StateValue` attribute of the `BooleanState` cluster is `true` (simulating detection). | +| RGB LED | off | The `StateValue` attribute of the `BooleanState` cluster is `false` (simulating no detection). | + +NOTE: `LED2` will be disabled when OTA is used. On `FRDM-MCXW71` board, `PTB0` +is wired to both `LED2` and CS (Chip Select) of the External Flash Memory. Since +the OTA image is stored in external memory, `LED2` operations will affect OTA +operation by corrupting packages and OTA will not work. + +The user actions are summarized below: + +| button | action | state | output | +| ------ | ----------- | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | +| SW2 | short press | not commissioned | Enable BLE advertising | +| SW2 | short press | commissioned + device is LIT | Enable Active Mode | +| SW2 | long press | NA | Initiate a factory reset (can be cancelled by pressing the button again within the factory reset timeout limit - 6 seconds by default) | +| SW3 | short press | NA | Toggle attribute `StateValue` value | +| SW3 | long press | NA | Clean soft reset of the device (takes into account proper Matter shutdown procedure) | + +## Building + +Manually building requires running the following commands: + +``` +user@ubuntu:~/Desktop/git/connectedhomeip$ cd examples/contact-sensor-app/nxp/mcxw71 +user@ubuntu:~/Desktop/git/connectedhomeip/examples/contact-sensor-app/nxp/mcxw71$ gn gen out/debug +user@ubuntu:~/Desktop/git/connectedhomeip/examples/contact-sensor-app/nxp/mcxw71$ ninja -C out/debug +``` + +Please note that running `gn gen out/debug` without `--args` option will use the +default gn args values found in `args.gni`. + +After a successful build, the `elf` and `srec` files are found in `out/debug/`. +See the files prefixed with `chip-mcxw71-contact-example`. + +## Flashing + +Two images must be written to the board: one for the host (CM33) and one for the +`NBU` (CM3). + +### Flashing the `NBU` image + +`NBU` image should be written only when a new NXP SDK is released. + +1. Install + [Secure Provisioning SDK tool](https://www.nxp.com/design/design-center/software/development-software/secure-provisioning-sdk-spsdk:SPSDK) + using Python: + + ``` + pip install spsdk + ``` + + Note: There might be some dependencies that cause conflicts with already + installed Python modules. However, `blhost` tool is still installed and can + be used. + +2. Updating `NBU` for Wireless examples + + It is necessary to work with the matching `NBU` image for the SDK version of + the application you are working with. This means that when you download your + SDK, prior to loading any wireless SDK example, update your `NBU` image with + the SDK provided binaries. For `FRDM` users, please write the following + binary: + + `middleware\wireless\ieee-802.15.4\bin\mcxw71\mcxw71_nbu_ble_15_4_dyn_matter_.sb3` + + Please note that `` may vary depending on the SDK version. + + 1. Place your device in `ISP` mode. + + - Make sure a jumper is placed on `JP25` + - Press and hold `SW4`, press and release Reset, then release `SW4` + + 2. Once the device is connected, you may find the assigned port by running: + + ``` + nxpdevscan + ``` + + 3. Run the `blhost` command to write the `sb3` file: + + ``` + blhost -p receive-sb-file \middleware\wireless\ieee-802.15.4\bin\mcxw71\mcxw71_nbu_ble_15_4_dyn_matter_.sb3 + ``` + +### Flashing the host image + +Host image is the one found under `out/debug/`. It should be written after each +build process. + +If debugging is needed then jump directly to the [Debugging](#debugging) +section. Otherwise, if only flashing is needed then +[JLink](https://www.segger.com/downloads/jlink/) can be used: + +- Plug `MCXW71` to the USB port (no need to keep the `SW4` button pressed + while doing this, e.g. ISP mode is not needed for host flashing) + +- Connect JLink to the device: + + ```bash + JLinkExe -device MCXW71 -if SWD -speed 4000 -autoconnect 1 + ``` + +- Run the following commands: + ```bash + reset + halt + loadfile chip-mcxw71-contact-example.srec + reset + go + quit + ``` + +## Debugging + +One option for debugging would be to use MCUXpresso IDE. + +- Drag-and-drop the zip file containing the NXP SDK in the "Installed SDKs" + tab: + +![Installed SDKs](../../../platform/nxp/mcxw71_k32w1/doc/images/mcxw71_installed_sdks.jpg) + +- Import any demo application from the installed SDK: + +``` +Import SDK example(s).. -> choose a demo app (demo_apps -> hello_world) -> Finish +``` + +![Import demo](../../../platform/nxp/mcxw71_k32w1/doc/images/import_demo.jpg) + +- Flash the previously imported demo application on the board: + +``` +Right click on the application (from Project Explorer) -> Debug as -> JLink/CMSIS-DAP +``` + +After this step, a debug configuration specific for the `MCXW71` board was +created. This debug configuration will be used later on for debugging the +application resulted after ot-nxp compilation. + +- Import Matter repo in MCUXpresso IDE as Makefile Project. Use _none_ as + _Toolchain for Indexer Settings_: + +``` +File -> Import -> C/C++ -> Existing Code as Makefile Project +``` + +![New Project](../../../platform/nxp/mcxw71_k32w1/doc/images/new_project.jpg) + +- Replace the path of the existing demo application with the path of the + `MCXW71` application: + +``` +Run -> Debug Configurations... -> C/C++ Application +``` + +![](../../../platform/nxp/mcxw71_k32w1/doc/images/mcxw71_debug.jpg) + +## OTA + +Please see +[mcxw71 OTA guide](../../../../docs/guides/nxp/nxp_mcxw71_ota_guide.md). diff --git a/examples/contact-sensor-app/nxp/mcxw71/args.gni b/examples/contact-sensor-app/nxp/mcxw71/args.gni new file mode 100644 index 00000000000000..72634a2308d04b --- /dev/null +++ b/examples/contact-sensor-app/nxp/mcxw71/args.gni @@ -0,0 +1,43 @@ +# Copyright (c) 2020-2024 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("//build_overrides/chip.gni") +import("${chip_root}/config/standalone/args.gni") + +# SDK target. This is overridden to add our SDK app_config.h & defines. +nxp_sdk_target = get_label_info(":sdk", "label_no_toolchain") +nxp_device = "MCXW716C" + +chip_enable_ota_requestor = true +chip_stack_lock_tracking = "fatal" +chip_enable_ble = true +chip_generate_link_map_file = true + +chip_system_config_provide_statistics = false +chip_system_config_use_open_thread_inet_endpoints = true +chip_with_lwip = false + +chip_enable_icd_server = true +chip_enable_icd_lit = false +icd_enforce_sit_slow_poll_limit = true +chip_persist_subscriptions = true +chip_subscription_timeout_resumption = true + +is_debug = false + +chip_crypto = "platform" +chip_openthread_ftd = false +chip_with_ot_cli = 0 + +chip_with_diag_logs_demo = true diff --git a/examples/contact-sensor-app/nxp/mcxw71/build_overrides b/examples/contact-sensor-app/nxp/mcxw71/build_overrides new file mode 120000 index 00000000000000..ee19c065d619a2 --- /dev/null +++ b/examples/contact-sensor-app/nxp/mcxw71/build_overrides @@ -0,0 +1 @@ +../../../build_overrides/ \ No newline at end of file diff --git a/examples/contact-sensor-app/nxp/mcxw71/include/config/AppConfig.h b/examples/contact-sensor-app/nxp/mcxw71/include/config/AppConfig.h new file mode 100644 index 00000000000000..0c8019d8e7e33c --- /dev/null +++ b/examples/contact-sensor-app/nxp/mcxw71/include/config/AppConfig.h @@ -0,0 +1,29 @@ +/* + * Copyright 2024 Project CHIP Authors + * All rights reserved. + * + * 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. + */ + +#pragma once + +/* ---- App Config ---- */ +#define APP_DEVICE_TYPE_ENDPOINT 1 +#define APP_CLUSTER_ATTRIBUTE chip::app::Clusters::BooleanState::Attributes::StateValue + +/* ---- Button Manager Config ---- */ +#define BUTTON_MANAGER_FACTORY_RESET_TIMEOUT_MS 6000 + +/* ---- LED Manager Config ---- */ +#define LED_MANAGER_STATUS_LED_INDEX 0 +#define LED_MANAGER_LIGHT_LED_INDEX 1 diff --git a/examples/contact-sensor-app/nxp/mcxw71/include/config/CHIPProjectConfig.h b/examples/contact-sensor-app/nxp/mcxw71/include/config/CHIPProjectConfig.h new file mode 100644 index 00000000000000..9e5cee6eb7b695 --- /dev/null +++ b/examples/contact-sensor-app/nxp/mcxw71/include/config/CHIPProjectConfig.h @@ -0,0 +1,233 @@ +/* + * Copyright (c) 2020-2023 Project CHIP Authors + * Copyright (c) 2020 Google LLC. + * All rights reserved. + * + * 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. + */ + +/** + * @file + * Example project configuration file for CHIP. + * + * This is a place to put application or project-specific overrides + * to the default configuration values for general CHIP features. + * + */ + +#pragma once + +// Use hard-coded test certificates already embedded in generic chip code => set it to 0 +// Use real/development certificates => set it to 1 + file the provisioning section from +// the internal flash +#ifndef CONFIG_CHIP_LOAD_REAL_FACTORY_DATA +#define CONFIG_CHIP_LOAD_REAL_FACTORY_DATA 0 +#endif + +#if CONFIG_CHIP_LOAD_REAL_FACTORY_DATA + +// VID/PID for product => will be used by Basic Information Cluster +#define CHIP_DEVICE_CONFIG_DEVICE_VENDOR_ID 0x1037 +#define CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_ID 0xA401 + +// Set the following define to use the Certification Declaration from below and not use it stored in factory data section +#ifndef CHIP_USE_DEVICE_CONFIG_CERTIFICATION_DECLARATION +#define CHIP_USE_DEVICE_CONFIG_CERTIFICATION_DECLARATION 0 +#endif + +#ifndef CHIP_DEVICE_CONFIG_CERTIFICATION_DECLARATION +//-> format_version = 1 +//-> vendor_id = 0x1037 +//-> product_id_array = [ 0xA401 ] +//-> device_type_id = 0x0015 +//-> certificate_id = "ZIG20142ZB330003-24" +//-> security_level = 0 +//-> security_information = 0 +//-> version_number = 0x2694 +//-> certification_type = 1 +//-> dac_origin_vendor_id is not present +//-> dac_origin_product_id is not present +#define CHIP_DEVICE_CONFIG_CERTIFICATION_DECLARATION \ + { \ + 0x30, 0x81, 0xe7, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x02, 0xa0, 0x81, 0xd9, 0x30, 0x81, 0xd6, \ + 0x02, 0x01, 0x03, 0x31, 0x0d, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x30, \ + 0x44, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x01, 0xa0, 0x37, 0x04, 0x35, 0x15, 0x24, 0x00, \ + 0x01, 0x25, 0x01, 0x37, 0x10, 0x36, 0x02, 0x05, 0x01, 0xa4, 0x18, 0x24, 0x03, 0x15, 0x2c, 0x04, 0x13, 0x5a, 0x49, \ + 0x47, 0x32, 0x30, 0x31, 0x34, 0x32, 0x5a, 0x42, 0x33, 0x33, 0x30, 0x30, 0x30, 0x33, 0x2d, 0x32, 0x34, 0x24, 0x05, \ + 0x00, 0x24, 0x06, 0x00, 0x25, 0x07, 0x76, 0x98, 0x24, 0x08, 0x01, 0x18, 0x31, 0x7c, 0x30, 0x7a, 0x02, 0x01, 0x03, \ + 0x80, 0x14, 0x62, 0xfa, 0x82, 0x33, 0x59, 0xac, 0xfa, 0xa9, 0x96, 0x3e, 0x1c, 0xfa, 0x14, 0x0a, 0xdd, 0xf5, 0x04, \ + 0xf3, 0x71, 0x60, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x30, 0x0a, 0x06, \ + 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x04, 0x46, 0x30, 0x44, 0x02, 0x20, 0x12, 0xec, 0x79, 0xdc, \ + 0x03, 0xd3, 0x4f, 0xf9, 0x79, 0xef, 0x56, 0x4e, 0x5b, 0x4f, 0xfc, 0xf5, 0xb1, 0x5a, 0xdb, 0xdf, 0xd9, 0xf8, 0x47, \ + 0xff, 0x81, 0xc3, 0x82, 0x2f, 0xa3, 0x2b, 0xb8, 0x3f, 0x02, 0x20, 0x53, 0x0d, 0x5d, 0xbd, 0xc6, 0xa4, 0x80, 0x67, \ + 0x1f, 0x10, 0xfb, 0xab, 0x00, 0x08, 0xee, 0x15, 0xa0, 0x6c, 0x40, 0x97, 0x55, 0x80, 0x28, 0x3e, 0xf3, 0xd9, 0x61, \ + 0x1f, 0x5b, 0x1d, 0x51, 0x02 \ + } + +// All remaining data will be pulled from the provisioning region of flash. +#endif + +#else + +/** + * CHIP_DEVICE_CONFIG_DEVICE_VENDOR_ID + * + * 0xFFF1: Test vendor. + */ +#define CHIP_DEVICE_CONFIG_DEVICE_VENDOR_ID 0xFFF1 + +/** + * CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_ID + * + */ +#define CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_ID 0x8006 + +// Use a default setup PIN code if one hasn't been provisioned in flash. +#ifndef CHIP_DEVICE_CONFIG_USE_TEST_SETUP_PIN_CODE +#define CHIP_DEVICE_CONFIG_USE_TEST_SETUP_PIN_CODE 20202021 +#endif + +#ifndef CHIP_DEVICE_CONFIG_USE_TEST_SETUP_DISCRIMINATOR +#define CHIP_DEVICE_CONFIG_USE_TEST_SETUP_DISCRIMINATOR 0xF00 +#endif + +// Use a default pairing code if one hasn't been provisioned in flash. +#define CHIP_DEVICE_CONFIG_USE_TEST_PAIRING_CODE "CHIPUS" + +/** + * CHIP_DEVICE_CONFIG_TEST_SERIAL_NUMBER + * + * Enables the use of a hard-coded default serial number if none + * is found in CHIP NV storage. + */ +#define CHIP_DEVICE_CONFIG_TEST_SERIAL_NUMBER "TEST_SN" + +#endif // CONFIG_CHIP_LOAD_REAL_FACTORY_DATA + +/** + * CHIP_DEVICE_CONFIG_DEVICE_HARDWARE_VERSION + * + * The hardware version number assigned to device or product by the device vendor. This + * number is scoped to the device product id, and typically corresponds to a revision of the + * physical device, a change to its packaging, and/or a change to its marketing presentation. + * This value is generally *not* incremented for device software versions. + */ +#define CHIP_DEVICE_CONFIG_DEVICE_HARDWARE_VERSION 100 + +#ifndef CHIP_DEVICE_CONFIG_DEFAULT_DEVICE_HARDWARE_VERSION_STRING +#define CHIP_DEVICE_CONFIG_DEFAULT_DEVICE_HARDWARE_VERSION_STRING "v0.1.0" +#endif + +/** + * CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING + * + * A string identifying the software version running on the device. + * CHIP currently expects the software version to be in the format + * {MAJOR_VERSION}.0d{MINOR_VERSION} + */ +#ifndef CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING +#define CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING NXP_CONFIG_DEVICE_SOFTWARE_VERSION_STRING +#endif + +#ifndef CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION +#define CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION NXP_CONFIG_DEVICE_SOFTWARE_VERSION +#endif + +#ifndef CHIP_DEVICE_CONFIG_DEVICE_VENDOR_NAME +#define CHIP_DEVICE_CONFIG_DEVICE_VENDOR_NAME "NXP Semiconductors" +#endif + +#ifndef CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_NAME +#define CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_NAME "NXP Demo App" +#endif + +/** + * CHIP_DEVICE_CONFIG_BLE_FAST_ADVERTISING_TIMEOUT + * + * The amount of time in miliseconds after which BLE should change his advertisements + * from fast interval to slow interval. + * + * 30000 (30 secondes). + */ +#define CHIP_DEVICE_CONFIG_BLE_FAST_ADVERTISING_TIMEOUT (30 * 1000) + +/** + * CHIP_DEVICE_CONFIG_BLE_ADVERTISING_TIMEOUT + * + * The amount of time in miliseconds after which BLE advertisement should be disabled, counting + * from the moment of slow advertisement commencement. + * + * Defaults to 9000000 (15 minutes). + */ +#define CHIP_DEVICE_CONFIG_BLE_ADVERTISING_TIMEOUT (15 * 60 * 1000) + +/** + * CONFIG_CHIP_NFC_COMMISSIONING, CHIP_DEVICE_CONFIG_ENABLE_NFC + * + * NFC commissioning is not supported on K32W1 + */ +#define CONFIG_CHIP_NFC_COMMISSIONING 0 +#define CHIP_DEVICE_CONFIG_ENABLE_NFC 0 + +/** + * @def CHIP_CONFIG_MAX_FABRICS + * + * @brief + * Maximum number of fabrics the device can participate in. Each fabric can + * provision the device with its unique operational credentials and manage + * its own access control lists. + */ +#define CHIP_CONFIG_MAX_FABRICS 5 // 5 is the minimum number of supported fabrics + +#define CHIP_DEVICE_CONFIG_ENABLE_SED 1 + +/** + * @def CHIP_DEVICE_CONFIG_KVS_WEAR_STATS + * + * @brief Toggle support for key value store wear stats on or off. + */ +#define CHIP_DEVICE_CONFIG_KVS_WEAR_STATS 0 + +/** + * @def CHIP_IM_MAX_NUM_COMMAND_HANDLER + * + * @brief Defines the maximum number of CommandHandler, limits the number of active commands transactions on server. + */ +#define CHIP_IM_MAX_NUM_COMMAND_HANDLER 2 + +/** + * @def CHIP_IM_MAX_NUM_WRITE_HANDLER + * + * @brief Defines the maximum number of WriteHandler, limits the number of active write transactions on server. + */ +#define CHIP_IM_MAX_NUM_WRITE_HANDLER 2 + +/** + * CHIP_CONFIG_EVENT_LOGGING_DEFAULT_IMPORTANCE + * + * For a development build, set the default importance of events to be logged as Debug. + * Since debug is the lowest importance level, this means all standard, critical, info and + * debug importance level vi events get logged. + */ +#if BUILD_RELEASE +#define CHIP_CONFIG_EVENT_LOGGING_DEFAULT_IMPORTANCE chip::Profiles::DataManagement::Production +#else +#define CHIP_CONFIG_EVENT_LOGGING_DEFAULT_IMPORTANCE chip::Profiles::DataManagement::Debug +#endif // BUILD_RELEASE + +#define CHIP_DEVICE_CONFIG_ENABLE_EXTENDED_DISCOVERY 1 + +#if CONFIG_DIAG_LOGS_DEMO +#define CHIP_CONFIG_ENABLE_BDX_LOG_TRANSFER 1 +#define CHIP_DEVICE_CONFIG_MAX_DIAG_LOG_SIZE 1024 +#endif diff --git a/examples/contact-sensor-app/nxp/mcxw71/third_party/connectedhomeip b/examples/contact-sensor-app/nxp/mcxw71/third_party/connectedhomeip new file mode 120000 index 00000000000000..59307833b4fee9 --- /dev/null +++ b/examples/contact-sensor-app/nxp/mcxw71/third_party/connectedhomeip @@ -0,0 +1 @@ +../../../../.. \ No newline at end of file diff --git a/examples/lighting-app/nxp/README.md b/examples/lighting-app/nxp/README.md index 74d0f9dc294813..67444a99e1bf8d 100644 --- a/examples/lighting-app/nxp/README.md +++ b/examples/lighting-app/nxp/README.md @@ -22,6 +22,7 @@ The example is based on: ## Supported devices - [k32w1](k32w1/README.md) +- [mcxw71](mcxw71/README.md) ## Introduction diff --git a/examples/lighting-app/nxp/k32w1/BUILD.gn b/examples/lighting-app/nxp/k32w1/BUILD.gn index 9544ca8486a2ff..541c288dd1eb5c 100644 --- a/examples/lighting-app/nxp/k32w1/BUILD.gn +++ b/examples/lighting-app/nxp/k32w1/BUILD.gn @@ -236,7 +236,7 @@ mcxw71_k32w1_executable("light_app") { } if (use_smu2_static) { - ldscript = "${example_platform_dir}/app/ldscripts/k32w1_app.ld" + ldscript = "${example_platform_dir}/app/ldscripts/app.ld" base_ldscript_dir = "${nxp_sdk_root}/middleware/wireless/framework/Common/devices/kw45_k32w1/gcc" } else { ldscript = "${nxp_sdk_root}/middleware/wireless/framework/Common/devices/kw45_k32w1/gcc/connectivity.ld" diff --git a/examples/lighting-app/nxp/k32w1/README.md b/examples/lighting-app/nxp/k32w1/README.md index ab54aab153e272..c47449bf249490 100644 --- a/examples/lighting-app/nxp/k32w1/README.md +++ b/examples/lighting-app/nxp/k32w1/README.md @@ -78,9 +78,9 @@ and global variables in the shared memory area from `NBU` domain. Note: These instances and global variables are placed in `SMU2` memory through name matching in the application linker script. They should not be changed or, -if changed, the names must be updated in `k32w1_app.ld`. See -[k32w1_app.ld](../../../platform/nxp/k32w1/app/ldscripts/k32w1_app.ld) for names -and `SMU2` memory range size. +if changed, the names must be updated in `app.ld`. See +[app.ld](../../../platform/nxp/mcxw71_k32w1/app/ldscripts/app.ld) for names and +`SMU2` memory range size. When compiling the application as an OT Full Thread Device (`chip_openthread_ftd=true`), using `use_smu2_static=true` gn arg will cause the diff --git a/examples/lighting-app/nxp/mcxw71/.gn b/examples/lighting-app/nxp/mcxw71/.gn new file mode 100644 index 00000000000000..146e2b9c27ec06 --- /dev/null +++ b/examples/lighting-app/nxp/mcxw71/.gn @@ -0,0 +1,31 @@ +# Copyright (c) 2020-2024 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("//build_overrides/build.gni") + +# The location of the build configuration file. +buildconfig = "${build_root}/config/BUILDCONFIG.gn" + +# CHIP uses angle bracket includes. +check_system_includes = true + +default_args = { + target_cpu = "arm" + target_os = "freertos" + + import("//args.gni") + + # Import default platform configs + import("${chip_root}/src/platform/nxp/mcxw71_k32w1/args.gni") +} diff --git a/examples/lighting-app/nxp/mcxw71/BUILD.gn b/examples/lighting-app/nxp/mcxw71/BUILD.gn new file mode 100644 index 00000000000000..34733584a80cd9 --- /dev/null +++ b/examples/lighting-app/nxp/mcxw71/BUILD.gn @@ -0,0 +1,268 @@ +# Copyright (c) 2024 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("//build_overrides/chip.gni") +import("//build_overrides/nxp_sdk.gni") +import("//build_overrides/openthread.gni") + +import("${nxp_sdk_build_root}/nxp_sdk.gni") + +import("${nxp_sdk_build_root}/${nxp_sdk_name}/nxp_executable.gni") + +import("${nxp_sdk_build_root}/${nxp_sdk_name}/${nxp_sdk_name}.gni") + +import("${chip_root}/src/crypto/crypto.gni") +import("${chip_root}/src/platform/device.gni") +import("${chip_root}/src/platform/nxp/${nxp_platform}/args.gni") + +import("${chip_root}/examples/common/pigweed/pigweed_rpcs.gni") + +if (chip_enable_pw_rpc) { + import("//build_overrides/pigweed.gni") + import("$dir_pw_build/target_types.gni") + import("${chip_root}/examples/platform/nxp/pw_rpc_server.gni") +} + +declare_args() { + # Setup discriminator as argument + setup_discriminator = 3840 +} + +assert(current_os == "freertos") +assert(target_os == "freertos") + +example_platform_dir = "${chip_root}/examples/platform/nxp/${nxp_platform}" +common_example_dir = "${chip_root}/examples/platform/nxp/common" + +mcxw71_k32w1_sdk("sdk") { + defines = [] + include_dirs = [] + sources = [] + + # Indicate the path to CHIPProjectConfig.h + include_dirs += [ "include/config" ] + + # Indicate the default path to FreeRTOSConfig.h + include_dirs += [ "${example_platform_dir}/app/project_include/freeRTOS" ] + + # Indicate the default path to OpenThreadConfig.h + include_dirs += [ "${example_platform_dir}/app/project_include/openthread" ] + + include_dirs += [ + "${nxp_sdk_root}/middleware/wireless/framework/boards/kw45_k32w1", + "${nxp_sdk_root}/middleware/wireless/framework/boards/kw45_k32w1/MCXW716C", + ] + + sources += [ + "${nxp_sdk_root}/middleware/wireless/framework/boards/kw45_k32w1/MCXW716C/clock_config.c", + "${nxp_sdk_root}/middleware/wireless/framework/boards/kw45_k32w1/MCXW716C/pin_mux.c", + "${nxp_sdk_root}/middleware/wireless/framework/boards/kw45_k32w1/app_services_init.c", + "${nxp_sdk_root}/middleware/wireless/framework/boards/kw45_k32w1/board.c", + "${nxp_sdk_root}/middleware/wireless/framework/boards/kw45_k32w1/board_comp.c", + "${nxp_sdk_root}/middleware/wireless/framework/boards/kw45_k32w1/board_dcdc.c", + "${nxp_sdk_root}/middleware/wireless/framework/boards/kw45_k32w1/board_extflash.c", + "${nxp_sdk_root}/middleware/wireless/framework/boards/kw45_k32w1/board_lp.c", + "${nxp_sdk_root}/middleware/wireless/framework/boards/kw45_k32w1/hardware_init.c", + ] + + if (is_debug) { + defines += [ "BUILD_RELEASE=0" ] + } else { + defines += [ "BUILD_RELEASE=1" ] + } + + if (chip_enable_pw_rpc) { + defines += [ + "CONFIG_ENABLE_PW_RPC", + "STREAMER_UART_FLUSH_DELAY_MS=0", + "STREAMER_UART_SERIAL_MANAGER_RING_BUFFER_SIZE=512", + "BOARD_APP_UART_CLK_FREQ=96000000", + ] + } + + defines += [ + "CHIP_DEVICE_CONFIG_USE_TEST_SETUP_DISCRIMINATOR=${setup_discriminator}", + ] + + if (chip_key_storage == "littlefs") { + include_dirs += [ "${example_platform_dir}/board" ] + sources += [ + "${example_platform_dir}/board/peripherals.c", + "${example_platform_dir}/board/peripherals.h", + ] + } +} + +mcxw71_k32w1_executable("light_app") { + output_name = "chip-mcxw71-light-example" + + defines = [] + deps = [] + sources = [] + + if (chip_enable_pw_rpc) { + forward_variables_from(pw_rpc_server, "*") + } else { + include_dirs = [] + cflags = [ "-Wconversion" ] + } + + # Defines used by common code + defines += [ + "CONFIG_NET_L2_OPENTHREAD=1", + "CONFIG_NETWORK_LAYER_BLE=1", + "CONFIG_OPERATIONAL_KEYSTORE=1", + "CONFIG_ENABLE_FEEDBACK=1", + "APP_QUEUE_TICKS_TO_WAIT=pdMS_TO_TICKS(10)", + "EXTERNAL_FACTORY_DATA_PROVIDER_HEADER=\"platform/nxp/common/legacy/FactoryDataProvider.h\"", + ] + + # App common files + include_dirs += [ + "${common_example_dir}/app_task/include", + "${common_example_dir}/matter_button/include", + "${common_example_dir}/clusters/include", + "${common_example_dir}/device_callbacks/include", + "${common_example_dir}/device_manager/include", + "${common_example_dir}/factory_data/include", + "${common_example_dir}/led_widget/include", + "${common_example_dir}/operational_keystore/include", + "${common_example_dir}/rpc/include", + "${common_example_dir}/ui_feedback/include", + ] + + sources += [ + "${common_example_dir}/app_task/source/AppTaskBase.cpp", + "${common_example_dir}/app_task/source/AppTaskFreeRTOS.cpp", + "${common_example_dir}/clusters/source/ZclCallbacks.cpp", + "${common_example_dir}/device_callbacks/source/CommonDeviceCallbacks.cpp", + "${common_example_dir}/device_manager/source/CHIPDeviceManager.cpp", + "${example_platform_dir}/factory_data/source/AppFactoryDataExample.cpp", + ] + + if (chip_enable_ota_requestor) { + defines += [ + "CONFIG_CHIP_OTA_IMAGE_PROCESSOR_HEADER=\"platform/nxp/common/legacy/OTAImageProcessorImpl.h\"", + + # The status LED and the external flash CS pin are wired together. The OTA image writing may fail if used together. + "LED_MANAGER_ENABLE_STATUS_LED=0", + ] + + include_dirs += [ "${common_example_dir}/ota_requestor/include" ] + sources += [ "${common_example_dir}/ota_requestor/source/OTARequestorInitiatorMultiImage.cpp" ] + deps += [ "${chip_root}/src/platform/nxp:nxp_ota" ] + } + + # Platform specific files + include_dirs += [ + "${example_platform_dir}/util", + "${example_platform_dir}/app/support", + "${example_platform_dir}/button", + ] + + sources += [ + "${example_platform_dir}/button/ButtonManager.cpp", + "${example_platform_dir}/clusters/Identify.cpp", + "${example_platform_dir}/operational_keystore/OperationalKeystore.cpp", + ] + + if (chip_enable_ota_requestor) { + sources += [ "${example_platform_dir}/ota/OtaUtils.cpp" ] + } + + if (chip_enable_pw_rpc) { + sources += [ "${example_platform_dir}/rpc/AppRpc.cpp" ] + } + + if (chip_with_factory_data == 1) { + include_dirs += [ "${chip_root}/src/platform/nxp/common/legacy" ] + deps += [ "${chip_root}/src/platform/nxp:nxp_factory_data" ] + } + + sources += [ + "../common/AppTask.cpp", + "../common/DeviceCallbacks.cpp", + "../common/main.cpp", + ] + + include_dirs += [ + "../common", + "../common/include", + "include/config", + ] + + deps += [ + "${chip_root}/examples/providers:device_info_provider", + "${chip_root}/src/platform/logging:default", + ] + + if (chip_config_dimmable_led) { + defines += [ "LIGHTING_MANAGER_ENABLE_DIMMABLE_LED=1" ] + sources += [ + "${common_example_dir}/led_widget/include/LedDimmer.h", + "${example_platform_dir}/util/LedDimmer.cpp", + "${example_platform_dir}/util/LightingManagerDimmable.cpp", + ] + deps += [ "${chip_root}/examples/lighting-app/lighting-common/" ] + } else { + sources += [ + "${common_example_dir}/ui_feedback/source/LedManager.cpp", + "${example_platform_dir}/util/LedOnOff.cpp", + ] + deps += [ "${chip_root}/examples/lighting-app/nxp/zap/" ] + } + + if (chip_openthread_ftd) { + deps += [ + "${openthread_root}:libopenthread-cli-ftd", + "${openthread_root}:libopenthread-ftd", + ] + } else { + deps += [ + "${openthread_root}:libopenthread-cli-mtd", + "${openthread_root}:libopenthread-mtd", + ] + } + + if (use_smu2_static) { + ldscript = "${example_platform_dir}/app/ldscripts/app.ld" + base_ldscript_dir = "${nxp_sdk_root}/middleware/wireless/framework/Common/devices/kw45_k32w1/gcc" + } else { + ldscript = "${nxp_sdk_root}/middleware/wireless/framework/Common/devices/kw45_k32w1/gcc/connectivity.ld" + } + + inputs = [ ldscript ] + + ldflags = [ + "-Wl,--defsym=__heap_size__=0", + "-Wl,--defsym=__stack_size__=0x480", + "-Wl,-print-memory-usage", + "-Wl,--no-warn-rwx-segments", + "-T" + rebase_path(ldscript, root_build_dir), + ] + + if (chip_with_factory_data == 1) { + ldflags += [ "-Wl,--defsym=gUseFactoryData_d=1" ] + } + + if (use_smu2_static) { + ldflags += [ "-L" + rebase_path(base_ldscript_dir, root_build_dir) ] + } + + output_dir = root_out_dir +} + +group("default") { + deps = [ ":light_app" ] +} diff --git a/examples/lighting-app/nxp/mcxw71/README.md b/examples/lighting-app/nxp/mcxw71/README.md new file mode 100644 index 00000000000000..116fd6183e197d --- /dev/null +++ b/examples/lighting-app/nxp/mcxw71/README.md @@ -0,0 +1,270 @@ +# Matter `MCXW71` Lighting Example Application + +For generic information related to on/off light application, please see the +[common README](../README.md). + +- [Matter `MCXW71` Lighting Example Application](#matter-mcxw71-lighting-example-application) + - [Introduction](#introduction) + - [Device UI](#device-ui) + - [Building](#building) + - [`SMU2` Memory](#smu2-memory) + - [LED PWM](#led-pwm) + - [Flashing](#flashing) + - [Flashing the `NBU` image](#flashing-the-nbu-image) + - [Flashing the host image](#flashing-the-host-image) + - [Debugging](#debugging) + - [Running RPC console](#running-rpc-console) + - [OTA](#ota) + +## Introduction + +This is an on/off lighting application implemented for an `mcxw71` device. + +The following board was used when testing this Matter reference app for a +`mcxw71` device: +![FRDM-MCXW71](../../../platform/nxp/mcxw71_k32w1/doc/images/frdm-mcxw71.jpg) + +## Device UI + +The state feedback is provided through LED effects: + +| widget | effect | description | +| ------- | ----------------------------------- | ----------------------------------------------------------------------------------------------------- | +| LED2 | short flash on (50ms on/950ms off) | The device is in an unprovisioned (unpaired) state and is waiting for a commissioner to connect. | +| LED2 | rapid even flashing (100ms period) | The device is in an unprovisioned state and a commissioner is connected via BLE. | +| LED2 | short flash off (950ms on/50ms off) | The device is fully provisioned, but does not yet have full network (Thread) or service connectivity. | +| LED2 | solid on | The device is fully provisioned and has full network and service connectivity. | +| RGB LED | on | The `OnOff` attribute of the `On/Off` cluster is `true` (simulating device turned on). | +| RGB LED | off | The `OnOff` attribute of the `On/Off` cluster is `false` (simulating device turned off). | + +NOTE: `LED2` will be disabled when OTA is used. On `FRDM-MCXW71` board, `PTB0` +is wired to both `LED2` and CS (Chip Select) of the External Flash Memory. Since +the OTA image is stored in external memory, `LED2` operations will affect OTA +operation by corrupting packages and OTA will not work. + +The user actions are summarized below: + +| button | action | output | +| ------ | ----------- | -------------------------------------------------------------------------------------------------------------------------------------- | +| SW2 | short press | Enable BLE advertising | +| SW2 | long press | Initiate a factory reset (can be cancelled by pressing the button again within the factory reset timeout limit - 6 seconds by default) | +| SW3 | short press | Toggle attribute `OnOff` value | +| SW3 | long press | Clean soft reset of the device (takes into account proper Matter shutdown procedure) | + +The example application provides a simple UI that depicts the state of the +device and offers basic user control. This UI is implemented via the +general-purpose LEDs and buttons built in the `MCXW71` board. + +## Building + +Manually building requires running the following commands: + +``` +user@ubuntu:~/Desktop/git/connectedhomeip$ cd examples/lighting-app/nxp/mcxw71 +user@ubuntu:~/Desktop/git/connectedhomeip/examples/lighting-app/nxp/mcxw71$ gn gen out/debug +user@ubuntu:~/Desktop/git/connectedhomeip/examples/lighting-app/nxp/mcxw71$ ninja -C out/debug +``` + +Please note that running `gn gen out/debug` without `--args` option will use the +default gn args values found in `args.gni`. + +After a successful build, the `elf` and `srec` files are found in `out/debug/`. +See the files prefixed with `chip-mcxw71-light-example`. + +### `SMU2` Memory + +Additional memory is provided to the application by moving some Matter instances +and global variables in the shared memory area from `NBU` domain. + +Note: These instances and global variables are placed in `SMU2` memory through +name matching in the application linker script. They should not be changed or, +if changed, the names must be updated in `app.ld`. See +[app.ld](../../../platform/nxp/mcxw71_k32w1/app/ldscripts/app.ld) for names and +`SMU2` memory range size. + +When compiling the application as an OT Full Thread Device +(`chip_openthread_ftd=true`), using `use_smu2_static=true` gn arg will cause the +following symbols to be moved to `SMU2` area: + +| symbol name | file | +| ----------------------------------- | ---------------------------- | +| `gImageProcessor` | `OTAImageProcessorImpl.cpp` | +| `gApplicationProcessor` | `OTAHooks.cpp` | +| `Server::sServer` | `Server.cpp` | +| `ThreadStackManagerImpl::sInstance` | `ThreadStackManagerImpl.cpp` | + +Additionally, using `use_smu2_dynamic=true` will cause the OpenThread buffers to +be dynamically allocated from a 13KB `SMU2` range after a successful +commissioning process. + +`use_smu2_static` and `use_smu2_dynamic` are set to `true` in the default +example. + +### LED PWM + +In the default configuration, the onboard RGB LED pins are configured as GPIO +pins. In order to enable the dimming feature, the pins need to be configured in +PWM mode and synced with channels of the `TPM` (Timer PWM Module). To enable +this feature, compile the application with: `chip_config_dimmable_led=true` + +If the feature is enabled, the LED brightness can be controlled using +`LevelControl` cluster +[commands](../../../../docs/guides/chip_tool_guide.md#step-7-control-application-data-model-clusters). + +## Flashing + +Two images must be written to the board: one for the host (CM33) and one for the +`NBU` (CM3). + +The image needed on the host side is the one generated in `out/debug/` while the +one needed on the `NBU` side can be found in the downloaded NXP-SDK package at +path - +`middleware\wireless\ieee-802.15.4\bin\k32w1\k32w1_nbu_ble_15_4_dyn_matter.sb3`. + +### Flashing the `NBU` image + +`NBU` image should be written only when a new NXP SDK is released. + +1. Install + [Secure Provisioning SDK tool](https://www.nxp.com/design/design-center/software/development-software/secure-provisioning-sdk-spsdk:SPSDK) + using Python: + + ``` + pip install spsdk + ``` + + Note: There might be some dependencies that cause conflicts with already + installed Python modules. However, `blhost` tool is still installed and can + be used. + +2. Updating `NBU` for Wireless examples + + It is necessary to work with the matching `NBU` image for the SDK version of + the application you are working with. This means that when you download your + SDK, prior to loading any wireless SDK example, update your `NBU` image with + the SDK provided binaries. For `FRDM` users, please write the following + binary: + + `middleware\wireless\ieee-802.15.4\bin\mcxw71\mcxw71_nbu_ble_15_4_dyn_matter_.sb3` + + Please note that `` may vary depending on the SDK version. + + 1. Place your device in `ISP` mode. + + - Make sure a jumper is placed on `JP25` + - Press and hold `SW4`, press and release Reset, then release `SW4` + + 2. Once the device is connected, you may find the assigned port by running: + + ``` + nxpdevscan + ``` + + 3. Run the `blhost` command to write the `sb3` file: + + ``` + blhost -p receive-sb-file \middleware\wireless\ieee-802.15.4\bin\mcxw71\mcxw71_nbu_ble_15_4_dyn_matter_.sb3 + ``` + +### Flashing the host image + +Host image is the one found under `out/debug/`. It should be written after each +build process. + +If debugging is needed then jump directly to the [Debugging](#debugging) +section. Otherwise, if only flashing is needed then +[JLink](https://www.segger.com/downloads/jlink/) can be used: + +- Plug `MCXW71` to the USB port (no need to keep the `SW4` button pressed + while doing this, e.g. ISP mode is not needed for host flashing) + +- Connect JLink to the device: + + ```bash + JLinkExe -device MCXW71 -if SWD -speed 4000 -autoconnect 1 + ``` + +- Run the following commands: + ```bash + reset + halt + loadfile chip-mcxw71-light-example.srec + reset + go + quit + ``` + +## Debugging + +One option for debugging would be to use MCUXpresso IDE. + +- Drag-and-drop the zip file containing the NXP SDK in the "Installed SDKs" + tab: + +![Installed SDKs](../../../platform/nxp/mcxw71_k32w1/doc/images/mcxw71_installed_sdks.jpg) + +- Import any demo application from the installed SDK: + +``` +Import SDK example(s).. -> choose a demo app (demo_apps -> hello_world) -> Finish +``` + +![Import demo](../../../platform/nxp/mcxw71_k32w1/doc/images/import_demo.jpg) + +- Flash the previously imported demo application on the board: + +``` +Right click on the application (from Project Explorer) -> Debug as -> JLink/CMSIS-DAP +``` + +After this step, a debug configuration specific for the `MCXW71` board was +created. This debug configuration will be used later on for debugging the +application resulted after ot-nxp compilation. + +- Import Matter repo in MCUXpresso IDE as Makefile Project. Use _none_ as + _Toolchain for Indexer Settings_: + +``` +File -> Import -> C/C++ -> Existing Code as Makefile Project +``` + +![New Project](../../../platform/nxp/mcxw71_k32w1/doc/images/new_project.jpg) + +- Replace the path of the existing demo application with the path of the + `MCXW71` application: + +``` +Run -> Debug Configurations... -> C/C++ Application +``` + +![Debug MCXW71](../../../platform/nxp/mcxw71_k32w1/doc/images/mcxw71_debug.jpg) + +## Running RPC console + +To build example with RPC enabled, use the following gn command: +`gn gen out/debug --args='import("//with_pw_rpc.gni") treat_warnings_as_errors=false'` + +The application runs an RPC server and processes events coming from an RPC +client. An example of an RPC client is the `chip-console`, which can be accessed +by running: +`chip-console --device /dev/tty. -b 115200 -o pw_log.out` + +The console should have already been installed in the virtual environment. From +the `chip-console`, a user can send specific commands to the device. + +For button commands, please run `rpcs.chip.rpc.Button.Event(index)` based on the +table below: + +| index | action | +| ----- | --------------------------------------------- | +| 0 | Start/stop BLE advertising | +| 1 | Factory reset the device | +| 2 | Application specific action (e.g. toggle LED) | +| 3 | Soft reset the device | + +To reboot the device, please run `rpcs.chip.rpc.Device.Reboot()`. + +## OTA + +Please see +[mcxw71 OTA guide](../../../../docs/guides/nxp/nxp_mcxw71_ota_guide.md). diff --git a/examples/lighting-app/nxp/mcxw71/args.gni b/examples/lighting-app/nxp/mcxw71/args.gni new file mode 100644 index 00000000000000..6a27d6605ea2b8 --- /dev/null +++ b/examples/lighting-app/nxp/mcxw71/args.gni @@ -0,0 +1,39 @@ +# Copyright (c) 2020-2024 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("//build_overrides/chip.gni") +import("${chip_root}/config/standalone/args.gni") + +# SDK target. This is overridden to add our SDK app_config.h & defines. +nxp_sdk_target = get_label_info(":sdk", "label_no_toolchain") +nxp_device = "MCXW716C" + +chip_config_dimmable_led = false +chip_enable_ota_requestor = true +chip_stack_lock_tracking = "fatal" +chip_enable_ble = true +chip_generate_link_map_file = true + +is_debug = false + +chip_crypto = "platform" +chip_openthread_ftd = true +chip_with_ot_cli = 0 + +chip_system_config_provide_statistics = false +chip_system_config_use_open_thread_inet_endpoints = true +chip_with_lwip = false + +use_smu2_static = true +use_smu2_dynamic = true diff --git a/examples/lighting-app/nxp/mcxw71/build_overrides b/examples/lighting-app/nxp/mcxw71/build_overrides new file mode 120000 index 00000000000000..ee19c065d619a2 --- /dev/null +++ b/examples/lighting-app/nxp/mcxw71/build_overrides @@ -0,0 +1 @@ +../../../build_overrides/ \ No newline at end of file diff --git a/examples/lighting-app/nxp/mcxw71/include/config/AppConfig.h b/examples/lighting-app/nxp/mcxw71/include/config/AppConfig.h new file mode 100644 index 00000000000000..6dcccf749bbebe --- /dev/null +++ b/examples/lighting-app/nxp/mcxw71/include/config/AppConfig.h @@ -0,0 +1,29 @@ +/* + * Copyright 2024 Project CHIP Authors + * All rights reserved. + * + * 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. + */ + +#pragma once + +/* ---- App Config ---- */ +#define APP_DEVICE_TYPE_ENDPOINT 1 +#define APP_CLUSTER_ATTRIBUTE chip::app::Clusters::OnOff::Attributes::OnOff + +/* ---- Button Manager Config ---- */ +#define BUTTON_MANAGER_FACTORY_RESET_TIMEOUT_MS 6000 + +/* ---- LED Manager Config ---- */ +#define LED_MANAGER_STATUS_LED_INDEX 0 +#define LED_MANAGER_LIGHT_LED_INDEX 1 diff --git a/examples/lighting-app/nxp/mcxw71/include/config/CHIPProjectConfig.h b/examples/lighting-app/nxp/mcxw71/include/config/CHIPProjectConfig.h new file mode 100644 index 00000000000000..20f126aa23a0d5 --- /dev/null +++ b/examples/lighting-app/nxp/mcxw71/include/config/CHIPProjectConfig.h @@ -0,0 +1,235 @@ +/* + * Copyright (c) 2020 Project CHIP Authors + * Copyright (c) 2020 Google LLC. + * All rights reserved. + * + * 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. + */ + +/** + * @file + * Example project configuration file for CHIP. + * + * This is a place to put application or project-specific overrides + * to the default configuration values for general CHIP features. + * + */ + +#pragma once + +// Security and Authentication disabled for development build. +// For convenience, enable CHIP Security Test Mode and disable the requirement for +// authentication in various protocols. +// WARNING: These options make it possible to circumvent basic CHIP security functionality, +// including message encryption. Because of this they MUST NEVER BE ENABLED IN PRODUCTION BUILDS. +#define CHIP_CONFIG_SECURITY_TEST_MODE 0 + +// Use hard-coded test certificates already embedded in generic chip code => set it to 0 +// Use real/development certificates => set it to 1 + file the provisioning section from +// the internal flash +#ifndef CONFIG_CHIP_LOAD_REAL_FACTORY_DATA +#define CONFIG_CHIP_LOAD_REAL_FACTORY_DATA 0 +#endif + +#if CONFIG_CHIP_LOAD_REAL_FACTORY_DATA + +// VID/PID for product => will be used by Basic Information Cluster +#define CHIP_DEVICE_CONFIG_DEVICE_VENDOR_ID 0x1037 +#define CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_ID 0xA401 + +// Set the following define to use the Certification Declaration from below and not use it stored in factory data section +#ifndef CHIP_USE_DEVICE_CONFIG_CERTIFICATION_DECLARATION +#define CHIP_USE_DEVICE_CONFIG_CERTIFICATION_DECLARATION 0 +#endif + +#ifndef CHIP_DEVICE_CONFIG_CERTIFICATION_DECLARATION +//-> format_version = 1 +//-> vendor_id = 0x1037 +//-> product_id_array = [ 0xA401 ] +//-> device_type_id = 0x0100 +//-> certificate_id = "ZIG20142ZB330003-24" +//-> security_level = 0 +//-> security_information = 0 +//-> version_number = 0x2694 +//-> certification_type = 1 +//-> dac_origin_vendor_id is not present +//-> dac_origin_product_id is not present +#define CHIP_DEVICE_CONFIG_CERTIFICATION_DECLARATION \ + { \ + 0x30, 0x81, 0xe8, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x02, 0xa0, 0x81, 0xda, 0x30, 0x81, 0xd7, \ + 0x02, 0x01, 0x03, 0x31, 0x0d, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x30, \ + 0x45, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x01, 0xa0, 0x38, 0x04, 0x36, 0x15, 0x24, 0x00, \ + 0x01, 0x25, 0x01, 0x37, 0x10, 0x36, 0x02, 0x05, 0x01, 0xa4, 0x18, 0x25, 0x03, 0x00, 0x01, 0x2c, 0x04, 0x13, 0x5a, \ + 0x49, 0x47, 0x32, 0x30, 0x31, 0x34, 0x32, 0x5a, 0x42, 0x33, 0x33, 0x30, 0x30, 0x30, 0x33, 0x2d, 0x32, 0x34, 0x24, \ + 0x05, 0x00, 0x24, 0x06, 0x00, 0x25, 0x07, 0x76, 0x98, 0x24, 0x08, 0x01, 0x18, 0x31, 0x7c, 0x30, 0x7a, 0x02, 0x01, \ + 0x03, 0x80, 0x14, 0x62, 0xfa, 0x82, 0x33, 0x59, 0xac, 0xfa, 0xa9, 0x96, 0x3e, 0x1c, 0xfa, 0x14, 0x0a, 0xdd, 0xf5, \ + 0x04, 0xf3, 0x71, 0x60, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x30, 0x0a, \ + 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x04, 0x46, 0x30, 0x44, 0x02, 0x20, 0x11, 0xc4, 0xe4, \ + 0x54, 0xcc, 0xdb, 0x09, 0xa9, 0x31, 0xd7, 0xbd, 0x6e, 0x28, 0x95, 0x9b, 0xab, 0x3e, 0xec, 0x76, 0x09, 0x8c, 0x39, \ + 0x93, 0x43, 0x6e, 0x89, 0x07, 0x7d, 0x8b, 0xe9, 0x3a, 0x0a, 0x02, 0x20, 0x71, 0xc6, 0xac, 0x09, 0x11, 0x7b, 0x1a, \ + 0x61, 0x5e, 0x3a, 0xc6, 0x4a, 0x4f, 0xf3, 0xd4, 0x3b, 0x62, 0x54, 0x3a, 0xf3, 0x60, 0xeb, 0x47, 0xd4, 0x8f, 0x18, \ + 0x0d, 0xa3, 0xd1, 0xef, 0xd0, 0x70 \ + } + +// All remaining data will be pulled from the provisioning region of flash. +#endif + +#else + +/** + * CHIP_DEVICE_CONFIG_DEVICE_VENDOR_ID + * + * 0xFFF1: Test vendor. + */ +#define CHIP_DEVICE_CONFIG_DEVICE_VENDOR_ID 0xFFF1 + +/** + * CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_ID + * + * 0x8005: example lighting-app + */ +#define CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_ID 0x8005 + +// Use a default setup PIN code if one hasn't been provisioned in flash. +#ifndef CHIP_DEVICE_CONFIG_USE_TEST_SETUP_PIN_CODE +#define CHIP_DEVICE_CONFIG_USE_TEST_SETUP_PIN_CODE 20202021 +#endif + +#ifndef CHIP_DEVICE_CONFIG_USE_TEST_SETUP_DISCRIMINATOR +#define CHIP_DEVICE_CONFIG_USE_TEST_SETUP_DISCRIMINATOR 0xF00 +#endif + +// Use a default pairing code if one hasn't been provisioned in flash. +#define CHIP_DEVICE_CONFIG_USE_TEST_PAIRING_CODE "CHIPUS" + +/** + * CHIP_DEVICE_CONFIG_TEST_SERIAL_NUMBER + * + * Enables the use of a hard-coded default serial number if none + * is found in CHIP NV storage. + */ +#define CHIP_DEVICE_CONFIG_TEST_SERIAL_NUMBER "TEST_SN" + +#endif // CONFIG_CHIP_LOAD_REAL_FACTORY_DATA + +/** + * CHIP_DEVICE_CONFIG_DEVICE_HARDWARE_VERSION + * + * The hardware version number assigned to device or product by the device vendor. This + * number is scoped to the device product id, and typically corresponds to a revision of the + * physical device, a change to its packaging, and/or a change to its marketing presentation. + * This value is generally *not* incremented for device software versions. + */ +#define CHIP_DEVICE_CONFIG_DEVICE_HARDWARE_VERSION 100 + +#ifndef CHIP_DEVICE_CONFIG_DEFAULT_DEVICE_HARDWARE_VERSION_STRING +#define CHIP_DEVICE_CONFIG_DEFAULT_DEVICE_HARDWARE_VERSION_STRING "v0.1.0" +#endif + +/** + * CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING + * + * A string identifying the software version running on the device. + * CHIP currently expects the software version to be in the format + * {MAJOR_VERSION}.0d{MINOR_VERSION} + */ +#ifndef CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING +#define CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING NXP_CONFIG_DEVICE_SOFTWARE_VERSION_STRING +#endif + +#ifndef CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION +#define CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION NXP_CONFIG_DEVICE_SOFTWARE_VERSION +#endif + +#ifndef CHIP_DEVICE_CONFIG_DEVICE_VENDOR_NAME +#define CHIP_DEVICE_CONFIG_DEVICE_VENDOR_NAME "NXP Semiconductors" +#endif + +#ifndef CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_NAME +#define CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_NAME "NXP Demo App" +#endif + +/** + * CHIP_DEVICE_CONFIG_ENABLE_CHIP_TIME_SERVICE_TIME_SYNC + * + * Enables synchronizing the device's real time clock with a remote CHIP Time service + * using the CHIP Time Sync protocol. + */ +// #define CHIP_DEVICE_CONFIG_ENABLE_CHIP_TIME_SERVICE_TIME_SYNC 1 + +/** + * CHIP_DEVICE_CONFIG_BLE_FAST_ADVERTISING_TIMEOUT + * + * The amount of time in miliseconds after which BLE should change his advertisements + * from fast interval to slow interval. + * + * 30000 (30 secondes). + */ +#define CHIP_DEVICE_CONFIG_BLE_FAST_ADVERTISING_TIMEOUT (30 * 1000) + +/** + * CHIP_DEVICE_CONFIG_BLE_ADVERTISING_TIMEOUT + * + * The amount of time in miliseconds after which BLE advertisement should be disabled, counting + * from the moment of slow advertisement commencement. + * + * Defaults to 9000000 (15 minutes). + */ +#define CHIP_DEVICE_CONFIG_BLE_ADVERTISING_TIMEOUT (15 * 60 * 1000) + +/** + * CONFIG_CHIP_NFC_COMMISSIONING, CHIP_DEVICE_CONFIG_ENABLE_NFC + * + * NFC commissioning is not supported on K32W1 + */ +#define CONFIG_CHIP_NFC_COMMISSIONING 0 +#define CHIP_DEVICE_CONFIG_ENABLE_NFC 0 + +/** + * @def CHIP_CONFIG_MAX_FABRICS + * + * @brief + * Maximum number of fabrics the device can participate in. Each fabric can + * provision the device with its unique operational credentials and manage + * its own access control lists. + */ +#define CHIP_CONFIG_MAX_FABRICS 5 // 5 is the minimum number of supported fabrics + +/** + * @def CHIP_IM_MAX_NUM_COMMAND_HANDLER + * + * @brief Defines the maximum number of CommandHandler, limits the number of active commands transactions on server. + */ +#define CHIP_IM_MAX_NUM_COMMAND_HANDLER 2 + +/** + * @def CHIP_IM_MAX_NUM_WRITE_HANDLER + * + * @brief Defines the maximum number of WriteHandler, limits the number of active write transactions on server. + */ +#define CHIP_IM_MAX_NUM_WRITE_HANDLER 2 + +/** + * CHIP_CONFIG_EVENT_LOGGING_DEFAULT_IMPORTANCE + * + * For a development build, set the default importance of events to be logged as Debug. + * Since debug is the lowest importance level, this means all standard, critical, info and + * debug importance level vi events get logged. + */ +#if BUILD_RELEASE +#define CHIP_CONFIG_EVENT_LOGGING_DEFAULT_IMPORTANCE chip::Profiles::DataManagement::Production +#else +#define CHIP_CONFIG_EVENT_LOGGING_DEFAULT_IMPORTANCE chip::Profiles::DataManagement::Debug +#endif // BUILD_RELEASE + +#define CHIP_DEVICE_CONFIG_ENABLE_EXTENDED_DISCOVERY 1 diff --git a/examples/lighting-app/nxp/mcxw71/third_party/connectedhomeip b/examples/lighting-app/nxp/mcxw71/third_party/connectedhomeip new file mode 120000 index 00000000000000..59307833b4fee9 --- /dev/null +++ b/examples/lighting-app/nxp/mcxw71/third_party/connectedhomeip @@ -0,0 +1 @@ +../../../../.. \ No newline at end of file diff --git a/examples/lighting-app/nxp/mcxw71/with_pw_rpc.gni b/examples/lighting-app/nxp/mcxw71/with_pw_rpc.gni new file mode 100644 index 00000000000000..c2dc1950544640 --- /dev/null +++ b/examples/lighting-app/nxp/mcxw71/with_pw_rpc.gni @@ -0,0 +1,37 @@ +# Copyright (c) 2023 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. + +# add this gni as import in your build args to use pigweed in the example +# 'import("//with_pw_rpc.gni")' + +import("//build_overrides/chip.gni") +import("${chip_root}/config/nxp/lib/pw_rpc/pw_rpc.gni") + +nxp_sdk_target = get_label_info(":sdk", "label_no_toolchain") + +chip_crypto = "platform" +chip_enable_ble = true +chip_enable_ota_requestor = true +chip_enable_pw_rpc = true +chip_openthread_ftd = true +chip_stack_lock_tracking = "fatal" + +chip_system_config_provide_statistics = false +chip_system_config_use_open_thread_inet_endpoints = true + +chip_with_lwip = false +chip_with_ot_cli = 0 + +cpp_standard = "gnu++17" +is_debug = false diff --git a/examples/platform/nxp/mcxw71_k32w1/app/ldscripts/k32w1_app.ld b/examples/platform/nxp/mcxw71_k32w1/app/ldscripts/app.ld similarity index 100% rename from examples/platform/nxp/mcxw71_k32w1/app/ldscripts/k32w1_app.ld rename to examples/platform/nxp/mcxw71_k32w1/app/ldscripts/app.ld diff --git a/examples/platform/nxp/mcxw71_k32w1/doc/images/frdm-mcxw71.jpg b/examples/platform/nxp/mcxw71_k32w1/doc/images/frdm-mcxw71.jpg new file mode 100755 index 0000000000000000000000000000000000000000..a54f70f062c6a0807066c1e61de214e076e78d22 GIT binary patch literal 922296 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
IOx?t9g3w8n|FOqprtM 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%0AVkI-u^|q3yE&qRvVw)-W2)E# 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
|(ohdQ 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

i&Ly{pn06=wmIE65XlSH4~-mv&V)3$oeLUEi(vQ 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 literal 0 HcmV?d00001 diff --git a/scripts/build/build/targets.py b/scripts/build/build/targets.py index 7cd7c157a54403..4c90164b2d1c12 100755 --- a/scripts/build/build/targets.py +++ b/scripts/build/build/targets.py @@ -507,7 +507,8 @@ def BuildNxpTarget(): target.AppendFixedTargets([ TargetPart('k32w0', board=NxpBoard.K32W0), TargetPart('k32w1', board=NxpBoard.K32W1), - TargetPart('rw61x', board=NxpBoard.RW61X) + TargetPart('rw61x', board=NxpBoard.RW61X), + TargetPart('mcxw71', board=NxpBoard.MCXW71) ]) # OS @@ -518,8 +519,8 @@ def BuildNxpTarget(): # apps target.AppendFixedTargets([ - TargetPart('lighting', app=NxpApp.LIGHTING).OnlyIfRe('(k32w0|k32w1)'), - TargetPart('contact-sensor', app=NxpApp.CONTACT).OnlyIfRe('(k32w0|k32w1)'), + TargetPart('lighting', app=NxpApp.LIGHTING).OnlyIfRe('(k32w0|k32w1|mcxw71)'), + TargetPart('contact-sensor', app=NxpApp.CONTACT).OnlyIfRe('(k32w0|k32w1|mcxw71)'), TargetPart('all-clusters', app=NxpApp.ALLCLUSTERS).OnlyIfRe('rw61x'), TargetPart('laundry-washer', app=NxpApp.LAUNDRYWASHER).OnlyIfRe('rw61x'), TargetPart('thermostat', app=NxpApp.THERMOSTAT).OnlyIfRe('rw61x') @@ -529,7 +530,7 @@ def BuildNxpTarget(): target.AppendModifier(name="low-power", low_power=True).OnlyIfRe('contact-sensor') target.AppendModifier(name="lit", enable_lit=True).OnlyIfRe('contact-sensor') target.AppendModifier(name="fro32k", use_fro32k=True).OnlyIfRe('k32w0') - target.AppendModifier(name="smu2", smu2=True).OnlyIfRe('k32w1-freertos-lighting') + target.AppendModifier(name="smu2", smu2=True).OnlyIfRe('(k32w1|mcxw71)-freertos-lighting') target.AppendModifier(name="dac-conversion", convert_dac_pk=True).OnlyIfRe('factory').ExceptIfRe('(k32w0|rw61x)') target.AppendModifier(name="rotating-id", enable_rotating_id=True).ExceptIfRe('rw61x') target.AppendModifier(name="sw-v2", has_sw_version_2=True) diff --git a/scripts/build/builders/nxp.py b/scripts/build/builders/nxp.py index 3592400fc0c631..1124a03142472c 100644 --- a/scripts/build/builders/nxp.py +++ b/scripts/build/builders/nxp.py @@ -38,6 +38,7 @@ class NxpBoard(Enum): K32W0 = auto() K32W1 = auto() RW61X = auto() + MCXW71 = auto() def Name(self, os_env): if self == NxpBoard.K32W0: @@ -49,6 +50,8 @@ def Name(self, os_env): return 'rd_rw612_bga' else: return 'rw61x' + elif self == NxpBoard.MCXW71: + return 'mcxw71' else: raise Exception('Unknown board type: %r' % self) @@ -62,6 +65,8 @@ def FolderName(self, os_env): return 'zephyr' else: return 'rt/rw61x' + elif self == NxpBoard.MCXW71: + return 'mcxw71' else: raise Exception('Unknown board type: %r' % self) diff --git a/scripts/build/testdata/all_targets_linux_x64.txt b/scripts/build/testdata/all_targets_linux_x64.txt index 6639429b31bb75..df54baa2ffec81 100644 --- a/scripts/build/testdata/all_targets_linux_x64.txt +++ b/scripts/build/testdata/all_targets_linux_x64.txt @@ -13,7 +13,7 @@ linux-{x64,arm64}-{rpc-console,all-clusters,all-clusters-minimal,chip-tool,therm linux-x64-efr32-test-runner[-clang] imx-{chip-tool,lighting-app,thermostat,all-clusters-app,all-clusters-minimal-app,ota-provider-app}[-release] infineon-psoc6-{lock,light,all-clusters,all-clusters-minimal}[-ota][-updateimage][-trustm] -nxp-{k32w0,k32w1,rw61x}-{zephyr,freertos}-{lighting,contact-sensor,all-clusters,laundry-washer,thermostat}[-factory][-low-power][-lit][-fro32k][-smu2][-dac-conversion][-rotating-id][-sw-v2][-ota][-wifi][-thread][-matter-shell] +nxp-{k32w0,k32w1,rw61x,mcxw71}-{zephyr,freertos}-{lighting,contact-sensor,all-clusters,laundry-washer,thermostat}[-factory][-low-power][-lit][-fro32k][-smu2][-dac-conversion][-rotating-id][-sw-v2][-ota][-wifi][-thread][-matter-shell] mbed-cy8cproto_062_4343w-{lock,light,all-clusters,all-clusters-minimal,pigweed,ota-requestor,shell}[-release][-develop][-debug] mw320-all-clusters-app nrf-{nrf5340dk,nrf52840dk,nrf52840dongle}-{all-clusters,all-clusters-minimal,lock,light,light-switch,shell,pump,pump-controller,window-covering}[-rpc] diff --git a/src/platform/nxp/common/legacy/gatt_db.h b/src/platform/nxp/common/legacy/gatt_db.h new file mode 100644 index 00000000000000..604fcfb61a7ba1 --- /dev/null +++ b/src/platform/nxp/common/legacy/gatt_db.h @@ -0,0 +1,30 @@ +PRIMARY_SERVICE(service_gatt, gBleSig_GenericAttributeProfile_d) +CHARACTERISTIC(char_service_changed, gBleSig_GattServiceChanged_d, (gGattCharPropRead_c | gGattCharPropNotify_c)) +VALUE(value_service_changed, gBleSig_GattServiceChanged_d, (gPermissionNone_c), 4, 0x00, 0x00, 0x00, 0x00) +CCCD(cccd_service_changed) + +PRIMARY_SERVICE(service_gap, gBleSig_GenericAccessProfile_d) +CHARACTERISTIC(char_device_name, gBleSig_GapDeviceName_d, (gGattCharPropRead_c)) +VALUE(value_device_name, gBleSig_GapDeviceName_d, (gPermissionFlagReadable_c), 16, "NXP_ELOCK_DEMO") +CHARACTERISTIC(char_appearance, gBleSig_GapAppearance_d, (gGattCharPropRead_c)) +VALUE(value_appearance, gBleSig_GapAppearance_d, (gPermissionFlagReadable_c), 2, 0x00, 0x00) + +PRIMARY_SERVICE(service_chipoble, gChipoBleService_d) +CHARACTERISTIC_UUID128(chipoble_rx, uuid_chipoble_rx, (gGattCharPropWrite_c)) +VALUE_UUID128_VARLEN(value_chipoble_rx, uuid_chipoble_rx, (gPermissionFlagWritable_c), gAttMaxMtu_c - 3, gAttMaxMtu_c - 3, 0x00) +CHARACTERISTIC_UUID128(chipoble_tx, uuid_chipoble_tx, (gGattCharPropIndicate_c | gGattCharPropRead_c)) +VALUE_UUID128_VARLEN(value_chipoble_tx, uuid_chipoble_tx, (gPermissionFlagReadable_c), gAttMaxMtu_c - 3, gAttMaxMtu_c - 3, 0x00) +CCCD(cccd_chipoble_tx) +CHARACTERISTIC_UUID128(chipoble_c3, uuid_chipoble_c3, (gGattCharPropRead_c)) +VALUE_UUID128_VARLEN(value_chipoble_c3, uuid_chipoble_c3, (gPermissionFlagReadable_c), gAttMaxReadDataSize_d(gAttMaxValueLength_c), + gAttMaxReadDataSize_d(gAttMaxValueLength_c), 0x00) + +PRIMARY_SERVICE(service_device_info, gBleSig_DeviceInformationService_d) +CHARACTERISTIC(char_model_no, gBleSig_ModelNumberString_d, (gGattCharPropRead_c)) +VALUE(value_model_no, gBleSig_ModelNumberString_d, (gPermissionFlagReadable_c), 15, "Chip ELock Demo") +CHARACTERISTIC(char_serial_no, gBleSig_SerialNumberString_d, (gGattCharPropRead_c)) +VALUE(value_serial_no, gBleSig_SerialNumberString_d, (gPermissionFlagReadable_c), 7, "BLESN01") +CHARACTERISTIC(char_fw_rev, gBleSig_FirmwareRevisionString_d, (gGattCharPropRead_c)) +VALUE(value_fw_rev, gBleSig_FirmwareRevisionString_d, (gPermissionFlagReadable_c), 5, "1.1.1") +CHARACTERISTIC(char_sw_rev, gBleSig_SoftwareRevisionString_d, (gGattCharPropRead_c)) +VALUE(value_sw_rev, gBleSig_SoftwareRevisionString_d, (gPermissionFlagReadable_c), 5, "1.1.4") diff --git a/src/platform/nxp/common/legacy/gatt_uuid128.h b/src/platform/nxp/common/legacy/gatt_uuid128.h new file mode 100644 index 00000000000000..938968b1943ce2 --- /dev/null +++ b/src/platform/nxp/common/legacy/gatt_uuid128.h @@ -0,0 +1,26 @@ +/* +* Declare all custom 128-bit UUIDs here using the format: +* +* UUID128(name, bytes) +* +* where: +* -name : an unique tag for the newly defined UUID; + will be used to reference this UUID when defining + services and characteristics in <> +* -bytes: 16 bytes representing the 128-bit value +* +* One definition per line. No semicolon required after each definition. +* +* example: +* UUID128(uuid_service_robot_characteristics, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, +0xCD, 0xEF) +* UUID128(uuid_char_robot_direction, 0x12, 0x34, 0x50, 0x00, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, +0xEF) +*/ +/* Services */ + +#define gChipoBleService_d 0xFFF6 + +UUID128(uuid_chipoble_tx, 0x12, 0x9D, 0x9F, 0x42, 0x9C, 0x4F, 0x9F, 0x95, 0x59, 0x45, 0x3D, 0x26, 0xF5, 0x2E, 0xEE, 0x18) +UUID128(uuid_chipoble_rx, 0x11, 0x9D, 0x9F, 0x42, 0x9C, 0x4F, 0x9F, 0x95, 0x59, 0x45, 0x3D, 0x26, 0xF5, 0x2E, 0xEE, 0x18) +UUID128(uuid_chipoble_c3, 0x04, 0x8f, 0x21, 0x83, 0x8a, 0x74, 0x7d, 0xb8, 0xf2, 0x45, 0x72, 0x87, 0x38, 0x02, 0x63, 0x64) From 3b74224ec040fd1568b1981f7e912ba1447101be Mon Sep 17 00:00:00 2001 From: Terence Hampson Date: Wed, 11 Sep 2024 08:48:48 -0400 Subject: [PATCH 20/38] Update chef operational-state-delegate-impl (#35528) --- .../chef-operational-state-delegate-impl.cpp | 15 +++++++++++++++ .../common/chef-operational-state-delegate-impl.h | 1 + 2 files changed, 16 insertions(+) diff --git a/examples/chef/common/chef-operational-state-delegate-impl.cpp b/examples/chef/common/chef-operational-state-delegate-impl.cpp index 2692417915d785..eedd141dc3b2e4 100644 --- a/examples/chef/common/chef-operational-state-delegate-impl.cpp +++ b/examples/chef/common/chef-operational-state-delegate-impl.cpp @@ -58,6 +58,7 @@ void GenericOperationalStateDelegateImpl::HandlePauseStateCallback(GenericOperat auto error = GetInstance()->SetOperationalState(to_underlying(OperationalState::OperationalStateEnum::kPaused)); if (error == CHIP_NO_ERROR) { + GetInstance()->UpdateCountdownTimeFromDelegate(); err.Set(to_underlying(ErrorStateEnum::kNoError)); } else @@ -72,6 +73,7 @@ void GenericOperationalStateDelegateImpl::HandleResumeStateCallback(GenericOpera auto error = GetInstance()->SetOperationalState(to_underlying(OperationalStateEnum::kRunning)); if (error == CHIP_NO_ERROR) { + GetInstance()->UpdateCountdownTimeFromDelegate(); err.Set(to_underlying(ErrorStateEnum::kNoError)); } else @@ -95,6 +97,7 @@ void GenericOperationalStateDelegateImpl::HandleStartStateCallback(GenericOperat auto error = GetInstance()->SetOperationalState(to_underlying(OperationalStateEnum::kRunning)); if (error == CHIP_NO_ERROR) { + GetInstance()->UpdateCountdownTimeFromDelegate(); (void) DeviceLayer::SystemLayer().StartTimer(System::Clock::Seconds16(1), onOperationalStateTimerTick, this); err.Set(to_underlying(ErrorStateEnum::kNoError)); } @@ -112,6 +115,8 @@ void GenericOperationalStateDelegateImpl::HandleStopStateCallback(GenericOperati { (void) DeviceLayer::SystemLayer().CancelTimer(onOperationalStateTimerTick, this); + GetInstance()->UpdateCountdownTimeFromDelegate(); + OperationalState::GenericOperationalError current_err(to_underlying(OperationalState::ErrorStateEnum::kNoError)); GetInstance()->GetCurrentOperationalError(current_err); @@ -151,6 +156,11 @@ static void onOperationalStateTimerTick(System::Layer * systemLayer, void * data delegate->mPausedTime++; } } + else if (!countdown_time.IsNull() && countdown_time.Value() <= 0) + { + OperationalState::GenericOperationalError noError(to_underlying(OperationalState::ErrorStateEnum::kNoError)); + delegate->HandleStopStateCallback(noError); + } if (state == OperationalState::OperationalStateEnum::kRunning || state == OperationalState::OperationalStateEnum::kPaused) { @@ -172,6 +182,11 @@ OperationalState::Instance * OperationalState::GetOperationalStateInstance() return gOperationalStateInstance; } +OperationalStateDelegate * OperationalState::GetOperationalStateDelegate() +{ + return gOperationalStateDelegate; +} + void OperationalState::Shutdown() { if (gOperationalStateInstance != nullptr) diff --git a/examples/chef/common/chef-operational-state-delegate-impl.h b/examples/chef/common/chef-operational-state-delegate-impl.h index 60b6b09e9b6511..badadd68cd30a9 100644 --- a/examples/chef/common/chef-operational-state-delegate-impl.h +++ b/examples/chef/common/chef-operational-state-delegate-impl.h @@ -138,6 +138,7 @@ class OperationalStateDelegate : public GenericOperationalStateDelegateImpl }; Instance * GetOperationalStateInstance(); +OperationalStateDelegate * GetOperationalStateDelegate(); void Shutdown(); From 16b1e5b3505e70120f21bb4dee4cc584bb0266d3 Mon Sep 17 00:00:00 2001 From: Marius Tache <102153746+marius-alex-tache@users.noreply.github.com> Date: Wed, 11 Sep 2024 15:53:37 +0300 Subject: [PATCH 21/38] [NXP] Fix key storage issues and add NVS wear stats support (#35511) * [nxp][platform][common] Simplify factory reset procedure when KeyStorage is used Instead of resetting the KetStorage which, in turn, removes the key files one by one, just shut it down to trigger a FileCache flush and then simply format the file system partition. Signed-off-by: Marian Chereji (cherry picked from commit 9a2624656feff58849d89272e73559da19078849) * [nxp][platform][common] Update "NXPConfig.h" to allow building multiple key storage solutions The "NXPConfig.h" header was developed to support 2 key storage solutions so far, which were mostly selected using the CHIP_PLAT_NVM_SUPPORT build symbol. In order to be able to support additional key storage solutions (such as Zephyr NVS), which are no longer selected via the above mentioned build symbol, the header Signed-off-by: Marian Chereji (cherry picked from commit 7bace6914508ac98124836a1be3973818993dd58) * [nxp][common] Fix KeyStorage use of illegal buffer size when checking the existence of a key The "NXPConfig::ConfigValueExists" member function is using a non-zero buffer capacity combined with a NULL buffer pointer when calling the KeyStorage KS_GetKeyInt() function. This combination is illegal. When using a NULL buffer pointer, a capacity of zero is required to be provided. Signed-off-by: Marian Chereji (cherry picked from commit f8f03ef0041bc8b7729fe7959cf2244b6d65133e) * [nxp][platform][common] Add check for read_bytes_size read_bytes_size can be nullptr according to the KVS API. Add a nullptr check to account for use cases where the parameter is not used (implicitly set to nullptr). Signed-off-by: marius-alex-tache * [nxp][platform][common] Add support for NVS key storage wear statistics Added the support to initialize and update key storage wear statistics. Signed-off-by: Marian Chereji Reviewed-by: Doru-Cristian Gucea Reviewed-by: Martin Girardot (cherry picked from commit d05884ddf8baac0da0a4d9d2a693280d2bdae86a) * [nxp][platform][common] Update platform names for w0/w1 Signed-off-by: marius-alex-tache --------- Signed-off-by: marius-alex-tache Co-authored-by: Marian Chereji --- src/platform/nxp/BUILD.gn | 2 +- .../CHIPDeviceNXPPlatformDefaultConfig.h | 4 ++ .../nxp/common/KeyValueStoreManagerImpl.cpp | 5 +- src/platform/nxp/common/NXPConfig.h | 13 +++-- src/platform/nxp/common/NXPConfigKS.cpp | 19 ++++--- src/platform/nxp/common/NXPConfigNVS.cpp | 57 +++++++++++++++++++ 6 files changed, 83 insertions(+), 17 deletions(-) diff --git a/src/platform/nxp/BUILD.gn b/src/platform/nxp/BUILD.gn index 0865a1d36dacb6..b2043caac1f0bf 100644 --- a/src/platform/nxp/BUILD.gn +++ b/src/platform/nxp/BUILD.gn @@ -26,7 +26,7 @@ source_set("logging") { "${chip_root}/src/platform/logging:headers", ] - if (nxp_platform == "k32w/k32w0" || nxp_platform == "k32w1") { + if (nxp_platform == "k32w0" || nxp_platform == "mcxw71_k32w1") { sources = [ "${chip_root}/src/platform/nxp/${nxp_platform}/Logging.cpp" ] } else { sources = [ "${chip_root}/src/platform/nxp/common/Logging.cpp" ] diff --git a/src/platform/nxp/common/CHIPDeviceNXPPlatformDefaultConfig.h b/src/platform/nxp/common/CHIPDeviceNXPPlatformDefaultConfig.h index ba2321c9a26566..e8d392fb793604 100644 --- a/src/platform/nxp/common/CHIPDeviceNXPPlatformDefaultConfig.h +++ b/src/platform/nxp/common/CHIPDeviceNXPPlatformDefaultConfig.h @@ -102,6 +102,10 @@ #define CHIP_DEVICE_CONFIG_ENABLE_THREAD_DNS_CLIENT 1 #endif // CHIP_DEVICE_CONFIG_ENABLE_THREAD +#ifndef CHIP_DEVICE_CONFIG_KVS_WEAR_STATS_KEY +#define CHIP_DEVICE_CONFIG_KVS_WEAR_STATS_KEY "nxp/diag/usr" +#endif // CHIP_DEVICE_CONFIG_KVS_WEAR_STATS_KEY + #if CHIP_DEVICE_CONFIG_ENABLE_THREAD && !CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE #define CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONABLE_DISCOVERY 1 #define CHIP_DEVICE_CONFIG_ENABLE_EXTENDED_DISCOVERY 1 diff --git a/src/platform/nxp/common/KeyValueStoreManagerImpl.cpp b/src/platform/nxp/common/KeyValueStoreManagerImpl.cpp index af2598ca2be188..737007a46dce68 100644 --- a/src/platform/nxp/common/KeyValueStoreManagerImpl.cpp +++ b/src/platform/nxp/common/KeyValueStoreManagerImpl.cpp @@ -55,7 +55,10 @@ CHIP_ERROR KeyValueStoreManagerImpl::_Get(const char * key, void * value, size_t ChipLogError(DeviceLayer, "KVS, failed to read key!"); } - *read_bytes_size = read_bytes; + if (read_bytes_size) + { + *read_bytes_size = read_bytes; + } exit: ConvertError(err); diff --git a/src/platform/nxp/common/NXPConfig.h b/src/platform/nxp/common/NXPConfig.h index 03d6174763fb69..7de3beab2b37ed 100644 --- a/src/platform/nxp/common/NXPConfig.h +++ b/src/platform/nxp/common/NXPConfig.h @@ -40,14 +40,12 @@ #if (CHIP_PLAT_NVM_SUPPORT == CHIP_PLAT_NVM_FWK) #include "NVM_Interface.h" +#include "ram_storage.h" #elif (CHIP_PLAT_NVM_SUPPORT == CHIP_PLAT_LITTLEFS) #include "fwk_filesystem.h" -#endif - -#if (CHIP_PLAT_NVM_SUPPORT == CHIP_PLAT_KEY_STORAGE) -#include "fwk_key_storage.h" -#else #include "ram_storage.h" +#elif (CHIP_PLAT_NVM_SUPPORT == CHIP_PLAT_KEY_STORAGE) +#include "fwk_key_storage.h" #endif namespace chip { @@ -188,11 +186,14 @@ class NXPConfig private: #if (CHIP_PLAT_NVM_SUPPORT == CHIP_PLAT_KEY_STORAGE) static CHIP_ERROR MapKeyStorageStatus(ks_error_t ksStatus); -#else +#elif (CHIP_PLAT_NVM_SUPPORT != CHIP_PLAT_NO_NVM) static CHIP_ERROR MapRamStorageStatus(rsError rsStatus); #endif static int SaveIntKeysToFS(void); static int SaveStringKeysToFS(void); +#if (CHIP_DEVICE_CONFIG_KVS_WEAR_STATS == 1) + static CHIP_ERROR InitStorageWearStats(void); +#endif }; } // namespace Internal diff --git a/src/platform/nxp/common/NXPConfigKS.cpp b/src/platform/nxp/common/NXPConfigKS.cpp index 1940a8081cbf7c..930f07fe3540d4 100644 --- a/src/platform/nxp/common/NXPConfigKS.cpp +++ b/src/platform/nxp/common/NXPConfigKS.cpp @@ -31,6 +31,7 @@ #include #include "fwk_file_cache.h" +#include "fwk_fs_abstraction.h" #include "fwk_key_storage.h" #include "fwk_lfs_mflash.h" @@ -419,26 +420,26 @@ bool NXPConfig::ConfigValueExists(Key key) found = false; readValue_p = NULL; outLen = 0; - /* Max number of bytes read when getting a value */ - bufSize = 256; + bufSize = 0; if (ValidConfigKey(key)) { /* Get the first occurence */ status = KS_GetKeyInt(ks_handle_p, (int) key, (char *) NS_INT, readValue_p, bufSize, &outLen); - found = (status == KS_ERROR_NONE && outLen != 0); + found = (status != KS_ERROR_KEY_NOT_FOUND); } return found; } CHIP_ERROR NXPConfig::FactoryResetConfig(void) { - /*for (Key key = kMinConfigKey_ChipConfig; key <= kMaxConfigKey_ChipConfig; key++) - { - ClearConfigValue(key); - }*/ - - KS_Reset(ks_handle_p); + /* + * When a factory reset is required, shut down the KeyStorage (which + * also flushes the FileCache) and then execute a simple format of the + * the file system partition. + */ + KS_DeInit(ks_handle_p); + FSA_Format(); DBG_PRINTF("FactoryResetConfig done\r\n"); diff --git a/src/platform/nxp/common/NXPConfigNVS.cpp b/src/platform/nxp/common/NXPConfigNVS.cpp index 34d98a36d25002..4cd997b218d473 100644 --- a/src/platform/nxp/common/NXPConfigNVS.cpp +++ b/src/platform/nxp/common/NXPConfigNVS.cpp @@ -20,10 +20,14 @@ #include #include #include +#include #include /* Only for flash init, to be move to sdk framework */ #include "port/nvs_port.h" +#if (CHIP_DEVICE_CONFIG_KVS_WEAR_STATS == 1) +#include "fwk_nvs_stats.h" +#endif /* CHIP_DEVICE_CONFIG_KVS_WEAR_STATS */ // These can be overridden by the application as needed. #ifndef CHIP_DEVICE_INTEGER_SETTINGS_KEY @@ -137,6 +141,17 @@ int DeleteSubtreeCallback(const char * name, size_t /* entrySize */, settings_re return 0; } + +#if (CHIP_DEVICE_CONFIG_KVS_WEAR_STATS == 1) +void OnFlashSectorWearCountUpdate(uint16_t sector_idx, const nvs_storage_wear_profile_t * flash_wear_profile) +{ + char keyUser[] = CHIP_DEVICE_CONFIG_KVS_WEAR_STATS_KEY; + const size_t flash_wear_profile_size = NVS_STORAGE_WEAR_PROFILE_SIZE(flash_wear_profile->sector_count); + + /* Update the NVS stats key in storage */ + NXPConfig::WriteConfigValueBin((const char *) keyUser, (uint8_t *) flash_wear_profile, flash_wear_profile_size); +} +#endif /* CHIP_DEVICE_CONFIG_KVS_WEAR_STATS */ } // namespace CHIP_ERROR NXPConfig::Init() @@ -151,8 +166,50 @@ CHIP_ERROR NXPConfig::Init() ReturnErrorCodeIf(settings_subsys_init(), CHIP_ERROR_PERSISTED_STORAGE_FAILED); +#if (CHIP_DEVICE_CONFIG_KVS_WEAR_STATS == 1) + ReturnErrorOnFailure(InitStorageWearStats()); +#endif /* CHIP_DEVICE_CONFIG_KVS_WEAR_STATS */ + + return CHIP_NO_ERROR; +} + +#if (CHIP_DEVICE_CONFIG_KVS_WEAR_STATS == 1) +CHIP_ERROR NXPConfig::InitStorageWearStats(void) +{ + nvs_storage_wear_profile_t * flash_wear_profile = NULL; + const size_t flash_wear_profile_size = NVS_STORAGE_WEAR_PROFILE_SIZE((uint32_t) NV_STORAGE_MAX_SECTORS); + size_t size; + char keyUser[] = CHIP_DEVICE_CONFIG_KVS_WEAR_STATS_KEY; + + /* Create an empty flash wear profile */ + flash_wear_profile = (nvs_storage_wear_profile_t *) calloc(1, flash_wear_profile_size); + ReturnErrorCodeIf(flash_wear_profile == NULL, CHIP_ERROR_NO_MEMORY); + + /* Try to read the flash wear profile from the User Support diagnostic log key */ + CHIP_ERROR err = ReadConfigValueBin((const char *) keyUser, (uint8_t *) flash_wear_profile, flash_wear_profile_size, size); + if ((err != CHIP_NO_ERROR) || (size != flash_wear_profile_size) || + (flash_wear_profile->sector_count != (uint32_t) NV_STORAGE_MAX_SECTORS)) + { + /* Either the flash wear stats are not available in the persistent + * storage or the flash wear statistics that we have read are not + * compatible with the current persistent storage configuration. In + * this case - just reset and save the flash wear statistics. */ + flash_wear_profile->sector_count = (uint32_t) NV_STORAGE_MAX_SECTORS; + memset(flash_wear_profile->erase_count, 0, (uint32_t) NV_STORAGE_MAX_SECTORS * sizeof(uint16_t)); + WriteConfigValueBin((const char *) keyUser, (uint8_t *) flash_wear_profile, flash_wear_profile_size); + } + else + { + /* Load the flash wear profile into the NVS statistics */ + nvs_stats_load_profile(flash_wear_profile); + } + free(flash_wear_profile); + + nvs_stats_config_event_handler(OnFlashSectorWearCountUpdate); + return CHIP_NO_ERROR; } +#endif /* CHIP_DEVICE_CONFIG_KVS_WEAR_STATS */ CHIP_ERROR NXPConfig::ReadConfigValue(Key key, bool & val) { From b2685cbbac62b016cbc3085f520460fbda545c1b Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Wed, 11 Sep 2024 10:14:01 -0400 Subject: [PATCH 22/38] Remove the accessedViaPublicAPI on MTRDevice. (#35531) Now that we have a concept of suspended devices, just use that to avoid wasting time on read-throughs which would fail anyway. --- src/darwin/Framework/CHIP/MTRDevice.mm | 14 +------------- src/darwin/Framework/CHIP/MTRDevice_Concrete.mm | 6 +++--- src/darwin/Framework/CHIP/MTRDevice_Internal.h | 11 ----------- 3 files changed, 4 insertions(+), 27 deletions(-) diff --git a/src/darwin/Framework/CHIP/MTRDevice.mm b/src/darwin/Framework/CHIP/MTRDevice.mm index ddc47965f9c8b1..f323c220ae118e 100644 --- a/src/darwin/Framework/CHIP/MTRDevice.mm +++ b/src/darwin/Framework/CHIP/MTRDevice.mm @@ -306,7 +306,6 @@ - (instancetype)initForSubclassesWithNodeID:(NSNumber *)nodeID controller:(MTRDe _delegates = [NSMutableSet set]; _deviceController = controller; _nodeID = nodeID; - _accessedViaPublicAPI = NO; _state = MTRDeviceStateUnknown; } @@ -322,7 +321,6 @@ - (instancetype)initWithNodeID:(NSNumber *)nodeID controller:(MTRDeviceControlle _nodeID = [nodeID copy]; _fabricIndex = controller.fabricIndex; _deviceController = controller; - _accessedViaPublicAPI = NO; _queue = dispatch_queue_create("org.csa-iot.matter.framework.device.workqueue", DISPATCH_QUEUE_SERIAL_WITH_AUTORELEASE_POOL); _asyncWorkQueue = [[MTRAsyncWorkQueue alloc] initWithContext:self]; @@ -362,19 +360,9 @@ - (void)dealloc MTR_LOG("MTRDevice dealloc: %p", self); } -+ (MTRDevice *)_deviceWithNodeID:(NSNumber *)nodeID controller:(MTRDeviceController *)controller -{ - return [controller deviceForNodeID:nodeID]; -} - + (MTRDevice *)deviceWithNodeID:(NSNumber *)nodeID controller:(MTRDeviceController *)controller { - auto * device = [self _deviceWithNodeID:nodeID controller:controller]; - if (device) { - std::lock_guard lock(device->_lock); - device->_accessedViaPublicAPI = YES; - } - return device; + return [controller deviceForNodeID:nodeID]; } #pragma mark - Time Synchronization diff --git a/src/darwin/Framework/CHIP/MTRDevice_Concrete.mm b/src/darwin/Framework/CHIP/MTRDevice_Concrete.mm index 64ba651f0ce192..9beacdfd046bbc 100644 --- a/src/darwin/Framework/CHIP/MTRDevice_Concrete.mm +++ b/src/darwin/Framework/CHIP/MTRDevice_Concrete.mm @@ -2700,12 +2700,12 @@ static BOOL AttributeHasChangesOmittedQuality(MTRAttributePath * attributePath) // 3. The attribute is not in the spec, and the read params asks to assume // an unknown attribute has the Changes Omitted quality. // - // But all this only happens if this device has been accessed via the public - // API. If it's a device we just created internally, don't do read-throughs. + // But all this only happens if this device is not suspended. If it's suspended, read-throughs will fail + // anyway, so we should not bother trying. BOOL readThroughsAllowed; { std::lock_guard lock(_lock); - readThroughsAllowed = _accessedViaPublicAPI; + readThroughsAllowed = !self.suspended; } if (readThroughsAllowed && (![self _subscriptionAbleToReport] || hasChangesOmittedQuality)) { // Read requests container will be a mutable array of items, each being an array containing: diff --git a/src/darwin/Framework/CHIP/MTRDevice_Internal.h b/src/darwin/Framework/CHIP/MTRDevice_Internal.h index 7a91b926560f30..d0661b2590e9cd 100644 --- a/src/darwin/Framework/CHIP/MTRDevice_Internal.h +++ b/src/darwin/Framework/CHIP/MTRDevice_Internal.h @@ -120,19 +120,8 @@ MTR_DIRECT_MEMBERS // Our controller. Declared nullable because our property is, though in // practice it does not look like we ever set it to nil. MTRDeviceController * _Nullable _deviceController; - - // Whether this device has been accessed via the public deviceWithNodeID API - // (as opposed to just via the internal _deviceWithNodeID). - BOOL _accessedViaPublicAPI; } -/** - * Internal way of creating an MTRDevice that does not flag the device as being - * visible to external API consumers. - */ -+ (MTRDevice *)_deviceWithNodeID:(NSNumber *)nodeID - controller:(MTRDeviceController *)controller; - - (instancetype)initForSubclassesWithNodeID:(NSNumber *)nodeID controller:(MTRDeviceController *)controller; - (instancetype)initWithNodeID:(NSNumber *)nodeID controller:(MTRDeviceController *)controller; From b1030ada898620d19713597f24a8669905c23de1 Mon Sep 17 00:00:00 2001 From: chirag-silabs <100861685+chirag-silabs@users.noreply.github.com> Date: Wed, 11 Sep 2024 21:07:10 +0530 Subject: [PATCH 23/38] [Silabs] Fixing the switch ladder and removing warning flags (#35366) * fixing the switch ladder and removing warning flags * Restyled by clang-format * adding unused parameter cflag due to wifi sdk * Restyled by gn * adding the correct warning options * updating the warning flag and only deleting fabrics for wifi * adding the remove services to get rid of the matter multicast service --------- Co-authored-by: Restyled.io --- examples/platform/silabs/BaseApplication.cpp | 20 ++++++++++++++------ third_party/silabs/SiWx917_sdk.gni | 7 ------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/examples/platform/silabs/BaseApplication.cpp b/examples/platform/silabs/BaseApplication.cpp index c61b91f7400879..37efb09fe5c207 100644 --- a/examples/platform/silabs/BaseApplication.cpp +++ b/examples/platform/silabs/BaseApplication.cpp @@ -802,6 +802,10 @@ void BaseApplication::ScheduleFactoryReset() { Provision::Manager::GetInstance().SetProvisionRequired(true); } +#if SL_WIFI + // Removing the matter services on factory reset + chip::Dnssd::ServiceAdvertiser::Instance().RemoveServices(); +#endif PlatformMgr().HandleServerShuttingDown(); // HandleServerShuttingDown calls OnShutdown() which is only implemented for the // basic information cluster it seems. And triggers and Event flush, which is not // relevant when there are no fabrics left @@ -851,19 +855,23 @@ void BaseApplication::OnPlatformEvent(const ChipDeviceEvent * event, intptr_t) case DeviceEventType::kThreadConnectivityChange: case DeviceEventType::kInternetConnectivityChange: { #ifdef DIC_ENABLE - VerifyOrReturn(event->InternetConnectivityChange.IPv4 == kConnectivity_Established); - if (DIC_OK != dic_init(dic::control::subscribeCB)) + if (event->InternetConnectivityChange.IPv4 == kConnectivity_Established) { - ChipLogError(AppServer, "dic_init failed"); + if (DIC_OK != dic_init(dic::control::subscribeCB)) + { + ChipLogError(AppServer, "dic_init failed"); + } } #endif // DIC_ENABLE #ifdef DISPLAY_ENABLED SilabsLCD::Screen_e screen; AppTask::GetLCD().GetScreen(screen); // Update the LCD screen with SSID and connected state - VerifyOrReturn(screen == SilabsLCD::Screen_e::StatusScreen); - BaseApplication::UpdateLCDStatusScreen(false); - AppTask::GetLCD().SetScreen(screen); + if (screen == SilabsLCD::Screen_e::StatusScreen) + { + BaseApplication::UpdateLCDStatusScreen(false); + AppTask::GetLCD().SetScreen(screen); + } #endif // DISPLAY_ENABLED if ((event->ThreadConnectivityChange.Result == kConnectivity_Established) || (event->InternetConnectivityChange.IPv6 == kConnectivity_Established)) diff --git a/third_party/silabs/SiWx917_sdk.gni b/third_party/silabs/SiWx917_sdk.gni index e91afe7483b3fa..3c5d8817b2d217 100644 --- a/third_party/silabs/SiWx917_sdk.gni +++ b/third_party/silabs/SiWx917_sdk.gni @@ -336,16 +336,9 @@ template("siwx917_sdk") { libs += [ "${sdk_support_root}/platform/emdrv/nvm3/lib/libnvm3_CM4_gcc.a" ] cflags += [ - "-Wno-maybe-uninitialized", "-Wno-shadow", - "-Wno-empty-body", - "-Wno-cpp", - "-Wno-missing-braces", - "-Wno-sign-compare", - "-Wno-error", "-Wno-unknown-warning-option", "-Wno-unused-variable", - "-Wno-unused-function", ] foreach(include_dir, _include_dirs) { From b70b7455982220c7269596f1b827c75606500fd9 Mon Sep 17 00:00:00 2001 From: Terence Hampson Date: Wed, 11 Sep 2024 11:49:39 -0400 Subject: [PATCH 24/38] update_cluster_revisions.py excludes updating no-unique-id example's BINFO cluster (#35510) --------- Co-authored-by: Boris Zbarsky --- scripts/tools/zap/update_cluster_revisions.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/scripts/tools/zap/update_cluster_revisions.py b/scripts/tools/zap/update_cluster_revisions.py index e29a274cf47087..797fd1733f3771 100755 --- a/scripts/tools/zap/update_cluster_revisions.py +++ b/scripts/tools/zap/update_cluster_revisions.py @@ -24,11 +24,15 @@ import sys from pathlib import Path +BASIC_INFORMATION_CLUSTER_ID = int("0x0039", 16) CHIP_ROOT_DIR = os.path.realpath( os.path.join(os.path.dirname(__file__), '../../..')) +EXCLUDE_FROM_UPDATE_DICTIONARY = { + BASIC_INFORMATION_CLUSTER_ID: ["lighting-app-data-mode-no-unique-id"] +} -def getTargets(): +def getTargets(cluster_id: int): ROOTS_TO_SEARCH = [ './examples', './src/controller/data_model', @@ -40,6 +44,10 @@ def getTargets(): for filepath in Path(root).rglob('*.zap'): targets.append(filepath) + if cluster_id in EXCLUDE_FROM_UPDATE_DICTIONARY: + for target_to_exclude in EXCLUDE_FROM_UPDATE_DICTIONARY[cluster_id]: + targets = [target for target in targets if target_to_exclude not in target.parts] + return targets @@ -130,7 +138,7 @@ def main(): os.chdir(CHIP_ROOT_DIR) - targets = getTargets() + targets = getTargets(args.cluster_id) if args.dry_run: for target in targets: From a62b5dbe1057a7214d9d22d3f85ae6ee8511c718 Mon Sep 17 00:00:00 2001 From: Andrei Litvin Date: Wed, 11 Sep 2024 12:31:29 -0400 Subject: [PATCH 25/38] Remove `all.xml` (#35521) * Remove unused file * Fix the documentation * Restyled by prettier-markdown --------- Co-authored-by: Andrei Litvin Co-authored-by: Restyled.io --- .../how_to_add_new_dts_and_clusters.md | 9 +- src/app/zap-templates/zcl/data-model/all.xml | 128 ------------------ 2 files changed, 4 insertions(+), 133 deletions(-) delete mode 100644 src/app/zap-templates/zcl/data-model/all.xml diff --git a/docs/cluster_and_device_type_dev/how_to_add_new_dts_and_clusters.md b/docs/cluster_and_device_type_dev/how_to_add_new_dts_and_clusters.md index 8d73a257c28996..90d82c60310a90 100644 --- a/docs/cluster_and_device_type_dev/how_to_add_new_dts_and_clusters.md +++ b/docs/cluster_and_device_type_dev/how_to_add_new_dts_and_clusters.md @@ -17,10 +17,9 @@ directory:** 1. [.github/workflows/tests.yaml](https://github.com/project-chip/connectedhomeip/tree/master/.github/workflows/tests.yaml) 2. [scripts/rules.matterlint](https://github.com/project-chip/connectedhomeip/tree/master/scripts/rules.matterlint) -3. [src/app/zap-templates/zcl/data-model/all.xml](https://github.com/project-chip/connectedhomeip/tree/master/src/app/zap-templates/zcl/data-model/all.xml) -4. [src/app/zap-templates/zcl/zcl-with-test-extensions.json](https://github.com/project-chip/connectedhomeip/tree/master/src/app/zap-templates/zcl/zcl-with-test-extensions.json) -5. [src/app/zap-templates/zcl/zcl.json](https://github.com/project-chip/connectedhomeip/tree/master/src/app/zap-templates/zcl/zcl.json) -6. If it is a derived cluster, add a reference to the base cluster definition. +3. [src/app/zap-templates/zcl/zcl-with-test-extensions.json](https://github.com/project-chip/connectedhomeip/tree/master/src/app/zap-templates/zcl/zcl-with-test-extensions.json) +4. [src/app/zap-templates/zcl/zcl.json](https://github.com/project-chip/connectedhomeip/tree/master/src/app/zap-templates/zcl/zcl.json) +5. If it is a derived cluster, add a reference to the base cluster definition. (e.g. in mode-base-cluster.xml you may need to add cluster codes - otherwise you may get strange exceptions which aren't clear when running regen_all.py) @@ -31,7 +30,7 @@ directory:** > > ``` -7. [src/controller/python/chip/clusters/\_\_init\_\_.py](https://github.com/project-chip/connectedhomeip/tree/master/src/controller/python/chip/clusters/__init__.py) +6. [src/controller/python/chip/clusters/\_\_init\_\_.py](https://github.com/project-chip/connectedhomeip/tree/master/src/controller/python/chip/clusters/__init__.py) **Enable your new cluster in the Python and Android clients** in [src/controller/data_model/controller-clusters.zap](https://github.com/project-chip/connectedhomeip/blob/master/src/controller/data_model/controller-clusters.zap) diff --git a/src/app/zap-templates/zcl/data-model/all.xml b/src/app/zap-templates/zcl/data-model/all.xml deleted file mode 100644 index 265e80c079e161..00000000000000 --- a/src/app/zap-templates/zcl/data-model/all.xml +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 49b48ad5df227685d150d5abb833784a018432ee Mon Sep 17 00:00:00 2001 From: Justin Wood Date: Wed, 11 Sep 2024 10:38:08 -0700 Subject: [PATCH 26/38] Moving these to async, as the completions already work when needed (#35537) * Moving these to async, as the completions already work when needed * Restyled by clang-format * Adding injection for events/attributes * Missing brace * Restyled by clang-format --------- Co-authored-by: Restyled.io --- .../Framework/CHIP/MTRDefines_Internal.h | 2 +- .../Framework/CHIP/MTRDeviceController_XPC.mm | 6 ++-- .../Framework/CHIP/MTRDevice_Concrete.mm | 34 +++++++++++++------ src/darwin/Framework/CHIP/MTRDevice_XPC.mm | 3 +- 4 files changed, 29 insertions(+), 16 deletions(-) diff --git a/src/darwin/Framework/CHIP/MTRDefines_Internal.h b/src/darwin/Framework/CHIP/MTRDefines_Internal.h index 94a1cbb3da61f4..983226704301e3 100644 --- a/src/darwin/Framework/CHIP/MTRDefines_Internal.h +++ b/src/darwin/Framework/CHIP/MTRDefines_Internal.h @@ -91,7 +91,7 @@ typedef struct {} variable_hidden_by_mtr_hide; { \ NSXPCConnection * xpcConnection = XPC_CONNECTION; \ \ - [[xpcConnection synchronousRemoteObjectProxyWithErrorHandler:^(NSError * _Nonnull error) { \ + [[xpcConnection remoteObjectProxyWithErrorHandler:^(NSError * _Nonnull error) { \ MTR_LOG_ERROR("Error: %@", error); \ }] PREFIX ADDITIONAL_ARGUMENTS]; \ } diff --git a/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm b/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm index 7ca9fde2099e03..29860fd41f1039 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm +++ b/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm @@ -181,7 +181,7 @@ - (BOOL)_setupXPCConnection MTR_LOG("%@ Activating new XPC connection", self); [self.xpcConnection activate]; - [[self.xpcConnection synchronousRemoteObjectProxyWithErrorHandler:^(NSError * _Nonnull error) { + [[self.xpcConnection remoteObjectProxyWithErrorHandler:^(NSError * _Nonnull error) { MTR_LOG_ERROR("Checkin error: %@", error); }] deviceController:self.uniqueIdentifier checkInWithContext:[NSDictionary dictionary]]; @@ -193,7 +193,7 @@ - (BOOL)_setupXPCConnection MTR_LOG("%@ => Registering nodeID: %@", self, nodeID); mtr_weakify(self); - [[self.xpcConnection synchronousRemoteObjectProxyWithErrorHandler:^(NSError * _Nonnull error) { + [[self.xpcConnection remoteObjectProxyWithErrorHandler:^(NSError * _Nonnull error) { mtr_strongify(self); MTR_LOG_ERROR("%@ Registration error for device nodeID: %@ : %@", self, nodeID, error); }] deviceController:self.uniqueIdentifier registerNodeID:nodeID]; @@ -288,7 +288,7 @@ - (MTRDevice *)_setupDeviceForNodeID:(NSNumber *)nodeID prefetchedClusterData:(N MTR_LOG("%s: returning XPC device for node id %@", __PRETTY_FUNCTION__, nodeID); mtr_weakify(self); - [[self.xpcConnection synchronousRemoteObjectProxyWithErrorHandler:^(NSError * _Nonnull error) { + [[self.xpcConnection remoteObjectProxyWithErrorHandler:^(NSError * _Nonnull error) { mtr_strongify(self); MTR_LOG_ERROR("%@ Registration error for device nodeID: %@ : %@", self, nodeID, error); }] deviceController:self.uniqueIdentifier registerNodeID:nodeID]; diff --git a/src/darwin/Framework/CHIP/MTRDevice_Concrete.mm b/src/darwin/Framework/CHIP/MTRDevice_Concrete.mm index 9beacdfd046bbc..6342a46bcd8432 100644 --- a/src/darwin/Framework/CHIP/MTRDevice_Concrete.mm +++ b/src/darwin/Framework/CHIP/MTRDevice_Concrete.mm @@ -1852,24 +1852,38 @@ - (void)_handleAttributeReport:(NSArray *> *)attrib [self _reportAttributes:[self _getAttributesToReportWithReportedValues:attributeReport fromSubscription:isFromSubscription]]; } -#ifdef DEBUG -- (void)unitTestInjectEventReport:(NSArray *> *)eventReport +// BEGIN DRAGON: This is used by the XPC Server to inject reports into local cache and broadcast them +- (void)_injectAttributeReport:(NSArray *> *)attributeReport fromSubscription:(BOOL)isFromSubscription { + [_deviceController asyncDispatchToMatterQueue:^{ + [self _handleReportBegin]; + dispatch_async(self.queue, ^{ + [self _handleAttributeReport:attributeReport fromSubscription:isFromSubscription]; + [self _handleReportEnd]; + }); + } errorHandler:nil]; +} + +- (void)_injectEventReport:(NSArray *> *)eventReport +{ + // [_deviceController asyncDispatchToMatterQueue:^{ // TODO: This wasn't used previously, not sure why, so keeping it here for thought, but preserving existing behavior dispatch_async(self.queue, ^{ [self _handleEventReport:eventReport]; }); + // } errorHandler: nil]; +} + +// END DRAGON: This is used by the XPC Server to inject attribute reports + +#ifdef DEBUG +- (void)unitTestInjectEventReport:(NSArray *> *)eventReport +{ + [self _injectEventReport:eventReport]; } - (void)unitTestInjectAttributeReport:(NSArray *> *)attributeReport fromSubscription:(BOOL)isFromSubscription { - [_deviceController asyncDispatchToMatterQueue:^{ - [self _handleReportBegin]; - dispatch_async(self.queue, ^{ - [self _handleAttributeReport:attributeReport fromSubscription:isFromSubscription]; - [self _handleReportEnd]; - }); - } - errorHandler:nil]; + [self _injectAttributeReport:attributeReport fromSubscription:isFromSubscription]; } #endif diff --git a/src/darwin/Framework/CHIP/MTRDevice_XPC.mm b/src/darwin/Framework/CHIP/MTRDevice_XPC.mm index 46f143e4bc189e..2f7fb260ebde48 100644 --- a/src/darwin/Framework/CHIP/MTRDevice_XPC.mm +++ b/src/darwin/Framework/CHIP/MTRDevice_XPC.mm @@ -244,8 +244,7 @@ - (void)_invokeCommandWithEndpointID:(NSNumber *)endpointID { NSXPCConnection * xpcConnection = [(MTRDeviceController_XPC *) [self deviceController] xpcConnection]; - // TODO: use asynchronous XPC and register a block with controller to call for this transaction - [[xpcConnection synchronousRemoteObjectProxyWithErrorHandler:^(NSError * _Nonnull error) { + [[xpcConnection remoteObjectProxyWithErrorHandler:^(NSError * _Nonnull error) { MTR_LOG_ERROR("Error: %@", error); }] deviceController:[[self deviceController] uniqueIdentifier] nodeID:[self nodeID] From 021f4311fb910905ccc38c9fcd54896704f0c49f Mon Sep 17 00:00:00 2001 From: Andrei Litvin Date: Wed, 11 Sep 2024 14:04:10 -0400 Subject: [PATCH 27/38] Update python builds to latest CI image (ubuntu 24.04 build) (#35534) * Switch python builds to latest CI image * Switch logic for pip updates and wheel installation: do not hardcode paths * More fixes for new python, where pip cannot just be used --- .github/workflows/build.yaml | 14 ++++++++------ scripts/build_python.sh | 4 ++-- scripts/build_python_device.sh | 4 ++-- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index be259e232e5022..83ecc7e00a2192 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -283,7 +283,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:54 + image: ghcr.io/project-chip/chip-build:74 volumes: - "/:/runner-root-volume" - "/tmp/log_output:/tmp/test_logs" @@ -316,9 +316,10 @@ jobs: run: | scripts/run_in_build_env.sh 'virtualenv pyenv' source pyenv/bin/activate - pip3 install ./out/controller/python/chip_core-0.0-cp37-abi3-linux_x86_64.whl - pip3 install ./out/controller/python/chip_clusters-0.0-py3-none-any.whl - pip3 install ./out/controller/python/chip_repl-0.0-py3-none-any.whl + python -m ensurepip --upgrade + python -m pip install ./out/controller/python/chip_core-0.0-cp37-abi3-linux_x86_64.whl + python -m pip install ./out/controller/python/chip_clusters-0.0-py3-none-any.whl + python -m pip install ./out/controller/python/chip_repl-0.0-py3-none-any.whl - name: Run Python tests shell: bash @@ -334,7 +335,8 @@ jobs: scripts/run_in_build_env.sh 'scripts/examples/gn_build_example.sh examples/chip-tool out/' scripts/run_in_build_env.sh 'virtualenv pyenv' source pyenv/bin/activate - pip3 install -r scripts/setup/requirements.setuppayload.txt + python -m ensurepip --upgrade + python -m pip install -r scripts/setup/requirements.setuppayload.txt python3 src/setup_payload/tests/run_python_setup_payload_test.py out/chip-tool build_linux_python_lighting_device: @@ -344,7 +346,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:54 + image: ghcr.io/project-chip/chip-build:74 volumes: - "/:/runner-root-volume" - "/tmp/log_output:/tmp/test_logs" diff --git a/scripts/build_python.sh b/scripts/build_python.sh index 9bb919605e229c..eaf1ad9c0e3050 100755 --- a/scripts/build_python.sh +++ b/scripts/build_python.sh @@ -217,8 +217,8 @@ if [ -n "$install_virtual_env" ]; then fi source "$ENVIRONMENT_ROOT"/bin/activate - "$ENVIRONMENT_ROOT"/bin/python -m pip install --upgrade pip - "$ENVIRONMENT_ROOT"/bin/pip install --upgrade "${WHEEL[@]}" + "$ENVIRONMENT_ROOT"/bin/python -m ensurepip --upgrade + "$ENVIRONMENT_ROOT"/bin/python -m pip install --upgrade "${WHEEL[@]}" if [ "$install_pytest_requirements" = "yes" ]; then YAMLTESTS_GN_LABEL="//scripts:matter_yamltests_distribution._build_wheel" diff --git a/scripts/build_python_device.sh b/scripts/build_python_device.sh index 9b21d28954c409..17824403184c12 100755 --- a/scripts/build_python_device.sh +++ b/scripts/build_python_device.sh @@ -104,8 +104,8 @@ virtualenv --clear "$ENVIRONMENT_ROOT" WHEEL=("$OUTPUT_ROOT"/controller/python/chip_core*.whl) source "$ENVIRONMENT_ROOT"/bin/activate -"$ENVIRONMENT_ROOT"/bin/python -m pip install --upgrade pip -"$ENVIRONMENT_ROOT"/bin/pip install --upgrade --force-reinstall --no-cache-dir "${WHEEL[@]}" +"$ENVIRONMENT_ROOT"/bin/python -m ensurepip --upgrade +"$ENVIRONMENT_ROOT"/bin/python -m pip install --upgrade --force-reinstall --no-cache-dir "${WHEEL[@]}" echo "" echo_green "Compilation completed and WHL package installed in: " From f46de96fb945c0feb4b3f7046914b7b36d1a6d63 Mon Sep 17 00:00:00 2001 From: Andrei Litvin Date: Wed, 11 Sep 2024 14:10:26 -0400 Subject: [PATCH 28/38] Switch infineon builds to latest CI image (#35535) * Switch infineon builds to latest CI image * Set up an environment for modus toolbox because image does not have it --- .github/workflows/examples-infineon.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/examples-infineon.yaml b/.github/workflows/examples-infineon.yaml index 290e67273f9bd3..0fcfac2ce7890e 100644 --- a/.github/workflows/examples-infineon.yaml +++ b/.github/workflows/examples-infineon.yaml @@ -37,7 +37,10 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-infineon:54 + image: ghcr.io/project-chip/chip-build-infineon:74 + env: + # TODO: this should probably be part of the dockerfile itself + CY_TOOLS_PATHS: /opt/Tools/ModusToolbox/tools_3.2 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" steps: From e64ab7181ad48e245b4e09feef38df841e61f2c1 Mon Sep 17 00:00:00 2001 From: Vatsal Ghelani <152916324+vatsalghelani-csa@users.noreply.github.com> Date: Wed, 11 Sep 2024 14:58:32 -0400 Subject: [PATCH 29/38] Fix same test run multiple times avoiding duplication (#35539) --- .github/workflows/tests.yaml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 3a9bca19317216..2c68b91222bf80 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -522,19 +522,17 @@ jobs: scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --load-from-env /tmp/test_env.yaml --script src/controller/python/test/test_scripts/mobile-device-test.py' scripts/run_in_python_env.sh out/venv 'python3 ./src/python_testing/execute_python_tests.py --env-file /tmp/test_env.yaml --search-directory src/python_testing' scripts/run_in_python_env.sh out/venv './scripts/tests/TestTimeSyncTrustedTimeSourceRunner.py --all-clusters out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test-data-model-check-check-failure-die/chip-all-clusters-app' - scripts/run_in_python_env.sh out/venv './src/python_testing/test_testing/test_TC_ICDM_2_1.py' scripts/run_in_python_env.sh out/venv 'python3 ./src/python_testing/TestIdChecks.py' scripts/run_in_python_env.sh out/venv 'python3 ./src/python_testing/TestSpecParsingDeviceType.py' - scripts/run_in_python_env.sh out/venv 'python3 ./src/python_testing/TestSpecParsingSupport.py' - scripts/run_in_python_env.sh out/venv 'python3 ./src/python_testing/TestConformanceTest.py' scripts/run_in_python_env.sh out/venv 'python3 ./src/python_testing/TestConformanceSupport.py' scripts/run_in_python_env.sh out/venv 'python3 ./src/python_testing/TestConformanceTest.py' scripts/run_in_python_env.sh out/venv 'python3 ./src/python_testing/TestChoiceConformanceSupport.py' + scripts/run_in_python_env.sh out/venv 'python3 ./src/python_testing/TestMatterTestingSupport.py' + scripts/run_in_python_env.sh out/venv 'python3 ./src/python_testing/TestSpecParsingSupport.py' + scripts/run_in_python_env.sh out/venv 'python3 ./src/python_testing/test_testing/test_TC_ICDM_2_1.py' scripts/run_in_python_env.sh out/venv 'python3 ./src/python_testing/test_testing/test_IDM_10_4.py' scripts/run_in_python_env.sh out/venv 'python3 ./src/python_testing/test_testing/test_TC_SC_7_1.py' scripts/run_in_python_env.sh out/venv 'python3 ./src/python_testing/test_testing/TestDecorators.py' - scripts/run_in_python_env.sh out/venv 'python3 ./src/python_testing/TestMatterTestingSupport.py' - scripts/run_in_python_env.sh out/venv 'python3 ./src/python_testing/TestSpecParsingSupport.py' - name: Uploading core files From 794df82c6cd5a45f8eacb73e9f72247e72fd1c6d Mon Sep 17 00:00:00 2001 From: Jeff Tung <100387939+jtung-apple@users.noreply.github.com> Date: Wed, 11 Sep 2024 13:14:26 -0700 Subject: [PATCH 30/38] [Darwin] Follow-up changes for PR#35475 (#35497) * [Darwin] Follow-up changes for PR#35475 * restyled * Additional fixes and unit test fix, and rebased to current master --- .../Framework/CHIP/MTRDefines_Internal.h | 4 +-- src/darwin/Framework/CHIP/MTRDevice.mm | 2 +- .../Framework/CHIP/MTRDeviceController.h | 7 +++++ .../Framework/CHIP/MTRDeviceController.mm | 26 ++++++++++++------- .../Framework/CHIP/MTRDevice_Concrete.mm | 6 ++--- src/darwin/Framework/CHIP/MTRDevice_XPC.mm | 4 +-- .../Framework/CHIPTests/MTRPairingTests.m | 22 ++++++++++++++-- 7 files changed, 51 insertions(+), 20 deletions(-) diff --git a/src/darwin/Framework/CHIP/MTRDefines_Internal.h b/src/darwin/Framework/CHIP/MTRDefines_Internal.h index 983226704301e3..14683f34c553f9 100644 --- a/src/darwin/Framework/CHIP/MTRDefines_Internal.h +++ b/src/darwin/Framework/CHIP/MTRDefines_Internal.h @@ -151,6 +151,4 @@ typedef struct {} variable_hidden_by_mtr_hide; } #endif -#ifndef YES_NO -#define YES_NO(x) ((x) ? @"YES" : @"NO") -#endif +#define MTR_YES_NO(x) ((x) ? @"YES" : @"NO") diff --git a/src/darwin/Framework/CHIP/MTRDevice.mm b/src/darwin/Framework/CHIP/MTRDevice.mm index f323c220ae118e..a0f985bb4ac1f1 100644 --- a/src/darwin/Framework/CHIP/MTRDevice.mm +++ b/src/darwin/Framework/CHIP/MTRDevice.mm @@ -1158,7 +1158,7 @@ - (nullable MTRDeviceClusterData *)_clusterDataForPath:(MTRClusterPath *)cluster // Page in the stored value for the data. MTRDeviceClusterData * data = [_deviceController.controllerDataStore getStoredClusterDataForNodeID:_nodeID endpointID:clusterPath.endpoint clusterID:clusterPath.cluster]; - MTR_LOG("%@ cluster path %@ cache miss - load from storage success %@", self, clusterPath, YES_NO(data)); + MTR_LOG("%@ cluster path %@ cache miss - load from storage success %@", self, clusterPath, MTR_YES_NO(data)); if (data != nil) { [_persistedClusterData setObject:data forKey:clusterPath]; } else { diff --git a/src/darwin/Framework/CHIP/MTRDeviceController.h b/src/darwin/Framework/CHIP/MTRDeviceController.h index d731b13052798c..0b553c9d43d25e 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceController.h +++ b/src/darwin/Framework/CHIP/MTRDeviceController.h @@ -198,6 +198,13 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) /** * Adds a Delegate to the device controller as well as the Queue on which the Delegate callbacks will be triggered * + * Multiple delegates can be added to monitor MTRDeviceController state changes. Note that there should only + * be one delegate that responds to pairing related callbacks. + * + * If a delegate is added a second time, the call would be ignored. + * + * All delegates are held by weak references, and so if a delegate object goes away, it will be automatically removed. + * * @param[in] delegate The delegate the commissioning process should use * * @param[in] queue The queue on which the callbacks will be delivered diff --git a/src/darwin/Framework/CHIP/MTRDeviceController.mm b/src/darwin/Framework/CHIP/MTRDeviceController.mm index dc36aeb694d1e7..b84505f8185442 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceController.mm +++ b/src/darwin/Framework/CHIP/MTRDeviceController.mm @@ -165,7 +165,7 @@ @implementation MTRDeviceController { BOOL _shutdownPending; os_unfair_lock _assertionLock; - NSMutableSet * _delegates; + NSMutableArray * _delegates; id _strongDelegateForSetDelegateAPI; } @@ -196,7 +196,7 @@ - (instancetype)initForSubclasses:(BOOL)startSuspended _nodeIDToDeviceMap = [NSMapTable strongToWeakObjectsMapTable]; - _delegates = [NSMutableSet set]; + _delegates = [NSMutableArray array]; return self; } @@ -1793,7 +1793,7 @@ + (void)forceLocalhostAdvertisingOnly #pragma mark - MTRDeviceControllerDelegate management -// Note these are implemented in the base class so that XPC subclass can use it as well when it +// Note these are implemented in the base class so that XPC subclass can use it as well - (void)setDeviceControllerDelegate:(id)delegate queue:(dispatch_queue_t)queue { @synchronized(self) { @@ -1814,6 +1814,17 @@ - (void)setDeviceControllerDelegate:(id)delegate qu - (void)addDeviceControllerDelegate:(id)delegate queue:(dispatch_queue_t)queue { @synchronized(self) { + __block BOOL delegateAlreadyAdded = NO; + [self _iterateDelegateInfoWithBlock:^(MTRDeviceControllerDelegateInfo * delegateInfo) { + if (delegateInfo.delegate == delegate) { + delegateAlreadyAdded = YES; + } + }]; + if (delegateAlreadyAdded) { + MTR_LOG("%@ addDeviceControllerDelegate: delegate already added", self); + return; + } + MTRDeviceControllerDelegateInfo * newDelegateInfo = [[MTRDeviceControllerDelegateInfo alloc] initWithDelegate:delegate queue:queue]; [_delegates addObject:newDelegateInfo]; MTR_LOG("%@ addDeviceControllerDelegate: added %p total %lu", self, delegate, static_cast(_delegates.count)); @@ -1836,9 +1847,6 @@ - (void)removeDeviceControllerDelegate:(id)delegate if (delegateInfoToRemove) { [_delegates removeObject:delegateInfoToRemove]; - if (_strongDelegateForSetDelegateAPI == delegate) { - _strongDelegateForSetDelegateAPI = nil; - } MTR_LOG("%@ removeDeviceControllerDelegate: removed %p remaining %lu", self, delegate, static_cast(_delegates.count)); } else { MTR_LOG("%@ removeDeviceControllerDelegate: delegate %p not found in %lu", self, delegate, static_cast(_delegates.count)); @@ -1857,7 +1865,7 @@ - (NSUInteger)_iterateDelegateInfoWithBlock:(void (^_Nullable)(MTRDeviceControll } // Opportunistically remove defunct delegate references on every iteration - NSMutableSet * delegatesToRemove = nil; + NSMutableArray * delegatesToRemove = nil; for (MTRDeviceControllerDelegateInfo * delegateInfo in _delegates) { id strongDelegate = delegateInfo.delegate; if (strongDelegate) { @@ -1866,14 +1874,14 @@ - (NSUInteger)_iterateDelegateInfoWithBlock:(void (^_Nullable)(MTRDeviceControll } } else { if (!delegatesToRemove) { - delegatesToRemove = [NSMutableSet set]; + delegatesToRemove = [NSMutableArray array]; } [delegatesToRemove addObject:delegateInfo]; } } if (delegatesToRemove.count) { - [_delegates minusSet:delegatesToRemove]; + [_delegates removeObjectsInArray:delegatesToRemove]; MTR_LOG("%@ _iterateDelegatesWithBlock: removed %lu remaining %lu", self, static_cast(delegatesToRemove.count), static_cast(_delegates.count)); } diff --git a/src/darwin/Framework/CHIP/MTRDevice_Concrete.mm b/src/darwin/Framework/CHIP/MTRDevice_Concrete.mm index 6342a46bcd8432..a70e4953fbd24d 100644 --- a/src/darwin/Framework/CHIP/MTRDevice_Concrete.mm +++ b/src/darwin/Framework/CHIP/MTRDevice_Concrete.mm @@ -445,8 +445,8 @@ - (NSString *)description wifi = @"NO"; thread = @"NO"; } else { - wifi = YES_NO(networkFeatures.unsignedLongLongValue & MTRNetworkCommissioningFeatureWiFiNetworkInterface); - thread = YES_NO(networkFeatures.unsignedLongLongValue & MTRNetworkCommissioningFeatureThreadNetworkInterface); + wifi = MTR_YES_NO(networkFeatures.unsignedLongLongValue & MTRNetworkCommissioningFeatureWiFiNetworkInterface); + thread = MTR_YES_NO(networkFeatures.unsignedLongLongValue & MTRNetworkCommissioningFeatureThreadNetworkInterface); } NSString * reportAge; @@ -2103,7 +2103,7 @@ - (nullable MTRDeviceClusterData *)_clusterDataForPath:(MTRClusterPath *)cluster // Page in the stored value for the data. MTRDeviceClusterData * data = [_deviceController.controllerDataStore getStoredClusterDataForNodeID:_nodeID endpointID:clusterPath.endpoint clusterID:clusterPath.cluster]; - MTR_LOG("%@ cluster path %@ cache miss - load from storage success %@", self, clusterPath, YES_NO(data)); + MTR_LOG("%@ cluster path %@ cache miss - load from storage success %@", self, clusterPath, MTR_YES_NO(data)); if (data != nil) { [_persistedClusterData setObject:data forKey:clusterPath]; } else { diff --git a/src/darwin/Framework/CHIP/MTRDevice_XPC.mm b/src/darwin/Framework/CHIP/MTRDevice_XPC.mm index 2f7fb260ebde48..794696f4a98c99 100644 --- a/src/darwin/Framework/CHIP/MTRDevice_XPC.mm +++ b/src/darwin/Framework/CHIP/MTRDevice_XPC.mm @@ -111,8 +111,8 @@ - (NSString *)description wifi = @"NO"; thread = @"NO"; } else { - wifi = YES_NO(networkFeatures.unsignedLongLongValue & MTRNetworkCommissioningFeatureWiFiNetworkInterface); - thread = YES_NO(networkFeatures.unsignedLongLongValue & MTRNetworkCommissioningFeatureThreadNetworkInterface); + wifi = MTR_YES_NO(networkFeatures.unsignedLongLongValue & MTRNetworkCommissioningFeatureWiFiNetworkInterface); + thread = MTR_YES_NO(networkFeatures.unsignedLongLongValue & MTRNetworkCommissioningFeatureThreadNetworkInterface); } // TODO: Add these to the description diff --git a/src/darwin/Framework/CHIPTests/MTRPairingTests.m b/src/darwin/Framework/CHIPTests/MTRPairingTests.m index 4e597961603ee9..d23c7f32d460b9 100644 --- a/src/darwin/Framework/CHIPTests/MTRPairingTests.m +++ b/src/darwin/Framework/CHIPTests/MTRPairingTests.m @@ -138,21 +138,35 @@ @interface MTRPairingTestMonitoringControllerDelegate : NSObject ", self, YES_NO(_statusUpdateCalled), YES_NO(_commissioningSessionEstablishmentDoneCalled), YES_NO(_commissioningCompleteCalled), YES_NO(_readCommissioningInfoCalled)]; + return [NSString stringWithFormat:@"", self, MTR_YES_NO(_statusUpdateCalled), MTR_YES_NO(_commissioningSessionEstablishmentDoneCalled), MTR_YES_NO(_commissioningCompleteCalled), MTR_YES_NO(_readCommissioningInfoCalled)]; } + +- (void)_checkIfAllCallbacksCalled +{ + if (self.allCallbacksCalledExpectation) { + if (self.statusUpdateCalled && self.commissioningSessionEstablishmentDoneCalled && self.commissioningCompleteCalled && self.readCommissioningInfoCalled) { + [self.allCallbacksCalledExpectation fulfill]; + self.allCallbacksCalledExpectation = nil; + } + } +} + - (void)controller:(MTRDeviceController *)controller statusUpdate:(MTRCommissioningStatus)status { self.statusUpdateCalled = YES; + [self _checkIfAllCallbacksCalled]; } - (void)controller:(MTRDeviceController *)controller commissioningSessionEstablishmentDone:(NSError * _Nullable)error { self.commissioningSessionEstablishmentDoneCalled = YES; + [self _checkIfAllCallbacksCalled]; } - (void)controller:(MTRDeviceController *)controller @@ -161,11 +175,13 @@ - (void)controller:(MTRDeviceController *)controller metrics:(MTRMetrics *)metrics { self.commissioningCompleteCalled = YES; + [self _checkIfAllCallbacksCalled]; } - (void)controller:(MTRDeviceController *)controller readCommissioningInfo:(MTRProductIdentity *)info { self.readCommissioningInfoCalled = YES; + [self _checkIfAllCallbacksCalled]; } @end @@ -259,6 +275,8 @@ - (void)doPairingTestWithAttestationDelegate:(id)a // Test that a monitoring delegate works __auto_type * monitoringControllerDelegate = [[MTRPairingTestMonitoringControllerDelegate alloc] init]; + XCTestExpectation * allCallbacksCalledExpectation = [self expectationWithDescription:@"All callbacks called on monitoring delegate"]; + monitoringControllerDelegate.allCallbacksCalledExpectation = allCallbacksCalledExpectation; [sController addDeviceControllerDelegate:monitoringControllerDelegate queue:callbackQueue]; XCTAssertEqual([sController unitTestDelegateCount], 2); @@ -278,7 +296,7 @@ - (void)doPairingTestWithAttestationDelegate:(id)a XCTAssertTrue([sController setupCommissioningSessionWithPayload:payload newNodeID:@(sDeviceId) error:&error]); XCTAssertNil(error); - [self waitForExpectations:@[ expectation ] timeout:kPairingTimeoutInSeconds]; + [self waitForExpectations:@[ expectation, allCallbacksCalledExpectation ] timeout:kPairingTimeoutInSeconds]; XCTAssertNil(controllerDelegate.commissioningCompleteError); // Test that the monitoring delegate got all the callbacks From 12d9340cbca150c306256338fcba467c67af0b7a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Sep 2024 21:19:12 +0000 Subject: [PATCH 31/38] Bump third_party/openthread/repo from `aed9cd1` to `2aeb8b8` (#35538) Bumps [third_party/openthread/repo](https://github.com/openthread/openthread) from `aed9cd1` to `2aeb8b8`. - [Release notes](https://github.com/openthread/openthread/releases) - [Commits](https://github.com/openthread/openthread/compare/aed9cd1a307c05fe2f5b6b4b5677baaabce3d38e...2aeb8b833ba760ec29d5f340dd1ce7bcb61c5d56) --- updated-dependencies: - dependency-name: third_party/openthread/repo dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Andrei Litvin --- third_party/openthread/repo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/third_party/openthread/repo b/third_party/openthread/repo index aed9cd1a307c05..2aeb8b833ba760 160000 --- a/third_party/openthread/repo +++ b/third_party/openthread/repo @@ -1 +1 @@ -Subproject commit aed9cd1a307c05fe2f5b6b4b5677baaabce3d38e +Subproject commit 2aeb8b833ba760ec29d5f340dd1ce7bcb61c5d56 From 6c046cb9367edaf576227f55fed360303b07ff60 Mon Sep 17 00:00:00 2001 From: Austin Bozowski Date: Wed, 11 Sep 2024 15:14:50 -0700 Subject: [PATCH 32/38] Update Chef Dockerfile to use trixie for latest ssl and glic versions (#35545) --- examples/chef/dockerfile | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/chef/dockerfile b/examples/chef/dockerfile index fb61266da5dd89..75458eb47e6b6c 100644 --- a/examples/chef/dockerfile +++ b/examples/chef/dockerfile @@ -1,10 +1,12 @@ -FROM debian:bullseye +FROM debian:trixie ARG DEVICE_NAME RUN apt-get update && \ apt-get install -y \ - libglib2.0-0 && \ + libglib2.0-0 \ + libc6 \ + libssl3 && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* From ac289edd6050de2f1646d839f07e055eb2848c8e Mon Sep 17 00:00:00 2001 From: Anton Usmansky Date: Thu, 12 Sep 2024 01:37:48 +0300 Subject: [PATCH 33/38] fix: drop poll timer to avoid crash after TransferFacilitator destruction (#34538) --- .../esp32/main/BdxOtaSender.cpp | 3 +- .../ota-provider-common/BdxOtaSender.cpp | 3 +- src/protocols/bdx/TransferFacilitator.cpp | 39 +++++++------------ src/protocols/bdx/TransferFacilitator.h | 17 +++----- 4 files changed, 23 insertions(+), 39 deletions(-) diff --git a/examples/ota-provider-app/esp32/main/BdxOtaSender.cpp b/examples/ota-provider-app/esp32/main/BdxOtaSender.cpp index 272187870f49df..5ff0e55b33355c 100644 --- a/examples/ota-provider-app/esp32/main/BdxOtaSender.cpp +++ b/examples/ota-provider-app/esp32/main/BdxOtaSender.cpp @@ -174,7 +174,6 @@ void BdxOtaSender::HandleTransferSessionOutput(TransferSession::OutputEvent & ev { ChipLogError(BDX, "onTransferComplete Callback not set"); } - mStopPolling = true; // Stop polling the TransferSession only after receiving BlockAckEOF Reset(); break; case TransferSession::OutputEventType::kStatusReceived: @@ -228,7 +227,7 @@ void BdxOtaSender::Reset() { mFabricIndex.ClearValue(); mNodeId.ClearValue(); - mTransfer.Reset(); + ResetTransfer(); if (mExchangeCtx != nullptr) { mExchangeCtx->Close(); diff --git a/examples/ota-provider-app/ota-provider-common/BdxOtaSender.cpp b/examples/ota-provider-app/ota-provider-common/BdxOtaSender.cpp index 5c3f2213427035..871d8bfb19de86 100644 --- a/examples/ota-provider-app/ota-provider-common/BdxOtaSender.cpp +++ b/examples/ota-provider-app/ota-provider-common/BdxOtaSender.cpp @@ -180,7 +180,6 @@ void BdxOtaSender::HandleTransferSessionOutput(TransferSession::OutputEvent & ev break; case TransferSession::OutputEventType::kAckEOFReceived: ChipLogDetail(BDX, "Transfer completed, got AckEOF"); - mStopPolling = true; // Stop polling the TransferSession only after receiving BlockAckEOF Reset(); break; case TransferSession::OutputEventType::kStatusReceived: @@ -212,7 +211,7 @@ void BdxOtaSender::Reset() { mFabricIndex.ClearValue(); mNodeId.ClearValue(); - Responder::ResetTransfer(); + ResetTransfer(); if (mExchangeCtx != nullptr) { mExchangeCtx->Close(); diff --git a/src/protocols/bdx/TransferFacilitator.cpp b/src/protocols/bdx/TransferFacilitator.cpp index fbe563187b6fb9..94962e26402cdb 100644 --- a/src/protocols/bdx/TransferFacilitator.cpp +++ b/src/protocols/bdx/TransferFacilitator.cpp @@ -32,6 +32,20 @@ namespace bdx { constexpr System::Clock::Timeout TransferFacilitator::kDefaultPollFreq; constexpr System::Clock::Timeout TransferFacilitator::kImmediatePollDelay; +TransferFacilitator::~TransferFacilitator() +{ + ResetTransfer(); +} + +void TransferFacilitator::ResetTransfer() +{ + mTransfer.Reset(); + ChipLogProgress(BDX, "Stop polling for messages"); + + VerifyOrReturn(mSystemLayer != nullptr); + mSystemLayer->CancelTimer(PollTimerHandler, this); +} + CHIP_ERROR TransferFacilitator::OnMessageReceived(chip::Messaging::ExchangeContext * ec, const chip::PayloadHeader & payloadHeader, chip::System::PacketBufferHandle && payload) { @@ -78,15 +92,7 @@ void TransferFacilitator::PollForOutput() HandleTransferSessionOutput(outEvent); VerifyOrReturn(mSystemLayer != nullptr, ChipLogError(BDX, "%s mSystemLayer is null", __FUNCTION__)); - if (!mStopPolling) - { - mSystemLayer->StartTimer(mPollFreq, PollTimerHandler, this); - } - else - { - mSystemLayer->CancelTimer(PollTimerHandler, this); - mStopPolling = false; - } + mSystemLayer->StartTimer(mPollFreq, PollTimerHandler, this); } void TransferFacilitator::ScheduleImmediatePoll() @@ -106,18 +112,10 @@ CHIP_ERROR Responder::PrepareForTransfer(System::Layer * layer, TransferRole rol ReturnErrorOnFailure(mTransfer.WaitForTransfer(role, xferControlOpts, maxBlockSize, timeout)); ChipLogProgress(BDX, "Start polling for messages"); - mStopPolling = false; mSystemLayer->StartTimer(mPollFreq, PollTimerHandler, this); return CHIP_NO_ERROR; } -void Responder::ResetTransfer() -{ - mTransfer.Reset(); - ChipLogProgress(BDX, "Stop polling for messages"); - mStopPolling = true; -} - CHIP_ERROR Initiator::InitiateTransfer(System::Layer * layer, TransferRole role, const TransferSession::TransferInitData & initData, System::Clock::Timeout timeout, System::Clock::Timeout pollFreq) { @@ -132,12 +130,5 @@ CHIP_ERROR Initiator::InitiateTransfer(System::Layer * layer, TransferRole role, return CHIP_NO_ERROR; } -void Initiator::ResetTransfer() -{ - mTransfer.Reset(); - ChipLogProgress(BDX, "Stop polling for messages"); - mStopPolling = true; -} - } // namespace bdx } // namespace chip diff --git a/src/protocols/bdx/TransferFacilitator.h b/src/protocols/bdx/TransferFacilitator.h index 97e981ac693ad8..280b6bf06896aa 100644 --- a/src/protocols/bdx/TransferFacilitator.h +++ b/src/protocols/bdx/TransferFacilitator.h @@ -45,7 +45,12 @@ class TransferFacilitator : public Messaging::ExchangeDelegate, public Messaging { public: TransferFacilitator() : mExchangeCtx(nullptr), mSystemLayer(nullptr), mPollFreq(kDefaultPollFreq) {} - ~TransferFacilitator() override = default; + ~TransferFacilitator() override; + + /** + * Calls reset on the TransferSession object and stops the poll timer. + */ + void ResetTransfer(); private: //// UnsolicitedMessageHandler Implementation //// @@ -96,7 +101,6 @@ class TransferFacilitator : public Messaging::ExchangeDelegate, public Messaging System::Clock::Timeout mPollFreq; static constexpr System::Clock::Timeout kDefaultPollFreq = System::Clock::Milliseconds32(500); static constexpr System::Clock::Timeout kImmediatePollDelay = System::Clock::Milliseconds32(1); - bool mStopPolling = false; }; /** @@ -121,11 +125,6 @@ class Responder : public TransferFacilitator CHIP_ERROR PrepareForTransfer(System::Layer * layer, TransferRole role, BitFlags xferControlOpts, uint16_t maxBlockSize, System::Clock::Timeout timeout, System::Clock::Timeout pollFreq = TransferFacilitator::kDefaultPollFreq); - - /** - * Calls reset on the TransferSession object and stops the poll timer. - */ - void ResetTransfer(); }; /** @@ -150,10 +149,6 @@ class Initiator : public TransferFacilitator CHIP_ERROR InitiateTransfer(System::Layer * layer, TransferRole role, const TransferSession::TransferInitData & initData, System::Clock::Timeout timeout, System::Clock::Timeout pollFreq = TransferFacilitator::kDefaultPollFreq); - /** - * Calls reset on the TransferSession object and stops the poll timer. - */ - void ResetTransfer(); }; } // namespace bdx From 22db90affca3cc088245efeacc945a6670fc16fb Mon Sep 17 00:00:00 2001 From: Yufeng Wang Date: Wed, 11 Sep 2024 18:51:12 -0700 Subject: [PATCH 34/38] Switch to check the specific log output from stdout (#35547) --- src/python_testing/TC_MCORE_FS_1_4.py | 50 +++++++++------------------ 1 file changed, 17 insertions(+), 33 deletions(-) diff --git a/src/python_testing/TC_MCORE_FS_1_4.py b/src/python_testing/TC_MCORE_FS_1_4.py index e6337352d5a71c..c776bd2e9fce7e 100644 --- a/src/python_testing/TC_MCORE_FS_1_4.py +++ b/src/python_testing/TC_MCORE_FS_1_4.py @@ -47,32 +47,6 @@ from matter_testing_support import MatterBaseTest, TestStep, async_test_body, default_matter_test_main, type_matches from mobly import asserts - -async def wait_for_server_initialization(server_port, timeout=5): - """Wait until the server is ready by checking if it opens the expected port.""" - start_time = asyncio.get_event_loop().time() - elapsed_time = 0 - retry_interval = 1 - - logging.info(f"Waiting for server to initialize on TCP port {server_port} for up to {timeout} seconds.") - - while elapsed_time < timeout: - try: - # Try connecting to the server to check if it's ready - reader, writer = await asyncio.open_connection('::1', server_port) - writer.close() - await writer.wait_closed() - logging.info(f"TH_SERVER_NO_UID is initialized and ready on port {server_port}.") - return - except (ConnectionRefusedError, OSError) as e: - logging.warning(f"Connection to port {server_port} failed: {e}. Retrying in {retry_interval} seconds...") - - await asyncio.sleep(retry_interval) - elapsed_time = asyncio.get_event_loop().time() - start_time - - raise TimeoutError(f"Server on port {server_port} did not initialize within {timeout} seconds. " - f"Total time waited: {elapsed_time} seconds.") - # TODO: Make this class more generic. Issue #35348 @@ -174,16 +148,32 @@ def stop(self): class AppServer: + def _process_admin_output(self, line): + if self.wait_for_text_text is not None and self.wait_for_text_text in line: + self.wait_for_text_event.set() + + def wait_for_text(self, timeout=30): + if not self.wait_for_text_event.wait(timeout=timeout): + raise Exception(f"Timeout waiting for text: {self.wait_for_text_text}") + self.wait_for_text_event.clear() + self.wait_for_text_text = None + def __init__(self, app, storage_dir, port=None, discriminator=None, passcode=None): + self.wait_for_text_event = threading.Event() + self.wait_for_text_text = None args = [app] args.extend(["--KVS", tempfile.mkstemp(dir=storage_dir, prefix="kvs-app-")[1]]) args.extend(['--secured-device-port', str(port)]) args.extend(["--discriminator", str(discriminator)]) args.extend(["--passcode", str(passcode)]) - self.app = Subprocess(args, tag="SERVER") + self.app = Subprocess(args, stdout_cb=self._process_admin_output, tag="SERVER") + self.wait_for_text_text = "Server initialization complete" self.app.start() + # Wait for the server-app to be ready. + self.wait_for_text() + def stop(self): self.app.stop() @@ -265,12 +255,6 @@ def setup_class(self): discriminator=self.th_server_discriminator, passcode=self.th_server_passcode) - # Wait for TH_SERVER_NO_UID get initialized. - try: - asyncio.run(wait_for_server_initialization(self.th_server_port)) - except TimeoutError: - asserts.fail(f"TH_SERVER_NO_UID server failed to open port {self.th_server_port}") - def teardown_class(self): if self.th_fsa_controller is not None: self.th_fsa_controller.stop() From d9a6cbef9fe8c763ffcc3982a1c1835379107c30 Mon Sep 17 00:00:00 2001 From: Amine Alami <43780877+Alami-Amine@users.noreply.github.com> Date: Thu, 12 Sep 2024 13:43:01 +0200 Subject: [PATCH 35/38] [OSS-Fuzz] Fix static library linking needed for OSS-Fuzz (#35523) * getting transitive libraries for static linking * Fixing commit * integrating comments --- build/config/linux/pkg-config.py | 10 +++++++++- build/config/linux/pkg_config.gni | 13 +++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/build/config/linux/pkg-config.py b/build/config/linux/pkg-config.py index f44667242de807..73a33e4f0e8694 100755 --- a/build/config/linux/pkg-config.py +++ b/build/config/linux/pkg-config.py @@ -142,6 +142,8 @@ def main(): dest='dridriverdir') parser.add_option('--version-as-components', action='store_true', dest='version_as_components') + parser.add_option('--static', action='store_true', + dest='static') (options, args) = parser.parse_args() # Make a list of regular expressions to strip out. @@ -203,7 +205,13 @@ def main(): sys.stdout.write(dridriverdir.strip()) return - cmd = [options.pkg_config, "--cflags", "--libs"] + args + cmd = [options.pkg_config, "--cflags", "--libs"] + + if options.static: + cmd.append("--static") + + cmd.extend(args) + if options.debug: sys.stderr.write('Running: %s\n' % ' '.join(cmd)) diff --git a/build/config/linux/pkg_config.gni b/build/config/linux/pkg_config.gni index d6892d97fb976f..04419ecee24260 100644 --- a/build/config/linux/pkg_config.gni +++ b/build/config/linux/pkg_config.gni @@ -137,10 +137,19 @@ template("pkg_config") { # Link libraries statically for OSS-Fuzz fuzzer build if (oss_fuzz) { + # Output libs needed for static linking (direct + transitive/non-direct libs), we will re-execute the script to get those libs + args += [ "--static" ] + pkgresult_static = exec_script(pkg_config_script, args, "value") libs = [] ldflags = [ "-Wl,-Bstatic" ] - foreach(lib, pkgresult[3]) { - ldflags += [ "-l$lib" ] + foreach(lib, pkgresult_static[3]) { + # dl(dynamic loading) lib is not needed for linking statically and its presence triggers errors. + # example of errors: + # ld.lld: error: undefined symbol: __dlsym + # >>> referenced by dlsym.o:(dlsym) in archive /lib/x86_64-linux-gnu/libdl.a + if (lib != "dl") { + ldflags += [ "-l$lib" ] + } } ldflags += [ "-Wl,-Bdynamic" ] lib_dirs = pkgresult[4] From 0adae42c23d44edfc83e55a04e51453b9039ef3c Mon Sep 17 00:00:00 2001 From: Raul Marquez <130402456+raul-marquez-csa@users.noreply.github.com> Date: Thu, 12 Sep 2024 06:52:34 -0700 Subject: [PATCH 36/38] TC-OO-2.7 - Updates labels and step numbers (#35051) * Updates labels and step numbers * Restyled by prettier-yaml --------- Co-authored-by: Restyled.io --- .../suites/certification/Test_TC_OO_2_7.yaml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/app/tests/suites/certification/Test_TC_OO_2_7.yaml b/src/app/tests/suites/certification/Test_TC_OO_2_7.yaml index 19183ba79aff8d..5915fd6357bd67 100644 --- a/src/app/tests/suites/certification/Test_TC_OO_2_7.yaml +++ b/src/app/tests/suites/certification/Test_TC_OO_2_7.yaml @@ -58,9 +58,9 @@ tests: } - label: - "Step 0b: TH binds GroupIds 0x0001 and 0x0002 with GroupKeySetID - 0x01a1 in the GroupKeyMap attribute list on GroupKeyManagement cluster - by writing the GroupKeyMap attribute with two entries as follows:" + "Step 0b: TH binds GroupIds 0x0001 with GroupKeySetID 0x01a1 in the + GroupKeyMap attribute list on GroupKeyManagement cluster by writing + the GroupKeyMap attribute with two entries as follows:" cluster: "Group Key Management" endpoint: 0 command: "writeAttribute" @@ -142,7 +142,7 @@ tests: value: 0 - label: - "Step 2b: TH sends a StoreScene command to DUT with the GroupID field + "Step 3: TH sends a StoreScene command to DUT with the GroupID field set to G1 and the SceneID field set to 0x01." command: "StoreScene" arguments: @@ -160,7 +160,7 @@ tests: - name: "SceneID" value: 0x01 - - label: "Step 3: TH sends a AddScene command to DUT with the GroupID field + - label: "Step 4: TH sends a AddScene command to DUT with the GroupID field set to G1, the SceneID field set to 0x02, the TransitionTime field set to 1000 (1s) and the ExtensionFieldSets set to: '[{ ClusterID: 0x0006, AttributeValueList: [{ AttributeID: 0x0000, ValueUnsigned8: 0x01 }]}]' @@ -195,7 +195,7 @@ tests: value: 0x02 - label: - "Step 4a: TH sends a RecallScene command to DUT with the GroupID field + "Step 5a: TH sends a RecallScene command to DUT with the GroupID field set to G1 and the SceneID field set to 0x02." PICS: S.S.C05.Rsp command: "RecallScene" @@ -214,7 +214,7 @@ tests: - name: "ms" value: 2000 - - label: "Step 4b: after a few seconds, TH reads OnOff attribute from DUT" + - label: "Step 5b: after a few seconds, TH reads OnOff attribute from DUT" cluster: "On/Off" command: "readAttribute" attribute: "OnOff" @@ -222,7 +222,7 @@ tests: value: 1 - label: - "Step 5a: TH sends a RecallScene command to DUT with the GroupID field + "Step 6a: TH sends a RecallScene command to DUT with the GroupID field set to G1 and the SceneID field set to 0x01." PICS: S.S.C05.Rsp command: "RecallScene" @@ -241,7 +241,7 @@ tests: - name: "ms" value: 1000 - - label: "Step 5b: after a few seconds, TH reads OnOff attribute from DUT" + - label: "Step 6b: after a few seconds, TH reads OnOff attribute from DUT" cluster: "On/Off" command: "readAttribute" attribute: "OnOff" From d04a6678dcf6187082c8852bde556bc882ee7f8b Mon Sep 17 00:00:00 2001 From: lpbeliveau-silabs <112982107+lpbeliveau-silabs@users.noreply.github.com> Date: Thu, 12 Sep 2024 11:00:39 -0400 Subject: [PATCH 37/38] Updated TC_2-3 test scripts to VS Documents (#35555) --- .../suites/certification/Test_TC_S_2_3.yaml | 117 ++++++++++-------- 1 file changed, 62 insertions(+), 55 deletions(-) diff --git a/src/app/tests/suites/certification/Test_TC_S_2_3.yaml b/src/app/tests/suites/certification/Test_TC_S_2_3.yaml index 1e66f4c803834d..b3498affd8fd20 100644 --- a/src/app/tests/suites/certification/Test_TC_S_2_3.yaml +++ b/src/app/tests/suites/certification/Test_TC_S_2_3.yaml @@ -239,7 +239,8 @@ tests: - label: "Step 2: TH sends a AddScene command to DUT with the GroupID field set to G1, the SceneID field set to 0x01, the TransitionTime field set to - 1000 (1s) and a set of extension fields appropriate to AC1." + 1,000(1s) and a set of extension fields appropriate to produce a + device state that will be referred as AC1 in further steps." PICS: S.S.C00.Rsp && PICS_SDK_CI_ONLY command: "AddScene" arguments: @@ -278,9 +279,10 @@ tests: - label: "Step 2: TH sends a AddScene command to DUT with the GroupID field set to G1, the SceneID field set to 0x01, the TransitionTime field set to - 1000 (1s) and a set of extension fields appropriate to AC1." + 1,000(1s) and a set of extension fields appropriate to produce a + device state that will be referred as AC1 in further steps." verification: | - ./chip-tool scenesmanagement add-scene 0x0101 0x01 1000 "scene name" '[{"clusterID": "0x0006", "attributeValueList":[{"attributeID": "0x0000", "ValueUnsigned8": "0x01"}, ]}, {"clusterID": "0x0008", "attributeValueList":[{"attributeID": "0x0000", "ValueUnsigned8": "0x64"}, ]}]' 1 1 + ./chip-tool scenesmanagement add-scene 0x0101 0x01 1000 "scene name" '[{"clusterID": "0x0008", "attributeValueList":[{"attributeID": "0x0000", "valueUnsigned8": "0x64"}, ]}]' 1 1 Verify DUT sends a AddSceneResponse command to TH with the Status field set to 0x00 (SUCCESS), the GroupID field set to 257 and the SceneID field set to 0x01 on the TH(Chip-tool) Log and below is the sample log provided for the raspi platform: @@ -350,35 +352,24 @@ tests: Verify DUT sends a ViewSceneResponse command to TH with the Status field set to 0x00 (SUCCESS), the GroupID field set to G1, the SceneID field set to 0x01, the TransitionTime field set to 1000 and a set of extension fields appropriate to AC1 on the TH(Chip-tool) Log and below is the sample log provided for the raspi platform: - - NOTE: The values below are expected to match the values from the specific AC tested - - [1708071897.294470][7731:7733] CHIP:DMG: Received Command Response Data, Endpoint=1 Cluster=0x0000_0062 Command=0x0000_0001 - [1708071897.294486][7731:7733] CHIP:TOO: Endpoint: 1 Cluster: 0x0000_0062 Command 0x0000_0001 - [1708071897.294520][7731:7733] CHIP:TOO: ViewSceneResponse: { - [1708071897.294527][7731:7733] CHIP:TOO: status: 0 - [1708071897.294530][7731:7733] CHIP:TOO: groupID: 257 - [1708071897.294533][7731:7733] CHIP:TOO: sceneID: 1 - [1708071897.294536][7731:7733] CHIP:TOO: transitionTime: 1000 - [1708071897.294540][7731:7733] CHIP:TOO: sceneName: scene name - [1708071897.294554][7731:7733] CHIP:TOO: extensionFieldSets: 2 entries - [1708071897.294569][7731:7733] CHIP:TOO: [1]: { - [1708071897.294574][7731:7733] CHIP:TOO: ClusterID: 6 - [1708071897.294580][7731:7733] CHIP:TOO: AttributeValueList: 1 entries - [1708071897.294589][7731:7733] CHIP:TOO: [1]: { - [1708071897.294593][7731:7733] CHIP:TOO: AttributeID: 0 - [1708071897.294596][7731:7733] CHIP:TOO: ValueUnsigned8: 1 - [1708071897.294599][7731:7733] CHIP:TOO: } - [1708071897.294603][7731:7733] CHIP:TOO: } - [1708071897.294611][7731:7733] CHIP:TOO: [2]: { - [1708071897.294615][7731:7733] CHIP:TOO: ClusterID: 8 - [1708071897.294621][7731:7733] CHIP:TOO: AttributeValueList: 1 entries - [1708071897.294628][7731:7733] CHIP:TOO: [1]: { - [1708071897.294633][7731:7733] CHIP:TOO: AttributeID: 0 - [1708071897.294636][7731:7733] CHIP:TOO: ValueUnsigned8: 100 - [1708071897.294639][7731:7733] CHIP:TOO: } - [1708071897.294643][7731:7733] CHIP:TOO: } - [1708071897.294647][7731:7733] CHIP:TOO: } + [1722518510.318] [187478:187480] [DMG] Received Command Response Data, Endpoint=1 Cluster=0x0000_0062 Command=0x0000_0001 + [1722518510.318] [187478:187480] [TOO] Endpoint: 1 Cluster: 0x0000_0062 Command 0x0000_0001 + [1722518510.318] [187478:187480] [TOO] ViewSceneResponse: { + [1722518510.318] [187478:187480] [TOO] status: 0 + [1722518510.318] [187478:187480] [TOO] groupID: 257 + [1722518510.318] [187478:187480] [TOO] sceneID: 1 + [1722518510.318] [187478:187480] [TOO] transitionTime: 1000 + [1722518510.318] [187478:187480] [TOO] sceneName: scene name + [1722518510.318] [187478:187480] [TOO] extensionFieldSets: 1 entries + [1722518510.318] [187478:187480] [TOO] [1]: { + [1722518510.318] [187478:187480] [TOO] ClusterID: 8 + [1722518510.318] [187478:187480] [TOO] AttributeValueList: 1 entries + [1722518510.318] [187478:187480] [TOO] [1]: { + [1722518510.318] [187478:187480] [TOO] AttributeID: 0 + [1722518510.318] [187478:187480] [TOO] ValueUnsigned8: 100 + [1722518510.318] [187478:187480] [TOO] } + [1722518510.318] [187478:187480] [TOO] } + [1722518510.318] [187478:187480] [TOO] } cluster: "LogCommands" command: "UserPrompt" arguments: @@ -433,7 +424,14 @@ tests: "Step 5a: TH configures AC2 on DUT for all implemented application clusters supporting scenesmanagement." verification: | - Is DUT configured with AC2? + ./chip-tool levelcontrol move-to-level-with-on-off 200 0 0 0 1 1 + + DUT is configured with AC2 for application clusters which is implemented, supporting scenes and different from AC1 + + [1705040820.918043][6555:6557] CHIP:DMG: StatusIB = + [1705040820.918056][6555:6557] CHIP:DMG: { + [1705040820.918068][6555:6557] CHIP:DMG: status = 0x00 (SUCCESS), + [1705040820.918080][6555:6557] CHIP:DMG: }, cluster: "LogCommands" command: "UserPrompt" PICS: PICS_SKIP_SAMPLE_APP @@ -479,7 +477,16 @@ tests: - label: "Verify DUT returns to AC1." verification: | - Is DUT configured with AC1? + Read CurrentLevel attribute from level control cluster + + ./chip-tool levelcontrol read current-level 1 1 + + Verify CurrentLevel attribute value on TH(chip-tool) + + [1708072116.730389][7757:7759] CHIP:DMG: } + [1708072116.730518][7757:7759] CHIP:TOO: Endpoint: 1 Cluster: 0x0000_0008 Attribute 0x0000_0000 DataVersion: 2359286215 + [1708072116.730552][7757:7759] CHIP:TOO: CurrentLevel: 100 + cluster: "LogCommands" command: "UserPrompt" PICS: PICS_SKIP_SAMPLE_APP @@ -528,8 +535,9 @@ tests: field set to G1, the SceneID field set to 0x03, the TransitionTime field set to G1 and a set of extension fields appropriate to AC1." verification: | - ./chip-tool scenesmanagement add-scene 0x0101 0x03 1 "scene name" '[{"clusterID": "0x0300", "attributeValueList":[{"attributeID": "0x4002", "ValueUnsigned8": "0x01"}]}]' 0xffffffffffff0101 1 - Note: As this is a multicast command, no log is expected. + ./chip-tool scenesmanagement add-scene 0x0101 0x03 1000 "scene name" '[{"clusterID": "0x0300", "attributeValueList":[{"attributeID": "0x4002", "valueUnsigned8": "0x01"}]}]' 0xffffffffffff0101 1 + + There is no Status response since this was a groupcast cluster: "LogCommands" command: "UserPrompt" PICS: S.S.C00.Rsp && PICS_SKIP_SAMPLE_APP @@ -589,25 +597,24 @@ tests: NOTE: The values below are expected to match the values from the specific AC tested - [1707285444.028460][13682:13684] CHIP:DMG: }, - [1707285444.028553][13682:13684] CHIP:DMG: Received Command Response Data, Endpoint=1 Cluster=0x0000_0062 Command=0x0000_0001 - [1707285444.028579][13682:13684] CHIP:TOO: Endpoint: 1 Cluster: 0x0000_0062 Command 0x0000_0001 - [1707285444.028670][13682:13684] CHIP:TOO: ViewSceneResponse: { - [1707285444.028685][13682:13684] CHIP:TOO: status: 0 - [1707285444.028696][13682:13684] CHIP:TOO: groupID: 257 - [1707285444.028706][13682:13684] CHIP:TOO: sceneID: 3 - [1707285444.028717][13682:13684] CHIP:TOO: transitionTime: 1 - [1707285444.028728][13682:13684] CHIP:TOO: sceneName: scene name - [1707285444.028766][13682:13684] CHIP:TOO: extensionFieldSets: 1 entries - [1707285444.028814][13682:13684] CHIP:TOO: [1]: { - [1707285444.028828][13682:13684] CHIP:TOO: ClusterID: 768 - [1707285444.028853][13682:13684] CHIP:TOO: AttributeValueList: 1 entries - [1707285444.028882][13682:13684] CHIP:TOO: [1]: { - [1707285444.028896][13682:13684] CHIP:TOO: AttributeID: 16386 - [1707285444.028913][13682:13684] CHIP:TOO: ValueUnsigned16: 1 - [1707285444.028925][13682:13684] CHIP:TOO: } - [1707285444.028937][13682:13684] CHIP:TOO: } - [1707285444.028950][13682:13684] CHIP:TOO: } + [1720504218.414] [3432:3434] [DMG] Received Command Response Data, Endpoint=1 Cluster=0x0000_0062 Command=0x0000_0001 + [1720504218.414] [3432:3434] [TOO] Endpoint: 1 Cluster: 0x0000_0062 Command 0x0000_0001 + [1720504218.414] [3432:3434] [TOO] ViewSceneResponse: { + [1720504218.414] [3432:3434] [TOO] status: 0 + [1720504218.414] [3432:3434] [TOO] groupID: 257 + [1720504218.414] [3432:3434] [TOO] sceneID: 3 + [1720504218.414] [3432:3434] [TOO] transitionTime: 1000 + [1720504218.414] [3432:3434] [TOO] sceneName: scene name + [1720504218.414] [3432:3434] [TOO] extensionFieldSets: 1 entries + [1720504218.414] [3432:3434] [TOO] [1]: { + [1720504218.414] [3432:3434] [TOO] ClusterID: 768 + [1720504218.414] [3432:3434] [TOO] AttributeValueList: 1 entries + [1720504218.414] [3432:3434] [TOO] [1]: { + [1720504218.414] [3432:3434] [TOO] AttributeID: 16386 + [1720504218.415] [3432:3434] [TOO] ValueUnsigned8: 1 + [1720504218.415] [3432:3434] [TOO] } + [1720504218.415] [3432:3434] [TOO] } + [1720504218.415] [3432:3434] [TOO] } cluster: "LogCommands" command: "UserPrompt" arguments: From 2f27c4a29883d29e788cfa694d7d2d948aa3e6de Mon Sep 17 00:00:00 2001 From: Michael Rupp Date: Tue, 10 Sep 2024 13:24:41 -0400 Subject: [PATCH 38/38] delete CSA actions --- .github/.wordlist.txt | 1628 ----------------- .github/CODEOWNERS | 2 - .github/ISSUE_TEMPLATE/001-bug-report.yaml | 80 - .github/ISSUE_TEMPLATE/002-1.0-issue.yaml | 98 - .github/ISSUE_TEMPLATE/003-1.1-issue.yaml | 98 - .github/ISSUE_TEMPLATE/004-1.2-issue.yaml | 98 - .github/ISSUE_TEMPLATE/005-1.3-issue.yaml | 98 - .github/ISSUE_TEMPLATE/049-trivial-fix.yaml | 93 - .github/ISSUE_TEMPLATE/050-tooling-fix.yaml | 88 - .github/ISSUE_TEMPLATE/060-platform-fix.yaml | 88 - .../ISSUE_TEMPLATE/080-feature-request.yaml | 62 - .github/ISSUE_TEMPLATE/090-sve-issue.yaml | 119 -- .github/ISSUE_TEMPLATE/091-cert-blocker.yaml | 108 -- .../ISSUE_TEMPLATE/097-ci-test-failure.yaml | 59 - .github/ISSUE_TEMPLATE/098-build-issue.yaml | 59 - .../099-github-workflow-issue.yaml | 59 - .../100-documentation-issue.yaml | 58 - .github/ISSUE_TEMPLATE/config.yaml | 1 - .github/PULL_REQUEST_TEMPLATE.md | 12 - .github/actions/bootstrap-cache/action.yaml | 17 - .github/actions/bootstrap/action.yaml | 82 - .../action.yaml | 43 - .../actions/checkout-submodules/action.yaml | 19 - .github/actions/dump-disk-info/action.yaml | 20 - .github/actions/dynamic/action.yaml | 38 - .../actions/git-safe-directory/action.yaml | 9 - .../actions/maximize-runner-disk/action.yaml | 48 - .../perform-codeql-analysis/action.yaml | 34 - .../actions/setup-size-reports/action.yaml | 15 - .../actions/upload-size-reports/action.yaml | 17 - .github/boring-cyborg.yml | 132 -- .github/config.yml | 8 - .github/dependabot.yml | 61 - .github/issue-labeler.yml | 54 - .github/labeler.yml | 333 ---- .github/release.yml | 76 - .github/workflows/artifacts.yaml | 17 - .github/workflows/bloat_check.yaml | 53 - .github/workflows/build-cert-bins.yaml | 21 - .github/workflows/build.yaml | 476 ----- .github/workflows/buildjet-cache-delete.yaml | 17 - .github/workflows/cert_test_checks.yaml | 35 - .../check-data-model-directory-updates.yaml | 31 - .github/workflows/chef.yaml | 117 -- .github/workflows/cherry-picks.yaml | 37 - .github/workflows/cirque.yaml | 136 -- .github/workflows/codeql.yml | 29 - .github/workflows/darwin-tests.yaml | 161 -- .github/workflows/darwin.yaml | 134 -- .github/workflows/docbuild.yaml | 54 - .github/workflows/docker_img.yaml | 171 -- .github/workflows/doxygen.yaml | 107 -- .../workflows/example-tv-casting-darwin.yaml | 49 - .github/workflows/examples-ameba.yaml | 60 - .github/workflows/examples-asr.yaml | 65 - .github/workflows/examples-bouffalolab.yaml | 147 -- .github/workflows/examples-cc13xx_26xx.yaml | 114 -- .github/workflows/examples-cc32xx.yaml | 87 - .github/workflows/examples-efr32.yaml | 148 -- .github/workflows/examples-esp32.yaml | 169 -- .github/workflows/examples-infineon.yaml | 226 --- .github/workflows/examples-linux-arm.yaml | 90 - .github/workflows/examples-linux-imx.yaml | 96 - .../workflows/examples-linux-standalone.yaml | 225 --- .../examples-linux-tv-casting-app.yaml | 89 - .github/workflows/examples-mw320.yaml | 71 - .github/workflows/examples-nrfconnect.yaml | 211 --- .github/workflows/examples-nuttx.yaml | 55 - .github/workflows/examples-nxp.yaml | 287 --- .github/workflows/examples-openiotsdk.yaml | 220 --- .github/workflows/examples-qpg.yaml | 89 - .github/workflows/examples-stm32.yaml | 79 - .github/workflows/examples-telink.yaml | 280 --- .github/workflows/examples-tizen.yaml | 86 - .github/workflows/full-android.yaml | 117 -- .github/workflows/fuzzing-build.yaml | 101 - .../workflows/gradle-wrapper-validation.yml | 20 - .github/workflows/issue-labeler.yaml | 20 - .github/workflows/java-tests.yaml | 308 ---- .github/workflows/kotlin-style.yaml | 70 - .github/workflows/labeler.yaml | 15 - .github/workflows/lint.yml | 347 ---- .github/workflows/minimal-build.yaml | 71 - .github/workflows/protocol_compatibility.yaml | 49 - .github/workflows/qemu.yaml | 99 - .github/workflows/recent_fail_summary.yaml | 58 - .github/workflows/release_artifacts.yaml | 89 - .github/workflows/roll_and_build_docker.yaml | 15 - .github/workflows/silabs_workflow.yaml | 40 + .github/workflows/smoketest-android.yaml | 82 - .github/workflows/spell.yml | 36 - .github/workflows/stale.yaml | 42 - .github/workflows/tag-releases.yaml | 52 - .github/workflows/tests.yaml | 627 ------- .github/workflows/third-party-check.yaml | 39 - .github/workflows/todos.yaml | 38 - .github/workflows/unit_integration_test.yaml | 88 - .github/workflows/zap_regeneration.yaml | 54 - .github/workflows/zap_templates.yaml | 75 - 99 files changed, 40 insertions(+), 10965 deletions(-) delete mode 100644 .github/.wordlist.txt delete mode 100644 .github/CODEOWNERS delete mode 100644 .github/ISSUE_TEMPLATE/001-bug-report.yaml delete mode 100644 .github/ISSUE_TEMPLATE/002-1.0-issue.yaml delete mode 100644 .github/ISSUE_TEMPLATE/003-1.1-issue.yaml delete mode 100644 .github/ISSUE_TEMPLATE/004-1.2-issue.yaml delete mode 100644 .github/ISSUE_TEMPLATE/005-1.3-issue.yaml delete mode 100644 .github/ISSUE_TEMPLATE/049-trivial-fix.yaml delete mode 100644 .github/ISSUE_TEMPLATE/050-tooling-fix.yaml delete mode 100644 .github/ISSUE_TEMPLATE/060-platform-fix.yaml delete mode 100644 .github/ISSUE_TEMPLATE/080-feature-request.yaml delete mode 100644 .github/ISSUE_TEMPLATE/090-sve-issue.yaml delete mode 100644 .github/ISSUE_TEMPLATE/091-cert-blocker.yaml delete mode 100644 .github/ISSUE_TEMPLATE/097-ci-test-failure.yaml delete mode 100644 .github/ISSUE_TEMPLATE/098-build-issue.yaml delete mode 100644 .github/ISSUE_TEMPLATE/099-github-workflow-issue.yaml delete mode 100644 .github/ISSUE_TEMPLATE/100-documentation-issue.yaml delete mode 100644 .github/ISSUE_TEMPLATE/config.yaml delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 .github/actions/bootstrap-cache/action.yaml delete mode 100644 .github/actions/bootstrap/action.yaml delete mode 100644 .github/actions/checkout-submodules-and-bootstrap/action.yaml delete mode 100644 .github/actions/checkout-submodules/action.yaml delete mode 100644 .github/actions/dump-disk-info/action.yaml delete mode 100644 .github/actions/dynamic/action.yaml delete mode 100644 .github/actions/git-safe-directory/action.yaml delete mode 100644 .github/actions/maximize-runner-disk/action.yaml delete mode 100644 .github/actions/perform-codeql-analysis/action.yaml delete mode 100644 .github/actions/setup-size-reports/action.yaml delete mode 100644 .github/actions/upload-size-reports/action.yaml delete mode 100644 .github/boring-cyborg.yml delete mode 100644 .github/config.yml delete mode 100644 .github/dependabot.yml delete mode 100644 .github/issue-labeler.yml delete mode 100644 .github/labeler.yml delete mode 100644 .github/release.yml delete mode 100644 .github/workflows/artifacts.yaml delete mode 100644 .github/workflows/bloat_check.yaml delete mode 100644 .github/workflows/build-cert-bins.yaml delete mode 100644 .github/workflows/build.yaml delete mode 100644 .github/workflows/buildjet-cache-delete.yaml delete mode 100644 .github/workflows/cert_test_checks.yaml delete mode 100644 .github/workflows/check-data-model-directory-updates.yaml delete mode 100644 .github/workflows/chef.yaml delete mode 100644 .github/workflows/cherry-picks.yaml delete mode 100644 .github/workflows/cirque.yaml delete mode 100644 .github/workflows/codeql.yml delete mode 100644 .github/workflows/darwin-tests.yaml delete mode 100644 .github/workflows/darwin.yaml delete mode 100644 .github/workflows/docbuild.yaml delete mode 100644 .github/workflows/docker_img.yaml delete mode 100644 .github/workflows/doxygen.yaml delete mode 100644 .github/workflows/example-tv-casting-darwin.yaml delete mode 100644 .github/workflows/examples-ameba.yaml delete mode 100644 .github/workflows/examples-asr.yaml delete mode 100644 .github/workflows/examples-bouffalolab.yaml delete mode 100644 .github/workflows/examples-cc13xx_26xx.yaml delete mode 100644 .github/workflows/examples-cc32xx.yaml delete mode 100644 .github/workflows/examples-efr32.yaml delete mode 100644 .github/workflows/examples-esp32.yaml delete mode 100644 .github/workflows/examples-infineon.yaml delete mode 100644 .github/workflows/examples-linux-arm.yaml delete mode 100644 .github/workflows/examples-linux-imx.yaml delete mode 100644 .github/workflows/examples-linux-standalone.yaml delete mode 100644 .github/workflows/examples-linux-tv-casting-app.yaml delete mode 100644 .github/workflows/examples-mw320.yaml delete mode 100644 .github/workflows/examples-nrfconnect.yaml delete mode 100644 .github/workflows/examples-nuttx.yaml delete mode 100644 .github/workflows/examples-nxp.yaml delete mode 100644 .github/workflows/examples-openiotsdk.yaml delete mode 100644 .github/workflows/examples-qpg.yaml delete mode 100644 .github/workflows/examples-stm32.yaml delete mode 100644 .github/workflows/examples-telink.yaml delete mode 100644 .github/workflows/examples-tizen.yaml delete mode 100644 .github/workflows/full-android.yaml delete mode 100644 .github/workflows/fuzzing-build.yaml delete mode 100644 .github/workflows/gradle-wrapper-validation.yml delete mode 100644 .github/workflows/issue-labeler.yaml delete mode 100644 .github/workflows/java-tests.yaml delete mode 100644 .github/workflows/kotlin-style.yaml delete mode 100644 .github/workflows/labeler.yaml delete mode 100644 .github/workflows/lint.yml delete mode 100644 .github/workflows/minimal-build.yaml delete mode 100644 .github/workflows/protocol_compatibility.yaml delete mode 100644 .github/workflows/qemu.yaml delete mode 100644 .github/workflows/recent_fail_summary.yaml delete mode 100644 .github/workflows/release_artifacts.yaml delete mode 100644 .github/workflows/roll_and_build_docker.yaml create mode 100644 .github/workflows/silabs_workflow.yaml delete mode 100644 .github/workflows/smoketest-android.yaml delete mode 100644 .github/workflows/spell.yml delete mode 100644 .github/workflows/stale.yaml delete mode 100644 .github/workflows/tag-releases.yaml delete mode 100644 .github/workflows/tests.yaml delete mode 100644 .github/workflows/third-party-check.yaml delete mode 100644 .github/workflows/todos.yaml delete mode 100644 .github/workflows/unit_integration_test.yaml delete mode 100644 .github/workflows/zap_regeneration.yaml delete mode 100644 .github/workflows/zap_templates.yaml diff --git a/.github/.wordlist.txt b/.github/.wordlist.txt deleted file mode 100644 index f317901e450aa6..00000000000000 --- a/.github/.wordlist.txt +++ /dev/null @@ -1,1628 +0,0 @@ -14 -15 -16 -17 -18 -19 -20 -21 -22 -AAAA -aarch -abcdef -abfb -ABI -ABIs -ables -accesscontrol -accessor -Accessors -acdbc -ack -ACKed -ACL -ACLs -actdiag -adb -AddNOC -addr -adk -adoc -adr -AdvAutonomous -AdvManagedFlag -AdvOnLink -AdvRouterAddr -AdvSendAdvert -AE -aef -AES -AFL -AIDL -algs -alloc -Ameba -amebad -amebaiot -AmebaZ -amebaz2 -announcementReason -AnnounceOTAProvider -AnnounceOTAProviderRequest -APIs -apk -AppImpl -AppleTV -appliable -applianceeventsandalert -ApplianceIdentification -appliancestatistics -ApplicationId -ApplicationIdentifier -ApplicationLauncher -ApplyUpdate -applyUpdateAction -ApplyUpdateRequest -ApplyUpdateResponse -approver -appspot -appwrite -aps -arg -argc -args -argv -armeabi -armino -ARMmbed -armv -ASAN -asdk -ASR -AssertionError -AST -ASYNC -ATLs -atomics -att -attId -attr -attrib -AttributeAccessInterface -attributeValue -attrListName -attrMask -attSizeBytes -attType -ATW -ATWC -AudioOutput -auth -AuthMode -autoApplyImage -autocompletion -AutoConf -autoconnect -autocrlf -autogenerated -automake -autotools -avahi -avL -AwaitNextAction -AXXXF -AYNJV -babaf -backend -backends -backticks -backtrace -BallastConfiguration -BarrierControl -BasicCHIPRegression -BasicInformation -baudrate -BCM -BD -BDX -BDXDownloader -BeagleBone -befc -BEKEN -betaprogram -BinaryInputBasic -Binfmt -bitbake -bld -BLE -BleApplicationDelegate -BleLayer -BLEManager -BLEManagerImpl -BlePlatformDelegate -Blinls -bloaty -blockdiag -blocklist -blockquote -bluetoothd -bluez -BOOL -booleans -BooleanState -bootable -Bootloader -BorderRouterAP -bouffalolab -BRD -breakpoint -bredr -BridgedDeviceBasicInformation -bringup -BroadcastReceiver -BromateConcentrationMeasurement -BromodichloromethaneConcentrationMeasurement -BromoformConcentrationMeasurement -bt -btmgmt -BTN -BTP -btvirt -BuildKit -buildwithmatter -buildX -burndown -ButtonIsr -BytesMain -bz -bzip -CACACACA -cacerts -CAfile -cancelled -capacitive -CarbonDioxideConcentrationMeasurement -CarbonMonoxideConcentrationMeasurement -CaseAdminNode -CatalogVendorId -CBB -cbd -CBOR -Ccache -ccf -CCMP -CCS -CCSTUDIO -CCXML -CDEEDC -CDVersionNumber -ced -cfg -CFLAGS -cgit -cgroup -changeset -Channel -characterised -CharString -checkmark -ChipBLEMgr -CHIPCirqueTest -CHIPConfig -CHIPCryptoPALHsm -CHIPDeviceController -ChipDeviceCtrl -CHIPDeviceEvent -CHIPDevicePlatformConfig -CHIPDevicePlatformEvent -ChipEchoRequester -ChipEchoResponder -ChipImInitiator -ChipImResponder -ChipLight -ChipMessageLayer -CHIPOBLE -CHIPProjectAppConfig -CHIPProjectConfig -CHIPTest -chiptests -CHIPTool -ChloraminesConcentrationMeasurement -ChlorineConcentrationMeasurement -ChlorodibromomethaneConcentrationMeasurement -ChloroformConcentrationMeasurement -chmod -chown -chrpath -CIPD -CircleCI -cJTAG -CKIT -CLA -clapre -CLI -CLIs -cloudbuild -CLRF -clusterAttrs -ClusterName -ClusterObjectTests -ClusterRevision -ClusterTestGeneration -cmake -CMakeLists -CMD -CMS -CMSIS -CMVH -cn -COAP -codeaurora -codebase -codegen -CodeGenerator -CodeLab -codelabs -ColorControl -Comcast -Commandline -CommandHandlerInterface -CommandName -Commissionable -CommissionableDataProvider -commissionables -commissionee -CommissioningFlow -commondatastorage -CONF -CONFIG -ConfigDescription -configs -configTOTAL -ConfigurationManager -ConfigurationManagerImpl -conformant -connectedhomeip -ConnectionData -ConnectIP -ConnectivityManager -ConnectivityManagerImpl -ConnectNetwork -ConnectNetworkRequest -ConnectNetworkResponse -connstring -conntype -const -ContentApp -ContentApp's -ContentAppPlatform -ContentLaunch -ContentLauncher -contrib -controllee -conv -CopperConcentrationMeasurement -Corstone -cortexa -cp -cpio -cpp -cppreference -CPROTO -cpuapp -cpython -CQM -crypto -cryptographic -CSA -csg -csrrequest -csu -csv -ctl -ctrl -ctypes -CurrentHue -CurrentLevel -CurrentSaturation -customAcl -customizations -cvfJ -cxx -CY -CYW -DAC -DACs -dadbdcdddedf -DAP -DAPLINK -DataFrame -datamodel -DataModelRevision -dataset -datasets -datastore -DataVersion -dbf -DBG -dBm -DBUILD -dbus -dcc -DCHIP -DCL -DCMAKE -DCONF -DCONFIG -debianutils -debugText -decrypt -decrypted -DEDEDEDE -deepnote -DefaultOTAProviders -DefaultOTARequestor -DefaultOTARequestorDriver -DefaultOTARequestorStorage -DefaultSuccess -definedValue -DehumidificationControl -DelayedActionTime -delayedApplyActionTimeSec -delayedQueryActionTimeSec -delayQuery -deliverables -demangle -deployable -depottools -deps -der -desc -descheduled -detokenization -detokenizer -dev -devcontainer -devCtrl -DevelopmentCerts -DeviceAttestationCredentialsProvider -DeviceAttestationCredsExample -DeviceCaCerts -DeviceCert -DeviceCommissioner -DeviceCommon -DeviceController -DeviceId -DeviceInstanceInfoProvider -DeviceLayer -DeviceNetworkProvisioningDelegate -DeviceNetworkProvisioningDelegateImpl -DevicePairingDelegate -DeviceTemperatureConfiguration -DevKitC -DevKitM -devtype -df -dfe -DFILE -dfu -DgDxsfHx -dhclient -DHCP -DHCPC -DHCPv -dhrishi -DiagnosticLogs -dialout -diffstat -diffsyms -dimmable -dirname -dirs -disableNotifyUpdateApplied -disambiguated -discoverable -DispatchEvent -DispatchEventToApplication -DissolvedOxygenConcentrationMeasurement -DISTRO -Distutils -DK -DL -DM -DMG -DMM -DNS -Dnsmasq -dnsmasqd -DNSSD -DNSStubListener -docbuild -Dockerfile -Dockerfiles -Don'ts -DoorLock -DoorState -doru -DOTBR -DOVERLAY -downcasting -DownloadProtocolEnum -Doxygen -dpkg -dropdown -dryrun -DS -duplicative -DUT -DUTS -DUT's -DV -DVK -dynload -eabi -EB -ECC -ECD -ECDH -ECDSA -EchoMessage -EchoRequests -EchoResponse -EchoService -ECW -edaf -edc -EDR -ee -eea -EEE -eef -ef -EFR -efuse -eg -EjQ -elftools -elock -emberAf -emberAfExternalAttributeReadCallback -emberAfExternalAttributeWriteCallback -EmberAfInitializeAttributes -emberAfSetDynamicEndpoint -emsp -EnableNetwork -EnableWiFiNetwork -endian -EndpointId -eno -entrypoint -enum -Enums -env -epochKey -epochStartTime -eq -errorValue -esd -espcoredump -ESPPORT -Espressif -esptool -eth -EthernetNetworkDiagnostics -ethernets -EthyleneConcentrationMeasurement -EthyleneOxideConcentrationMeasurement -EvalCode -EvalCodeWithName -EvalFrameDefault -EV -EVB -EventLogging -evk -EVSE -exceptfds -ExchangeContext -exe -ExecStart -executables -ExtendedPAN -ExtensionEntry -extern -extpanid -FabricId -fabricIdx -fabricIndex -factoryreset -FanControl -fb -fbb -fbd -FC -FCJ -FDDE -fddead -fde -fdx -FECA -FecalColiformAndEColiConcentrationMeasurement -feff -ffaa -ffeebaefa -FFF -fffe -fffff -Fi -filepath -fini -FixedLabel -flashdebug -FlowMeasurement -FluorideConcentrationMeasurement -focusable -forkpty -FOTA -FreeRTOS -FreeRTOSConfig -FS -fsl -fstab -fsync -ftd -fullclean -fuzzer -fuzzers -fuzztest -FW -gbl -gcloud -GDB -gdbgui -gdbserver -GeneralCommissioning -GeneralDiagnostics -generalised -GenericConfigurationManagerImpl -GenericConnectivityManagerImpl -GenericImpl -GenericPlatformManagerImpl -GenericThreadConfigurationManagerImpl -GenericThreadStackManagerImpl -GenericWiFiConfigurationManagerImpl -GetDeviceId -GetDeviceInfo -GetDns -getter -getters -GetInDevelopmentTests -GetIP -getManualTests -GetSafeAttributePersistenceProvider -getstarted -GH -ghcr -ghp -githubusercontent -gitignore -glibc -gn -GND -gni -GNinja -GNUARMEMB -gnueabihf -googleapis -googlesource -GPG -GPIO -GPL -GPLv -Gradle -gradlew -graphviz -Groupcast -GroupId -GroupKeyManagement -groupsettings -gsdk -gtk -GUA -Gv -gz -gzbf -HaloaceticAcidsConcentrationMeasurement -HandleCommand -hardcoded -hardknott -hardwarever -HardwareVersion -HardwareVersionString -hasValue -hci -hciattach -hciconfig -hdlc -HEPA -HKDF -HMAC -hoc -homebrew -HomePod -HomePods -hostapd -hostname -href -HSM -hsm -HTTPS -Humidistat -HW -hwadr -HydrogenConcentrationMeasurement -HydrogenSulphideConcentrationMeasurement -IasAce -IasWd -iaszone -ibb -ICA -ICAC -ICD -ICDs -iCloud -ICMP -IDF -IDL -IDLs -idt -idx -ifconfig -ifdef -ifdefs -IGMP -ihex -Illuminance -IlluminanceMeasurement -IM -imager -imagetool -imageUri -img -Impl -ImplClass -implementers -imx -imxlinux -incomingCommands -indexhtml -Inet -InetLayer -Infineon -ini -init -InitArgs -inlined -InputLoop -installDebug -instantiation -integrations -IntelliSense -InteractionModelEngine -InteractionModelVersion -Interoperable -introvideos -InvokeCommandRequests -InvokeCommandResponse -IoT -ipaddr -iPadOS -ipadr -IPK -ipp -iptables -iputils -IPv -ipykernel -ipynb -IPython -ISCAN -isHexString -isLowerCase -isUpperCase -itemName -iterable -itsfoss -JDK -jinja -JLink -JLinkExe -JLinkRTTClient -JN -jni -jpg -jre -js -json -JTAG -Jupyter -jupyterlab -KA -kAdminister -kbd -kBusy -kCase -Kconfig -kDacPublicKey -KeypadInput -keypair -keyset -kGroup -kInvalidCommandId -KitProg -kManage -kNewButton -kNodeIdNotSpecified -knownissues -kOperate -kPAKEParameterError -kPase -kView -KVS -kWindowNotOpen -LabelList -LabelStruct -launchable -LAUNCHXL -ldflags -LeadConcentrationMeasurement -LEDs -LevelControl -LF -libavahi -libc -libcairo -libCHIP -libdbus -LIBDIR -libegl -libffi -libfuzzer -libgirepository -libglib -libical -libncurses -libreadline -libsdl -libshell -libssl -libstdc -libthread -libtool -libTransportLayer -libudev -libwebkitgtk -lifecycle -lightbulb -lightin -LightingApp -LightingColor -LightingState -LinkSoftwareAndDocumentationPack -lladdr -LocalConfigDisabled -localedef -localhost -LocalizationConfiguration -localstatedir -LockingState -LogEvent -loopback -LowPower -LPC -LSP -LTE -LTS -LwIP -LwIP's -LZMA -macaddr -machineType -MacOS -MacOSX -MacPorts -Makefile -makefiles -MakeTpCall -mandir -ManganeseConcentrationMeasurement -ManualPairingCode -ManualTest -ManufacturingDate -masterkey -matterBuildSrcDir -matterc -MatterCustomTrace -matterd -MatterLock -MatterReportingAttributeChangeCallback -matterSdkSourceBuild -matterSourceBuildAbiFilters -matterUTestLib -maxApplicableSoftwareVersion -MaxInterval -MaxIntervalCeilingSeconds -maxLength -MaxRtrAdvInterval -maxValue -mbed -MbedCommissioning -MbedNewTarget -mbedos -mbedTarget -mbedTLS -MCORE -mcu -MCUboot -mcumgr -MCUs -mcux -MCUXpresso -mdash -MDNS -MediaInput -MediaPlayback -MediaTek -MEI -mem -memdf -MemMonitoring -menuconfig -MeshCoP -MeterIdentification -MfgDeviceCaCerts -MfgSpecificPing -mfrcacerts -mfrcert -MfrDeviceCert -MfrDeviceId -mgmt -microcontroller -microcontrollers -MicroSD -middleware -minApplicableSoftwareVersion -Minicom -MinInterval -MinIntervalFloorSeconds -minLength -MinRtrAdvInterval -minValue -mkdir -mlan -MLD -mmevk -moal -Mobly -ModeSelect -modprobe -Modustoolbox -moveMode -MoveToHue -MoveToLevel -MoveToSaturation -MoveWithOnOff -MPSL -MRP -MTD -MTR -MTU -Multiband -Multicast -multilib -Multiprotocol -multithreaded -mutex -mutexes -mv -MX -mydir -MyPASSWORD -MySSID -NAMESERVER -NAMESPACE -namespaces -namespacing -nano -natively -navpad -nbsp -NCP -ncs -nding -NDK -netcmp -netif -netplan -NetworkCommissioning -networkID -networkname -NewUDPEndPoint -nfds -NitricOxideConcentrationMeasurement -NitrogenDioxideConcentrationMeasurement -nl -nltest -nmcli -nmtui -noc -NodeId -nongnu -nordicsemi -NotAvailable -NotifyUpdateApplied -notValue -npm -nRF -nrfconnect -nrfdks -nrfutil -nrfxlib -NTAG -NTP -nullable -nullptr -NUM -NuttX -NVM -NVS -nwdiag -nwk -NXP -objcopy -OccupancySensing -OctetString -OECORE -OID -ol -Onboarding -onboardingcodes -oneshot -onnetwork -OnOff -OnOffClusterTest -OnOffSwitchConfiguration -OnPlatformEvent -onwards -OO -openiotsdk -openjdk -OpenOCD -OpenSSL -OpenThread -OpenThreadDemo -openweave -OperationalCredentials -operationalDataset -opkg -OPTIGA -optionMask -optionOverride -optionsMask -optionsOverride -orgs -OSS -OTA -OTADownloader -otaDownloadPath -otaImageList -OTAImageProcessorDriver -OTAImageProcessorImpl -OTAImageProcessorInterface -otaissues -OTAProvider -OTAProviderIpAddress -OTAProviderNodeId -otaproviders -OTAProviderSerialPort -OTARequesterImpl -OTARequestorDriver -OTARequestorInterface -OTARequestorSerialPort -OTARequestorStorage -otasoftwareupdateapp -OtaSoftwareUpdateProvider -otasoftwareupdaterequestor -otatesting -otaURL -OTBR -otcli -outform -outgoingCommands -overridable -OxygenConcentrationMeasurement -OzoneConcentrationMeasurement -PAA -PAAs -PacketBuffer -PAI -PairDevice -PAIs -PAKE -palletsprojects -PANID -pankore -param -params -PartNumber -PASE -Passcode -passRetained -passwd -PBKDF -pbuf -pbufs -pbxproj -PCA -pcap -pcaps -PDFs -PDK -PDM -peerAddrStr -peerNodeId -peerSessionId -pem -percentageLiftValue -perfetto -periodicQueryTimeout -pexpect -pickString -PICSCODE -PID -Pigweed -PinCode -pinrequest -PIXIT -PIXITs -pkgconfig -PKI -plaintext -PlatformManager -PlatformManagerImpl -plt -PluginServerCallback -png -Podman -PollControl -pollInterval -polymorphism -POSIX -PosixConfig -postAttributeChangeCallback -PowerConfiguration -PowerProfile -PowerSource -PowerSourceConfiguration -pre -preprocessor -Presetup -PressureMeasurement -prj -ProductID -ProductLabel -ProductName -ProductURL -proto -protobuf -protos -Prover -providerFabricIndex -ProviderLocation -providerNodeId -ProxyConfiguration -ProxyDiscovery -ProxyValid -ProxyView -PRs -PSA -PSCAN -PSECT -PSK -PSoC -PTR -pts -PulseWidthModulation -PumpConfigurationAndControl -pwd -PWM -PXXXF -py -pychip -pycrypto -pycryptodome -PyEval -PyFunction -pylint -PyObject -pypi -PyRun -pytest -QEMU -Qorvo -QPG -QRCode -qrcodetool -QRCodeUrl -QSPI -QueryImage -QueryImageResponse -queryImageStatus -Quickstart -qvCHIP -RADVD -raspberryPi -RasPi -rAv -RCAC -RCP -ReadAttribute -ReadConfigValue -readelf -readfds -README -READMEs -readonly -readthedocs -Reag -rebase -recommand -recommanded -recurse -regen -registerAttributeAccessOverride -RegisterCommandHandler -RelativeHumidityMeasurement -RemainAfterExit -remoteDeviceId -Rendez -RendezvousInformation -RendezvousParameters -RendezVousTest -REPL -repo -repos -req -Requestor -Requestor's -RequestorCanConsent -Requestors -responder -RestrictedEvent -retargeting -reusability -reviwed -rfid -rfids -RGB -riscv -rloc -rmw -rodata -Rollershade -rootfs -RPC -RPCs -RPi -RPi's -RPis -RSA -rsn -RSSI -RST -rsync -RTC -rtd -RTL -rtld -RTOS -RTT -RTX -runArgs -runIf -RUNAS -RunMain -runtime -RVC -rw -RXD -sandboxed -saveAs -saveDataVersschemaionAs -sbin -scalability -scalable -schema -schemas -scm -sco -scp -ScriptBinding -SDB -SDC -SDHC -SDK -SDK's -sdkconfig -SDKs -SDKTARGETSYSROOT -sdl -SecureCertDACProvider -SED -SEGGER -semver -SendButton -SendNewInputEvent -sendto -seqdiag -SERIALDEVICE -serialno -SerialNumber -ServiceId -SetDns -SetImageProcessorDelegate -SetOTADownloader -SetOtaRequestorDriver -setpin -setpoint -SetpointRaiseLower -SetRequestorInstance -SetUpPINCode -SetupQRCode -sexualized -sfv -SHA -ShadeConfiguration -SHAs -showDocumentation -showsdks -shubhamdp -SIGINT -SiLabs -Silabs's -SiliconLabs -SimpleFileExFlags -SimpleLink -SiWx -sizedb -sl -SLAAC -SLTB -SLWSTK -SmartThings -smoketest -SMP -socat -socio -SoCs -SodiumConcentrationMeasurement -softap -SoftDevice -softmmu -SoftwareDiagnostics -SoftwareVersion -softwareVersionStr -SoftwareVersionString -softwareVersionValid -SparkFun -sphinxcontrib -SPI -spiflash -spinel -src -SRP -SRV -SSBL -SSID -startoffset -StartScan -startsWith -StatusCode -stderr -stdout -sterm -stlink -stm -stmicroelectronics -storagepath -str -strcpy -struct -structs -su -Subclassing -subcommand -subcommands -subdirectories -subdirectory -subfolder -submodule -submodules -subnet -subprocess -SubscribeResponse -SubscriptionId -substeps -subtype -sudo -SulfateConcentrationMeasurement -SulfurDioxideConcentrationMeasurement -suppressResponse -svg -SVR -SWD -SWU -symlinks -sysbuild -sysconfdir -SysConfig -sysctl -sysdeps -SYSROOT -systemctl -systemd -systemdsystemunitdir -systemduserunitdir -systime -sysv -TargetNavigator -TBD -tbody -tcl -TCP -teardown -Telink -TemperatureMeasurement -templating -Tera -testability -TestArray -TestCluster -TestConstraints -TestEmptyString -TestEqualities -TestGenExample -TestGroupDemoConfig -TestMultiRead -TestName -TestOnlySendCommandTimedRequestFlagWithNoTimedInvoke -TESTPASSWD -TestPICS -TESTSSID -TestString -TestStruct -TestThreadStackMgr -TestTimedRequestTimeout -TestUint -TestUpdateValue -testws -texinfo -textboxes -TFT -ThermostatUserInterfaceConfiguration -ThIsIsNoTMyReAlGiThUbToKeNSoDoNoTtRy -thread -ThreadNetworkDiagnostics -threadOperationalDataset -ThreadStackManager -ThreadStackManagerImpl -ths -Thunderboard -timedInteractionTimeoutMs -TimeFormatLocalization -timeframe -timeoutMs -TimeSynchronization -tinycrypt -Tizen -TKIP -TLS -tlsr -TLV -tmp -tngvndl -TODO -toJson -tokenization -tokenized -tokenizer -toolchain -toolchains -topologies -tos -TotalColiformBacteriaConcentrationMeasurement -totalTests -TotalTrihalomethanesConcentrationMeasurement -TPK -trackAlloc -trackFree -TransferSession -transitionTime -TransportMgrBase -TriggerEffect -TRNG -trustm -TrustedRootCertificates -tsan -TSG -tsv -TTL -tty -ttyACM -ttyACMx -ttymxc -ttyUSB -TurbidityConcentrationMeasurement -TvCasting -TVOC -tvOS -TXD -txt -uargument -UART -UDC -udcport -udhcpc -UDP -UDPEndPoint -udpPort -ug -ui -uint -ULA -Ultrafast -UNBLUR -uncommissioned -Unencrypted -unfocus -Unicast -UniFlash -UnitLocalization -unpair -unprovisioned -Unsecure -Unselect -untrusted -updateAvailable -updateNotAvailable -UpdateTokens -upstreamed -ureverse -URI -urlrequest -usbmodem -usbserial -USBtoUART -uscif -UserConsentNeeded -userConsentState -userguide -USERINTERFACE -UserLabel -usermod -usr -UTF -util -utils -UUID -ux -validator -valgrind -vcom -VCP -Vectorcall -VendorID -VendorName -vendorpayload -venv -ver -Verifier -Verifiers -VID -vids -virtualenv -visualstudio -vlatest -VLEDs -vm -vn -vnc -vous -VPN -VSC -VSCode -WaitNewInputEvent -WakeOnLan -WantedBy -watchdogTimeout -watchOS -webpage -wf -wg -wget -whde -whitespace -whitespaces -whl -wic -WiFiNetworkDiagnostics -WindowCovering -WindowCoveringGoToLiftPercentage -WiseMCU -wlan -wmm -WPA -wpan -wra -WriteAttribute -writefds -wrover -WS -WSL -WSTK -xa -xAAAA -xab -xaver -xb -xbef -xc -xcd -Xcode -xcodebuild -xcodeproj -xcworkspace -xd -xds -xdsdfu -xEA -xEB -xEC -xed -xef -xF -xFA -xFB -xFC -xFD -xFE -xFF -xFFF -xFFFF -xfffff -xFFFFFFEFFFFFFFFF -xtensa -xvzf -xwayland -xyz -xz -xzvf -yaml -yearday -yml -YNJV -Yocto -yoctoproject -YourFolder -zapt -zaptool -ZCL -zclconfigure -zclread -zclsubscribe -zclwrite -ZephyrConfig -zephyrproject -zhengyaohan -Zigbee -zigbeealliance -zigbeethread diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS deleted file mode 100644 index b8ab010a1dfe5f..00000000000000 --- a/.github/CODEOWNERS +++ /dev/null @@ -1,2 +0,0 @@ -# Current reviewers-XXX teams, who review everything for approval. -* @reviewers-amazon @reviewers-apple @reviewers-comcast @reviewers-google @reviewers-lg @reviewers-nordic @reviewers-samsung @reviewers-silabs @reviewers-tcl diff --git a/.github/ISSUE_TEMPLATE/001-bug-report.yaml b/.github/ISSUE_TEMPLATE/001-bug-report.yaml deleted file mode 100644 index 8944e002c5ecc3..00000000000000 --- a/.github/ISSUE_TEMPLATE/001-bug-report.yaml +++ /dev/null @@ -1,80 +0,0 @@ -name: "\U0001F41B Bug report" -description: Create a report to help Matter -title: "[BUG] " -labels: [bug, "needs triage"] -body: - - type: markdown - attributes: - value: | - Thanks for reporting an issue against the Matter SDK! We need information about the bug report to follow up, so please help us out by filling out this information. - - type: textarea - id: repro - attributes: - label: Reproduction steps - description: "How do you trigger this bug? Please walk us through it step by step." - placeholder: | - Please list reproduction steps step by step. - Place shell commands between ```. - Attach logs as files instead of pasting them in. - 1. - 2. - 3. - ... - validations: - required: true - - type: input - id: prevalence - attributes: - label: Bug prevalence - description: "How often do you or others encounter this bug?" - placeholder: "Example: Whenever I do this, 1-2 times a week, day, hour, etc" - validations: - required: true - - type: input - attributes: - label: GitHub hash of the SDK that was being used - description: Hash of the GitHub SDK used - validations: - required: true - - type: dropdown - attributes: - label: Platform - description: What platforms are affected? - multiple: true - options: - - ameba - - android - - cc13x2_cc26x2 - - darwin - - efr32 - - esp32 - - freeRTOS - - IMX8 - - k32w - - nrf - - python - - raspi - - vscode - - windows - - other - - core - validations: - required: true - - type: input - id: platform-versions - attributes: - label: Platform Version(s) - description: "What platform version(s) are affected [optional]" - placeholder: "eg: 1.0.1, N/A" - - type: textarea - attributes: - label: Anything else? - description: | - Links? References? Anything that will give us more context about the issue you are encountering! - - Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. - validations: - required: false - - type: markdown - attributes: - value: "Thanks for submitting a bug!" diff --git a/.github/ISSUE_TEMPLATE/002-1.0-issue.yaml b/.github/ISSUE_TEMPLATE/002-1.0-issue.yaml deleted file mode 100644 index 10551fef60fe44..00000000000000 --- a/.github/ISSUE_TEMPLATE/002-1.0-issue.yaml +++ /dev/null @@ -1,98 +0,0 @@ -name: "\u0030\u20e3 1.0 Issue" -description: Create an issue that is required for Matter 1.0 release -title: "[1.0] " -labels: [bug, "V1.0", "needs triage"] -body: - - type: markdown - attributes: - value: | - Thanks for reporting an issue against the Matter SDK! We need information about the bug report to follow up, so please help us out by filling out this information. - - type: textarea - id: repro - attributes: - label: Reproduction steps - description: "How do you trigger this bug? Please walk us through it step by step." - placeholder: | - Please list reproduction steps step by step. - Place shell commands between ```. - Attach logs as files instead of pasting them in. - 1. - 2. - 3. - ... - validations: - required: true - - type: input - id: prevalence - attributes: - label: Bug prevalence - description: "How often do you or others encounter this bug?" - placeholder: "Example: Whenever I do this, 1-2 times a week, day, hour, etc" - validations: - required: true - - type: input - attributes: - label: GitHub hash of the SDK that was being used - description: Hash of the GitHub SDK used - validations: - required: true - - type: dropdown - attributes: - label: Platform - description: What platforms are affected? - multiple: true - options: - - ameba - - android - - cc13x2_cc26x2 - - darwin - - efr32 - - esp32 - - freeRTOS - - IMX8 - - k32w - - nrf connect - - nrf - - python - - raspi - - vscode - - windows - - other - - core - validations: - required: true - - type: input - id: platform-versions - attributes: - label: Platform Version(s) - description: "What platform version(s) are affected [optional]" - placeholder: "eg: 1.0.1, N/A" - - type: dropdown - attributes: - label: Type - description: What type of issue is this? - multiple: true - options: - - Test Improvement - - Common Cluster Logic - - Spec Compliance Issue - - Security Issue - - Platform Issue - - Core SDK Memory Issue - - Core SDK Crash - - Core SDK Performance Improvement - - Core SDK Interopability Issue - validations: - required: true - - type: textarea - attributes: - label: Anything else? - description: | - Links? References? Anything that will give us more context about the issue you are encountering! - - Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. - validations: - required: false - - type: markdown - attributes: - value: "Thanks for helping us get to 1.0!" diff --git a/.github/ISSUE_TEMPLATE/003-1.1-issue.yaml b/.github/ISSUE_TEMPLATE/003-1.1-issue.yaml deleted file mode 100644 index 50db3e80a95c33..00000000000000 --- a/.github/ISSUE_TEMPLATE/003-1.1-issue.yaml +++ /dev/null @@ -1,98 +0,0 @@ -name: "\u0031\u20e3 1.1 Issue" -description: Create an issue that is required for Matter 1.1 release -title: "[1.1] " -labels: [bug, "V1.1", "needs triage"] -body: - - type: markdown - attributes: - value: | - Thanks for reporting an issue against the Matter SDK! We need information about the bug report to follow up, so please help us out by filling out this information. - - type: textarea - id: repro - attributes: - label: Reproduction steps - description: "How do you trigger this bug? Please walk us through it step by step." - placeholder: | - Please list reproduction steps step by step. - Place shell commands between ```. - Attach logs as files instead of pasting them in. - 1. - 2. - 3. - ... - validations: - required: true - - type: input - id: prevalence - attributes: - label: Bug prevalence - description: "How often do you or others encounter this bug?" - placeholder: "Example: Whenever I do this, 1-2 times a week, day, hour, etc" - validations: - required: true - - type: input - attributes: - label: GitHub hash of the SDK that was being used - description: Hash of the GitHub SDK used - validations: - required: true - - type: dropdown - attributes: - label: Platform - description: What platforms are affected? - multiple: true - options: - - ameba - - android - - cc13x2_cc26x2 - - darwin - - efr32 - - esp32 - - freeRTOS - - IMX8 - - k32w - - nrf connect - - nrf - - python - - raspi - - vscode - - windows - - other - - core - validations: - required: true - - type: input - id: platform-versions - attributes: - label: Platform Version(s) - description: "What platform version(s) are affected [optional]" - placeholder: "eg: 1.1, N/A" - - type: dropdown - attributes: - label: Type - description: What type of issue is this? - multiple: true - options: - - Test Improvement - - Common Cluster Logic - - Spec Compliance Issue - - Security Issue - - Platform Issue - - Core SDK Memory Issue - - Core SDK Crash - - Core SDK Performance Improvement - - Core SDK Interopability Issue - validations: - required: true - - type: textarea - attributes: - label: Anything else? - description: | - Links? References? Anything that will give us more context about the issue you are encountering! - - Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. - validations: - required: false - - type: markdown - attributes: - value: "Thanks for helping us get to 1.1!" diff --git a/.github/ISSUE_TEMPLATE/004-1.2-issue.yaml b/.github/ISSUE_TEMPLATE/004-1.2-issue.yaml deleted file mode 100644 index 81b641a52e45ef..00000000000000 --- a/.github/ISSUE_TEMPLATE/004-1.2-issue.yaml +++ /dev/null @@ -1,98 +0,0 @@ -name: "\u0032\u20e3 1.2 Issue" -description: Create an issue that is required for Matter 1.2 release -title: "[1.2] " -labels: [bug, "V1.2", "needs triage"] -body: - - type: markdown - attributes: - value: | - Thanks for reporting an issue against the Matter SDK! We need information about the bug report to follow up, so please help us out by filling out this information. - - type: textarea - id: repro - attributes: - label: Reproduction steps - description: "How do you trigger this bug? Please walk us through it step by step." - placeholder: | - Please list reproduction steps step by step. - Place shell commands between ```. - Attach logs as files instead of pasting them in. - 1. - 2. - 3. - ... - validations: - required: true - - type: input - id: prevalence - attributes: - label: Bug prevalence - description: "How often do you or others encounter this bug?" - placeholder: "Example: Whenever I do this, 1-2 times a week, day, hour, etc" - validations: - required: true - - type: input - attributes: - label: GitHub hash of the SDK that was being used - description: Hash of the GitHub SDK used - validations: - required: true - - type: dropdown - attributes: - label: Platform - description: What platforms are affected? - multiple: true - options: - - ameba - - android - - cc13x2_cc26x2 - - darwin - - efr32 - - esp32 - - freeRTOS - - IMX8 - - k32w - - nrf connect - - nrf - - python - - raspi - - vscode - - windows - - other - - core - validations: - required: true - - type: input - id: platform-versions - attributes: - label: Platform Version(s) - description: "What platform version(s) are affected [optional]" - placeholder: "eg: 1.2, N/A" - - type: dropdown - attributes: - label: Type - description: What type of issue is this? - multiple: true - options: - - Test Improvement - - Common Cluster Logic - - Spec Compliance Issue - - Security Issue - - Platform Issue - - Core SDK Memory Issue - - Core SDK Crash - - Core SDK Performance Improvement - - Core SDK Interopability Issue - validations: - required: true - - type: textarea - attributes: - label: Anything else? - description: | - Links? References? Anything that will give us more context about the issue you are encountering! - - Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. - validations: - required: false - - type: markdown - attributes: - value: "Thanks for helping us get to 1.2!" diff --git a/.github/ISSUE_TEMPLATE/005-1.3-issue.yaml b/.github/ISSUE_TEMPLATE/005-1.3-issue.yaml deleted file mode 100644 index 5c91f91e75b3be..00000000000000 --- a/.github/ISSUE_TEMPLATE/005-1.3-issue.yaml +++ /dev/null @@ -1,98 +0,0 @@ -name: "\u0033\u20e3 1.3 Issue" -description: Create an issue that is required for Matter 1.3 release -title: "[1.3] " -labels: [bug, "V1.3", "needs triage"] -body: - - type: markdown - attributes: - value: | - Thanks for reporting an issue against the Matter SDK! We need information about the bug report to follow up, so please help us out by filling out this information. - - type: textarea - id: repro - attributes: - label: Reproduction steps - description: "How do you trigger this bug? Please walk us through it step by step." - placeholder: | - Please list reproduction steps step by step. - Place shell commands between ```. - Attach logs as files instead of pasting them in. - 1. - 2. - 3. - ... - validations: - required: true - - type: input - id: prevalence - attributes: - label: Bug prevalence - description: "How often do you or others encounter this bug?" - placeholder: "Example: Whenever I do this, 1-2 times a week, day, hour, etc" - validations: - required: true - - type: input - attributes: - label: GitHub hash of the SDK that was being used - description: Hash of the GitHub SDK used - validations: - required: true - - type: dropdown - attributes: - label: Platform - description: What platforms are affected? - multiple: true - options: - - ameba - - android - - cc13x2_cc26x2 - - darwin - - efr32 - - esp32 - - freeRTOS - - IMX8 - - k32w - - nrf connect - - nrf - - python - - raspi - - vscode - - windows - - other - - core - validations: - required: true - - type: input - id: platform-versions - attributes: - label: Platform Version(s) - description: "What platform version(s) are affected [optional]" - placeholder: "eg: 1.3, N/A" - - type: dropdown - attributes: - label: Type - description: What type of issue is this? - multiple: true - options: - - Test Improvement - - Common Cluster Logic - - Spec Compliance Issue - - Security Issue - - Platform Issue - - Core SDK Memory Issue - - Core SDK Crash - - Core SDK Performance Improvement - - Core SDK Interopability Issue - validations: - required: true - - type: textarea - attributes: - label: Anything else? - description: | - Links? References? Anything that will give us more context about the issue you are encountering! - - Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. - validations: - required: false - - type: markdown - attributes: - value: "Thanks for helping us get to 1.3!" diff --git a/.github/ISSUE_TEMPLATE/049-trivial-fix.yaml b/.github/ISSUE_TEMPLATE/049-trivial-fix.yaml deleted file mode 100644 index 7c82d950e9f7f4..00000000000000 --- a/.github/ISSUE_TEMPLATE/049-trivial-fix.yaml +++ /dev/null @@ -1,93 +0,0 @@ -name: "\U0001F3C3 Trivial Fix" -description: Create an issue for a trivial fix -title: "[Trivial] " -labels: [bug, "needs triage"] -body: - - type: markdown - attributes: - value: | - Thanks for taking the time to submit a trivial fix, can you please please help us understand this change in this quick form? - - type: dropdown - attributes: - label: Type - description: What type of trivial fix is this? - multiple: true - options: - - Comment fix - - Typo fix - - Rename - - Other - validations: - required: true - - type: textarea - id: repro - attributes: - label: Explanation - description: "(Optional) If other, why do you think this is trivial?" - validations: - required: false - - type: dropdown - attributes: - label: Platform - description: What platforms are affected? - multiple: true - options: - - all - - ameba - - android - - cc13x2_cc26x2 - - darwin - - efr32 - - esp32 - - freeRTOS - - IMX8 - - k32w - - nrf connect - - nrf - - python - - raspi - - vscode - - windows - - other - - core (please add to version below) - validations: - required: true - - type: input - id: platform-versions - attributes: - label: Platform Version(s) - description: "What platform version(s) are affected [optional]" - placeholder: "eg: 1.0.1, N/A" - - type: dropdown - attributes: - label: Testing - description: How was this tested? - multiple: true - options: - - Unit tested - - YAML tested - - Manually tested with SDK - - CI tested - - Hardware validated - - Platform validated - validations: - required: true - - type: textarea - attributes: - label: (Optional) If manually tested please explain why this is only manually tested - description: | - Please explain how you tested it - validations: - required: false - - type: textarea - attributes: - label: Anything else? - description: | - Links? References? Anything that will give us more context about this! - - Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. - validations: - required: false - - type: markdown - attributes: - value: "Thanks for submitting a trivial issue!" diff --git a/.github/ISSUE_TEMPLATE/050-tooling-fix.yaml b/.github/ISSUE_TEMPLATE/050-tooling-fix.yaml deleted file mode 100644 index 0d775a61ef119d..00000000000000 --- a/.github/ISSUE_TEMPLATE/050-tooling-fix.yaml +++ /dev/null @@ -1,88 +0,0 @@ -name: "\U0001F9F0 Tooling Fix/Feature" -description: Create an issue for a tooling specific fix/feature -title: "[Tooling] " -labels: ["tools", "needs triage"] -body: - - type: markdown - attributes: - value: | - Thanks for taking the time to submit a an issue for our tooling, can you please please help us understand this change in this quick form? - - type: textarea - id: repro - attributes: - label: Reproduction steps / Feature - description: "How do you trigger this issue and/or can you please explain this new feature? Please walk us through it step by step." - placeholder: | - Please list reproduction steps step by step. - Place shell commands between ```. - Attach logs as files instead of pasting them in. - 1. - 2. - 3. - ... - validations: - required: true - - type: dropdown - attributes: - label: Platform - description: What platforms are affected? - multiple: true - options: - - ameba - - android - - cc13x2_cc26x2 - - darwin - - efr32 - - esp32 - - freeRTOS - - IMX8 - - k32w - - nrf connect - - nrf - - python - - raspi - - vscode - - windows - - other - - core (please add to version below) - validations: - required: true - - type: input - id: platform-versions - attributes: - label: Platform Version(s) - description: "What platform version(s) are affected [optional]" - placeholder: "eg: 1.0.1, N/A" - - type: dropdown - attributes: - label: Type - description: How was this tested? - multiple: true - options: - - Unit tested - - YAML tested - - Manually tested with SDK - - CI tested - - Hardware validated - - Platform validated - validations: - required: true - - type: textarea - attributes: - label: (Optional) If manually tested please explain why this is only manually tested - description: | - Please explain how you tested it - validations: - required: false - - type: textarea - attributes: - label: Anything else? - description: | - Links? References? Anything that will give us more context about this! - - Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. - validations: - required: false - - type: markdown - attributes: - value: "Thanks for help our tooling!" diff --git a/.github/ISSUE_TEMPLATE/060-platform-fix.yaml b/.github/ISSUE_TEMPLATE/060-platform-fix.yaml deleted file mode 100644 index fdb8b76d88f2ec..00000000000000 --- a/.github/ISSUE_TEMPLATE/060-platform-fix.yaml +++ /dev/null @@ -1,88 +0,0 @@ -name: "\U0001F3D7 Platform Fix" -description: Create an issue for a platform specific fix -title: "[Platform] " -labels: ["platform", "needs triage"] -body: - - type: markdown - attributes: - value: | - Thanks for taking the time to submit a an issue for a platform, can you please please help us understand this change in this quick form? - - type: textarea - id: repro - attributes: - label: Reproduction steps - description: "How do you trigger this issue? Please walk us through it step by step." - placeholder: | - Please list reproduction steps step by step. - Place shell commands between ```. - Attach logs as files instead of pasting them in. - 1. - 2. - 3. - ... - validations: - required: true - - type: dropdown - attributes: - label: Platform - description: What platforms are affected? - multiple: true - options: - - ameba - - android - - cc13x2_cc26x2 - - darwin - - efr32 - - esp32 - - freeRTOS - - IMX8 - - k32w - - nrf connect - - nrf - - python - - raspi - - vscode - - windows - - other - - core (please add to version below) - validations: - required: true - - type: input - id: platform-versions - attributes: - label: Platform Version(s) - description: "What platform version(s) are affected [optional]" - placeholder: "eg: 1.0.1, N/A" - - type: dropdown - attributes: - label: Type - description: How was this tested? - multiple: true - options: - - Unit tested - - YAML tested - - Manually tested with SDK - - CI tested - - Hardware validated - - Platform validated - validations: - required: true - - type: textarea - attributes: - label: (Optional) If manually tested please explain why this is only manually tested - description: | - Please explain how you tested it - validations: - required: false - - type: textarea - attributes: - label: Anything else? - description: | - Links? References? Anything that will give us more context about this! - - Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. - validations: - required: false - - type: markdown - attributes: - value: "Thanks for submitting a platform issue!" diff --git a/.github/ISSUE_TEMPLATE/080-feature-request.yaml b/.github/ISSUE_TEMPLATE/080-feature-request.yaml deleted file mode 100644 index c83b0c22acaa98..00000000000000 --- a/.github/ISSUE_TEMPLATE/080-feature-request.yaml +++ /dev/null @@ -1,62 +0,0 @@ -name: "\U0001F4A1 Feature Request" -description: Create an feature to be considered future release -title: "[Feature] " -labels: ["feature work", "feature request", "needs triage"] -body: - - type: markdown - attributes: - value: | - Thanks for submitting a feature request to the Matter SDK! We need information about the feature to follow up, so please help us out by filling out this information. - - type: textarea - id: repro - attributes: - label: Feature description - description: "What feature are you looking to add? Please walk us through it!" - value: | - ... - validations: - required: true - - type: dropdown - attributes: - label: Platform - description: What platforms are affected? - multiple: true - options: - - all - - ameba - - android - - cc13x2_cc26x2 - - darwin - - efr32 - - esp32 - - freeRTOS - - IMX8 - - k32w - - nrf connect - - nrf - - python - - raspi - - vscode - - windows - - other - - core - validations: - required: true - - type: input - id: platform-versions - attributes: - label: Platform Version(s) - description: "What platform version(s) are affected [optional]" - placeholder: "eg: 1.0.1, N/A" - - type: textarea - attributes: - label: Anything else? - description: | - Links? References? Anything that will give us more context about the issue you are encountering! - - Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. - validations: - required: false - - type: markdown - attributes: - value: "Thanks for submitting a new feature request." diff --git a/.github/ISSUE_TEMPLATE/090-sve-issue.yaml b/.github/ISSUE_TEMPLATE/090-sve-issue.yaml deleted file mode 100644 index 6ea65341230a35..00000000000000 --- a/.github/ISSUE_TEMPLATE/090-sve-issue.yaml +++ /dev/null @@ -1,119 +0,0 @@ -name: "\U0001F9EA SVE Issue" -description: Create an issue that is required for SVE -title: "[SVE] " -labels: [bug, "sve", "request sve", "needs triage"] -body: - - type: markdown - attributes: - value: | - Thanks for reporting an issue against the Matter SDK! We need information about the bug report to follow up, so please help us out by filling out this information. - - type: textarea - id: repro - attributes: - label: Reproduction steps - description: "How do you trigger this bug? Please walk us through it step by step." - placeholder: | - Please list reproduction steps step by step. - Place shell commands between ```. - Attach logs as files instead of pasting them in. - 1. - 2. - 3. - ... - validations: - required: true - - type: input - id: prevalence - attributes: - label: Bug prevalence - description: "How often do you or others encounter this bug?" - placeholder: "Example: Whenever I do this, 1-2 times a week, day, hour, etc" - validations: - required: true - - type: input - attributes: - label: GitHub hash of the SDK that was being used - description: Hash of the GitHub SDK used - validations: - required: true - - type: dropdown - attributes: - label: Platform - description: What platforms are affected? - multiple: true - options: - - ameba - - android - - cc13x2_cc26x2 - - darwin - - efr32 - - esp32 - - freeRTOS - - IMX8 - - k32w - - nrf connect - - nrf - - python - - raspi - - vscode - - windows - - other - - core (please add to version below) - validations: - required: true - - type: input - id: platform-versions - attributes: - label: Platform Version(s) - description: "What platform version(s) are affected [optional]" - placeholder: "eg: 1.0.1, N/A" - - type: dropdown - attributes: - label: Type - description: What type of issue is this? - multiple: true - options: - - Test Improvement - - Common Cluster Logic - - Spec Compliance Issue - - Security Issue - - Platform Issue - - Core SDK Memory Issue - - Core SDK Crash - - Core SDK Performance Improvement - - Core SDK Interopability Issue - validations: - required: true - - type: dropdown - attributes: - label: Testing - description: How was this tested? - multiple: true - options: - - Unit tested - - YAML tested - - Manually tested with SDK - - CI tested - - Hardware validated - - Platform validated - validations: - required: true - - type: textarea - attributes: - label: (Optional) If manually tested please explain why this is only manually tested - description: | - Please explain how you tested it - validations: - required: false - - type: textarea - attributes: - label: Anything else? - description: | - Links? References? Anything that will give us more context about the issue you are encountering! - - Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. - validations: - required: false - - type: markdown - attributes: - value: "Thanks for helping our SVE!" diff --git a/.github/ISSUE_TEMPLATE/091-cert-blocker.yaml b/.github/ISSUE_TEMPLATE/091-cert-blocker.yaml deleted file mode 100644 index 659135117d1938..00000000000000 --- a/.github/ISSUE_TEMPLATE/091-cert-blocker.yaml +++ /dev/null @@ -1,108 +0,0 @@ -name: "\U0001F4DC Test Case Failure / Cert Blocker" -description: Create a report to identify matter certification test failures -title: "[CERT-TEST-FAILURE] " -labels: [bug, "cert blocker", "needs triage"] -body: - - type: markdown - attributes: - value: | - Thanks for reporting an issue against the Matter SDK! We need information about the cert blocker to follow up, so please help us out by filling out this information. - - type: dropdown - attributes: - label: Feature Area - description: What feature area is the test failing in? - multiple: true - options: - - Area:AirPurifiers - - Area:AirQualitySensor - - Area:ConcentrationMeasurement - - Area:DeviceAppearance - - Area:Dishwashers - - Area:DoorLockEnhancements - - Area:EventList - - Area:ICDPhase2 - - Area:ModeSelect - - Area:OperationalState - - Area:Refrigerators - - Area:RobotVacuums - - Area:RoomAirConditioner - - Area:Scenes - - Area:SmokeCO2 - - Area:TemperatureControlledCabinet - - Area:TimeSync - - Other - validations: - required: true - - type: input - id: testcase - attributes: - label: Test Case - description: "Which test case is failing?" - placeholder: "TC-XXXX" - validations: - required: true - - type: textarea - id: repro - attributes: - label: Reproduction steps - description: "How do you trigger this bug? Please walk us through it step by step." - placeholder: | - Please list reproduction steps step by step. - Place shell commands between ```. - Attach logs as files instead of pasting them in. - 1. - 2. - 3. - ... - validations: - required: true - - type: input - id: prevalence - attributes: - label: Bug prevalence - description: "How often do you or others encounter this bug?" - placeholder: "Example: Whenever I do this, 1-2 times a week, day, hour, etc" - validations: - required: true - - type: input - attributes: - label: GitHub hash of the SDK that was being used - description: Hash of the GitHub SDK used - validations: - required: true - - type: dropdown - attributes: - label: Platform - description: What platforms are affected? - multiple: true - options: - - ameba - - android - - cc13x2_cc26x2 - - darwin - - efr32 - - esp32 - - freeRTOS - - IMX8 - - k32w - - nrf - - python - - raspi - - vscode - - windows - - other - - core - validations: - required: true - - type: textarea - attributes: - label: Anything else? - description: | - Links? References? Anything that will give us more context about the issue you are encountering! - - Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. - validations: - required: false - - type: markdown - attributes: - value: "Thanks for submitting a test case/cert blocker!" diff --git a/.github/ISSUE_TEMPLATE/097-ci-test-failure.yaml b/.github/ISSUE_TEMPLATE/097-ci-test-failure.yaml deleted file mode 100644 index a99f5a6361715d..00000000000000 --- a/.github/ISSUE_TEMPLATE/097-ci-test-failure.yaml +++ /dev/null @@ -1,59 +0,0 @@ -name: "\U0001F6E0 Test Issue" -description: Test issue -title: "[Test Failed] " -labels: ["build issue", "needs triage", "tests"] -body: - - type: markdown - attributes: - value: | - Thanks for reporting an issue against the Matter SDK's tests! We need information about the bug report to follow up, so please help us out by filling out this information. - - type: textarea - id: repro - attributes: - label: Test issue(s) - description: "What are the tests that failed? Please include links to failed jobs if possible." - value: | - 1. - 2. - 3. - ... - validations: - required: true - - type: dropdown - attributes: - label: Platform - description: What platforms are affected? - multiple: true - options: - - ameba - - android - - cc13x2_cc26x2 - - darwin - - efr32 - - esp32 - - freeRTOS - - IMX8 - - k32w - - nrf connect - - nrf - - python - - raspi - - vscode - - windows - - other - - core (please add to version below) - - all - validations: - required: false - - type: textarea - attributes: - label: Anything else? - description: | - Links? References? Anything that will give us more context about the issue you are encountering! - - Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. - validations: - required: false - - type: markdown - attributes: - value: "Thanks for helping improve our tests" diff --git a/.github/ISSUE_TEMPLATE/098-build-issue.yaml b/.github/ISSUE_TEMPLATE/098-build-issue.yaml deleted file mode 100644 index 5d1adb35548657..00000000000000 --- a/.github/ISSUE_TEMPLATE/098-build-issue.yaml +++ /dev/null @@ -1,59 +0,0 @@ -name: "\U0001F6E0 Build Issue" -description: Build issue -title: "[Build] " -labels: ["build issue", "needs triage"] -body: - - type: markdown - attributes: - value: | - Thanks for reporting an issue against the Matter SDK's builds! We need information about the bug report to follow up, so please help us out by filling out this information. - - type: textarea - id: repro - attributes: - label: Build issue(s) - description: "What are the build issues? Please include links to failed jobs if possible." - value: | - 1. - 2. - 3. - ... - validations: - required: true - - type: dropdown - attributes: - label: Platform - description: What platforms are affected? - multiple: true - options: - - ameba - - android - - cc13x2_cc26x2 - - darwin - - efr32 - - esp32 - - freeRTOS - - IMX8 - - k32w - - nrf connect - - nrf - - python - - raspi - - vscode - - windows - - other - - core (please add to version below) - - all - validations: - required: false - - type: textarea - attributes: - label: Anything else? - description: | - Links? References? Anything that will give us more context about the issue you are encountering! - - Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. - validations: - required: false - - type: markdown - attributes: - value: "Thanks for helping improve our builds" diff --git a/.github/ISSUE_TEMPLATE/099-github-workflow-issue.yaml b/.github/ISSUE_TEMPLATE/099-github-workflow-issue.yaml deleted file mode 100644 index eefa5f0f984c61..00000000000000 --- a/.github/ISSUE_TEMPLATE/099-github-workflow-issue.yaml +++ /dev/null @@ -1,59 +0,0 @@ -name: "\U0001F477 GitHub / CI / Workflow" -description: Create an issue to improve CI / Workflows -title: "[Workflow] " -labels: ["workflows", "needs triage"] -body: - - type: markdown - attributes: - value: | - Thanks for reporting an issue against the Matter SDK's workflows! We need information about the bug report to follow up, so please help us out by filling out this information. - - type: textarea - id: repro - attributes: - label: Workflow issues - description: "What updates to the workflows are needed?" - value: | - 1. - 2. - 3. - ... - validations: - required: true - - type: dropdown - attributes: - label: Platform - description: What platforms are affected? - multiple: true - options: - - ameba - - android - - cc13x2_cc26x2 - - darwin - - efr32 - - esp32 - - freeRTOS - - IMX8 - - k32w - - nrf connect - - nrf - - python - - raspi - - vscode - - windows - - other - - core (please add to version below) - - all - validations: - required: false - - type: textarea - attributes: - label: Anything else? - description: | - Links? References? Anything that will give us more context about the issue you are encountering! - - Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. - validations: - required: false - - type: markdown - attributes: - value: "Thanks for helping improve our development workflows" diff --git a/.github/ISSUE_TEMPLATE/100-documentation-issue.yaml b/.github/ISSUE_TEMPLATE/100-documentation-issue.yaml deleted file mode 100644 index 51971d1d010b5f..00000000000000 --- a/.github/ISSUE_TEMPLATE/100-documentation-issue.yaml +++ /dev/null @@ -1,58 +0,0 @@ -name: "\U0001F5BA Documentation Issue" -description: Create an issue to improve documentation -title: "[Documentation] " -labels: ["documentation", "needs triage"] -body: - - type: markdown - attributes: - value: | - Thanks for reporting an issue against the Matter SDK! We need information about the bug report to follow up, so please help us out by filling out this information. - - type: textarea - id: repro - attributes: - label: Documentation issues - description: "What updates to documentation are needed?" - value: | - 1. - 2. - 3. - ... - validations: - required: true - - type: dropdown - attributes: - label: Platform - description: What platforms are affected? - multiple: true - options: - - ameba - - android - - cc13x2_cc26x2 - - darwin - - efr32 - - esp32 - - freeRTOS - - IMX8 - - k32w - - nrf connect - - nrf - - python - - raspi - - vscode - - windows - - other - - core (please add to version below) - validations: - required: false - - type: textarea - attributes: - label: Anything else? - description: | - Links? References? Anything that will give us more context about the issue you are encountering! - - Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. - validations: - required: false - - type: markdown - attributes: - value: "Thanks for helping improve our documentation." diff --git a/.github/ISSUE_TEMPLATE/config.yaml b/.github/ISSUE_TEMPLATE/config.yaml deleted file mode 100644 index 3ba13e0cec6cbb..00000000000000 --- a/.github/ISSUE_TEMPLATE/config.yaml +++ /dev/null @@ -1 +0,0 @@ -blank_issues_enabled: false diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index dad1d2c6463644..00000000000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,12 +0,0 @@ -> !!!!!!!!!! Please delete the instructions below and replace with PR description -> -> If you have an issue number, please use a syntax of -> `Fixes #12345` and a brief change description -> -> If you do not have an issue number, please have a good description of -> the problem and the fix. Help the reviewer understand what to expect. -> -> Make sure you delete these instructions (to prove you have read them). -> -> !!!!!!!!!! Instructions end - diff --git a/.github/actions/bootstrap-cache/action.yaml b/.github/actions/bootstrap-cache/action.yaml deleted file mode 100644 index f5ed24ba3f06e7..00000000000000 --- a/.github/actions/bootstrap-cache/action.yaml +++ /dev/null @@ -1,17 +0,0 @@ -name: Bootstrap cache -description: Bootstrap cache (deprecated) -runs: - using: "composite" - steps: - - uses: Wandalen/wretry.action@v1.4.10 - name: Bootstrap cache - continue-on-error: true - with: - action: buildjet/cache@v3 - attempt_limit: 3 - attempt_delay: 2000 - with: | - key: ${{ runner.os }}-env-${{ hashFiles('scripts/setup/*', 'third_party/pigweed/**', '/etc/lsb-release') }} - path: | - .environment - build_overrides/pigweed_environment.gni diff --git a/.github/actions/bootstrap/action.yaml b/.github/actions/bootstrap/action.yaml deleted file mode 100644 index ea06ceed7b3952..00000000000000 --- a/.github/actions/bootstrap/action.yaml +++ /dev/null @@ -1,82 +0,0 @@ -name: Bootstrap -description: Bootstrap -inputs: - platform: - description: "Platform name" - required: false - default: none - bootstrap-log-name: - description: "Bootstrap log name" - required: false - default: bootstrap-logs-${{ github.job }} -outputs: - cache-hit: - description: "Bootstrap environment was restored from cache" - value: ${{ fromJSON(steps.restore.outputs.outputs).cache-hit }} # dynamic action returns all outputs in `outputs` - -runs: - using: "composite" - steps: - - name: Determine bootstrap cache configuration - id: prepare - shell: bash - run: | - # Determine bootstrap cache configuration - # In addition to the various setup files, the work directory matters as well, - # because the bootstrapped Pigweed environment contains absolute paths. - echo "Calculating bootstrap cache key for '$PWD'" - FILES_HASH="${{ hashFiles('scripts/setup/*', 'third_party/pigweed/**') }}" - case "$RUNNER_OS" in - macOS) OS_HASH="$(sw_vers | shasum -a 256 | cut -d' ' -f1)";; - *) OS_HASH="$(shasum -a 256 /etc/lsb-release | cut -d' ' -f1)";; - esac - PYTHON_HASH="$(python --version | shasum -a 256 | cut -d' ' -f1)" - FINAL_HASH="$(echo "$PWD:$FILES_HASH:$OS_HASH:$PYTHON_HASH" | shasum -a 256 | cut -d' ' -f1)" - echo key="${RUNNER_OS}-${RUNNER_ARCH}-${{ inputs.platform }}-${FINAL_HASH}" | tee -a "$GITHUB_OUTPUT" - - # Split caches across backends - case "$RUNNER_OS" in - macOS) echo backend=actions;; - *) echo backend=buildjet;; - esac | tee -a "$GITHUB_OUTPUT" - - - name: Bootstrap from cache - id: restore - uses: ./.github/actions/dynamic - continue-on-error: true - with: - action: ${{ steps.prepare.outputs.backend }}/cache/restore@v4 - with: | - key: ${{ steps.prepare.outputs.key }} - path: | - .environment - build_overrides/pigweed_environment.gni - - - name: Run bootstrap - if: ${{ fromJSON(steps.restore.outputs.outputs).cache-hit != 'true' }} - env: - PW_NO_CIPD_CACHE_DIR: 1 - PW_ENVSETUP_NO_BANNER: 1 - shell: bash - run: source scripts/bootstrap.sh -p all,${{ inputs.platform }} - - - name: Save bootstrap cache - uses: ./.github/actions/dynamic - if: ${{ fromJSON(steps.restore.outputs.outputs).cache-hit != 'true' }} - continue-on-error: true - with: - action: ${{ steps.prepare.outputs.backend }}/cache/save@v4 - with: | - key: ${{ steps.prepare.outputs.key }} - path: | - .environment - build_overrides/pigweed_environment.gni - - - name: Upload bootstrap logs - uses: actions/upload-artifact@v4 - if: ${{ always() && !env.ACT && fromJSON(steps.restore.outputs.outputs).cache-hit != 'true' }} - with: - name: ${{ inputs.bootstrap-log-name }} - path: | - .environment/gn_out/.ninja_log - .environment/pigweed-venv/*.log diff --git a/.github/actions/checkout-submodules-and-bootstrap/action.yaml b/.github/actions/checkout-submodules-and-bootstrap/action.yaml deleted file mode 100644 index df3fdff1e02ce4..00000000000000 --- a/.github/actions/checkout-submodules-and-bootstrap/action.yaml +++ /dev/null @@ -1,43 +0,0 @@ -name: Checkout submodules & Bootstrap -description: Checkout submodules & Bootstrap -inputs: - platform: - description: "Platform name" - required: true - extra-submodule-parameters: - description: "extra submodule parameters" - required: false - default: "" - bootstrap-log-name: - description: "Bootstrap log name" - required: false - default: bootstrap-logs-${{ github.job }} -runs: - using: "composite" - steps: - - name: Maximize runner disk - uses: ./.github/actions/maximize-runner-disk - - name: Dump disk info - uses: ./.github/actions/dump-disk-info - - name: Set git safe directory for local act runs - uses: ./.github/actions/git-safe-directory - - name: Checkout submodules - uses: ./.github/actions/checkout-submodules - with: - platform: ${{ inputs.platform }} - extra-parameters: ${{ inputs.extra-submodule-parameters }} - - name: Bootstrap - uses: ./.github/actions/bootstrap - with: - platform: ${{ inputs.platform }} - bootstrap-log-name: ${{ inputs.bootstrap-log-name }} - - name: Dump disk info after checkout submodule & Bootstrap - shell: bash - run: scripts/dump_diskspace_info.sh - - name: Work around TSAN ASLR issues - if: runner.os == 'Linux' && !env.ACT - shell: bash - run: | - # See https://stackoverflow.com/a/77856955/2365113 - if [[ "$UID" == 0 ]]; then function sudo() { "$@"; }; fi - sudo sysctl vm.mmap_rnd_bits=28 diff --git a/.github/actions/checkout-submodules/action.yaml b/.github/actions/checkout-submodules/action.yaml deleted file mode 100644 index e180a8c49458a2..00000000000000 --- a/.github/actions/checkout-submodules/action.yaml +++ /dev/null @@ -1,19 +0,0 @@ -name: Checkout submodules -description: Checkout submodules -inputs: - extra-parameters: - description: "extra parameters" - required: false - default: "" - platform: - description: "Platform name" - required: true -runs: - using: "composite" - steps: - - uses: Wandalen/wretry.action@v1.4.10 - name: Checkout submodules - with: - command: scripts/checkout_submodules.py --allow-changing-global-git-config --shallow --platform ${{ inputs.platform }} ${{ inputs.extra-parameters }} - attempt_limit: 3 - attempt_delay: 2000 diff --git a/.github/actions/dump-disk-info/action.yaml b/.github/actions/dump-disk-info/action.yaml deleted file mode 100644 index 1f6474e54c4656..00000000000000 --- a/.github/actions/dump-disk-info/action.yaml +++ /dev/null @@ -1,20 +0,0 @@ -name: Dump disk space info -description: Help debug running out of disk space on github CI -runs: - using: "composite" - steps: - - name: Collect disk info - # Unfortunately current syntax for github wrapper actions only work for - # Javascript actions, and Docker container actions, which doesn't make it - # possible to wrap a shell script like the one below. The action below - # essentially wraps the shell commands we want to run into a Javascript - # wrapped action. This allow us to get the disk info usage before a job - # is run and after the job is run regardless if the job succeeds or - # fails. - uses: pyTooling/Actions/with-post-step@v0.4.5 - if: ${{ runner.os == 'Linux' }} - with: - main: |- - exec ./scripts/dump_diskspace_info.sh - post: |- - exec ./scripts/dump_diskspace_info.sh \ No newline at end of file diff --git a/.github/actions/dynamic/action.yaml b/.github/actions/dynamic/action.yaml deleted file mode 100644 index 7cee233c4f4ce2..00000000000000 --- a/.github/actions/dynamic/action.yaml +++ /dev/null @@ -1,38 +0,0 @@ -name: Dynamic -description: Dynamically resolves another GitHub action -inputs: - action: - description: Action reference - required: true - with: - description: Action inputs as multi-line YAML string - required: false - default: "" -outputs: - outputs: - description: JSON object of outputs from the action - value: ${{ steps.run.outputs.outputs }} -runs: - using: composite - steps: - - name: Instantiate - shell: bash - run: | - # Dynamically invoke ${{ inputs.action }} - with='${{ inputs.with }}' - [[ -z "$with" ]] || with="$(echo ' with:'; sed -e 's/^/ /' <<<"$with")" - mkdir -p ./.tmp/dynamic-action-instance - cat <./.tmp/dynamic-action-instance/action.yaml - runs: - using: composite - steps: - - id: run - uses: ${{ inputs.action }} - $with - outputs: - outputs: - value: $(echo '$'){{ toJSON(steps.run.outputs) }} - END - - name: Run - id: run - uses: ./.tmp/dynamic-action-instance diff --git a/.github/actions/git-safe-directory/action.yaml b/.github/actions/git-safe-directory/action.yaml deleted file mode 100644 index 1308c4ea1bf524..00000000000000 --- a/.github/actions/git-safe-directory/action.yaml +++ /dev/null @@ -1,9 +0,0 @@ -name: Git safe directory -description: For running act with checkout owned by non-root user -runs: - using: "composite" - steps: - - name: Set git safe.directory to "*" - if: ${{ env.ACT }} - shell: bash - run: git config --system --add safe.directory '*' \ No newline at end of file diff --git a/.github/actions/maximize-runner-disk/action.yaml b/.github/actions/maximize-runner-disk/action.yaml deleted file mode 100644 index d71ba3646d3279..00000000000000 --- a/.github/actions/maximize-runner-disk/action.yaml +++ /dev/null @@ -1,48 +0,0 @@ -name: Maximize runner disk -description: Free up disk space on the github runner -runs: - using: "composite" - steps: - - name: Free up disk space on the github runner - if: runner.os == 'Linux' && !env.ACT - shell: bash - run: | - # maximize-runner-disk - # Directories to prune to free up space. Candidates: - # 1.6G /usr/share/dotnet - # 1.1G /usr/local/lib/android/sdk/platforms - # 1000M /usr/local/lib/android/sdk/build-tools - # 8.9G /usr/local/lib/android/sdk - # This list can be amended later to change the trade-off between the amount of - # disk space freed up, and how long it takes to do so (deleting many files is slow). - prune=(/usr/share/dotnet /usr/local/lib/android/sdk/platforms /usr/local/lib/android/sdk/build-tools) - - if [[ "$UID" -eq 0 && -d /__w ]]; then - root=/runner-root-volume - if [[ ! -d "$root" ]]; then - echo "Unable to maximize disk space, job is running inside a container and $root is not mounted" - exit 0 - fi - function sudo() { "$@"; } # we're already root (and sudo is probably unavailable) - elif [[ "$UID" -ne 0 && "$RUNNER_ENVIRONMENT" == github-hosted ]]; then - root= - else - echo "Unable to maximize disk space, unknown runner environment" - exit 0 - fi - - echo "Freeing up runner disk space on ${root:-/}" - function avail() { df -k --output=avail "${root:-/}" | grep '^[0-9]*$'; } - function now() { date '+%s'; } - before="$(avail)" start="$(now)" - for dir in "${prune[@]}"; do - if [[ -d "${root}${dir}" ]]; then - echo "- $dir" - # du -sh -- "${root}${dir}" - sudo rm -rf -- "${root}${dir}" - else - echo "- $dir (not found)" - fi - done - after="$(avail)" end="$(now)" - echo "Done, freed up $(( (after - before) / 1024 ))M of disk space in $(( end - start )) seconds." diff --git a/.github/actions/perform-codeql-analysis/action.yaml b/.github/actions/perform-codeql-analysis/action.yaml deleted file mode 100644 index f1caf10dc3df1c..00000000000000 --- a/.github/actions/perform-codeql-analysis/action.yaml +++ /dev/null @@ -1,34 +0,0 @@ -name: Run CodeQL Analysis -description: Run and upload CodeQL Analysis -inputs: - language: - description: "language for codeql analysis" - required: true -runs: - using: "composite" - steps: - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 - with: - category: "/language:${{ inputs.language }}" - upload: False - output: sarif-results - - name: filter-sarif - uses: advanced-security/filter-sarif@v1 - with: - patterns: | - -**/third_party/** - -**/scripts/** - input: "sarif-results/${{ inputs.language }}.sarif" - output: "sarif-results/${{ inputs.language }}.sarif" - - - name: Upload SARIF - uses: github/codeql-action/upload-sarif@v2 - with: - sarif_file: "sarif-results/${{ inputs.language }}.sarif" - - name: Upload loc as a Build Artifact - uses: actions/upload-artifact@v4 - with: - name: sarif-results - path: sarif-results - retention-days: 1 diff --git a/.github/actions/setup-size-reports/action.yaml b/.github/actions/setup-size-reports/action.yaml deleted file mode 100644 index 511a434242d2e6..00000000000000 --- a/.github/actions/setup-size-reports/action.yaml +++ /dev/null @@ -1,15 +0,0 @@ -name: Setup size reports -description: Setup size reports -inputs: - gh-context: - description: "GH Context" - required: true - -runs: - using: "composite" - steps: - - name: Set up environment for size reports - shell: bash - env: - GH_CONTEXT: ${{ inputs.gh-context }} - run: scripts/tools/memory/gh_sizes_environment.py "${GH_CONTEXT}" diff --git a/.github/actions/upload-size-reports/action.yaml b/.github/actions/upload-size-reports/action.yaml deleted file mode 100644 index 41fe8c820c7cc0..00000000000000 --- a/.github/actions/upload-size-reports/action.yaml +++ /dev/null @@ -1,17 +0,0 @@ -name: upload-size-reports -description: upload-size-reports -inputs: - platform-name: - description: "Platform name Name" - required: true - -runs: - using: "composite" - steps: - - name: Uploading Size Reports - uses: actions/upload-artifact@v4 - if: ${{ !env.ACT }} - with: - name: Size,${{ inputs.platform-name }}-Examples,${{ env.GH_EVENT_PR }},${{ env.GH_EVENT_HASH }},${{ env.GH_EVENT_PARENT }},${{ github.event_name }} - path: | - /tmp/bloat_reports/ diff --git a/.github/boring-cyborg.yml b/.github/boring-cyborg.yml deleted file mode 100644 index c6fa9bcf943bef..00000000000000 --- a/.github/boring-cyborg.yml +++ /dev/null @@ -1,132 +0,0 @@ -# Copyright (c) 2020 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. -labelPRBasedOnFilePath: - ############################################################ - # Top Level Labels - ############################################################ - repo: - - ./* - - ############################################################ - # Examples - ############################################################ - examples: - - examples/* - - ############################################################ - # Documentation - ############################################################ - documentation: - - docs/* - - ############################################################ - # Tools + Development Items - ############################################################ - scripts: - - scripts/* - - integrations: - - integrations/* - - vscode: - - .vscode - - .devcontainer - - gn: - - gn/* - - github: - - .github - - workflows: - - .github/workflows/* - - tools: - - tools/* - - ############################################################ - # Source Code - ############################################################ - qr code: - - src/qrcode/* - - lwip: - - src/lwip/* - - inet: - - src/inet/* - - config: - - config/* - - lib: - - src/lib/* - - crypto: - - src/crypto/* - - controller: - - src/controller/* - - ble: - - src/ble/* - - app: - - src/app/* - - transport: - - src/transport/* - - system: - - src/system/* - - setup payload: - - src/setup_payload/* - - ############################################################ - # Platforms - ############################################################ - platform: - - src/platform/* - - darwin: - - src/platform/Darwin/* - - src/darwin/* - - efr32: - - src/platform/silabs/* - - esp32: - - src/platform/ESP32/* - - freeRTOS: - - src/platform/FreeRTOS/* - - k32w: - - src/platform/K32W/* - - linux: - - src/platform/Linux/* - - nrf connect: - - src/platform/nrfconnect/* - - openthread: - - src/platform/openthread/* - - zephyr: - - src/platform/Zephyr/* - - telink: - - src/platform/telink/* diff --git a/.github/config.yml b/.github/config.yml deleted file mode 100644 index 027b4dc4e4deca..00000000000000 --- a/.github/config.yml +++ /dev/null @@ -1,8 +0,0 @@ -todo: - keyword: ["@todo", "TODO", "TODO:"] # string|string[] - bodyKeyword: ["@body", "BODY", "BODY:"] # string|string[] - blobLines: 10 # number|boolean, 0 or false to disable - autoAssign: true # string|string[]|boolean - label: ["todo"] # boolean|string|string[] - reopenClosed: true # boolean - exclude: ".*lint\\.yaml|.*/(zzz_generated|zap-generated)/.*" # string diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index 8c618416fba4c1..00000000000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,61 +0,0 @@ -version: 2 -updates: - - package-ecosystem: "gradle" - directory: "/" - schedule: - interval: "weekly" - - - package-ecosystem: "pip" - directory: "/" - schedule: - interval: "weekly" - - - package-ecosystem: "github-actions" - directory: "/" - schedule: - interval: "weekly" - - - package-ecosystem: "gitsubmodule" - directory: "/" - schedule: - interval: "weekly" - allow: - - dependency-name: "third_party/pigweed/repo" - - dependency-name: "third_party/mbedtls/repo" - - dependency-name: "third_party/openthread/repo" - - - dependency-name: "third_party/ameba/repo" - - dependency-name: "third_party/android_deps/repo" - - dependency-name: "third_party/asr/repo" - - dependency-name: "third_party/boringssl/repo" - - dependency-name: "third_party/bouffalolab/repo" - - dependency-name: "third_party/cirque/repo" - - dependency-name: "third_party/editline/repo" - - dependency-name: "third_party/freertos/repo" - - dependency-name: "third_party/imgui/repo" - - dependency-name: "third_party/infineon/repo" - - dependency-name: "third_party/inipp/repo" - - dependency-name: "third_party/java_deps/repo" - - dependency-name: "third_party/jlink/repo" - - dependency-name: "third_party/jsoncpp/repo" - - dependency-name: "third_party/libwebsockets/repo" - - dependency-name: "third_party/lwip/repo" - - dependency-name: "third_party/mbed-mcu-boot/repo" - - dependency-name: "third_party/mbed-os-cypress-capsense-button/repo" - - dependency-name: "third_party/mbed-os-posix-socket/repo" - - dependency-name: "third_party/mbedtls/repo" - - dependency-name: "third_party/mt793x_sdk/repo" - - dependency-name: "third_party/mynewt-core/repo" - - dependency-name: "third_party/nanopb/repo" - - dependency-name: "third_party/nlassert/repo" - - dependency-name: "third_party/nlfaultinjection/repo" - - dependency-name: "third_party/nlio/repo" - - dependency-name: "third_party/nxp/repo" - - dependency-name: "third_party/open-iot-sdk/repo" - - dependency-name: "third_party/ot-br-posix/repo" - - dependency-name: "third_party/perfetto/repo" - - dependency-name: "third_party/qpg_sdk/repo" - - dependency-name: "third_party/silabs/repo" - - dependency-name: "third_party/simw-top-mini/repo" - - dependency-name: "third_party/ti_simplelink_sdk/repo" - - dependency-name: "third_party/tizen/repo" diff --git a/.github/issue-labeler.yml b/.github/issue-labeler.yml deleted file mode 100644 index 909ef045c039e4..00000000000000 --- a/.github/issue-labeler.yml +++ /dev/null @@ -1,54 +0,0 @@ -darwin: - # Make sure we don't match random words that contain "mac" inside. - # - # Make sure we don't match random words that contain "ios" inside - # (like "kiosk" or whatnot), but do allow matching "ios8" and things - # like that. - # - # Make sure we don't trigger for the string "MAC", which almost - # certainly has nothing to do with Darwin. - # - # \\b means "word boundary" - # (?![a-z]) means "there is no next char in the range a-z". - - "/(\\b[Ii][Oo][Ss](?![a-zA-Z])|[Hh][Oo][Mm][Ee][Pp][Oo][Dd]|[Dd][Aa][Rr][Ww][Ii][Nn]|\\bm[Aa][Cc]\\b|\\bMa[Cc]\\b|\\bM[Aa]c\\b|[Mm][Aa][Cc][Oo][Ss])/" - -linux: - - "/(linux)/i" - -# Special Keywords for Cert Blockers -air purifiers: - - "(Area:AirPurifiers)" -air quality sensors: - - "(Area:AirQualitySensor)" -concentration measurement: - - "(Area:ConcentrationMeasurement)" -device appearance: - - "(Area:DeviceAppearance)" -dishwashers: - - "(Area:Dishwashers)" -door lock enhancements: - - "(Area:DoorLockEnhancements)" -event list: - - "(Area;EventList)" -icd: - - "(Area:ICDPhase2)" -icd phase 2: - - "(Area:ICDPhase2)" -mode select: - - "(Area:ModeSelect)" -operational state: - - "(Area:OperationalState)" -refrigerators: - - "(Area:Refrigerators)" -robot vacuums: - - "(Area:RobotVacuums)" -room air conditioners: - - "(Area:RoomAirConditioner)" -scenes: - - "(Area:Scenes)" -smoke & c02: - - "(Area:SmokeCO2)" -temperature controlled cabinet: - - "(Area:TemperatureControlledCabinet)" -time sync: - - "(Area:TimeSync)" diff --git a/.github/labeler.yml b/.github/labeler.yml deleted file mode 100644 index 7e02fe6d368df3..00000000000000 --- a/.github/labeler.yml +++ /dev/null @@ -1,333 +0,0 @@ -# Copyright (c) 2020 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. - -############################################################ -# Top Level Labels -############################################################ -repo: - - changed-files: - - any-glob-to-any-file: - - './*' - -############################################################ -# Examples -############################################################ -examples: - - changed-files: - - any-glob-to-any-file: - - examples/* - - examples/**/* - -############################################################ -# Documentation -############################################################ -documentation: - - changed-files: - - any-glob-to-any-file: - - docs/* - - docs/**/* - - "*.md" - -############################################################ -# Tools + Development Items -############################################################ -scripts: - - changed-files: - - any-glob-to-any-file: - - scripts/* - - scripts/**/* - -integrations: - - changed-files: - - any-glob-to-any-file: - - integrations/* - - integrations/**/* - -docker: - - changed-files: - - any-glob-to-any-file: - - integrations/docker/* - - integrations/docker/**/* - -vscode: - - changed-files: - - any-glob-to-any-file: - - .vscode/* - - .vscode/**/* - - .devcontainer/* - - .devcontainer/**/* - -gn: - - changed-files: - - any-glob-to-any-file: - - build/* - - build/**/* - - build_overrides/* - - build_overrides/**/* - - .gn - - "*.gn" - - "*.gni" - -github: - - changed-files: - - any-glob-to-any-file: - - .github - - .github/* - - .github/**/* - -workflows: - - changed-files: - - any-glob-to-any-file: - - .github/workflows/* - - .github/workflows/**/* - -tools: - - changed-files: - - any-glob-to-any-file: - - src/tools/* - - src/tools/**/* - - tools/* - - tools/**/* - - examples/chip-tool/* - - examples/chip-tool/**/* - -############################################################ -# Tests -############################################################ -tests: - - changed-files: - - any-glob-to-any-file: - - src/python_testing/* - - src/python_testing/**/* - - src/app/tests/* - - src/app/tests/**/* - -test driver: - - changed-files: - - any-glob-to-any-file: - - src/test_driver/* - - src/test_driver/**/* - -# Cert tests touched: add current milestone delta-tracking label. -# TODO: Change after Aug 15, 2024 -matter-1.4-te2-script-change: - - changed-files: - - any-glob-to-any-file: - - src/python_testing/* - - src/python_testing/**/* - - src/app/tests/suites/certification/* - -############################################################ -# Source Code -############################################################ -qr code: - - changed-files: - - any-glob-to-any-file: - - src/qrcode/* - - src/qrcode/**/* - - src/qrcodetool/* - - src/qrcodetool/**/* - -lwip: - - changed-files: - - any-glob-to-any-file: - - src/lwip/* - - src/lwip/**/* - -inet: - - changed-files: - - any-glob-to-any-file: - - src/inet/* - - src/inet/**/* - -config: - - changed-files: - - any-glob-to-any-file: - - config/* - - config/**/* - -lib: - - changed-files: - - any-glob-to-any-file: - - src/lib/* - - src/lib/**/* - -core: - - changed-files: - - any-glob-to-any-file: - - src/lib/core/* - - src/lib/core/**/* - -protocols: - - changed-files: - - any-glob-to-any-file: - - src/lib/protocols/* - - src/lib/protocols/**/* - - src/protocols/* - - src/protocols/**/* - -messaging: - - changed-files: - - any-glob-to-any-file: - - src/messaging/* - - src/messaging/**/* - -shell: - - changed-files: - - any-glob-to-any-file: - - src/lib/shell/* - - src/lib/shell/**/* - -support: - - changed-files: - - any-glob-to-any-file: - - src/lib/support/* - - src/lib/support/**/* - -crypto: - - changed-files: - - any-glob-to-any-file: - - src/crypto/* - - src/crypto/**/* - -controller: - - changed-files: - - any-glob-to-any-file: - - src/controller/* - - src/controller/**/* - -ble: - - changed-files: - - any-glob-to-any-file: - - src/ble/* - - src/ble/**/* - -app: - - changed-files: - - any-glob-to-any-file: - - src/app/* - - src/app/**/* - -icd: - - changed-files: - - any-glob-to-any-file: - - src/app/icd/* - - src/app/icd/**/* - -transport: - - changed-files: - - any-glob-to-any-file: - - src/transport/* - - src/transport/**/* - -system: - - changed-files: - - any-glob-to-any-file: - - src/system/* - - src/system/**/* - -setup payload: - - changed-files: - - any-glob-to-any-file: - - src/setup_payload/* - - src/setup_payload/**/* - -############################################################ -# Platforms -############################################################ -platform: - - changed-files: - - any-glob-to-any-file: - - src/platform/* - - src/platform/**/* - - config/tizen/chip-gn/platform/* - - config/tizen/chip-gn/platform/**/* - - examples/platform/* - - examples/platform/**/* - - scripts/tools/memory/platform/* - - scripts/tools/memory/platform/**/* - - src/include/platform/* - - src/include/platform/**/* - - src/lib/dnssd/platform/* - - src/lib/dnssd/platform/**/* - -darwin: - - changed-files: - - any-glob-to-any-file: - - src/platform/Darwin/* - - src/platform/Darwin/**/* - - src/darwin/* - - src/darwin/**/* - - examples/darwin-framework-tool/* - - examples/darwin-framework-tool/**/* - -silabs: - - changed-files: - - any-glob-to-any-file: - - src/platform/silabs/* - - src/platform/silabs/**/* - -esp32: - - changed-files: - - any-glob-to-any-file: - - src/platform/ESP32/* - - src/platform/ESP32/**/* - -freeRTOS: - - changed-files: - - any-glob-to-any-file: - - src/platform/FreeRTOS/* - - src/platform/FreeRTOS/**/* - -k32w: - - changed-files: - - any-glob-to-any-file: - - src/platform/K32W/* - - src/platform/K32W/**/* - -linux: - - changed-files: - - any-glob-to-any-file: - - src/platform/Linux/* - - src/platform/Linux/**/* - -nrf connect: - - changed-files: - - any-glob-to-any-file: - - src/platform/nrfconnect/* - - src/platform/nrfconnect/**/* - -openthread: - - changed-files: - - any-glob-to-any-file: - - src/platform/openthread/* - - src/platform/openthread/**/* - -zephyr: - - changed-files: - - any-glob-to-any-file: - - src/platform/Zephyr/* - - src/platform/Zephyr/**/* - -telink: - - changed-files: - - any-glob-to-any-file: - - src/platform/telink/* - - src/platform/telink/**/* - -tizen: - - changed-files: - - any-glob-to-any-file: - - src/platform/Tizen/* - - src/platform/Tizen/**/* diff --git a/.github/release.yml b/.github/release.yml deleted file mode 100644 index d33d2a3e6ddf48..00000000000000 --- a/.github/release.yml +++ /dev/null @@ -1,76 +0,0 @@ -# .github/release.yml - -changelog: - exclude: - labels: - - scripts - - external dependency - - submodules - - integrations - - documentation - authors: - - restyled-io - - octocat - - pullapprove - - jira - - issue-label-bot - - github-actions - - github-labels - - buildjet - categories: - - title: Highlighted Fixes - labels: - - release note - - title: Security Fixes - labels: - - security - - title: Bug Fixes - labels: - - bug - - title: Bluetooth Related Changes - labels: - - ble - - title: Spec Alignment Changes - labels: - - spec - - title: Transport/Messaging Layer Changes - labels: - - inet - - transport - - messaging - - protocols - - lwip - - title: Crypto Changes - labels: - - crypto - - title: Core Library Changes - labels: - - lib - - title: Core Changes - labels: - - core - - title: Controller Changes - labels: - - controller - - title: System Level Changes - labels: - - system - - attestation - - title: App Level Changes - labels: - - app - - title: Platform Changes - labels: - - platform - - darwin - - android - - title: Example App Changes - labels: - - examples - - title: Test Changes - labels: - - tests - - title: Build Related Changes - labels: - - gn - - build diff --git a/.github/workflows/artifacts.yaml b/.github/workflows/artifacts.yaml deleted file mode 100644 index 002d945ebc0f09..00000000000000 --- a/.github/workflows/artifacts.yaml +++ /dev/null @@ -1,17 +0,0 @@ -name: 'Delete old artifacts' -on: - schedule: - - cron: '0 * * * *' # every hour - -concurrency: - group: ${{ github.workflow }} - cancel-in-progress: true - -jobs: - delete-artifacts: - runs-on: ubuntu-latest - steps: - - uses: kolpav/purge-artifacts-action@v1 - with: - token: ${{ secrets.GITHUB_TOKEN }} - expire-in: 14days diff --git a/.github/workflows/bloat_check.yaml b/.github/workflows/bloat_check.yaml deleted file mode 100644 index 870c5f379e5eb8..00000000000000 --- a/.github/workflows/bloat_check.yaml +++ /dev/null @@ -1,53 +0,0 @@ -# Copyright (c) 2020 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. - -name: Bloat Check -on: - workflow_dispatch: - schedule: - - cron: "*/5 * * * *" - -concurrency: - group: ${{ github.workflow }} - # Don't cancel an already-running bloat check just because it took more - # than 5 minutes to run and our cron job is trying to schedule a new one. - cancel-in-progress: false - -jobs: - pull_request_update: - name: Report on pull requests - - # Don't run on forked repos - if: github.repository_owner == 'project-chip' - - runs-on: ubuntu-latest - - container: - image: ghcr.io/project-chip/chip-build:74 - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Report - run: | - scripts/tools/memory/gh_report.py \ - --verbose \ - --report-increases 0.2 \ - --report-pr \ - --github-comment \ - --github-limit-artifact-pages 50 \ - --github-limit-artifacts 500 \ - --github-limit-comments 20 \ - --github-repository project-chip/connectedhomeip \ - --github-api-token "${{ secrets.GITHUB_TOKEN }}" diff --git a/.github/workflows/build-cert-bins.yaml b/.github/workflows/build-cert-bins.yaml deleted file mode 100644 index 52c274193b4fc1..00000000000000 --- a/.github/workflows/build-cert-bins.yaml +++ /dev/null @@ -1,21 +0,0 @@ -name: Build Certification Image -on: - workflow_call: - workflow_dispatch: -jobs: - build-cert-bin: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@master - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - name: Publish to Registry - uses: elgohr/Publish-Docker-Github-Action@v5 - with: - name: ghcr.io/project-chip/chip-cert-bins - tags: latest - dockerfile: ./integrations/docker/images/chip-cert-bins/Dockerfile - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - registry: ghcr.io - platforms: linux/amd64,linux/arm64,linux/arm diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml deleted file mode 100644 index 83ecc7e00a2192..00000000000000 --- a/.github/workflows/build.yaml +++ /dev/null @@ -1,476 +0,0 @@ -# Copyright (c) 2020-2021 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. - -name: Builds - -on: - push: - branches-ignore: - - 'dependabot/**' - pull_request: - merge_group: - workflow_dispatch: - workflow_call: - inputs: - run-codeql: - required: false - type: boolean - -concurrency: - group: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true - -env: - CHIP_NO_LOG_TIMESTAMPS: true - -jobs: - build_linux_gcc_debug: - name: Build on Linux (gcc_debug) - - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build:74 - volumes: - - "/:/runner-root-volume" - - "/tmp/log_output:/tmp/test_logs" - options: --privileged --sysctl "net.ipv6.conf.all.disable_ipv6=0 - net.ipv4.conf.all.forwarding=1 net.ipv6.conf.all.forwarding=1" - - steps: - - name: Dump GitHub context - env: - GITHUB_CONTEXT: ${{ toJSON(github) }} - run: echo "$GITHUB_CONTEXT" - - name: Dump Concurrency context - env: - CONCURRENCY_CONTEXT: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }} - run: echo "$CONCURRENCY_CONTEXT" - - name: Checkout - uses: actions/checkout@v4 - - name: Try to ensure the directories for core dumping exist and we - can write them. - run: | - mkdir /tmp/cores || true - sysctl -w kernel.core_pattern=/tmp/cores/core.%u.%p.%t || true - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: linux - - name: Initialize CodeQL - if: ${{ inputs.run-codeql }} - uses: github/codeql-action/init@v3 - with: - languages: "cpp" - - name: Setup Build - run: scripts/build/gn_gen.sh --args="chip_config_memory_debug_checks=true chip_config_memory_debug_dmalloc=false chip_data_model_check_die_on_failure=true" - - name: Run Build - run: scripts/run_in_build_env.sh "ninja -C ./out" - - name: Run Tests - run: scripts/tests/gn_tests.sh - # TODO Log Upload https://github.com/project-chip/connectedhomeip/issues/2227 - # TODO https://github.com/project-chip/connectedhomeip/issues/1512 - # - name: Run Code Coverage - # if: ${{ contains('main', env.BUILD_TYPE) }} - # run: scripts/tools/codecoverage.sh - # - name: Upload Code Coverage - # if: ${{ contains('main', env.BUILD_TYPE) }} - # run: bash <(curl -s https://codecov.io/bash) - - name: Set up Build Without Detail Logging - run: scripts/build/gn_gen.sh --args="chip_detail_logging=false" - - name: Run Build Without Detail Logging - run: scripts/run_in_build_env.sh "ninja -C ./out" - - name: Set up Build Without Progress Logging - run: scripts/build/gn_gen.sh --args="chip_detail_logging=false chip_progress_logging=false" - - name: Run Build Without Progress Logging - run: scripts/run_in_build_env.sh "ninja -C ./out" - - name: Set up Build Without Error Logging - run: scripts/build/gn_gen.sh --args="chip_detail_logging=false chip_progress_logging=false chip_error_logging=false" - - name: Run Build Without Error Logging - run: scripts/run_in_build_env.sh "ninja -C ./out" - - name: Set up Build Without Logging - run: scripts/build/gn_gen.sh --args="chip_logging=false" - - name: Run Build Without Logging - run: scripts/run_in_build_env.sh "ninja -C ./out" - - name: Uploading core files - uses: actions/upload-artifact@v4 - if: ${{ failure() && !env.ACT }} - with: - name: crash-core-linux-gcc-debug - path: /tmp/cores/ - # Cores are big; don't hold on to them too long. - retention-days: 5 - - name: Perform CodeQL Analysis - if: ${{ inputs.run-codeql }} - uses: ./.github/actions/perform-codeql-analysis - with: - language: cpp - # OBJDIR on linux is > 10K files and takes more than 50 minutes to upload, usually - # having the job timeout. - # - # If re-enabling, some subset of this should be picked - # - # - name: Uploading objdir for debugging - # uses: actions/upload-artifact@v4 - # if: ${{ failure() && !env.ACT }} - # with: - # name: crash-objdir-linux-gcc-debug - # path: out/ - # # objdirs are big; don't hold on to them too long. - # retention-days: 5 - - build_linux: - name: Build on Linux (fake, gcc_release, clang, simulated) - - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build:74 - volumes: - - "/:/runner-root-volume" - - "/tmp/log_output:/tmp/test_logs" - options: --privileged --sysctl "net.ipv6.conf.all.disable_ipv6=0 - net.ipv4.conf.all.forwarding=1 net.ipv6.conf.all.forwarding=1" - - steps: - - name: Dump GitHub context - env: - GITHUB_CONTEXT: ${{ toJSON(github) }} - run: echo "$GITHUB_CONTEXT" - - name: Dump Concurrency context - env: - CONCURRENCY_CONTEXT: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }} - run: echo "$CONCURRENCY_CONTEXT" - - name: Checkout - uses: actions/checkout@v4 - - name: Try to ensure the directories for core dumping exist and we - can write them. - run: | - mkdir /tmp/cores || true - sysctl -w kernel.core_pattern=/tmp/cores/core.%u.%p.%t || true - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: linux - - name: Initialize CodeQL - if: ${{ inputs.run-codeql }} - uses: github/codeql-action/init@v3 - with: - languages: "cpp" - - name: Setup and Build Simulated Device - run: | - BUILD_TYPE=simulated - GN_ARGS='chip_tests_zap_config="app1" chip_project_config_include_dirs=["../../examples/placeholder/linux/apps/app1/include", "../../config/standalone"] chip_config_network_layer_ble=false' - CHIP_ROOT_PATH=examples/placeholder/linux - CHIP_ROOT_PATH="$CHIP_ROOT_PATH" BUILD_TYPE="$BUILD_TYPE" scripts/build/gn_gen.sh --args="$GN_ARGS" - scripts/run_in_build_env.sh "ninja -C ./out/$BUILD_TYPE" - - name: Setup Build, Run Build and Run Tests - run: | - BUILD_TYPE=gcc_release scripts/build/gn_gen.sh --args="is_debug=false chip_data_model_check_die_on_failure=true" - scripts/run_in_build_env.sh "ninja -C ./out/gcc_release" - BUILD_TYPE=gcc_release scripts/tests/gn_tests.sh - - name: Clean output - run: rm -rf ./out - - name: Run Tests with sanitizers - env: - LSAN_OPTIONS: detect_leaks=1 - run: | - for BUILD_TYPE in asan tsan ubsan; do - case $BUILD_TYPE in - "asan") GN_ARGS='is_clang=true is_asan=true';; - "msan") GN_ARGS='is_clang=true is_msan=true';; - "tsan") GN_ARGS='is_clang=true is_tsan=true chip_enable_wifi=false';; - "ubsan") GN_ARGS='is_clang=true is_ubsan=true';; - esac - - rm -rf ./out/sanitizers - BUILD_TYPE=sanitizers scripts/build/gn_gen.sh --args="$GN_ARGS chip_data_model_check_die_on_failure=true" --export-compile-commands - BUILD_TYPE=sanitizers scripts/tests/gn_tests.sh - done - - name: Ensure codegen is done for sanitize - run: | - ./scripts/run_in_build_env.sh "./scripts/run_codegen_targets.sh out/sanitizers" - - name: Clang-tidy validation - # NOTE: clang-tidy crashes on CodegenDataModel_Write due to Nullable/std::optional check. - # See https://github.com/llvm/llvm-project/issues/97426 - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/run-clang-tidy-on-compile-commands.py \ - --compile-database out/sanitizers/compile_commands.json \ - --file-exclude-regex '/(repo|zzz_generated|lwip/standalone)/|-ReadImpl|-InvokeSubscribeImpl|CodegenDataModel_Write|QuieterReporting' \ - check \ - " - - name: Clean output - run: rm -rf ./out - - name: Build using build_examples.py - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target linux-x64-minmdns-ipv6only-clang \ - --target linux-x64-rpc-console \ - build \ - " - - name: Create a pre-generate directory and ensure compile-time codegen would fail - run: | - ./scripts/run_in_build_env.sh "./scripts/codepregen.py ./zzz_pregenerated" - mv scripts/codegen.py scripts/codegen.py.renamed - mv scripts/tools/zap/generate.py scripts/tools/zap/generate.py.renamed - - name: Clean output - run: rm -rf ./out - - name: Build using build_examples.py (pregen) - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target linux-x64-all-clusters-ipv6only-clang \ - --target linux-x64-chip-tool-ipv6only-clang \ - --pregen-dir ./zzz_pregenerated \ - build \ - " - - name: Undo code pre-generation changes (make compile time codegen work again) - run: | - rm -rf ./zzz_pregenerated - mv scripts/codegen.py.renamed scripts/codegen.py - mv scripts/tools/zap/generate.py.renamed scripts/tools/zap/generate.py - - name: Run fake linux tests with build_examples - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py --target linux-fake-tests build" - - name: Perform CodeQL Analysis - if: ${{ inputs.run-codeql }} - uses: ./.github/actions/perform-codeql-analysis - with: - language: cpp - - - name: Uploading core files - uses: actions/upload-artifact@v4 - if: ${{ failure() && !env.ACT }} - with: - name: crash-core-linux - path: /tmp/cores/ - # Cores are big; don't hold on to them too long. - retention-days: 5 - # OBJDIR on linux is > 10K files and takes more than 50 minutes to upload, usually - # having the job timeout. - # - # If re-enabling, some subset of this should be picked - # - # - name: Uploading objdir for debugging - # uses: actions/upload-artifact@v4 - # if: ${{ failure() && !env.ACT }} - # with: - # name: crash-objdir-linux - # path: out/ - # # objdirs are big; don't hold on to them too long. - # retention-days: 5 - - build_linux_python_lib: - name: Build on Linux (python_lib) - - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build:74 - volumes: - - "/:/runner-root-volume" - - "/tmp/log_output:/tmp/test_logs" - options: --sysctl "net.ipv6.conf.all.disable_ipv6=0 - net.ipv4.conf.all.forwarding=1 net.ipv6.conf.all.forwarding=1" - - steps: - - name: Dump GitHub context - env: - GITHUB_CONTEXT: ${{ toJSON(github) }} - run: echo "$GITHUB_CONTEXT" - - name: Dump Concurrency context - env: - CONCURRENCY_CONTEXT: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }} - run: echo "$CONCURRENCY_CONTEXT" - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: linux - - - name: Setup Build, Run Build and Run Tests - run: | - scripts/build/gn_gen.sh --args="enable_rtti=true chip_config_memory_debug_checks=false chip_config_memory_debug_dmalloc=false chip_generate_link_map_file=false chip_data_model_check_die_on_failure=true" - scripts/run_in_build_env.sh "ninja -C ./out" - scripts/tests/gn_tests.sh - - name: Setup test python environment - shell: bash - run: | - scripts/run_in_build_env.sh 'virtualenv pyenv' - source pyenv/bin/activate - python -m ensurepip --upgrade - python -m pip install ./out/controller/python/chip_core-0.0-cp37-abi3-linux_x86_64.whl - python -m pip install ./out/controller/python/chip_clusters-0.0-py3-none-any.whl - python -m pip install ./out/controller/python/chip_repl-0.0-py3-none-any.whl - - - name: Run Python tests - shell: bash - run: | - source pyenv/bin/activate - cd src/controller/python/test/unit_tests/ - python3 -m unittest -v - - name: Clean previous outputs - run: rm -rf out pyenv - - name: Run Python Setup Payload Generator Test - shell: bash - run: | - scripts/run_in_build_env.sh 'scripts/examples/gn_build_example.sh examples/chip-tool out/' - scripts/run_in_build_env.sh 'virtualenv pyenv' - source pyenv/bin/activate - python -m ensurepip --upgrade - python -m pip install -r scripts/setup/requirements.setuppayload.txt - python3 src/setup_payload/tests/run_python_setup_payload_test.py out/chip-tool - - build_linux_python_lighting_device: - name: Build on Linux (python lighting-app) - - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build:74 - volumes: - - "/:/runner-root-volume" - - "/tmp/log_output:/tmp/test_logs" - options: --sysctl "net.ipv6.conf.all.disable_ipv6=0 - net.ipv4.conf.all.forwarding=1 net.ipv6.conf.all.forwarding=1" - - steps: - - name: Dump GitHub context - env: - GITHUB_CONTEXT: ${{ toJSON(github) }} - run: echo "$GITHUB_CONTEXT" - - name: Dump Concurrency context - env: - CONCURRENCY_CONTEXT: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }} - run: echo "$CONCURRENCY_CONTEXT" - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: linux - - - name: Setup Build - run: | - scripts/build_python_device.sh --chip_detail_logging true - - build_darwin: - name: Build on Darwin (clang, python_lib, simulated) - runs-on: macos-13 - if: github.actor != 'restyled-io[bot]' - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: darwin - - name: Try to ensure the directory for diagnostic log collection exists - run: | - mkdir -p ~/Library/Logs/DiagnosticReports || true - - name: Initialize CodeQL - if: ${{ inputs.run-codeql }} - uses: github/codeql-action/init@v3 - with: - languages: "cpp" - - - name: Setup and Build Simulated Device - run: | - BUILD_TYPE=simulated - GN_ARGS='chip_tests_zap_config="app1" chip_project_config_include_dirs=["../../examples/placeholder/linux/apps/app1/include", "../../config/standalone"] chip_config_network_layer_ble=false' - CHIP_ROOT_PATH=examples/placeholder/linux - CHIP_ROOT_PATH="$CHIP_ROOT_PATH" BUILD_TYPE="$BUILD_TYPE" scripts/build/gn_gen.sh --args="$GN_ARGS" - scripts/run_in_build_env.sh "ninja -C ./out/$BUILD_TYPE" - - name: Setup Build, Run Build and Run Tests - # We can't enable leak checking here in LSAN_OPTIONS, because on - # Darwin that's only supported with a new enough clang, and we're - # not building with the pigweed clang here. - run: | - for BUILD_TYPE in default python_lib; do - case $BUILD_TYPE in - # We want to build various standalone example apps - # (similar to what examples-linux-standalone.yaml - # does), so use target_os="all" to get those picked - # up as part of the "unified" build. But then to - # save CI resources we want to exclude the - # "host clang" build, which uses the pigweed - # clang. - "default") GN_ARGS='target_os="all" is_asan=true enable_host_clang_build=false';; - esac - BUILD_TYPE=$BUILD_TYPE scripts/build/gn_gen.sh --args="$GN_ARGS chip_data_model_check_die_on_failure=true" --export-compile-commands - scripts/run_in_build_env.sh "ninja -C ./out/$BUILD_TYPE" - BUILD_TYPE=$BUILD_TYPE scripts/tests/gn_tests.sh - done - - name: Ensure codegen is done for sanitize - run: | - ./scripts/run_in_build_env.sh "./scripts/run_codegen_targets.sh out/default" - - name: Clang-tidy validation - # NOTE: clang-tidy crashes on CodegenDataModel_Write due to Nullable/std::optional check. - # See https://github.com/llvm/llvm-project/issues/97426 - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/run-clang-tidy-on-compile-commands.py \ - --compile-database out/default/compile_commands.json \ - --file-exclude-regex '/(repo|zzz_generated|lwip/standalone)/|CodegenDataModel_Write|QuieterReporting' \ - check \ - " - - name: Uploading diagnostic logs - uses: actions/upload-artifact@v4 - if: ${{ failure() && !env.ACT }} - with: - name: crash-log-darwin - path: ~/Library/Logs/DiagnosticReports/ - - - name: Perform CodeQL Analysis - if: ${{ inputs.run-codeql }} - uses: ./.github/actions/perform-codeql-analysis - with: - language: cpp - - # TODO Log Upload https://github.com/project-chip/connectedhomeip/issues/2227 - # TODO https://github.com/project-chip/connectedhomeip/issues/1512 - - build_linux_gcc_coverage: - name: Build on Linux (coverage) - - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build:74 - volumes: - - "/:/runner-root-volume" - - "/tmp/log_output:/tmp/test_logs" - options: --privileged --sysctl "net.ipv6.conf.all.disable_ipv6=0 - net.ipv4.conf.all.forwarding=1 net.ipv6.conf.all.forwarding=1" - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: linux - - - name: Run Build Coverage - run: ./scripts/build_coverage.sh diff --git a/.github/workflows/buildjet-cache-delete.yaml b/.github/workflows/buildjet-cache-delete.yaml deleted file mode 100644 index f5c4e0668b1aed..00000000000000 --- a/.github/workflows/buildjet-cache-delete.yaml +++ /dev/null @@ -1,17 +0,0 @@ -name: Manually Delete BuildJet Cache -on: - workflow_dispatch: - inputs: - cache_key: - description: 'BuildJet Cache Key to Delete' - required: true - type: string -jobs: - manually-delete-buildjet-cache: - runs-on: buildjet-2vcpu-ubuntu-2204 - steps: - - name: Checkout - uses: actions/checkout@v4 - - uses: buildjet/cache-delete@v1 - with: - cache_key: ${{ inputs.cache_key }} \ No newline at end of file diff --git a/.github/workflows/cert_test_checks.yaml b/.github/workflows/cert_test_checks.yaml deleted file mode 100644 index 44d545a6636897..00000000000000 --- a/.github/workflows/cert_test_checks.yaml +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright (c) 2024 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. - -name: Certification test checks - -on: - pull_request: - paths: - - "src/app/tests/suites/certification/**" - -jobs: - check-certification-tests: - name: Check for common problems in certification tests - runs-on: ubuntu-latest - - container: - image: ghcr.io/project-chip/chip-build - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Run checks - run: | - python3 scripts/tests/matter_yaml_linter.py diff --git a/.github/workflows/check-data-model-directory-updates.yaml b/.github/workflows/check-data-model-directory-updates.yaml deleted file mode 100644 index 305da81d9da817..00000000000000 --- a/.github/workflows/check-data-model-directory-updates.yaml +++ /dev/null @@ -1,31 +0,0 @@ -# Copyright (c) 2024 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. - -name: Check for changes to data_model directory without a sha update - -on: - pull_request: - paths: - - "data_model/**" - -jobs: - check-submodule-update-label: - name: Check for changes to data_model directory without a sha update - runs-on: ubuntu-latest - if: "git diff --name-only HEAD^..HEAD data_model/ | grep -q spec_sha" - steps: - - name: Error Message - run: echo This pull request attempts to update data_model directory, but is missing updates to spec_sha file with the latest version of the sha. Files in the data_model directory are generated automatically and should not be updated manually. - - name: Fail Job - run: exit 1 diff --git a/.github/workflows/chef.yaml b/.github/workflows/chef.yaml deleted file mode 100644 index 642cdb6cf87e92..00000000000000 --- a/.github/workflows/chef.yaml +++ /dev/null @@ -1,117 +0,0 @@ -# Copyright (c) 2021 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. - -name: Build Chef CI examples on all platforms - -on: - push: - branches-ignore: - - 'dependabot/**' - pull_request: - merge_group: - -concurrency: - group: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true - -env: - CHIP_NO_LOG_TIMESTAMPS: true - -jobs: - chef_linux: - name: Chef - Linux CI Examples - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build:74 - options: --user root - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: linux - - name: CI Examples Linux - shell: bash - run: | - ./scripts/run_in_build_env.sh "./examples/chef/chef.py --ci -t linux" - - chef_esp32: - name: Chef - ESP32 CI Examples - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build-esp32:74 - options: --user root - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: esp32 - - name: CI Examples ESP32 - shell: bash - run: | - ./scripts/run_in_build_env.sh "./examples/chef/chef.py --ci -t esp32" - - chef_nrfconnect: - name: Chef - NRFConnect CI Examples - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build-nrf-platform:74 - options: --user root - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: nrfconnect - - name: CI Examples NRFConnect - shell: bash - run: | - ./scripts/run_in_build_env.sh "./examples/chef/chef.py --ci -t nrfconnect" - - chef_telink: - name: Chef - Telink CI Examples - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build-telink:74 - options: --user root - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: telink - # - name: Update Zephyr to specific revision (for developers purpose) - # shell: bash - # run: scripts/run_in_build_env.sh "python3 scripts/tools/telink/update_zephyr.py ab81a585fca6a83b30e1f4e58a021113d6a3acb8" - - name: CI Examples Telink - shell: bash - run: | - ./scripts/run_in_build_env.sh "./examples/chef/chef.py --ci -t telink" diff --git a/.github/workflows/cherry-picks.yaml b/.github/workflows/cherry-picks.yaml deleted file mode 100644 index a062aa5fcf9b87..00000000000000 --- a/.github/workflows/cherry-picks.yaml +++ /dev/null @@ -1,37 +0,0 @@ -name: Cherry-Pick Merges - -on: - pull_request_target: - branches: - - master - types: ["closed"] - -jobs: - cherry_pick_release_v1_0: - runs-on: ubuntu-latest - name: Cherry-Pick into SVE - if: | - (github.event.pull_request.merged == true) - && ( - (contains(github.event.pull_request.labels.*.name, 'sve')) - || (contains(github.event.pull_request.labels.*.name, 'request sve')) - || (contains(github.event.pull_request.labels.*.name, 'cert blocker')) - ) - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: Cherry-Pick into sve branch - uses: carloscastrojumo/github-cherry-pick-action@v1.0.9 - with: - token: ${{ secrets.MATTER_PAT }} - branch: 1.3-sve - labels: | - sve cherry pick - reviewers: | - woody-apple - andy31415 - raju-apple -env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/cirque.yaml b/.github/workflows/cirque.yaml deleted file mode 100644 index 6fe17c3558c767..00000000000000 --- a/.github/workflows/cirque.yaml +++ /dev/null @@ -1,136 +0,0 @@ -# Copyright (c) 2020-2023 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. - -name: Cirque - -on: - push: - branches-ignore: - - 'dependabot/**' - pull_request: - merge_group: - workflow_dispatch: - -concurrency: - group: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true - -env: - CHIP_NO_LOG_TIMESTAMPS: true - -jobs: - cirque: - name: Cirque - - env: - GITHUB_CACHE_PATH: /tmp/cirque-cache - - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - # need to run with privilege, which isn't supported by job.XXX.contaner - # https://github.com/actions/container-action/issues/2 - # container: - # image: ghcr.io/project-chip/chip-build-cirque: - # volumes: - # - "/tmp:/tmp" - # - "/dev/pts:/dev/pts" - # env: - # LOG_DIR: /tmp/cirque_test_output/ - # CLEANUP_DOCKER_FOR_CI: 1 - # options: "--privileged" - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules - uses: ./.github/actions/checkout-submodules - with: - platform: linux - - # TODO: Is what's being cached here actually compatible with a regular bootstrap? - - name: Bootstrap Cache - uses: ./.github/actions/bootstrap-cache - - name: Bootstrap Cirque - run: | - integrations/docker/images/stage-2/chip-build-cirque/run.sh \ - -- sh -c " \ - git config --global --add safe.directory '*' \ - && bash scripts/bootstrap.sh \ - && chown -R $(id -u):$(id -g) .environment \ - " - - - name: Get Cirque Bootstrap cache key - id: cirque-bootstrap-cache-key - run: echo "val=$(scripts/tests/cirque_tests.sh cachekeyhash)" >> $GITHUB_OUTPUT - - uses: Wandalen/wretry.action@v1.4.10 - name: Cirque Bootstrap cache - if: ${{ !env.ACT }} - continue-on-error: true - timeout-minutes: 10 - with: - action: buildjet/cache@v3 - attempt_limit: 3 - attempt_delay: 2000 - with: | - key: ${{ runner.os }}-cirque-${{ steps.cirque-bootstrap-cache-key.outputs.val }} - restore-keys: ${{ runner.os }}-cirque- - path: ${{ env.GITHUB_CACHE_PATH }} - - name: Cirque Bootstrap - run: | - integrations/docker/images/stage-2/chip-build-cirque/run.sh \ - --env GITHUB_ACTION_RUN=1 \ - --env GITHUB_CACHE_PATH=${{ env.GITHUB_CACHE_PATH }} \ - --volume /tmp:/tmp \ - -- sh -c " \ - git config --global --add safe.directory '*' \ - && scripts/tests/cirque_tests.sh bootstrap \ - " - - - name: Artifact suffix - id: outsuffix - uses: haya14busa/action-cond@v1 - if: ${{ !env.ACT }} - with: - cond: ${{ github.event.pull_request.number == '' }} - if_true: "${{ github.sha }}" - if_false: "pull-${{ github.event.pull_request.number }}" - - name: Build Binaries - run: | - integrations/docker/images/stage-2/chip-build-cirque/run.sh \ - -- sh -c " \ - git config --global --add safe.directory '*' \ - && scripts/build/gn_gen_cirque.sh \ - " - - name: Run Tests - run: | - integrations/docker/images/stage-2/chip-build-cirque/run.sh \ - --env LOG_DIR=/tmp/cirque_test_output \ - --env CLEANUP_DOCKER_FOR_CI=1 \ - --env GITHUB_ACTION_RUN=1 \ - --privileged \ - --volume /tmp:/tmp \ - --volume /dev/pts:/dev/pts \ - -- sh -c " \ - git config --global --add safe.directory '*' \ - && scripts/tests/cirque_tests.sh run_all_tests \ - " - - - - name: Uploading Binaries - uses: actions/upload-artifact@v4 - if: ${{ always() && !env.ACT }} - with: - name: cirque_log-${{steps.outsuffix.outputs.value}}-logs - path: /tmp/cirque_test_output/ diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml deleted file mode 100644 index 6b150397783138..00000000000000 --- a/.github/workflows/codeql.yml +++ /dev/null @@ -1,29 +0,0 @@ -# Copyright (c) 2020-2023 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. -name: "CodeQL" - -on: - workflow_dispatch: -# push: -# branches: [ "master", "sve*", "test_event_*", "v1.*" ] -# pull_request: - schedule: - - cron: '0 5 * * *' - -jobs: - analyze: - uses: project-chip/connectedhomeip/.github/workflows/build.yaml@master - with: - run-codeql: true - diff --git a/.github/workflows/darwin-tests.yaml b/.github/workflows/darwin-tests.yaml deleted file mode 100644 index 815293204b09de..00000000000000 --- a/.github/workflows/darwin-tests.yaml +++ /dev/null @@ -1,161 +0,0 @@ -# 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. - -name: Darwin Tests - -on: - push: - branches-ignore: - - 'dependabot/**' - pull_request: - merge_group: - workflow_dispatch: - -concurrency: - group: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == - 'pull_request' && github.event.number) || (github.event_name == - 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true - -env: - CHIP_NO_LOG_TIMESTAMPS: true - -jobs: - test_suites_chip_tool_darwin: - name: Test Suites - Darwin - - strategy: - matrix: - build_variant: [no-ble-asan-clang] - env: - BUILD_VARIANT: ${{matrix.build_variant}} - - # We can't use the pigweed clang to build the Darwin framework once we start using - # Swift, because it does not handle CLANG_ENABLE_MODULES correctly. - # - # But the Xcode clang does not handle LSan correctly. Since we can't easily apply - # LSAN_OPTIONS to just everything except darwin-framework-tool, instead disable asan for - # it. - BUILD_VARIANT_FRAMEWORK_TOOL: no-ble - LSAN_OPTIONS: detect_leaks=1 malloc_context_size=40 suppressions=scripts/tests/chiptest/lsan-mac-suppressions.txt - - if: github.actor != 'restyled-io[bot]' - runs-on: macos-13 - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Setup Environment - # coreutils for stdbuf - run: brew install coreutils - - name: - Try to ensure the directories for core dumping and diagnostic - log collection exist and we can write them. - run: | - sudo chown ${USER} /cores || true - mkdir -p ~/Library/Logs/DiagnosticReports || true - mkdir objdir-clone || true - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: darwin - bootstrap-log-name: bootstrap-logs-darwin-${{ matrix.build_variant }} - - - name: Run macOS Darwin Framework Tool Build Debug - working-directory: src/darwin/Framework - run: xcodebuild -target "darwin-framework-tool" -sdk macosx -configuration Debug - - name: Delete Defaults - run: defaults delete com.apple.dt.xctest.tool - continue-on-error: true - - name: Clean Build - run: xcodebuild clean - working-directory: src/darwin/Framework - - name: Build Apps - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target darwin-x64-darwin-framework-tool-${BUILD_VARIANT_FRAMEWORK_TOOL} \ - --target darwin-x64-all-clusters-${BUILD_VARIANT} \ - --target darwin-x64-lock-${BUILD_VARIANT} \ - --target darwin-x64-ota-provider-${BUILD_VARIANT} \ - --target darwin-x64-ota-requestor-${BUILD_VARIANT} \ - --target darwin-x64-tv-app-${BUILD_VARIANT} \ - --target darwin-x64-bridge-${BUILD_VARIANT} \ - --target darwin-x64-lit-icd-${BUILD_VARIANT} \ - --target darwin-x64-microwave-oven-${BUILD_VARIANT} \ - --target darwin-x64-rvc-${BUILD_VARIANT} \ - --target darwin-x64-network-manager-${BUILD_VARIANT} \ - build \ - --copy-artifacts-to objdir-clone \ - " - - name: Run Tests - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/tests/run_test_suite.py \ - --runner darwin_framework_tool_python \ - --chip-tool ./out/darwin-x64-darwin-framework-tool-${BUILD_VARIANT_FRAMEWORK_TOOL}/darwin-framework-tool \ - --target-skip-glob '{TestAccessControlConstraints}' \ - run \ - --iterations 1 \ - --test-timeout-seconds 120 \ - --all-clusters-app ./out/darwin-x64-all-clusters-${BUILD_VARIANT}/chip-all-clusters-app \ - --lock-app ./out/darwin-x64-lock-${BUILD_VARIANT}/chip-lock-app \ - --ota-provider-app ./out/darwin-x64-ota-provider-${BUILD_VARIANT}/chip-ota-provider-app \ - --ota-requestor-app ./out/darwin-x64-ota-requestor-${BUILD_VARIANT}/chip-ota-requestor-app \ - --tv-app ./out/darwin-x64-tv-app-${BUILD_VARIANT}/chip-tv-app \ - --bridge-app ./out/darwin-x64-bridge-${BUILD_VARIANT}/chip-bridge-app \ - --microwave-oven-app ./out/darwin-x64-microwave-oven-${BUILD_VARIANT}/chip-microwave-oven-app \ - --rvc-app ./out/darwin-x64-rvc-${BUILD_VARIANT}/chip-rvc-app \ - --network-manager-app ./out/darwin-x64-network-manager-${BUILD_VARIANT}/matter-network-manager-app \ - " - - name: Run OTA Test - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/tests/run_darwin_framework_ota_test.py \ - run \ - --darwin-framework-tool ./out/darwin-x64-darwin-framework-tool-${BUILD_VARIANT_FRAMEWORK_TOOL}/darwin-framework-tool \ - --ota-requestor-app ./out/darwin-x64-ota-requestor-${BUILD_VARIANT}/chip-ota-requestor-app \ - --ota-data-file /tmp/rawImage \ - --ota-image-file /tmp/otaImage \ - --ota-destination-file /tmp/downloadedImage \ - --ota-candidate-file /tmp/otaCandidateJSON \ - " - - name: Uploading core files - uses: actions/upload-artifact@v4 - if: ${{ failure() && !env.ACT }} - with: - name: crash-core-darwin-${{ matrix.build_variant }} - path: /cores/ - # Cores are big; don't hold on to them too long. - retention-days: 5 - - name: Uploading diagnostic logs - uses: actions/upload-artifact@v4 - if: ${{ failure() && !env.ACT }} - with: - name: crash-log-darwin-${{ matrix.build_variant }} - path: ~/Library/Logs/DiagnosticReports/ - - name: Uploading framework build log - uses: actions/upload-artifact@v4 - if: ${{ failure() && !env.ACT }} - with: - name: framework-build-log-darwin-${BUILD_VARIANT_FRAMEWORK_TOOL} - path: out/darwin-x64-darwin-framework-tool-${BUILD_VARIANT_FRAMEWORK_TOOL}/darwin_framework_build.log - - name: Uploading objdir for debugging - uses: actions/upload-artifact@v4 - if: ${{ failure() && !env.ACT }} - with: - name: crash-objdir-darwin-${{ matrix.build_variant }} - path: objdir-clone/ - # objdirs are big; don't hold on to them too long. - retention-days: 5 diff --git a/.github/workflows/darwin.yaml b/.github/workflows/darwin.yaml deleted file mode 100644 index 9eeac9118ef9d3..00000000000000 --- a/.github/workflows/darwin.yaml +++ /dev/null @@ -1,134 +0,0 @@ -# Copyright (c) 2020-2021 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. - -name: Darwin - -on: - push: - branches-ignore: - - "dependabot/**" - pull_request: - merge_group: - workflow_dispatch: - -concurrency: - group: - ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == - 'pull_request' && github.event.number) || (github.event_name == - 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true - -env: - CHIP_NO_LOG_TIMESTAMPS: true - -jobs: - framework: - name: Build framework - if: github.actor != 'restyled-io[bot]' - runs-on: macos-13 - strategy: - matrix: - options: # We don't need a full matrix - - flavor: macos-release - arguments: -sdk macosx -configuration Release - - flavor: ios-release - arguments: -sdk iphoneos -configuration Release - - flavor: tvos-debug - arguments: -sdk appletvos -configuration Debug - - flavor: watchos-debug - arguments: -sdk watchos -configuration Debug - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: darwin - bootstrap-log-name: - bootstrap-logs-framework-${{ matrix.options.flavor }} - - name: Block zap-cli from being used - env: - PW_ENVSETUP_NO_BANNER: 1 - run: | - # Framework builds are NOT expected to require zap-cli - scripts/run_in_build_env.sh 'rm -- "$(which zap-cli)"' - # run_in_build_env.sh is used to ensure PATH is set to something that would otherwise find zap-cli - scripts/run_in_build_env.sh '(zap-cli --version && exit 1) || exit 0' - - name: Build - working-directory: src/darwin/Framework - run: xcodebuild -target "Matter" ${{ matrix.options.arguments }} - - tests: - name: Run framework tests - if: github.actor != 'restyled-io[bot]' - needs: [framework] # serialize to avoid running to many parallel macos runners - runs-on: macos-13 - strategy: - matrix: - options: # We don't need a full matrix - - flavor: asan - arguments: - -enableAddressSanitizer YES - -enableUndefinedBehaviorSanitizer YES - - flavor: tsan - arguments: -enableThreadSanitizer YES - # "leaks" does not seem to be very compatible with asan or tsan - - flavor: leaks - defines: ENABLE_LEAK_DETECTION=1 - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: darwin - bootstrap-log-name: - bootstrap-logs-framework-${{ matrix.options.flavor }} - - name: Build example All Clusters Server - run: | - scripts/examples/gn_build_example.sh examples/all-clusters-app/linux out/debug/all-clusters-app chip_config_network_layer_ble=false - - name: Build example OTA Provider - run: | - scripts/examples/gn_build_example.sh examples/ota-provider-app/linux out/debug/ota-provider-app chip_config_network_layer_ble=false - - name: Build example OTA Requestor - run: | - scripts/examples/gn_build_example.sh examples/ota-requestor-app/linux out/debug/ota-requestor-app chip_config_network_layer_ble=false non_spec_compliant_ota_action_delay_floor=0 - - name: Run Framework Tests - # We want to ensure that our log upload runs on timeout, so use a timeout here shorter - # than the 6-hour overall job timeout. 4.5 hours should be plenty. - timeout-minutes: 270 - working-directory: src/darwin/Framework - run: | - mkdir -p /tmp/darwin/framework-tests - echo "This is a simple log" > /tmp/darwin/framework-tests/end_user_support_log.txt - ../../../out/debug/all-clusters-app/chip-all-clusters-app --interface-id -1 --end_user_support_log /tmp/darwin/framework-tests/end_user_support_log.txt > >(tee /tmp/darwin/framework-tests/all-cluster-app.log) 2> >(tee /tmp/darwin/framework-tests/all-cluster-app-err.log >&2) & - - export TEST_RUNNER_ASAN_OPTIONS=__CURRENT_VALUE__:detect_stack_use_after_return=1 - - # Disable BLE (CHIP_IS_BLE=NO) because the app does not have the permission to use it and that may crash the CI. - xcodebuild test -target "Matter" -scheme "Matter Framework Tests" -sdk macosx ${{ matrix.options.arguments }} \ - CHIP_IS_BLE=NO GCC_PREPROCESSOR_DEFINITIONS='${inherited} ${{ matrix.options.defines }}' \ - > >(tee /tmp/darwin/framework-tests/darwin-tests.log) 2> >(tee /tmp/darwin/framework-tests/darwin-tests-err.log >&2) - - name: Collect crash logs - if: failure() && !env.ACT - run: | - mkdir -p /tmp/darwin/framework-tests - find ~/Library/Developer/Xcode/DerivedData /Library/Logs/DiagnosticReports -name '*.ips' -print0 | xargs -0 -J % cp % /tmp/darwin/framework-tests - - name: Uploading log files - uses: actions/upload-artifact@v4 - if: failure() && !env.ACT - with: - name: darwin-framework-test-logs-${{ matrix.options.flavor }} - path: /tmp/darwin/framework-tests - retention-days: 5 diff --git a/.github/workflows/docbuild.yaml b/.github/workflows/docbuild.yaml deleted file mode 100644 index 2d28a2a537d922..00000000000000 --- a/.github/workflows/docbuild.yaml +++ /dev/null @@ -1,54 +0,0 @@ -name: Documentation Build - -on: - pull_request: - types: [opened, synchronize, reopened] - branches: - - master - paths: - - '.github/workflows/docbuild.yaml' - - '**.md' - - 'docs/**' - push: - branches: - - master - -permissions: - contents: write - -jobs: - build-and-publish: - runs-on: ubuntu-latest - - steps: - - name: Checkout the code - uses: actions/checkout@v4 - with: - path: matter - fetch-depth: 0 - - name: Install Python - uses: actions/setup-python@v5 - with: - python-version: 3.8 - cache-dependency-path: matter/docs/requirements.txt - cache: pip - - name: Install base dependencies - working-directory: matter - run: | - sudo pip3 install -U pip - pip3 install -r docs/requirements.txt - - name: Build documentation - working-directory: matter/docs - run: | - mkdir -p _build/src - make html - touch _build/html/.nojekyll - - name: Deploy to gh-pages - if: github.repository == 'project-chip/connectedhomeip' && github.event_name == 'push' && github.ref_name == 'master' - uses: peaceiris/actions-gh-pages@v3 - with: - deploy_key: ${{ secrets.DOXYGEN_DEPLOY_KEY }} - external_repository: project-chip/connectedhomeip-doc - publish_dir: matter/docs/_build/html - # Keep only the latest version of the documentation - force_orphan: true diff --git a/.github/workflows/docker_img.yaml b/.github/workflows/docker_img.yaml deleted file mode 100644 index 05594606a610c7..00000000000000 --- a/.github/workflows/docker_img.yaml +++ /dev/null @@ -1,171 +0,0 @@ -# Copyright (c) 2020-2021 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. - -name: Docker CHIP images - -on: - workflow_call: - inputs: - push_images: - required: false - type: boolean - default: false - push: - paths: - - "integrations/docker/**" - pull_request: - paths: - - "integrations/docker/**" - workflow_dispatch: - inputs: - push_images: - required: false - type: boolean - default: false - -jobs: - build_images_base: - name: Build Docker CHIP Build images - base - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - strategy: - fail-fast: false - matrix: - img: - - "" - - "-minimal" - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Build & Push images using project bash script - if: ${{ inputs.push_images == true }} - run: | - cd integrations/docker/images/base/chip-build${{ matrix.img }} - ./build.sh --latest --push - - name: Build images using project bash script - if: ${{ inputs.push_images == false }} - run: | - cd integrations/docker/images/base/chip-build${{ matrix.img }} - ./build.sh --latest - build_images_stage_1: - needs: [build_images_base] - name: Build Docker CHIP Build images - stage 1 - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - strategy: - fail-fast: false - matrix: - img: - - "-crosscompile" - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Build & Push images using project bash script - if: ${{ inputs.push_images == true }} - run: | - cd integrations/docker/images/stage-1/chip-build${{ matrix.img }} - ./build.sh --latest --push - - name: Build images using project bash script - if: ${{ inputs.push_images == false }} - run: | - cd integrations/docker/images/stage-1/chip-build${{ matrix.img }} - ./build.sh --latest - build_images_stage_2: - needs: [build_images_base, build_images_stage_1] - name: Build Docker CHIP Build images - stage 2 - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - strategy: - fail-fast: false - matrix: - img: - - "-ameba" - - "-asr" - - "-bouffalolab" - - "-doxygen" - - "-efr32" - - "-esp32" - - "-infineon" - # NOTE: imx image requires too much space for GitHub-hosted runners. It fails with: - # ApplyLayer exit status 1 stdout: stderr: write /opt/fsl-imx-xwayland/5.15-kirkstone/sysroots/armv8a-poky-linux/opt/ltp/testcases/bin/fanotify15: no space left on device - # - "-imx" - - "-java" - - "-k32w" - - "-nrf-platform" - - "-telink" - - "-ti" - - "-tizen" - - "-openiotsdk" - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Build & Push images using project bash script - if: ${{ inputs.push_images == true }} - run: | - cd integrations/docker/images/stage-2/chip-build${{ matrix.img }} - ./build.sh --latest --push - - name: Build images using project bash script - if: ${{ inputs.push_images == false }} - run: | - cd integrations/docker/images/stage-2/chip-build${{ matrix.img }} - ./build.sh --latest - - build_images_stage_3: - needs: [build_images_base, build_images_stage_1, build_images_stage_2] - name: Build Docker CHIP Build images - stage 3 - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - strategy: - fail-fast: false - matrix: - img: - - "-android" - - "-esp32-qemu" - - "-tizen-qemu" - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Build & Push images using project bash script - if: ${{ inputs.push_images == true }} - run: | - cd integrations/docker/images/stage-3/chip-build${{ matrix.img }} - ./build.sh --latest --push - - name: Build images using project bash script - if: ${{ inputs.push_images == false }} - run: | - cd integrations/docker/images/stage-3/chip-build${{ matrix.img }} - ./build.sh --latest - build_images_vscode: - needs: [build_images_base, build_images_stage_1, build_images_stage_2, build_images_stage_3] - name: Build Docker CHIP Build images - vscode - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' && false - strategy: - fail-fast: false - matrix: - img: - - "-vscode" - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Build & Push images using project bash script - if: ${{ inputs.push_images == true }} - run: | - cd integrations/docker/images/vscode/chip-build${{ matrix.img }} - ./build.sh --latest --push - - name: Build images using project bash script - if: ${{ inputs.push_images == false }} - run: | - cd integrations/docker/images/vscode-3/chip-build${{ matrix.img }} - ./build.sh --latest diff --git a/.github/workflows/doxygen.yaml b/.github/workflows/doxygen.yaml deleted file mode 100644 index d29b620c374165..00000000000000 --- a/.github/workflows/doxygen.yaml +++ /dev/null @@ -1,107 +0,0 @@ -# Copyright (c) 2020 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. - -name: Doxygen - -on: - push: - paths: - - "**.do[xc]" - - "**.c[cs]?" - - "**.cxx" - - "**.cpp" - - "**.c\\+\\+" - - "**.ii" - - "**.ixx" - - "**.ipp" - - "**.i\\+\\+" - - "**.inl" - - "**.[hH]" - - "**.hh" - - "**.HH" - - "**.hxx" - - "**.hpp" - - "**.h\\+\\+" - - "**.mm" - - "**.txt" - - "**.[ido]dl" - - "**.java" - - "**.d" - - "**.php[45]?" - - "**.inc" - - "**.phtml" - - "**.[mM]" - pull_request: - paths: - - "**.do[xc]" - - "**.c[cs]?" - - "**.cxx" - - "**.cpp" - - "**.c\\+\\+" - - "**.ii" - - "**.ixx" - - "**.ipp" - - "**.i\\+\\+" - - "**.inl" - - "**.[hH]" - - "**.hh" - - "**.HH" - - "**.hxx" - - "**.hpp" - - "**.h\\+\\+" - - "**.mm" - - "**.txt" - - "**.[ido]dl" - - "**.java" - - "**.d" - - "**.php[45]?" - - "**.inc" - - "**.phtml" - - "**.[mM]" - workflow_dispatch: - -concurrency: - group: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true - -jobs: - doxygen: - name: Build Doxygen - - runs-on: ubuntu-latest - container: - image: ghcr.io/project-chip/chip-build-doxygen:74 - - if: github.actor != 'restyled-io[bot]' - - steps: - - name: "Print Actor" - run: echo ${{github.actor}} - - name: Checkout - uses: actions/checkout@v4 - - name: Generate - run: scripts/helpers/doxygen.sh - - name: Extract branch name - shell: bash - run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF##*/})" - id: extract_branch - - name: Deploy if master - if: steps.extract_branch.outputs.branch == 'master' && github.repository == 'project-chip/connectedhomeip' - uses: peaceiris/actions-gh-pages@v3 - with: - deploy_key: ${{ secrets.DOXYGEN_DEPLOY_KEY }} - external_repository: project-chip/connectedhomeip-doc - publish_dir: ./docs/html - # Keep only the latest version of the documentation - force_orphan: true diff --git a/.github/workflows/example-tv-casting-darwin.yaml b/.github/workflows/example-tv-casting-darwin.yaml deleted file mode 100644 index d9d9ef8f37cee9..00000000000000 --- a/.github/workflows/example-tv-casting-darwin.yaml +++ /dev/null @@ -1,49 +0,0 @@ -# Copyright (c) 2020-2021 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. - -name: TV Casting Example - Darwin - -on: - push: - branches-ignore: - - "dependabot/**" - pull_request: - merge_group: - workflow_dispatch: - -concurrency: - group: - ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == - 'pull_request' && github.event.number) || (github.event_name == - 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true - -env: - CHIP_NO_LOG_TIMESTAMPS: true - -jobs: - tv-casting-bridge: - name: Build TV Casting Bridge example - if: github.actor != 'restyled-io[bot]' - runs-on: macos-13 - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: darwin - - name: Build - working-directory: examples/tv-casting-app/darwin/MatterTvCastingBridge - run: xcodebuild -target "MatterTvCastingBridge" -sdk iphoneos diff --git a/.github/workflows/examples-ameba.yaml b/.github/workflows/examples-ameba.yaml deleted file mode 100644 index 62a3bf55119b3d..00000000000000 --- a/.github/workflows/examples-ameba.yaml +++ /dev/null @@ -1,60 +0,0 @@ -# Copyright (c) 2021 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. - -name: Build example - Ameba - -on: - push: - branches-ignore: - - 'dependabot/**' - pull_request: - merge_group: - -concurrency: - group: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true - -env: - CHIP_NO_LOG_TIMESTAMPS: true - -jobs: - ameba: - name: Ameba - env: - BUILD_TYPE: ameba - - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build-ameba:74 - options: --user root - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: ameba - - name: Build example Ameba All Clusters App - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target ameba-amebad-all-clusters \ - --target ameba-amebad-all-clusters-minimal \ - --target ameba-amebad-light \ - --target ameba-amebad-pigweed \ - build \ - " diff --git a/.github/workflows/examples-asr.yaml b/.github/workflows/examples-asr.yaml deleted file mode 100644 index 840811d13daa6a..00000000000000 --- a/.github/workflows/examples-asr.yaml +++ /dev/null @@ -1,65 +0,0 @@ -# Copyright (c) 2023 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. - -name: Build example - ASR - -on: - push: - branches-ignore: - - 'dependabot/**' - pull_request: - merge_group: - -concurrency: - group: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true - -env: - CHIP_NO_LOG_TIMESTAMPS: true - -jobs: - asr: - name: ASR - - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build-asr:74 - options: --user root - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: asr - - name: Build all ASR582X examples - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target asr-asr582x-all-clusters \ - --target asr-asr582x-all-clusters-minimal \ - --target asr-asr582x-lighting-ota \ - --target asr-asr582x-light-switch-shell \ - --target asr-asr582x-lock-no_logging \ - --target asr-asr582x-ota-requestor \ - --target asr-asr582x-bridge-factory \ - --target asr-asr582x-temperature-measurement-rotating_id \ - --target asr-asr582x-thermostat-rio \ - --target asr-asr582x-dishwasher \ - --target asr-asr582x-refrigerator \ - build \ - " diff --git a/.github/workflows/examples-bouffalolab.yaml b/.github/workflows/examples-bouffalolab.yaml deleted file mode 100644 index af20a4c5b0872f..00000000000000 --- a/.github/workflows/examples-bouffalolab.yaml +++ /dev/null @@ -1,147 +0,0 @@ -# Copyright (c) 2020 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. - -name: Build example - BouffaloLab - -on: - push: - branches-ignore: - - 'dependabot/**' - pull_request: - merge_group: - workflow_dispatch: - -concurrency: - group: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true - -env: - CHIP_NO_LOG_TIMESTAMPS: true - -jobs: - bouffalolab: - name: Bouffalo Lab - - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build-bouffalolab:74 - volumes: - - "/tmp/bloat_reports:/tmp/bloat_reports" - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: bouffalolab - extra-submodule-parameters: " --recursive" - - name: Set up environment for size reports - uses: ./.github/actions/setup-size-reports - if: ${{ !env.ACT }} - with: - gh-context: ${{ toJson(github) }} - - name: Build example BL602 Lighting App - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target bouffalolab-bl602-night-light-light \ - --target bouffalolab-bl602-night-light-light-mfd \ - --target bouffalolab-bl602-iot-matter-v1-light-115200-rpc \ - build \ - --copy-artifacts-to out/artifacts \ - " - - name: Prepare some bloat report from the previous builds - run: | - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - bl602 bl602 lighting-app \ - out/artifacts/bouffalolab-bl602-night-light-light/chip-bl602-lighting-example.out \ - /tmp/bloat_reports/ - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - bl602 bl602+mfd lighting-app \ - out/artifacts/bouffalolab-bl602-night-light-light-mfd/chip-bl602-lighting-example.out \ - /tmp/bloat_reports/ - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - bl602 bl602+rpc lighting-app \ - out/artifacts/bouffalolab-bl602-iot-matter-v1-light-115200-rpc/chip-bl602-lighting-example.out \ - /tmp/bloat_reports/ - - name: Clean out build output - run: rm -rf ./out - - - name: Build example BL702 Lighting App - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target bouffalolab-bl706-night-light-light \ - --target bouffalolab-bl706-night-light-light-mfd \ - --target bouffalolab-bl706dk-light-ethernet \ - --target bouffalolab-bl706dk-light-wifi-fp \ - --target bouffalolab-xt-zb6-devkit-light-115200-rpc \ - build \ - --copy-artifacts-to out/artifacts \ - " - - name: Prepare some bloat report from the previous builds - run: | - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - bl702 bl702 lighting-app \ - out/artifacts/bouffalolab-bl706-night-light-light/chip-bl702-lighting-example.out \ - /tmp/bloat_reports/ - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - bl702 bl702+mfd lighting-app \ - out/artifacts/bouffalolab-bl706-night-light-light-mfd/chip-bl702-lighting-example.out \ - /tmp/bloat_reports/ - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - bl702 bl706-eth lighting-app \ - out/artifacts/bouffalolab-bl706dk-light-ethernet/chip-bl702-lighting-example.out \ - /tmp/bloat_reports/ - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - bl702 bl706-wifi lighting-app \ - out/artifacts/bouffalolab-bl706dk-light-wifi-fp/chip-bl702-lighting-example.out \ - /tmp/bloat_reports/ - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - bl702 bl702+rpc lighting-app \ - out/artifacts/bouffalolab-xt-zb6-devkit-light-115200-rpc/chip-bl702-lighting-example.out \ - /tmp/bloat_reports/ - - name: Clean out build output - run: rm -rf ./out - - - name: Build example BL702L Lighting App - timeout-minutes: 30 - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target bouffalolab-bl704ldk-light \ - --target bouffalolab-bl704ldk-light-mfd \ - build \ - --copy-artifacts-to out/artifacts \ - " - - name: Prepare some bloat report from the previous builds - run: | - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - bl702l bl702l lighting-app \ - out/artifacts/bouffalolab-bl704ldk-light/chip-bl702l-lighting-example.out \ - /tmp/bloat_reports/ - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - bl702l bl702l+mfd lighting-app \ - out/artifacts/bouffalolab-bl704ldk-light-mfd/chip-bl702l-lighting-example.out \ - /tmp/bloat_reports/ - - name: Clean out build output - run: rm -rf ./out - - - name: Uploading Size Reports - uses: ./.github/actions/upload-size-reports - if: ${{ !env.ACT }} - with: - platform-name: BouffaloLab diff --git a/.github/workflows/examples-cc13xx_26xx.yaml b/.github/workflows/examples-cc13xx_26xx.yaml deleted file mode 100644 index 53c813d0b4c433..00000000000000 --- a/.github/workflows/examples-cc13xx_26xx.yaml +++ /dev/null @@ -1,114 +0,0 @@ -# Copyright (c) 2021 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. - -name: Build example - TI CC13XX_26XX - -on: - workflow_dispatch: - # Temporarely disabled: - # - TI CI runs out of disk space - # - Image should be updated to an Ubuntu 24.04 or higher based one (move from :54 version) - # push: - # branches-ignore: - # - 'dependabot/**' - # pull_request: - # merge_group: - -concurrency: - group: - ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == - 'pull_request' && github.event.number) || (github.event_name == - 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true -env: - CHIP_NO_LOG_TIMESTAMPS: true - -jobs: - cc13xx_26xx: - name: cc13xx_26xx - - env: - BUILD_TYPE: gn_cc13xx_26xx - - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build-ti:74 - volumes: - - "/tmp/bloat_reports:/tmp/bloat_reports" - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: cc13xx_26xx - extra-submodule-parameters: " --recursive" - - name: Set up environment for size reports - uses: ./.github/actions/setup-size-reports - if: ${{ !env.ACT }} - with: - gh-context: ${{ toJson(github) }} - - - name: Build examples - run: | - scripts/run_in_build_env.sh "\ - ./scripts/build/build_examples.py \ - --target ti-cc13x4_26x4-lighting-ftd \ - --target ti-cc13x4_26x4-lighting-mtd \ - --target ti-cc13x4_26x4-lock-ftd \ - --target ti-cc13x4_26x4-lock-mtd \ - --target ti-cc13x4_26x4-pump-mtd \ - --target ti-cc13x4_26x4-pump-ftd \ - --target ti-cc13x4_26x4-pump-controller-mtd \ - --target ti-cc13x4_26x4-pump-controller-ftd \ - build \ - --copy-artifacts-to out/artifacts \ - " - - name: Get lock FTD size stats - run: | - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - cc13x4_26x4 LP_EM_CC1354P10_6 lock-ftd \ - out/artifacts/ti-cc13x4_26x4-lock-ftd/chip-LP_EM_CC1354P10_6-lock-example.out \ - /tmp/bloat_reports/ - - name: Get lock MTD size stats - run: | - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - cc13x4_26x4 LP_EM_CC1354P10_6 lock-mtd \ - out/artifacts/ti-cc13x4_26x4-lock-mtd/chip-LP_EM_CC1354P10_6-lock-example.out \ - /tmp/bloat_reports/ - - name: Get Pump App size stats - run: | - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - cc13x4_26x4 LP_EM_CC1354P10_6 pump-app \ - out/artifacts/ti-cc13x4_26x4-pump-mtd/chip-LP_EM_CC1354P10_6-pump-example.out \ - /tmp/bloat_reports/ - - name: Get Pump Controller MTD size stats - run: | - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - cc13x4_26x4 LP_EM_CC1354P10_6 pump-controller-app \ - out/artifacts/ti-cc13x4_26x4-pump-controller-mtd/chip-LP_EM_CC1354P10_6-pump-controller-example.out \ - /tmp/bloat_reports/ - - name: Get Lighting FTD size stats - run: | - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - cc13x4_26x4 LP_EM_CC1354P10_6 lighting-app \ - out/artifacts/ti-cc13x4_26x4-lighting-ftd/chip-LP_EM_CC1354P10_6-lighting-example.out \ - /tmp/bloat_reports/ - - name: Uploading Size Reports - uses: ./.github/actions/upload-size-reports - if: ${{ !env.ACT }} - with: - platform-name: cc13x4_26x4 diff --git a/.github/workflows/examples-cc32xx.yaml b/.github/workflows/examples-cc32xx.yaml deleted file mode 100644 index 091a5eeabc4361..00000000000000 --- a/.github/workflows/examples-cc32xx.yaml +++ /dev/null @@ -1,87 +0,0 @@ -# Copyright (c) 2021 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. - -name: Build example - TI CC32XX - -on: - workflow_dispatch: - # Temporarely disabled: - # - TI CI runs out of disk space - # - Image should be updated to an Ubuntu 24.04 or higher based one (move from :54 version) - # push: - # branches-ignore: - # - 'dependabot/**' - # pull_request: - # merge_group: - -concurrency: - group: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true - -env: - CHIP_NO_LOG_TIMESTAMPS: true - -jobs: - cc32xx: - name: cc32xx - - env: - BUILD_TYPE: gn_cc32xx - - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build-ti:74 - volumes: - - "/tmp/bloat_reports:/tmp/bloat_reports" - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: cc32xx - - name: Set up environment for size reports - uses: ./.github/actions/setup-size-reports - if: ${{ !env.ACT }} - with: - gh-context: ${{ toJson(github) }} - - - name: Build examples - run: | - scripts/run_in_build_env.sh "\ - ./scripts/build/build_examples.py \ - --target cc32xx-lock --target cc32xx-air-purifier build \ - --copy-artifacts-to out/artifacts \ - " - - name: Get lock app size stats - run: | - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - cc32xx CC3235SF_LAUNCHXL lock \ - out/artifacts/cc32xx-lock/chip-CC3235SF_LAUNCHXL-lock-example.out \ - /tmp/bloat_reports/ - - - name: Get air purifier app size stats - run: | - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - cc32xx CC3235SF_LAUNCHXL air-purifier \ - out/artifacts/cc32xx-air-purifier/chip-CC3235SF_LAUNCHXL-air-purifier-example.out \ - /tmp/bloat_reports/ - - - name: Uploading Size Reports - uses: ./.github/actions/upload-size-reports - if: ${{ !env.ACT }} - with: - platform-name: cc32xx diff --git a/.github/workflows/examples-efr32.yaml b/.github/workflows/examples-efr32.yaml deleted file mode 100644 index c236b4ca3db4c3..00000000000000 --- a/.github/workflows/examples-efr32.yaml +++ /dev/null @@ -1,148 +0,0 @@ -# Copyright (c) 2020 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. - -name: Build example - EFR32 - -on: - push: - branches-ignore: - - 'dependabot/**' - pull_request: - merge_group: - -concurrency: - group: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true - -env: - CHIP_NO_LOG_TIMESTAMPS: true - -jobs: - efr32: - name: EFR32 - - env: - SILABS_BOARD: BRD4187C - BUILD_TYPE: gn_efr32 - - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build-efr32:74 - volumes: - - "/tmp/bloat_reports:/tmp/bloat_reports" - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: silabs_docker - - - name: Set up environment for size reports - uses: ./.github/actions/setup-size-reports - if: ${{ !env.ACT }} - with: - gh-context: ${{ toJson(github) }} - - - name: Test SLC gen - timeout-minutes: 30 - run: | - scripts/examples/gn_silabs_example.sh examples/lighting-app/silabs ./out/light-app BRD4187C --slc_generate --docker - rm -rf ./out/ - - name: Build some BRD4187C variants (1) - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --enable-flashbundle \ - --target efr32-brd4187c-thermostat-openthread-mtd \ - --target efr32-brd4187c-switch-shell-use-ot-coap-lib \ - --target efr32-brd4187c-unit-test \ - build \ - --copy-artifacts-to out/artifacts \ - " - - name: Clean out build output - run: rm -rf ./out - - name: Build some BRD4187C variants (2) - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --enable-flashbundle \ - --target efr32-brd4187c-light-use-ot-lib \ - --target efr32-brd4187c-pump \ - --target efr32-brd4187c-lock-shell-heap-monitoring \ - build \ - --copy-artifacts-to out/artifacts \ - " - - name: Clean out build output - run: rm -rf ./out - - name: Build BRD4187C variants (3) - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --enable-flashbundle \ - --target efr32-brd4187c-window-covering-additional-data-advertising \ - --target efr32-brd4187c-light-rpc \ - build \ - --copy-artifacts-to out/artifacts \ - " - - name: Prepare some bloat report from the previous builds - run: | - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - efr32 BRD4187C lighting-app \ - out/efr32-brd4187c-light-rpc/matter-silabs-lighting-example.out \ - /tmp/bloat_reports/ - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - efr32 BRD4187C window-app \ - out/efr32-brd4187c-window-covering-additional-data-advertising/matter-silabs-window-example.out \ - /tmp/bloat_reports/ - - name: Clean out build output - run: rm -rf ./out - - name: Build BRD4338A WiFi Soc variants - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --enable-flashbundle \ - --target efr32-brd4338a-light-skip-rps-generation \ - --target efr32-brd4338a-lock-skip-rps-generation \ - build \ - --copy-artifacts-to out/artifacts \ - " - - name: Prepare bloat report for brd4338a lock app - run: | - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - efr32 BRD4338a lock-app \ - out/efr32-brd4338a-lock-skip-rps-generation/matter-silabs-lock-example.out \ - /tmp/bloat_reports/ - - name: Clean out build output - run: rm -rf ./out - - name: Build EFR32 with WiFi NCP - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --enable-flashbundle \ - --target efr32-brd4187c-lock-wifi-siwx917 \ - --target efr32-brd4187c-light-wifi-rs9116 \ - --target efr32-brd4187c-lock-wifi-wf200 \ - build \ - --copy-artifacts-to out/artifacts \ - " - - name: Clean out build output - run: rm -rf ./out - - name: Uploading Size Reports - uses: ./.github/actions/upload-size-reports - if: ${{ !env.ACT }} - with: - platform-name: EFR32 diff --git a/.github/workflows/examples-esp32.yaml b/.github/workflows/examples-esp32.yaml deleted file mode 100644 index 5d84540eda4676..00000000000000 --- a/.github/workflows/examples-esp32.yaml +++ /dev/null @@ -1,169 +0,0 @@ -# Copyright (c) 2020 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. - -name: Build example - ESP32 - -on: - push: - branches-ignore: - - 'dependabot/**' - pull_request: - merge_group: - -concurrency: - group: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true - -env: - CHIP_NO_LOG_TIMESTAMPS: true - -jobs: - esp32: - name: ESP32 - - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build-esp32:74 - volumes: - - "/tmp/bloat_reports:/tmp/bloat_reports" - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: esp32 - - - name: Set up environment for size reports - uses: ./.github/actions/setup-size-reports - if: ${{ !env.ACT }} - with: - gh-context: ${{ toJson(github) }} - - - name: Build some M5Stack variations - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --enable-flashbundle \ - --target esp32-m5stack-all-clusters \ - build \ - --copy-artifacts-to out/artifacts \ - " - - name: Prepare bloat report - run: | - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - esp32 m5stack all-clusters-app \ - out/esp32-m5stack-all-clusters/chip-all-clusters-app.elf \ - /tmp/bloat_reports/ - - name: Prepare code pregen and ensure compile time pregen not possible - run: | - ./scripts/run_in_build_env.sh "./scripts/codepregen.py ./zzz_pregenerated" - mv scripts/codegen.py scripts/codegen.py.renamed - mv scripts/tools/zap/generate.py scripts/tools/zap/generate.py.renamed - - name: Clean output - run: rm -rf ./out - - name: Build some M5Stack variations with pregen - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --enable-flashbundle \ - --target esp32-m5stack-all-clusters-minimal \ - --target esp32-m5stack-all-clusters-rpc-ipv6only \ - --pregen-dir ./zzz_pregenerated \ - build \ - --copy-artifacts-to out/artifacts \ - " - - name: Undo code pregeneration changes - run: | - rm -rf ./zzz_pregenerated - mv scripts/codegen.py.renamed scripts/codegen.py - mv scripts/tools/zap/generate.py.renamed scripts/tools/zap/generate.py - - name: Build example All Clusters App(Target:ESP32C3) - run: scripts/examples/esp_example.sh all-clusters-app sdkconfig.defaults.esp32c3 esp32c3 - - name: Copy aside build products - run: | - mkdir -p example_binaries/esp32-build - cp examples/all-clusters-app/esp32/build/chip-all-clusters-app.elf \ - example_binaries/esp32-build/chip-all-clusters-app.elf - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - esp32 c3devkit all-clusters-app \ - example_binaries/esp32-build/chip-all-clusters-app.elf \ - /tmp/bloat_reports/ - - - name: Build example Pigweed App - run: scripts/examples/esp_example.sh pigweed-app sdkconfig.defaults - - - name: Build example Lighting App (Target:ESP32H2) - run: scripts/examples/esp_example.sh lighting-app sdkconfig.defaults.esp32h2 esp32h2 - - - name: Build example Lock App (Target:ESP32C6) - run: scripts/examples/esp_example.sh lock-app sdkconfig.defaults.esp32c6 esp32c6 - - - name: Uploading Size Reports - uses: ./.github/actions/upload-size-reports - if: ${{ !env.ACT }} - with: - platform-name: ESP32 - - esp32_1: - name: ESP32_1 - - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build-esp32:74 - volumes: - - "/tmp/bloat_reports:/tmp/bloat_reports" - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: esp32 - - - name: Build example Bridge App - run: scripts/examples/esp_example.sh bridge-app - - - name: Build example Persistent Storage App - run: scripts/examples/esp_example.sh persistent-storage sdkconfig.defaults - - - name: Build example Shell App - run: scripts/examples/esp_example.sh shell sdkconfig.defaults - - - name: Build example Temperature Measurement App - run: scripts/examples/esp_example.sh temperature-measurement-app sdkconfig.optimize.defaults - - - name: Build example OTA Requestor App - run: scripts/examples/esp_example.sh ota-requestor-app sdkconfig.defaults - - - name: Build example OTA Provider App - run: scripts/examples/esp_example.sh ota-provider-app sdkconfig.defaults - - - name: Build example Light Switch App (Target:ESP32C3) - run: scripts/examples/esp_example.sh light-switch-app sdkconfig.defaults.esp32c3 esp32c3 - - - name: Build example Lighting App (external platform) - run: scripts/examples/esp_example.sh lighting-app sdkconfig.ext_plat.defaults - - - name: Build example Energy Management App - run: scripts/examples/esp_example.sh energy-management-app sdkconfig.defaults - - - name: Build example LIT ICD App (Target:ESP32H2) - run: scripts/examples/esp_example.sh lit-icd-app sdkconfig.defaults esp32h2 diff --git a/.github/workflows/examples-infineon.yaml b/.github/workflows/examples-infineon.yaml deleted file mode 100644 index 0fcfac2ce7890e..00000000000000 --- a/.github/workflows/examples-infineon.yaml +++ /dev/null @@ -1,226 +0,0 @@ -# Copyright (c) 2021 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. - -name: Build example - Infineon - -on: - push: - branches-ignore: - - 'dependabot/**' - pull_request: - merge_group: - workflow_dispatch: - -concurrency: - group: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true - -env: - CHIP_NO_LOG_TIMESTAMPS: true - -jobs: - infineon: - name: Infineon examples building - - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build-infineon:74 - env: - # TODO: this should probably be part of the dockerfile itself - CY_TOOLS_PATHS: /opt/Tools/ModusToolbox/tools_3.2 - volumes: - - "/tmp/bloat_reports:/tmp/bloat_reports" - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: infineon - - - name: Set up environment for size reports - uses: ./.github/actions/setup-size-reports - if: ${{ !env.ACT }} - with: - gh-context: ${{ toJson(github) }} - - - name: Build PSoC6 lock-app example - run: | - scripts/run_in_build_env.sh \ - "scripts/build/build_examples.py \ - --enable-flashbundle \ - --target infineon-psoc6-lock \ - build \ - --copy-artifacts-to out/artifacts \ - " - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - psoc6 cy8ckit_062s2_43012 lock \ - out/artifacts/infineon-psoc6-lock/chip-psoc6-lock-example.out \ - /tmp/bloat_reports/ - - name: Build PSoC6 all-clusters-app example - run: | - scripts/run_in_build_env.sh \ - "scripts/build/build_examples.py \ - --enable-flashbundle \ - --target infineon-psoc6-all-clusters \ - build \ - --copy-artifacts-to out/artifacts \ - " - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - psoc6 cy8ckit_062s2_43012 all-clusters \ - out/artifacts/infineon-psoc6-all-clusters/chip-psoc6-clusters-example.out \ - /tmp/bloat_reports/ - - name: Build PSoC6 all-clusters-minimal-app example - run: | - scripts/run_in_build_env.sh \ - "scripts/build/build_examples.py \ - --enable-flashbundle \ - --target infineon-psoc6-all-clusters-minimal \ - build \ - --copy-artifacts-to out/artifacts \ - " - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - psoc6 cy8ckit_062s2_43012 all-clusters-minimal \ - out/artifacts/infineon-psoc6-all-clusters-minimal/chip-psoc6-clusters-minimal-example.out \ - /tmp/bloat_reports/ - - name: Build PSoC6 lighting-app example - run: | - scripts/run_in_build_env.sh \ - "scripts/build/build_examples.py \ - --enable-flashbundle \ - --target infineon-psoc6-light \ - build \ - --copy-artifacts-to out/artifacts \ - " - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - psoc6 cy8ckit_062s2_43012 light \ - out/artifacts/infineon-psoc6-light/chip-psoc6-lighting-example.out \ - /tmp/bloat_reports/ - - - name: Build CYW30739 Lighting App - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target cyw30739-cyw30739b2_p5_evk_01-light \ - --target cyw30739-cyw30739b2_p5_evk_02-light \ - --target cyw30739-cyw30739b2_p5_evk_03-light \ - --target cyw30739-cyw930739m2evb_02-light \ - build \ - --copy-artifacts-to out/artifacts \ - " - - name: Get light size stats - run: | - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - cyw30739 CYW30739B2-P5-EVK-01 light \ - out/artifacts/cyw30739-cyw30739b2_p5_evk_01-light/lighting_app-CYW30739B2-P5-EVK-01.elf \ - /tmp/bloat_reports/ - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - cyw30739 CYW30739B2-P5-EVK-02 light \ - out/artifacts/cyw30739-cyw30739b2_p5_evk_02-light/lighting_app-CYW30739B2-P5-EVK-02.elf \ - /tmp/bloat_reports/ - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - cyw30739 CYW30739B2-P5-EVK-03 light \ - out/artifacts/cyw30739-cyw30739b2_p5_evk_03-light/lighting_app-CYW30739B2-P5-EVK-03.elf \ - /tmp/bloat_reports/ - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - cyw30739 CYW930739M2EVB-02 light \ - out/artifacts/cyw30739-cyw930739m2evb_02-light/lighting_app-CYW930739M2EVB-02.elf \ - /tmp/bloat_reports/ - - name: Clean out build output - run: rm -rf ./out - - name: Build CYW30739 Light Switch App - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target cyw30739-cyw30739b2_p5_evk_01-light-switch \ - --target cyw30739-cyw30739b2_p5_evk_02-light-switch \ - --target cyw30739-cyw30739b2_p5_evk_03-light-switch \ - build \ - --copy-artifacts-to out/artifacts \ - " - - name: Get light-switch size stats - run: | - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - cyw30739 CYW30739B2-P5-EVK-01 light-switch \ - out/artifacts/cyw30739-cyw30739b2_p5_evk_01-light-switch/light_switch_app-CYW30739B2-P5-EVK-01.elf \ - /tmp/bloat_reports/ - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - cyw30739 CYW30739B2-P5-EVK-02 light-switch \ - out/artifacts/cyw30739-cyw30739b2_p5_evk_02-light-switch/light_switch_app-CYW30739B2-P5-EVK-02.elf \ - /tmp/bloat_reports/ - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - cyw30739 CYW30739B2-P5-EVK-03 light-switch \ - out/artifacts/cyw30739-cyw30739b2_p5_evk_03-light-switch/light_switch_app-CYW30739B2-P5-EVK-03.elf \ - /tmp/bloat_reports/ - - name: Clean out build output - run: rm -rf ./out - - name: Build CYW30739 Lock App - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target cyw30739-cyw30739b2_p5_evk_01-lock \ - --target cyw30739-cyw30739b2_p5_evk_02-lock \ - --target cyw30739-cyw30739b2_p5_evk_03-lock \ - build \ - --copy-artifacts-to out/artifacts \ - " - - name: Get lock size stats - run: | - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - cyw30739 CYW30739B2-P5-EVK-01 lock \ - out/artifacts/cyw30739-cyw30739b2_p5_evk_01-lock/lock_app-CYW30739B2-P5-EVK-01.elf \ - /tmp/bloat_reports/ - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - cyw30739 CYW30739B2-P5-EVK-02 lock \ - out/artifacts/cyw30739-cyw30739b2_p5_evk_02-lock/lock_app-CYW30739B2-P5-EVK-02.elf \ - /tmp/bloat_reports/ - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - cyw30739 CYW30739B2-P5-EVK-03 lock \ - out/artifacts/cyw30739-cyw30739b2_p5_evk_03-lock/lock_app-CYW30739B2-P5-EVK-03.elf \ - /tmp/bloat_reports/ - - name: Clean out build output - run: rm -rf ./out - - name: Build CYW30739 Thermostat App - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target cyw30739-cyw30739b2_p5_evk_01-thermostat \ - --target cyw30739-cyw30739b2_p5_evk_02-thermostat \ - --target cyw30739-cyw30739b2_p5_evk_03-thermostat \ - build \ - --copy-artifacts-to out/artifacts \ - " - - name: Get thermostat size stats - run: | - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - cyw30739 CYW30739B2-P5-EVK-01 thermostat \ - out/artifacts/cyw30739-cyw30739b2_p5_evk_01-thermostat/thermostat-CYW30739B2-P5-EVK-01.elf \ - /tmp/bloat_reports/ - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - cyw30739 CYW30739B2-P5-EVK-02 thermostat \ - out/artifacts/cyw30739-cyw30739b2_p5_evk_02-thermostat/thermostat-CYW30739B2-P5-EVK-02.elf \ - /tmp/bloat_reports/ - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - cyw30739 CYW30739B2-P5-EVK-03 thermostat \ - out/artifacts/cyw30739-cyw30739b2_p5_evk_03-thermostat/thermostat-CYW30739B2-P5-EVK-03.elf \ - /tmp/bloat_reports/ - - name: Clean out build output - run: rm -rf ./out - - name: Uploading Size Reports - uses: ./.github/actions/upload-size-reports - if: ${{ !env.ACT }} - with: - platform-name: Infineon diff --git a/.github/workflows/examples-linux-arm.yaml b/.github/workflows/examples-linux-arm.yaml deleted file mode 100644 index 41fe2456518850..00000000000000 --- a/.github/workflows/examples-linux-arm.yaml +++ /dev/null @@ -1,90 +0,0 @@ -# Copyright (c) 2020 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. - -name: Build example - Linux ARM - -on: - push: - branches-ignore: - - 'dependabot/**' - pull_request: - merge_group: - -concurrency: - group: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true - -env: - CHIP_NO_LOG_TIMESTAMPS: true - -jobs: - arm_crosscompile: - name: Linux ARM Cross compile - - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build-crosscompile:74 - volumes: - - "/tmp/bloat_reports:/tmp/bloat_reports" - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: linux - - - name: Set up environment for size reports - uses: ./.github/actions/setup-size-reports - if: ${{ !env.ACT }} - with: - gh-context: ${{ toJson(github) }} - - - name: Build Some samples - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target linux-arm64-chip-cert-clang \ - --target linux-arm64-all-clusters-clang \ - --target linux-arm64-chip-tool-ipv6only-clang \ - --target linux-arm64-chip-tool-nodeps-ipv6only \ - --target linux-arm64-lock-clang \ - --target linux-arm64-minmdns-clang \ - --target linux-arm64-light-rpc-ipv6only-clang \ - --target linux-arm64-thermostat-no-ble-clang \ - --target linux-arm64-lit-icd-no-ble-clang \ - --target linux-arm64-fabric-admin-clang-rpc \ - --target linux-arm64-fabric-bridge-no-ble-clang-rpc \ - build \ - " - - name: Bloat report - chip-tool - run: | - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - linux arm64 chip-tool-ipv6only \ - out/linux-arm64-chip-tool-ipv6only-clang/chip-tool \ - /tmp/bloat_reports/ - - name: Bloat report - thermostat - run: | - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - linux arm64 thermostat-no-ble \ - out/linux-arm64-thermostat-no-ble-clang/thermostat-app \ - /tmp/bloat_reports/ - - name: Uploading Size Reports - uses: ./.github/actions/upload-size-reports - if: ${{ !env.ACT }} - with: - platform-name: Linux diff --git a/.github/workflows/examples-linux-imx.yaml b/.github/workflows/examples-linux-imx.yaml deleted file mode 100644 index 6ad5f4c9d9c31e..00000000000000 --- a/.github/workflows/examples-linux-imx.yaml +++ /dev/null @@ -1,96 +0,0 @@ -# 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. - -name: Build example - i.MX Linux - -on: - push: - branches-ignore: - - 'dependabot/**' - pull_request: - merge_group: - -concurrency: - group: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true - -env: - CHIP_NO_LOG_TIMESTAMPS: true - -jobs: - imx: - name: Linux i.MX Build - - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build-imx:74 - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: linux - - - name: Build lighting-app - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target imx-lighting-app \ - build" - - name: Clean out build output - run: rm -rf ./out - - name: Build chip-tool - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target imx-chip-tool \ - build" - - name: Clean out build output - run: rm -rf ./out - - name: Build thermostat - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target imx-thermostat \ - build" - - name: Clean out build output - run: rm -rf ./out - - name: Build all-cluster - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target imx-all-clusters-app \ - build" - - name: Clean out build output - run: rm -rf ./out - - name: Build all-cluster-minimal - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target imx-all-clusters-minimal-app \ - build" - - name: Clean out build output - run: rm -rf ./out - - name: Build ota-provider-app - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target imx-ota-provider-app \ - build" - - name: Clean out build output - run: rm -rf ./out diff --git a/.github/workflows/examples-linux-standalone.yaml b/.github/workflows/examples-linux-standalone.yaml deleted file mode 100644 index aa4051ea308a56..00000000000000 --- a/.github/workflows/examples-linux-standalone.yaml +++ /dev/null @@ -1,225 +0,0 @@ -# Copyright (c) 2020 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. - -name: Build example - Linux Standalone - -on: - push: - branches-ignore: - - 'dependabot/**' - pull_request: - merge_group: - -concurrency: - group: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true - -env: - CHIP_NO_LOG_TIMESTAMPS: true - -jobs: - linux_standalone: - name: Linux Standalone - - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build:74 - volumes: - - "/tmp/bloat_reports:/tmp/bloat_reports" - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: linux - - - name: Set up environment for size reports - uses: ./.github/actions/setup-size-reports - if: ${{ !env.ACT }} - with: - gh-context: ${{ toJson(github) }} - - - name: Build Standalone cert tool - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target linux-x64-chip-cert \ - build" - - name: Build minmdns example with platform dns - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target linux-x64-address-resolve-tool-platform-mdns-ipv6only \ - build" - - name: Build example Standalone chip tool - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target linux-x64-chip-tool \ - build" - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - linux debug chip-tool \ - out/linux-x64-chip-tool/chip-tool \ - /tmp/bloat_reports/ - - name: Build example Standalone Shell - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target linux-x64-shell \ - build" - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - linux debug shell \ - out/linux-x64-shell/chip-shell \ - /tmp/bloat_reports/ - - name: Build example Standalone All Clusters Server - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target linux-x64-all-clusters \ - build" - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - linux debug all-clusters-app \ - out/linux-x64-all-clusters/chip-all-clusters-app \ - /tmp/bloat_reports/ - - name: Clean out build output - run: rm -rf ./out - - name: Build example Standalone All Clusters Minimal Server - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target linux-x64-all-clusters-minimal \ - build" - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - linux debug all-clusters-minimal-app \ - out/linux-x64-all-clusters-minimal/chip-all-clusters-minimal-app \ - /tmp/bloat_reports/ - - name: Build example TV app - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target linux-x64-tv-app \ - build" - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - linux debug tv-app \ - out/linux-x64-tv-app/chip-tv-app \ - /tmp/bloat_reports/ - - name: Build example Standalone TV Casting App - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target linux-x64-tv-casting-app \ - build" - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - linux debug tv-casting-app \ - out/linux-x64-tv-casting-app/chip-tv-casting-app \ - /tmp/bloat_reports/ - - name: Build example lighting app with RPCs and UI - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target linux-x64-light-rpc-with-ui \ - build" - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - linux debug+rpc+ui lighting-app \ - out/linux-x64-light-rpc-with-ui/chip-lighting-app \ - /tmp/bloat_reports/ - - name: Clean out build output - run: rm -rf ./out - - name: Build example Standalone Bridge - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target linux-x64-bridge \ - build" - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - linux debug bridge-app \ - out/linux-x64-bridge/chip-bridge-app \ - /tmp/bloat_reports/ - - name: Build example OTA Provider - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target linux-x64-ota-provider \ - build" - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - linux debug ota-provider-app \ - out/linux-x64-ota-provider/chip-ota-provider-app \ - /tmp/bloat_reports/ - - name: Build example OTA Requestor - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target linux-x64-ota-requestor \ - build" - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - linux debug ota-requestor-app \ - out/linux-x64-ota-requestor/chip-ota-requestor-app \ - /tmp/bloat_reports/ - - name: Clean out build output - run: rm -rf ./out - - name: Build example Standalone Lock App - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target linux-x64-lock-no-thread \ - build" - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - linux debug lock-app \ - out/linux-x64-lock-no-thread/chip-lock-app \ - /tmp/bloat_reports/ - - name: Build example contact sensor with UI - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target linux-x64-contact-sensor-no-ble-with-ui \ - build" - - name: Build example Air Purifier - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target linux-x64-air-purifier \ - build" - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - linux debug air-purifier-app \ - out/linux-x64-air-purifier/chip-air-purifier-app \ - /tmp/bloat_reports/ - - name: Build example Fabric Admin - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target linux-x64-fabric-admin-rpc \ - build" - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - linux debug fabric-admin \ - out/linux-x64-fabric-admin-rpc/fabric-admin \ - /tmp/bloat_reports/ - - name: Build example Fabric Bridge App - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target linux-x64-fabric-bridge-no-ble-rpc \ - build" - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - linux debug fabric-bridge-app \ - out/linux-x64-fabric-bridge-no-ble-rpc/fabric-bridge-app \ - /tmp/bloat_reports/ - - name: Uploading Size Reports - uses: ./.github/actions/upload-size-reports - if: ${{ !env.ACT }} - with: - platform-name: Linux-Standalone diff --git a/.github/workflows/examples-linux-tv-casting-app.yaml b/.github/workflows/examples-linux-tv-casting-app.yaml deleted file mode 100644 index e2ff0f9f6697da..00000000000000 --- a/.github/workflows/examples-linux-tv-casting-app.yaml +++ /dev/null @@ -1,89 +0,0 @@ -# Copyright (c) 2024 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. - -name: Test TV Casting Example - -on: - push: - branches-ignore: - - "dependabot/**" - pull_request: - merge_group: - -concurrency: - group: - ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == - 'pull_request' && github.event.number) || (github.event_name == - 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true - -jobs: - Linux-test: - name: Linux Test - - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build:74 - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: linux - - - name: Set Up Environment for Size Reports - uses: ./.github/actions/setup-size-reports - if: ${{ !env.ACT }} - with: - gh-context: ${{ toJson(github) }} - - - name: Build Linux tv-app - run: | - ./scripts/run_in_build_env.sh \ - "scripts/examples/gn_build_example.sh examples/tv-app/linux/ out/tv-app" - - - name: Build Linux tv-casting-app - run: | - ./scripts/run_in_build_env.sh \ - "scripts/examples/gn_build_example.sh examples/tv-casting-app/linux/ out/tv-casting-app chip_casting_simplified=true" - - - name: - Test casting from Linux tv-casting-app to Linux tv-app - - Commissionee Generated Passcode - run: | - ./scripts/run_in_build_env.sh \ - "python3 ./scripts/tests/run_tv_casting_test.py" - timeout-minutes: 2 # Comment this out to debug if GitHub Action times out. - - # TODO: this test is flaky and was disabled - # https://github.com/project-chip/connectedhomeip/issues/34598 - # - # - name: - # Test casting from Linux tv-casting-app to Linux tv-app - - # Commissioner Generated Passcode - # run: | - # ./scripts/run_in_build_env.sh \ - # "python3 ./scripts/tests/run_tv_casting_test.py --commissioner-generated-passcode=True" - # timeout-minutes: 2 # Comment this out to debug if GitHub Action times out. - - - name: Uploading Size Reports - uses: ./.github/actions/upload-size-reports - if: ${{ !env.ACT }} - with: - platform-name: Linux diff --git a/.github/workflows/examples-mw320.yaml b/.github/workflows/examples-mw320.yaml deleted file mode 100644 index 04664c28cf339e..00000000000000 --- a/.github/workflows/examples-mw320.yaml +++ /dev/null @@ -1,71 +0,0 @@ -# Copyright (c) 2020-2021 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. - -name: Build example - MW320 - -on: - push: - branches-ignore: - - 'dependabot/**' - pull_request: - merge_group: - -concurrency: - group: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true - -env: - CHIP_NO_LOG_TIMESTAMPS: true - -jobs: - mw320: - name: MW320 - - env: - BUILD_TYPE: gn_mw320 - - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build:74 - volumes: - - "/tmp/bloat_reports:/tmp/bloat_reports" - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: mw320 - - - name: Set up environment for size reports - uses: ./.github/actions/setup-size-reports - if: ${{ !env.ACT }} - with: - gh-context: ${{ toJson(github) }} - - - name: Build MW320 all clusters example app - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target 'mw320-all-clusters-app' \ - build \ - --copy-artifacts-to out/artifacts \ - " - - name: Uploading Size Reports - uses: ./.github/actions/upload-size-reports - if: ${{ !env.ACT }} - with: - platform-name: MW320 diff --git a/.github/workflows/examples-nrfconnect.yaml b/.github/workflows/examples-nrfconnect.yaml deleted file mode 100644 index 13b0ae9c691d7c..00000000000000 --- a/.github/workflows/examples-nrfconnect.yaml +++ /dev/null @@ -1,211 +0,0 @@ -# Copyright (c) 2020 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. - -name: Build example - nRF Connect SDK - -on: - push: - branches-ignore: - - 'dependabot/**' - pull_request: - merge_group: - -concurrency: - group: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true - -env: - CHIP_NO_LOG_TIMESTAMPS: true - -jobs: - nrfconnect: - name: nRF Connect SDK - - env: - BUILD_TYPE: nrfconnect - - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build-nrf-platform:74 - volumes: - - "/tmp/bloat_reports:/tmp/bloat_reports" - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: nrfconnect - - name: Detect changed paths - uses: dorny/paths-filter@v3 - id: changed_paths - with: - filters: | - nrfconnect: - - '**/nrfconnect/**' - - '**/Zephyr/**' - - '**/zephyr/**' - tests: - - '**/tests/**' - shell: - - 'examples/shell/nrfconnect/**' - - name: Set up environment for size reports - uses: ./.github/actions/setup-size-reports - if: ${{ !env.ACT }} - with: - gh-context: ${{ toJson(github) }} - - - name: Check nRF Connect SDK revision. - run: scripts/run_in_build_env.sh "python3 scripts/setup/nrfconnect/update_ncs.py --check" - - name: Run unit tests of factory data generation script - run: | - scripts/run_in_build_env.sh 'pip3 install -r scripts/setup/requirements.nrfconnect.txt' - scripts/run_in_build_env.sh "./scripts/tools/nrfconnect/tests/test_generate_factory_data.py" - - name: Build example nRF Connect SDK Lock App on nRF52840 DK - if: github.event_name == 'push' || steps.changed_paths.outputs.nrfconnect == 'true' - run: | - scripts/examples/nrfconnect_example.sh lock-app nrf52840dk/nrf52840 - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - nrfconnect nrf52840dk_nrf52840 lock-app \ - examples/lock-app/nrfconnect/build/nrfconnect/zephyr/zephyr.elf \ - /tmp/bloat_reports/ - - name: Build example nRF Connect SDK Lighting App on nRF52840 Dongle - if: github.event_name == 'push' || steps.changed_paths.outputs.nrfconnect == 'true' - run: | - scripts/examples/nrfconnect_example.sh lighting-app nrf52840dongle/nrf52840 -DCONFIG_CHIP_ROTATING_DEVICE_ID=y - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - nrfconnect nrf52840dongle_nrf52840 lighting-app \ - examples/lighting-app/nrfconnect/build/nrfconnect/zephyr/zephyr.elf \ - /tmp/bloat_reports/ - - name: Build example nRF Connect SDK Lighting App on nRF52840 DK with RPC - if: github.event_name == 'push' || steps.changed_paths.outputs.nrfconnect == 'true' - run: | - scripts/examples/nrfconnect_example.sh lighting-app nrf52840dk/nrf52840 -DOVERLAY_CONFIG=rpc.overlay - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - nrfconnect nrf52840dk_nrf52840+rpc lighting-app \ - examples/lighting-app/nrfconnect/build/nrfconnect/zephyr/zephyr.elf \ - /tmp/bloat_reports/ - - name: Build example nRF Connect SDK Light Switch App on nRF52840 DK - if: github.event_name == 'push' || steps.changed_paths.outputs.nrfconnect == 'true' - run: | - scripts/examples/nrfconnect_example.sh light-switch-app nrf52840dk/nrf52840 - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - nrfconnect nrf52840dk_nrf52840 light-switch-app \ - examples/light-switch-app/nrfconnect/build/nrfconnect/zephyr/zephyr.elf \ - /tmp/bloat_reports/ - - name: Build example nRF Connect SDK Shell on nRF52840 DK - if: github.event_name == 'push' || steps.changed_paths.outputs.shell == 'true' - run: | - scripts/examples/nrfconnect_example.sh shell nrf52840dk/nrf52840 - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - nrfconnect nrf52840dk_nrf52840 shell \ - examples/shell/nrfconnect/build/nrfconnect/zephyr/zephyr.elf \ - /tmp/bloat_reports/ - - name: Build example nRF Connect SDK Pump App on nRF52840 DK - if: github.event_name == 'push' || steps.changed_paths.outputs.nrfconnect == 'true' - run: | - scripts/examples/nrfconnect_example.sh pump-app nrf52840dk/nrf52840 - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - nrfconnect nrf52840dk_nrf52840 pump-app \ - examples/pump-app/nrfconnect/build/nrfconnect/zephyr/zephyr.elf \ - /tmp/bloat_reports/ - - name: Build example nRF Connect SDK Pump Controller App on nRF52840 DK - if: github.event_name == 'push' || steps.changed_paths.outputs.nrfconnect == 'true' - run: | - scripts/examples/nrfconnect_example.sh pump-controller-app nrf52840dk/nrf52840 - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - nrfconnect nrf52840dk_nrf52840 pump-controller-app \ - examples/pump-controller-app/nrfconnect/build/nrfconnect/zephyr/zephyr.elf \ - /tmp/bloat_reports/ - - name: Build example nRF Connect SDK All Clusters App on nRF52840 DK - run: | - scripts/examples/nrfconnect_example.sh all-clusters-app nrf52840dk/nrf52840 - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - nrfconnect nrf52840dk_nrf52840 all-clusters-app \ - examples/all-clusters-app/nrfconnect/build/nrfconnect/zephyr/zephyr.elf \ - /tmp/bloat_reports/ - - name: Build example nRF Connect SDK All Clusters Minimal App on nRF52840 DK - run: | - scripts/examples/nrfconnect_example.sh all-clusters-minimal-app nrf52840dk/nrf52840 -DFILE_SUFFIX=dfu - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - nrfconnect nrf52840dk_nrf52840 all-clusters-minimal-app \ - examples/all-clusters-minimal-app/nrfconnect/build/nrfconnect/zephyr/zephyr.elf \ - /tmp/bloat_reports/ - - name: Build example nRF Connect SDK Lock App on nRF5340 DK - if: github.event_name == 'push' || steps.changed_paths.outputs.nrfconnect == 'true' - run: | - scripts/examples/nrfconnect_example.sh lock-app nrf5340dk/nrf5340/cpuapp - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - nrfconnect nrf5340dk_nrf5340_cpuapp lock-app \ - examples/lock-app/nrfconnect/build/nrfconnect/zephyr/zephyr.elf \ - /tmp/bloat_reports/ - - name: Build example nRF Connect SDK Lighting App on nRF5340 DK - if: github.event_name == 'push' || steps.changed_paths.outputs.nrfconnect == 'true' - run: | - scripts/examples/nrfconnect_example.sh lighting-app nrf5340dk/nrf5340/cpuapp - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - nrfconnect nrf5340dk_nrf5340_cpuapp lighting-app \ - examples/lighting-app/nrfconnect/build/nrfconnect/zephyr/zephyr.elf \ - /tmp/bloat_reports/ - - name: Build example nRF Connect SDK Lock App on nRF7002 PDK - if: github.event_name == 'push' || steps.changed_paths.outputs.nrfconnect == 'true' - run: | - scripts/examples/nrfconnect_example.sh lock-app nrf7002dk/nrf5340/cpuapp - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - nrfconnect nrf7002dk_nrf5340_cpuapp lock-app \ - examples/lock-app/nrfconnect/build/nrfconnect/zephyr/zephyr.elf \ - /tmp/bloat_reports/ - - name: Build example nRF Connect SDK Light Switch App on nRF7002 PDK - if: github.event_name == 'push' || steps.changed_paths.outputs.nrfconnect == 'true' - run: | - scripts/examples/nrfconnect_example.sh light-switch-app nrf7002dk/nrf5340/cpuapp - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - nrfconnect nrf7002dk_nrf5340_cpuapp light-switch-app \ - examples/light-switch-app/nrfconnect/build/nrfconnect/zephyr/zephyr.elf \ - /tmp/bloat_reports/ - - name: Build example nRF Connect SDK Lighting App on nRF7002 PDK - if: github.event_name == 'push' || steps.changed_paths.outputs.nrfconnect == 'true' - run: | - scripts/examples/nrfconnect_example.sh lighting-app nrf7002dk/nrf5340/cpuapp - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - nrfconnect nrf7002dk_nrf5340_cpuapp lighting-app \ - examples/light-switch-app/nrfconnect/build/nrfconnect/zephyr/zephyr.elf \ - /tmp/bloat_reports/ - - name: Build example nRF Connect SDK All Clusters App on nRF7002 PDK - run: | - scripts/examples/nrfconnect_example.sh all-clusters-app nrf7002dk/nrf5340/cpuapp -DFILE_SUFFIX=release - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - nrfconnect nrf7002dk_nrf5340_cpuapp all-clusters-app \ - examples/all-clusters-app/nrfconnect/build/nrfconnect/zephyr/zephyr.elf \ - /tmp/bloat_reports/ - - name: Run unit tests for Zephyr native_posix_64 platform - if: github.event_name == 'push' || steps.changed_paths.outputs.tests == 'true' || steps.changed_paths.outputs.nrfconnect == 'true' - run: | - scripts/run_in_build_env.sh "./scripts/build/build_examples.py --target nrf-native-posix-64-tests build" - - name: Uploading Failed Test Logs - uses: actions/upload-artifact@v4 - if: ${{ failure() && !env.ACT }} - with: - name: test-log - path: | - src/test_driver/nrfconnect/build/Testing/Temporary/LastTest.log - - - name: Uploading Size Reports - uses: ./.github/actions/upload-size-reports - if: ${{ !env.ACT }} - with: - platform-name: nRFConnect diff --git a/.github/workflows/examples-nuttx.yaml b/.github/workflows/examples-nuttx.yaml deleted file mode 100644 index d1bf7594b0a332..00000000000000 --- a/.github/workflows/examples-nuttx.yaml +++ /dev/null @@ -1,55 +0,0 @@ -# Copyright (c) 2024 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. - -name: Build example - NuttX - -on: - push: - pull_request: - merge_group: - workflow_dispatch: - -concurrency: - group: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true - -env: - CHIP_NO_LOG_TIMESTAMPS: true - -jobs: - nuttx: - name: NuttX - - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build-nuttx:74 - volumes: - - "/tmp/bloat_reports:/tmp/bloat_reports" - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: nuttx - extra-submodule-parameters: " --recursive" - - name: Build example simulator NuttX Lighting App - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target nuttx-x64-light \ - build \ - " diff --git a/.github/workflows/examples-nxp.yaml b/.github/workflows/examples-nxp.yaml deleted file mode 100644 index d09e893f2909dd..00000000000000 --- a/.github/workflows/examples-nxp.yaml +++ /dev/null @@ -1,287 +0,0 @@ -# Copyright (c) 2021 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. - -name: Build example - NXP - -on: - push: - branches-ignore: - - 'dependabot/**' - pull_request: - merge_group: - -concurrency: - group: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true - -env: - CHIP_NO_LOG_TIMESTAMPS: true - -jobs: - k32w0: - name: K32W0 - - env: - BUILD_TYPE: gn_k32w - - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build-k32w:74 - volumes: - - "/tmp/bloat_reports:/tmp/bloat_reports" - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: nxp - - - name: Set up environment for size reports - uses: ./.github/actions/setup-size-reports - if: ${{ !env.ACT }} - with: - gh-context: ${{ toJson(github) }} - - - name: Build examples - run: | - scripts/run_in_build_env.sh "\ - ./scripts/build/build_examples.py \ - --target nxp-k32w0-freertos-lighting \ - --target nxp-k32w0-freertos-lighting-factory \ - --target nxp-k32w0-freertos-lighting-rotating-id \ - --target nxp-k32w0-freertos-contact-sensor \ - --target nxp-k32w0-freertos-contact-sensor-low-power \ - --target nxp-k32w0-freertos-contact-sensor-low-power-factory \ - build \ - --copy-artifacts-to out/artifacts \ - " - - name: Get lighting app size stats - run: | - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - nxp k32w0+release light \ - out/artifacts/nxp-k32w0-freertos-lighting/chip-k32w0x-light-example.elf \ - /tmp/bloat_reports/ - - name: Get contact sensor size stats - run: | - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - nxp k32w0+release contact \ - out/artifacts/nxp-k32w0-freertos-contact-sensor-low-power/chip-k32w0x-contact-example.elf \ - /tmp/bloat_reports/ - - name: Uploading Size Reports - uses: ./.github/actions/upload-size-reports - if: ${{ !env.ACT }} - with: - platform-name: K32W0 - k32w1: - name: K32W1 - - env: - BUILD_TYPE: gn_k32w - - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build-nxp:71 - volumes: - - "/tmp/bloat_reports:/tmp/bloat_reports" - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: nxp - extra-submodule-parameters: --recursive - - - name: Set up environment for size reports - uses: ./.github/actions/setup-size-reports - if: ${{ !env.ACT }} - with: - gh-context: ${{ toJson(github) }} - - - name: Build examples - run: | - scripts/run_in_build_env.sh "\ - ./scripts/build/build_examples.py \ - --target nxp-k32w1-freertos-lighting \ - --target nxp-k32w1-freertos-contact-sensor-low-power \ - build \ - --copy-artifacts-to out/artifacts \ - " - - name: Get lighting app size stats - run: | - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - nxp k32w1+release light \ - out/artifacts/nxp-k32w1-freertos-lighting/chip-k32w1-light-example.elf \ - /tmp/bloat_reports/ - - name: Get contact sensor size stats - run: | - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - nxp k32w1+release contact \ - out/artifacts/nxp-k32w1-freertos-contact-sensor-low-power/chip-k32w1-contact-example.elf \ - /tmp/bloat_reports/ - - name: Uploading Size Reports - uses: ./.github/actions/upload-size-reports - if: ${{ !env.ACT }} - with: - platform-name: K32W1 - mcxw71: - name: MCXW71 - - env: - BUILD_TYPE: gn_k32w - - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build-nxp:71 - volumes: - - "/tmp/bloat_reports:/tmp/bloat_reports" - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: nxp - extra-submodule-parameters: --recursive - - - name: Set up environment for size reports - uses: ./.github/actions/setup-size-reports - if: ${{ !env.ACT }} - with: - gh-context: ${{ toJson(github) }} - - - name: Build examples - run: | - scripts/run_in_build_env.sh "\ - ./scripts/build/build_examples.py \ - --target nxp-mcxw71-freertos-lighting \ - --target nxp-mcxw71-freertos-contact-sensor-low-power \ - build \ - --copy-artifacts-to out/artifacts \ - " - - name: Get lighting app size stats - run: | - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - nxp mcxw71+release light \ - out/artifacts/nxp-mcxw71-freertos-lighting/chip-mcxw71-light-example.elf \ - /tmp/bloat_reports/ - - name: Get contact sensor size stats - run: | - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - nxp mcxw71+release contact \ - out/artifacts/nxp-mcxw71-freertos-contact-sensor-low-power/chip-mcxw71-contact-example.elf \ - /tmp/bloat_reports/ - - name: Uploading Size Reports - uses: ./.github/actions/upload-size-reports - if: ${{ !env.ACT }} - with: - platform-name: MCXW71 - rw61x: - name: RW61X - - env: - BUILD_TYPE: gn_rw61x - - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build-nxp:74 - volumes: - - "/tmp/bloat_reports:/tmp/bloat_reports" - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: nxp - extra-submodule-parameters: --recursive - - - name: Set up environment for size reports - uses: ./.github/actions/setup-size-reports - if: ${{ !env.ACT }} - with: - gh-context: ${{ toJson(github) }} - - - name: Build RW61X all clusters example app - run: | - scripts/run_in_build_env.sh "\ - ./scripts/build/build_examples.py \ - --target nxp-rw61x-freertos-all-clusters-wifi \ - --target nxp-rw61x-freertos-all-clusters-thread \ - --target nxp-rw61x-freertos-all-clusters-thread-wifi \ - build \ - --copy-artifacts-to out/artifacts \ - " - - - name: Build RW61X thermostat example app - run: | - scripts/run_in_build_env.sh "\ - ./scripts/build/build_examples.py \ - --target nxp-rw61x-freertos-thermostat-wifi \ - --target nxp-rw61x-freertos-thermostat-thread \ - --target nxp-rw61x-freertos-thermostat-thread-wifi \ - build \ - --copy-artifacts-to out/artifacts \ - " - - - name: Build RW61X laundry-washer example app - run: | - scripts/run_in_build_env.sh "\ - ./scripts/build/build_examples.py \ - --target nxp-rw61x-freertos-laundry-washer-wifi \ - --target nxp-rw61x-freertos-laundry-washer-thread \ - --target nxp-rw61x-freertos-laundry-washer-thread-wifi \ - build \ - --copy-artifacts-to out/artifacts \ - " - - name: Uploading Size Reports - uses: ./.github/actions/upload-size-reports - if: ${{ !env.ACT }} - with: - platform-name: RW61X - zephyr: - name: ZEPHYR_RW61X - - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build-nxp-zephyr:74 - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: nxp - - - name: Build RW61x Zephyr examples - run: | - scripts/run_in_build_env.sh "\ - ./scripts/build/build_examples.py \ - --target nxp-rw61x-zephyr-all-clusters \ - --target nxp-rw61x-zephyr-thermostat \ - --target nxp-rw61x-zephyr-laundry-washer-factory \ - build \ - " diff --git a/.github/workflows/examples-openiotsdk.yaml b/.github/workflows/examples-openiotsdk.yaml deleted file mode 100644 index d85a789a0bcef7..00000000000000 --- a/.github/workflows/examples-openiotsdk.yaml +++ /dev/null @@ -1,220 +0,0 @@ -# Copyright (c) 2021 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. - -name: Build example - Open IoT SDK - -on: - push: - branches-ignore: - - 'dependabot/**' - pull_request: - merge_group: - workflow_dispatch: - -concurrency: - group: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true - -env: - CHIP_NO_LOG_TIMESTAMPS: true - -jobs: - openiotsdk: - name: Open IoT SDK examples building - - env: - TEST_NETWORK_NAME: OIStest - - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build-openiotsdk:74 - volumes: - - "/tmp/bloat_reports:/tmp/bloat_reports" - options: --privileged - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: openiotsdk linux - extra-submodule-parameters: " --recursive" - - - name: Set up environment for size reports - uses: ./.github/actions/setup-size-reports - if: ${{ !env.ACT }} - with: - gh-context: ${{ toJson(github) }} - - - name: Build and install Python controller - run: | - scripts/run_in_build_env.sh './scripts/build_python.sh --install_virtual_env out/venv' - scripts/run_in_python_env.sh out/venv 'pip install -r scripts/setup/requirements.openiotsdk.txt' - - - name: Build shell example - id: build_shell - run: | - scripts/examples/openiotsdk_example.sh shell - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - openiotsdk release shell \ - examples/shell/openiotsdk/build/chip-openiotsdk-shell-example.elf \ - /tmp/bloat_reports/ - - - name: "Test: shell example" - if: github.event_name == 'workflow_dispatch' && steps.build_shell.outcome == 'success' - run: | - scripts/run_in_python_env.sh out/venv \ - 'scripts/examples/openiotsdk_example.sh --no-activate -C test shell' - - - name: Clean shell output - run: rm -rf examples/shell/openiotsdk/build - - - name: Build lock-app example (mbedtls) - # Disabled being tracked here: https://github.com/project-chip/connectedhomeip/issues/28026 - if: false - id: build_lock_app_mbedtls - run: | - scripts/examples/openiotsdk_example.sh -b mbedtls lock-app - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - openiotsdk release lock-app-mbedtls \ - examples/lock-app/openiotsdk/build/chip-openiotsdk-lock-app-example.elf \ - /tmp/bloat_reports/ - - - name: Build tv-app example - id: build_tv_app - timeout-minutes: 10 - run: | - scripts/examples/openiotsdk_example.sh tv-app - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - openiotsdk release tv-app \ - examples/tv-app/openiotsdk/build/chip-openiotsdk-tv-app-example.elf \ - /tmp/bloat_reports/ - - - name: "Test: tv-app example" - if: github.event_name == 'workflow_dispatch' && steps.build_tv_app.outcome == 'success' - timeout-minutes: 10 - run: | - scripts/setup/openiotsdk/network_setup.sh -n $TEST_NETWORK_NAME up - scripts/run_in_python_env.sh out/venv \ - 'scripts/run_in_ns.sh ${TEST_NETWORK_NAME}ns scripts/examples/openiotsdk_example.sh --no-activate -C test -n ${TEST_NETWORK_NAME}tap tv-app' - scripts/setup/openiotsdk/network_setup.sh -n $TEST_NETWORK_NAME down - - - name: Clean tv-app output - run: rm -rf examples/tv-app/openiotsdk/build - - - name: Build all-clusters-app example - id: build_all_clusters_app - timeout-minutes: 10 - run: | - scripts/examples/openiotsdk_example.sh all-clusters-app - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - openiotsdk release all-clusters-app \ - examples/all-clusters-app/openiotsdk/build/chip-openiotsdk-all-clusters-app-example.elf \ - /tmp/bloat_reports/ - - - name: "Test: all-clusters-app example" - if: github.event_name == 'workflow_dispatch' && steps.build_all_clusters_app.outcome == 'success' - timeout-minutes: 5 - run: | - scripts/setup/openiotsdk/network_setup.sh -n $TEST_NETWORK_NAME up - scripts/run_in_python_env.sh out/venv \ - 'scripts/run_in_ns.sh ${TEST_NETWORK_NAME}ns scripts/examples/openiotsdk_example.sh --no-activate -C test -n ${TEST_NETWORK_NAME}tap all-clusters-app' - scripts/setup/openiotsdk/network_setup.sh -n $TEST_NETWORK_NAME down - - - name: Clean all-clusters-app output - run: rm -rf examples/all-clusters-app/openiotsdk/build - - - name: Build ota-requestor-app example - id: build_ota_requestor_app - timeout-minutes: 10 - run: | - scripts/examples/openiotsdk_example.sh -v 1 -V 0.0.1 ota-requestor-app - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - openiotsdk release ota-requestor-app \ - examples/ota-requestor-app/openiotsdk/build/chip-openiotsdk-ota-requestor-app-example.elf \ - /tmp/bloat_reports/ - - - name: Build unit tests (mbedtls) - # Disabled being tracked here: https://github.com/project-chip/connectedhomeip/issues/28026 - if: false - id: build_unit_tests_mbedtls - run: | - scripts/examples/openiotsdk_example.sh -b mbedtls unit-tests - - - name: Build the OTA provider (Linux) - id: build_ota_provider_app - if: steps.build_ota_requestor_app.outcome == 'success' - timeout-minutes: 10 - run: | - scripts/examples/gn_build_example.sh examples/ota-provider-app/linux/ out/ota-provider chip_config_network_layer_ble=false - - - name: "Test: lock-app example (mbedtls)" - if: github.event_name == 'workflow_dispatch' && steps.build_lock_app_mbedtls.outcome == 'success' - run: | - scripts/setup/openiotsdk/network_setup.sh -n $TEST_NETWORK_NAME up - scripts/run_in_python_env.sh out/venv \ - 'scripts/run_in_ns.sh ${TEST_NETWORK_NAME}ns scripts/examples/openiotsdk_example.sh --no-activate -C test -n ${TEST_NETWORK_NAME}tap lock-app' - scripts/setup/openiotsdk/network_setup.sh -n $TEST_NETWORK_NAME down - - - name: "Test: ota-requestor-app example" - if: github.event_name == 'workflow_dispatch' && steps.build_ota_requestor_app.outcome == 'success' && steps.build_ota_provider_app.outcome == 'success' - timeout-minutes: 30 - run: | - mkdir out/binaries - cp examples/ota-requestor-app/openiotsdk/build/chip-openiotsdk-ota-requestor-app-example.elf out/binaries/ - scripts/examples/openiotsdk_example.sh -c -v 2 -V 0.0.2 ota-requestor-app - cp examples/ota-requestor-app/openiotsdk/build/chip-openiotsdk-ota-requestor-app-example.ota out/binaries/ - scripts/setup/openiotsdk/network_setup.sh -n $TEST_NETWORK_NAME up - scripts/run_in_python_env.sh out/venv \ - 'scripts/run_in_ns.sh ${TEST_NETWORK_NAME}ns scripts/examples/openiotsdk_example.sh --no-activate -p out/binaries -v 2 -V 0.0.2 -C test -n ${TEST_NETWORK_NAME}tap ota-requestor-app' - scripts/setup/openiotsdk/network_setup.sh -n $TEST_NETWORK_NAME down - - - name: "Test: unit-tests (mbedtls)" - if: github.event_name == 'workflow_dispatch' && steps.build_unit_tests_mbedtls.outcome == 'success' - run: | - scripts/run_in_python_env.sh out/venv \ - 'scripts/examples/openiotsdk_example.sh --no-activate -C test unit-tests' - - - name: Build lock-app example (psa) - # Disabled being tracked here: https://github.com/project-chip/connectedhomeip/issues/28026 - if: false - id: build_lock_app_psa - run: | - scripts/examples/openiotsdk_example.sh -c -b psa lock-app - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - openiotsdk release lock-app-psa \ - examples/lock-app/openiotsdk/build/chip-openiotsdk-lock-app-example.elf \ - /tmp/bloat_reports/ - - - name: "Test: lock-app example (psa)" - if: github.event_name == 'workflow_dispatch' && steps.build_lock_app_psa.outcome == 'success' - run: | - scripts/setup/openiotsdk/network_setup.sh -n $TEST_NETWORK_NAME up - scripts/run_in_python_env.sh out/venv \ - 'scripts/run_in_ns.sh ${TEST_NETWORK_NAME}ns scripts/examples/openiotsdk_example.sh --no-activate -C test -n ${TEST_NETWORK_NAME}tap lock-app' - scripts/setup/openiotsdk/network_setup.sh -n $TEST_NETWORK_NAME down - - - name: Build unit tests (psa) - id: build_unit_tests_psa - run: | - scripts/examples/openiotsdk_example.sh -b psa unit-tests - - - name: "Test: unit-tests (psa)" - if: github.event_name == 'workflow_dispatch' && steps.build_unit_tests_psa.outcome == 'success' - run: | - scripts/run_in_python_env.sh out/venv \ - 'scripts/examples/openiotsdk_example.sh --no-activate -C test unit-tests' diff --git a/.github/workflows/examples-qpg.yaml b/.github/workflows/examples-qpg.yaml deleted file mode 100644 index 18d47cf8ef9937..00000000000000 --- a/.github/workflows/examples-qpg.yaml +++ /dev/null @@ -1,89 +0,0 @@ -# Copyright (c) 2020-2021 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. - -name: Build example - QPG - -on: - push: - branches-ignore: - - 'dependabot/**' - pull_request: - merge_group: - -concurrency: - group: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true - -env: - CHIP_NO_LOG_TIMESTAMPS: true - -jobs: - qpg: - name: QPG - - env: - BUILD_TYPE: gn_qpg - - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build:74 - volumes: - - "/tmp/bloat_reports:/tmp/bloat_reports" - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: qpg - - - name: Set up environment for size reports - uses: ./.github/actions/setup-size-reports - if: ${{ !env.ACT }} - with: - gh-context: ${{ toJson(github) }} - - - name: Build QPG6105 example apps - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --enable-flashbundle \ - --target qpg-qpg6105-lock \ - --target qpg-qpg6105-light \ - --target qpg-qpg6105-light-switch \ - --target qpg-qpg6105-thermostat \ - build \ - --copy-artifacts-to out/artifacts \ - " - - name: Build Matter SDK library - run: | - config/qpg/chip-gn/build.sh - - - name: Prepare some bloat report from the previous builds - run: | - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - qpg qpg6105+debug lighting-app \ - out/qpg-qpg6105-light/chip-qpg6105-lighting-example.out \ - /tmp/bloat_reports/ - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - qpg qpg6105+debug lock-app \ - out/qpg-qpg6105-lock/chip-qpg6105-lock-example.out \ - /tmp/bloat_reports/ - - name: Uploading Size Reports - uses: ./.github/actions/upload-size-reports - if: ${{ !env.ACT }} - with: - platform-name: QPG diff --git a/.github/workflows/examples-stm32.yaml b/.github/workflows/examples-stm32.yaml deleted file mode 100644 index 6c4fa05864efff..00000000000000 --- a/.github/workflows/examples-stm32.yaml +++ /dev/null @@ -1,79 +0,0 @@ -# Copyright (c) 2020-2021 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. - -name: Build example - stm32 - -on: - push: - branches-ignore: - - 'dependabot/**' - pull_request: - merge_group: - -concurrency: - group: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true - -env: - CHIP_NO_LOG_TIMESTAMPS: true - -jobs: - stm32: - name: stm32 - timeout-minutes: 60 - - env: - BUILD_TYPE: gn_stm32 - - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build:74 - volumes: - - "/tmp/bloat_reports:/tmp/bloat_reports" - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: stm32 - extra-submodule-parameters: --recursive - - name: Set up environment for size reports - uses: ./.github/actions/setup-size-reports - if: ${{ !env.ACT }} - with: - gh-context: ${{ toJson(github) }} - - - name: Build stm32 example apps - timeout-minutes: 20 - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target stm32-STM32WB5MM-DK-light build \ - " - - - name: Gather size reports - run: | - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - stm32 STM32WB5MM-DK light \ - out/stm32-stm32wb5mm-dk-light/chip-stm32-lighting-example.elf \ - /tmp/bloat_reports/ - - - name: Uploading Size Reports - uses: ./.github/actions/upload-size-reports - if: ${{ !env.ACT }} - with: - platform-name: stm32 diff --git a/.github/workflows/examples-telink.yaml b/.github/workflows/examples-telink.yaml deleted file mode 100644 index 904ae98fbcabcc..00000000000000 --- a/.github/workflows/examples-telink.yaml +++ /dev/null @@ -1,280 +0,0 @@ -# Copyright (c) 2022-2024 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. - -name: Build example - Telink - -on: - push: - branches-ignore: - - 'dependabot/**' - pull_request: - merge_group: - -concurrency: - group: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true - -env: - CHIP_NO_LOG_TIMESTAMPS: true - -jobs: - telink: - name: Telink - env: - BUILD_TYPE: telink - - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build-telink:74 - volumes: - - "/tmp/bloat_reports:/tmp/bloat_reports" - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: telink - - - name: Set up environment for size reports - uses: ./.github/actions/setup-size-reports - if: ${{ !env.ACT }} - with: - gh-context: ${{ toJson(github) }} - - # - name: Update Zephyr to specific revision (for developers purpose) - # run: scripts/run_in_build_env.sh "python3 scripts/tools/telink/update_zephyr.py ab81a585fca6a83b30e1f4e58a021113d6a3acb8" - - - name: Build example Telink (B92 retention) Air Quality Sensor App - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py --target 'telink-tlsr9528a_retention-air-quality-sensor' build" - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - telink tlsr9528a_retention air-quality-sensor-app \ - out/telink-tlsr9528a_retention-air-quality-sensor/zephyr/zephyr.elf \ - /tmp/bloat_reports/ - - - name: clean out build output - run: rm -rf ./out - - - name: Build example Telink (W91) All Clusters App - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py --target 'telink-tlsr9118bdk40d-all-clusters' build" - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - telink tlsr9118bdk40d all-clusters-app \ - out/telink-tlsr9118bdk40d-all-clusters/zephyr/zephyr.elf \ - /tmp/bloat_reports/ - - - name: clean out build output - run: rm -rf ./out - - - name: Build example Telink (B92) All Clusters Minimal App - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py --target 'telink-tlsr9528a-all-clusters-minimal' build" - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - telink tlsr9528a all-clusters-minimal-app \ - out/telink-tlsr9528a-all-clusters-minimal/zephyr/zephyr.elf \ - /tmp/bloat_reports/ - - - name: clean out build output - run: rm -rf ./out - - - name: Build example Telink (B95) Bridge App - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py --target 'telink-tlsr9258a-bridge' build" - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - telink tlsr9258a bridge-app \ - out/telink-tlsr9258a-bridge/zephyr/zephyr.elf \ - /tmp/bloat_reports/ - - - name: clean out build output - run: rm -rf ./out - - - name: Build example Telink (B92 retention) Contact Sensor App - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py --target 'telink-tlsr9528a_retention-contact-sensor' build" - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - telink tlsr9528a_retention contact-sensor-app \ - out/telink-tlsr9528a_retention-contact-sensor/zephyr/zephyr.elf \ - /tmp/bloat_reports/ - - - name: clean out build output - run: rm -rf ./out - - - name: Build tools required for Factory Data - run: | - ./scripts/checkout_submodules.py --allow-changing-global-git-config --shallow --platform linux - ./scripts/build/gn_gen.sh - ./scripts/run_in_build_env.sh "ninja -C ./out/$BUILD_TYPE chip-cert chip-tool spake2p" - mv ./out/$BUILD_TYPE/chip-cert ./out/$BUILD_TYPE/chip-tool ./out/$BUILD_TYPE/spake2p ./out - - - name: clean out build output (keep tools) - run: rm -rf ./out/telink* - - - name: Build example Telink (W91) Lighting App with OTA, Factory Data - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py --target 'telink-tlsr9118bdk40d-light-ota-factory-data' build" - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - telink tlsr9118bdk40d lighting-app-ota-factory-data \ - out/telink-tlsr9118bdk40d-light-ota-factory-data/zephyr/zephyr.elf \ - /tmp/bloat_reports/ - - - name: clean out build output (keep tools) - run: rm -rf ./out/telink* - - - name: Build example Telink (B91) Lighting App with OTA, RPC, Factory Data and 4Mb flash - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py --target 'telink-tlsr9518adk80d-light-ota-rpc-factory-data-4mb' build" - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - telink tlsr9518adk80d lighting-app-ota-rpc-factory-data-4mb \ - out/telink-tlsr9518adk80d-light-ota-rpc-factory-data-4mb/zephyr/zephyr.elf \ - /tmp/bloat_reports/ - - - name: clean out build output (keep tools) - run: rm -rf ./out/telink* - - - name: Build example Telink (B92) Light Switch App with OTA, Shell, Factory Data - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py --target 'telink-tlsr9528a-light-switch-ota-shell-factory-data' build" - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - telink tlsr9528a light-switch-app-ota-shell-factory-data \ - out/telink-tlsr9528a-light-switch-ota-shell-factory-data/zephyr/zephyr.elf \ - /tmp/bloat_reports/ - - - name: clean out build output - run: rm -rf ./out - - - name: Build example Telink (B92) Lock App with DFU - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py --target 'telink-tlsr9528a-lock-dfu' build" - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - telink tlsr9528a lock-app-dfu \ - out/telink-tlsr9528a-lock-dfu/zephyr/zephyr.elf \ - /tmp/bloat_reports/ - - - name: clean out build output - run: rm -rf ./out - - - name: Build example Telink (B95) OTA Requestor App - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py --target 'telink-tlsr9258a-ota-requestor' build" - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - telink tlsr9258a ota-requestor-app \ - out/telink-tlsr9258a-ota-requestor/zephyr/zephyr.elf \ - /tmp/bloat_reports/ - - - name: clean out build output - run: rm -rf ./out - - - name: Build example Telink (B91 USB) Pump App - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py --target 'telink-tlsr9518adk80d-pump-usb' build" - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - telink tlsr9518adk80d pump-app-usb \ - out/telink-tlsr9518adk80d-pump-usb/zephyr/zephyr.elf \ - /tmp/bloat_reports/ - - - name: clean out build output - run: rm -rf ./out - - - name: Build example Telink (B91) Pump Controller App - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py --target 'telink-tlsr9518adk80d-pump-controller' build" - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - telink tlsr9518adk80d pump-controller-app \ - out/telink-tlsr9518adk80d-pump-controller/zephyr/zephyr.elf \ - /tmp/bloat_reports/ - - - name: clean out build output - run: rm -rf ./out - - - name: Build example Telink (B91) Shell App - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py --target 'telink-tlsr9518adk80d-shell' build" - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - telink tlsr9518adk80d shell \ - out/telink-tlsr9518adk80d-shell/zephyr/zephyr.elf \ - /tmp/bloat_reports/ - - - name: clean out build output - run: rm -rf ./out - - - name: Build example Telink (B92 retention) Smoke CO Alarm App - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py --target 'telink-tlsr9528a_retention-smoke-co-alarm' build" - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - telink tlsr9528a_retention smoke_co_alarm-app \ - out/telink-tlsr9528a_retention-smoke-co-alarm/zephyr/zephyr.elf \ - /tmp/bloat_reports/ - - - name: clean out build output - run: rm -rf ./out - - - name: Build example Telink (B91 Mars) Temperature Measurement App with OTA - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py --target 'telink-tlsr9518adk80d-temperature-measurement-mars-ota' build" - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - telink tlsr9518adk80d temperature-measurement-app-mars-ota \ - out/telink-tlsr9518adk80d-temperature-measurement-mars-ota/zephyr/zephyr.elf \ - /tmp/bloat_reports/ - - - name: clean out build output - run: rm -rf ./out - - - name: Build example Telink (B91) Thermostat App - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py --target 'telink-tlsr9518adk80d-thermostat' build" - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - telink tlsr9518adk80d thermostat \ - out/telink-tlsr9518adk80d-thermostat/zephyr/zephyr.elf \ - /tmp/bloat_reports/ - - - name: clean out build output - run: rm -rf ./out - - - name: Build example Telink (W91) Window Covering App - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py --target 'telink-tlsr9118bdk40d-window-covering' build" - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - telink tlsr9118bdk40d window-covering \ - out/telink-tlsr9118bdk40d-window-covering/zephyr/zephyr.elf \ - /tmp/bloat_reports/ - - - name: clean out build output - run: rm -rf ./out - - - name: Uploading Size Reports - uses: ./.github/actions/upload-size-reports - if: ${{ !env.ACT }} - with: - platform-name: Telink diff --git a/.github/workflows/examples-tizen.yaml b/.github/workflows/examples-tizen.yaml deleted file mode 100644 index f6571342a84618..00000000000000 --- a/.github/workflows/examples-tizen.yaml +++ /dev/null @@ -1,86 +0,0 @@ -# Copyright (c) 2021 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. - -name: Build example - Tizen - -on: - push: - branches-ignore: - - 'dependabot/**' - pull_request: - merge_group: - -concurrency: - group: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true - -env: - CHIP_NO_LOG_TIMESTAMPS: true - -jobs: - tizen: - name: Tizen - - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build-tizen:74 - options: --user root - volumes: - - "/tmp/bloat_reports:/tmp/bloat_reports" - - "/tmp/output_binaries:/tmp/output_binaries" - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: tizen - - - name: Set up environment for size reports - uses: ./.github/actions/setup-size-reports - if: ${{ !env.ACT }} - with: - gh-context: ${{ toJson(github) }} - - - name: Build Tizen examples - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --enable-flashbundle \ - --target tizen-arm-all-clusters \ - --target tizen-arm-chip-tool-ubsan \ - --target tizen-arm-light-with-ui \ - build \ - --copy-artifacts-to out/artifacts \ - " - - - name: Bloat report - chip-tool - run: | - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - tizen arm chip-tool-ubsan out/tizen-arm-chip-tool-ubsan/chip-tool \ - /tmp/bloat_reports/ - - name: Bloat report - all-clusters-app - run: | - .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - tizen arm all-clusters-app out/tizen-arm-all-clusters/chip-all-clusters-app \ - /tmp/bloat_reports/ - - - name: Uploading Size Reports - uses: ./.github/actions/upload-size-reports - if: ${{ !env.ACT }} - with: - platform-name: Tizen diff --git a/.github/workflows/full-android.yaml b/.github/workflows/full-android.yaml deleted file mode 100644 index 43aee09a821be9..00000000000000 --- a/.github/workflows/full-android.yaml +++ /dev/null @@ -1,117 +0,0 @@ -# Copyright (c) 2020 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. - -name: Full builds - Android - -on: - push: - branches-ignore: - - 'dependabot/**' - workflow_dispatch: - -concurrency: - group: full-${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true - -env: - CHIP_NO_LOG_TIMESTAMPS: true - -jobs: - full_android: - name: Run - - env: - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64/ - - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build-android:74 - volumes: - - "/tmp/log_output:/tmp/test_logs" - - steps: - - uses: actions/checkout@v4 - name: Checkout - with: - token: ${{ github.token }} - # To use act like: - # act -j full_android - # - # Note you likely still need to have non submodules setup for the - # local machine, like: - # git submodule deinit --all - - uses: actions/checkout@v4 - if: ${{ env.ACT }} - name: Checkout (ACT for local build) - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: android - - - name: Cleanup pigweed CIPD packages - # This should not generally be needed, however android CI runs out of space - # We do not need pigweed cross compile here because we use android NDK - # compilers. Removing this package saves a significant amount of space. - continue-on-error: true - run: | - du -sh .environment/cipd/packages/arm - rm -rf .environment/cipd/packages/arm - - name: Build Android arm-chip-tool - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py --target android-arm-chip-tool build" - - name: Clean out build output - run: rm -rf ./out examples/android/CHIPTool/app/libs/jniLibs/* examples/android/CHIPTool/app/libs/*.jar - - name: Build Android arm-tv-casting-app - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py --target android-arm-tv-casting-app build" - - name: Clean out build output - run: rm -rf ./out examples/tv-casting-app/android/App/app/libs/jniLibs/* examples/tv-casting-app/android/App/app/libs/*.jar - - name: Build Android arm-tv-server - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py --target android-arm-tv-server build" - - name: Clean out build output - run: rm -rf ./out examples/tv-app/android/App/app/libs/jniLibs/* examples/tv-app/android/App/app/libs/*.jar - - name: Build Android arm64-tv-casting-app - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py --target android-arm64-tv-casting-app build" - - name: Clean out build output - run: rm -rf ./out examples/tv-casting-app/android/app/libs/jniLibs/* examples/android/CHIPTool/app/libs/*.jar - - name: Build Android arm64-tv-server - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py --target android-arm64-tv-server build" - - name: Clean out build output - run: rm -rf ./out examples/tv-app/android/App/app/libs/jniLibs/* examples/tv-app/android/App/app/libs/*.jar - - name: Build Android arm64-chip-tool - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py --target android-arm64-chip-tool build" - - name: Run Android build rule tests - run: | - ./scripts/run_in_build_env.sh \ - "ninja -C out/android-arm64-chip-tool build/chip/java/tests:java_build_test" - - name: Clean out build output - run: rm -rf ./out examples/android/CHIPTool/app/libs/jniLibs/* examples/android/CHIPTool/app/libs/*.jar - - name: Build Android arm64-chip-test - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py --target android-arm64-chip-test build" - - name: Clean out build output - run: rm -rf ./out examples/android/CHIPTest/app/libs/jniLibs/* examples/android/CHIPTest/app/libs/*.jar diff --git a/.github/workflows/fuzzing-build.yaml b/.github/workflows/fuzzing-build.yaml deleted file mode 100644 index d839317bc4248e..00000000000000 --- a/.github/workflows/fuzzing-build.yaml +++ /dev/null @@ -1,101 +0,0 @@ -# Copyright (c) 2021 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. - -name: Fuzzing Builds - -on: - # For now, only manual triggers. - workflow_dispatch: - -concurrency: - group: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true - -env: - CHIP_NO_LOG_TIMESTAMPS: true - -jobs: - build_linux_fuzzing: - name: Build on Linux - - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build:74 - volumes: - - "/tmp/log_output:/tmp/test_logs" - - steps: - - name: Checkout - uses: actions/checkout@v4 - - run: apt-get update - - run: apt-get install --fix-missing llvm-10 clang-10 - - name: Try to ensure the objdir-clone dir exists - run: | - mkdir objdir-clone || true - - - name: Bootstrap - uses: ./.github/actions/bootstrap - - - name: Build all-clusters-app - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target linux-x64-all-clusters-no-ble-libfuzzer \ - build \ - --copy-artifacts-to objdir-clone \ - " - - name: Uploading binaries - uses: actions/upload-artifact@v4 - if: ${{ !env.ACT }} - with: - name: objdir-linux - path: objdir-clone/ - # objdirs are big; don't hold on to them too long. - retention-days: 5 - - build_darwin_fuzzing: - name: Build on Darwin - runs-on: macos-13 - if: github.actor != 'restyled-io[bot]' - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Setup Environment - run: brew install llvm - - name: Try to ensure the objdir-clone dir exists - run: | - mkdir objdir-clone || true - - - name: Bootstrap - uses: ./.github/actions/bootstrap - - - name: Build all-clusters-app - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target darwin-x64-all-clusters-no-ble-asan-libfuzzer-clang \ - build \ - --copy-artifacts-to objdir-clone \ - " - - name: Uploading binaries - uses: actions/upload-artifact@v4 - if: ${{ !env.ACT }} - with: - name: crash-darwin - path: objdir-clone/ - # objdirs are big; don't hold on to them too long. - retention-days: 5 diff --git a/.github/workflows/gradle-wrapper-validation.yml b/.github/workflows/gradle-wrapper-validation.yml deleted file mode 100644 index ab3f49942329ce..00000000000000 --- a/.github/workflows/gradle-wrapper-validation.yml +++ /dev/null @@ -1,20 +0,0 @@ -name: "Validate Gradle Wrapper" -on: - push: - branches-ignore: - - 'dependabot/**' - pull_request: - -jobs: - validation: - name: "Validation" - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: Wandalen/wretry.action@v1.4.5 - name: Gradle Validation - continue-on-error: true - with: - action: gradle/wrapper-validation-action@v1 - attempt_limit: 3 - attempt_delay: 2000 diff --git a/.github/workflows/issue-labeler.yaml b/.github/workflows/issue-labeler.yaml deleted file mode 100644 index a92a4c212d187a..00000000000000 --- a/.github/workflows/issue-labeler.yaml +++ /dev/null @@ -1,20 +0,0 @@ -name: "Issue Labeler" -on: - issues: - types: [opened, edited] - -permissions: - issues: write - contents: read - -jobs: - triage: - runs-on: ubuntu-latest - steps: - - uses: github/issue-labeler@v3.4 #May not be the latest version - with: - configuration-path: .github/issue-labeler.yml - not-before: 2020-01-15T02:54:34Z - enable-versioned-regex: 0 - sync-labels: 1 - repo-token: ${{ github.token }} \ No newline at end of file diff --git a/.github/workflows/java-tests.yaml b/.github/workflows/java-tests.yaml deleted file mode 100644 index a43fdfb7f49d4d..00000000000000 --- a/.github/workflows/java-tests.yaml +++ /dev/null @@ -1,308 +0,0 @@ -# Copyright (c) 2023 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. - -name: Java Tests - -on: - push: - branches-ignore: - - 'dependabot/**' - pull_request: - merge_group: - workflow_dispatch: - -concurrency: - group: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == - 'pull_request' && github.event.number) || (github.event_name == - 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true - -env: - CHIP_NO_LOG_TIMESTAMPS: true - -jobs: - java_tests_linux: - name: Linux - - env: - TSAN_OPTIONS: "halt_on_error=1 suppressions=scripts/tests/chiptest/tsan-linux-suppressions.txt" - - if: github.actor != 'restyled-io[bot]' - runs-on: ubuntu-latest - - container: - image: ghcr.io/project-chip/chip-build-java:74 - options: --privileged --sysctl "net.ipv6.conf.all.disable_ipv6=0 - net.ipv4.conf.all.forwarding=0 net.ipv6.conf.all.forwarding=0" - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: linux - bootstrap-log-name: bootstrap-logs-linux-${{ matrix.build_variant }}${{ matrix.chip_tool }} - - name: Try to ensure the directories for core dumping exist and we - can write them. - run: | - mkdir /tmp/cores || true - sysctl -w kernel.core_pattern=/tmp/cores/core.%u.%p.%t || true - mkdir objdir-clone || true - - name: Generate unit tests - run: | - scripts/run_in_build_env.sh \ - './scripts/build/build_examples.py \ - --target linux-x64-tests \ - gen \ - ' - - name: Build unit tests - run: scripts/run_in_build_env.sh 'ninja -C out/linux-x64-tests src:java_controller_tests' - - - name: Run unit tests - # TODO: this direct path loading is not maintainable. Our build system should define and - # support test classes. - run: | - $JAVA_PATH/bin/java \ - -cp 'third_party/java_deps/artifacts/*:out/linux-x64-tests/lib/src/controller/java/*' \ - org.junit.runner.JUnitCore \ - matter.tlv.TlvWriterTest \ - matter.tlv.TlvReadWriteTest \ - matter.tlv.TlvReaderTest \ - matter.jsontlv.JsonToTlvToJsonTest \ - matter.onboardingpayload.ManualCodeTest \ - matter.onboardingpayload.QRCodeTest - - name: Build Java Matter Controller and all clusters app - run: | - scripts/run_in_build_env.sh './scripts/build_python.sh --install_virtual_env out/venv' - scripts/run_in_python_env.sh out/venv 'pip install -r scripts/setup/requirements.build.txt' - scripts/run_in_python_env.sh out/venv 'pip install colorama' - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test \ - --target linux-x64-java-matter-controller \ - --target linux-x64-lit-icd-ipv6only \ - build \ - " - - name: Build Kotlin Matter Controller - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target linux-x64-kotlin-matter-controller \ - build \ - " - - name: Run Discover Commissionables Test - run: | - scripts/run_in_python_env.sh out/venv \ - './scripts/tests/run_java_test.py \ - --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app \ - --app-args "--discriminator 3840 --interface-id -1" \ - --tool-path out/linux-x64-java-matter-controller \ - --tool-cluster "discover" \ - --tool-args "commissionables" \ - --factoryreset \ - ' - - name: Run Pairing Onnetwork Test - run: | - scripts/run_in_python_env.sh out/venv \ - './scripts/tests/run_java_test.py \ - --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app \ - --app-args "--discriminator 3840 --interface-id -1" \ - --tool-path out/linux-x64-java-matter-controller \ - --tool-cluster "pairing" \ - --tool-args "onnetwork-long --nodeid 1 --setup-pin-code 20202021 --discriminator 3840 -t 1000" \ - --factoryreset \ - ' - - name: Run IM Invoke Test - run: | - scripts/run_in_python_env.sh out/venv \ - './scripts/tests/run_java_test.py \ - --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app \ - --app-args "--discriminator 3840 --interface-id -1" \ - --tool-path out/linux-x64-java-matter-controller \ - --tool-cluster "im" \ - --tool-args "onnetwork-long-im-invoke --nodeid 1 --setup-pin-code 20202021 --discriminator 3840 -t 1000" \ - --factoryreset \ - ' - - name: Run IM Extendable Invoke Test - run: | - scripts/run_in_python_env.sh out/venv \ - './scripts/tests/run_java_test.py \ - --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app \ - --app-args "--discriminator 3840 --interface-id -1" \ - --tool-path out/linux-x64-java-matter-controller \ - --tool-cluster "im" \ - --tool-args "onnetwork-long-im-extendable-invoke --nodeid 1 --setup-pin-code 20202021 --discriminator 3840 -t 1000" \ - --factoryreset \ - ' - - name: Run IM Read Test - run: | - scripts/run_in_python_env.sh out/venv \ - './scripts/tests/run_java_test.py \ - --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app \ - --app-args "--discriminator 3840 --interface-id -1" \ - --tool-path out/linux-x64-java-matter-controller \ - --tool-cluster "im" \ - --tool-args "onnetwork-long-im-read --nodeid 1 --setup-pin-code 20202021 --discriminator 3840 -t 3000" \ - --factoryreset \ - ' - - name: Run IM Write Test - run: | - scripts/run_in_python_env.sh out/venv \ - './scripts/tests/run_java_test.py \ - --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app \ - --app-args "--discriminator 3840 --interface-id -1" \ - --tool-path out/linux-x64-java-matter-controller \ - --tool-cluster "im" \ - --tool-args "onnetwork-long-im-write --nodeid 1 --setup-pin-code 20202021 --discriminator 3840 -t 1000" \ - --factoryreset \ - ' - - name: Run IM Subscribe Test - run: | - scripts/run_in_python_env.sh out/venv \ - './scripts/tests/run_java_test.py \ - --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app \ - --app-args "--discriminator 3840 --interface-id -1" \ - --tool-path out/linux-x64-java-matter-controller \ - --tool-cluster "im" \ - --tool-args "onnetwork-long-im-subscribe --nodeid 1 --setup-pin-code 20202021 --discriminator 3840 -t 3000" \ - --factoryreset \ - ' - - name: Run Pairing AlreadyDiscovered Test - run: | - scripts/run_in_python_env.sh out/venv \ - './scripts/tests/run_java_test.py \ - --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app \ - --app-args "--discriminator 3840 --interface-id -1" \ - --tool-path out/linux-x64-java-matter-controller \ - --tool-cluster "pairing" \ - --tool-args "already-discovered --nodeid 1 --setup-pin-code 20202021 --address ::1 --port 5540 -t 1000" \ - --factoryreset \ - ' - # Disabled due to failure: https://github.com/project-chip/connectedhomeip/issues/27361 - # - name: Run Pairing Address-PaseOnly Test - # run: | - # scripts/run_in_python_env.sh out/venv \ - # './scripts/tests/run_java_test.py \ - # --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app \ - # --app-args "--discriminator 3840 --interface-id -1" \ - # --tool-path out/linux-x64-java-matter-controller \ - # --tool-cluster "pairing" \ - # --tool-args "address-paseonly --nodeid 1 --setup-pin-code 20202021 --address ::1 --port 5540 -t 1000" \ - # --factoryreset \ - # ' - - name: Run Pairing SetupQRCode Test - run: | - scripts/run_in_python_env.sh out/venv \ - './scripts/tests/run_java_test.py \ - --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app \ - --app-args "--discriminator 3840 --interface-id -1" \ - --tool-path out/linux-x64-java-matter-controller \ - --tool-cluster "pairing" \ - --tool-args "code --nodeid 1 --setup-payload MT:-24J0AFN00KA0648G00 --discover-once 1 --use-only-onnetwork-discovery 0 -t 1000" \ - --factoryreset \ - ' - - name: Run Pairing ManualCode Test - run: | - scripts/run_in_python_env.sh out/venv \ - './scripts/tests/run_java_test.py \ - --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app \ - --app-args "--discriminator 3840 --interface-id -1" \ - --tool-path out/linux-x64-java-matter-controller \ - --tool-cluster "pairing" \ - --tool-args "code --nodeid 1 --setup-payload 34970112332 --discover-once 1 --use-only-onnetwork-discovery 0 -t 1000" \ - --factoryreset \ - ' - - name: Run Pairing ICD Onnetwork Test - run: | - scripts/run_in_python_env.sh out/venv \ - './scripts/tests/run_java_test.py \ - --app out/linux-x64-lit-icd-ipv6only/lit-icd-app \ - --app-args "--discriminator 3840 --interface-id -1" \ - --tool-path out/linux-x64-java-matter-controller \ - --tool-cluster "pairing" \ - --tool-args "onnetwork-long --nodeid 1 --setup-pin-code 20202021 --discriminator 3840 -t 1000" \ - --factoryreset \ - ' - - name: Run Pairing Onnetwork Test - run: | - scripts/run_in_python_env.sh out/venv \ - './scripts/tests/run_kotlin_test.py \ - --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app \ - --app-args "--discriminator 3840 --interface-id -1" \ - --tool-path out/linux-x64-kotlin-matter-controller \ - --tool-cluster "pairing" \ - --tool-args "onnetwork-long --nodeid 1 --setup-pin-code 20202021 --discriminator 3840 -t 1000" \ - --factoryreset \ - ' - - name: Run Kotlin IM Invoke Test - run: | - scripts/run_in_python_env.sh out/venv \ - './scripts/tests/run_kotlin_test.py \ - --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app \ - --app-args "--discriminator 3840 --interface-id -1" \ - --tool-path out/linux-x64-kotlin-matter-controller \ - --tool-cluster "im" \ - --tool-args "onnetwork-long-im-invoke --nodeid 1 --setup-pin-code 20202021 --discriminator 3840 -t 1000" \ - --factoryreset \ - ' - - name: Run Kotlin IM Read Test - run: | - scripts/run_in_python_env.sh out/venv \ - './scripts/tests/run_kotlin_test.py \ - --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app \ - --app-args "--discriminator 3840 --interface-id -1" \ - --tool-path out/linux-x64-kotlin-matter-controller \ - --tool-cluster "im" \ - --tool-args "onnetwork-long-im-read --nodeid 1 --setup-pin-code 20202021 --discriminator 3840 -t 3000" \ - --factoryreset \ - ' - - name: Run Kotlin IM Write Test - run: | - scripts/run_in_python_env.sh out/venv \ - './scripts/tests/run_kotlin_test.py \ - --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app \ - --app-args "--discriminator 3840 --interface-id -1" \ - --tool-path out/linux-x64-kotlin-matter-controller \ - --tool-cluster "im" \ - --tool-args "onnetwork-long-im-write --nodeid 1 --setup-pin-code 20202021 --discriminator 3840 -t 1000" \ - --factoryreset \ - ' - - name: Run Kotlin IM Subscribe Test - run: | - scripts/run_in_python_env.sh out/venv \ - './scripts/tests/run_kotlin_test.py \ - --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app \ - --app-args "--discriminator 3840 --interface-id -1" \ - --tool-path out/linux-x64-kotlin-matter-controller \ - --tool-cluster "im" \ - --tool-args "onnetwork-long-im-subscribe --nodeid 1 --setup-pin-code 20202021 --discriminator 3840 -t 3000" \ - --factoryreset \ - ' - - name: Uploading core files - uses: actions/upload-artifact@v4 - if: ${{ failure() && !env.ACT }} - with: - name: crash-core-linux-java-controller - path: /tmp/cores/ - # Cores are big; don't hold on to them too long. - retention-days: 5 - - name: Uploading objdir for debugging - uses: actions/upload-artifact@v4 - if: ${{ failure() && !env.ACT }} - with: - name: crash-objdir-linux-java-controller - path: objdir-clone/ - # objdirs are big; don't hold on to them too long. - retention-days: 5 diff --git a/.github/workflows/kotlin-style.yaml b/.github/workflows/kotlin-style.yaml deleted file mode 100644 index a8d328268951bf..00000000000000 --- a/.github/workflows/kotlin-style.yaml +++ /dev/null @@ -1,70 +0,0 @@ -name: Kotlin - -on: - pull_request: - paths: - - "**/*.kt" - - ".github/workflows/kotlin-style.yaml" - - "kotlin-detect-config.yaml" - -concurrency: - group: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true - - -jobs: - detekt: - name: Static code analysis - runs-on: ubuntu-latest - - steps: - - name: "checkout" - uses: actions/checkout@v4 - - - name: "detekt" - uses: natiginfo/action-detekt-all@1.23.6 - # Detekt seems not to like circular symlinks, so we set up - # explicit paths below - # - # In particular, if symlinks exist and recurse, detekt tries to - # follow, so for example `examples/android/CHIPTest` as a path - # will never end (and eventually run out of HEAP) because - # `examples/android/CHIPTest/third_party/connectedhomeip` is - # circular - with: - args: --parallel --build-upon-default-config --config kotlin-detect-config.yaml --input examples/android/CHIPTest/app,examples/android/CHIPTool,examples/java-matter-controller/java,src/controller/java - - ktlint: - name: "Format check" - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - - uses: actions/setup-java@v4 - with: - distribution: 'adopt' - java-version: '17' - - - name: Download ktfmt - run: | - cd /tmp - wget "https://repo1.maven.org/maven2/com/facebook/ktfmt/0.44/ktfmt-0.44-jar-with-dependencies.jar" - - - name: Format kotlin files - run: | - find src examples -name '*.kt' \ - | xargs java -jar /tmp/ktfmt-0.44-jar-with-dependencies.jar --google-style - - - name: Ensure git works in current working directory - run: git config --global --add safe.directory `pwd` - - - name: Check for uncommited changes - run: | - git add . - # Show the full diff - git diff-index -p HEAD -- - # Also show just the files that are different, to make it easy - # to tell at a glance what might be going on. And throw in - # --exit-code to make this job fail if there is a difference. - git diff-index --exit-code HEAD -- diff --git a/.github/workflows/labeler.yaml b/.github/workflows/labeler.yaml deleted file mode 100644 index 59f56fdb5407ae..00000000000000 --- a/.github/workflows/labeler.yaml +++ /dev/null @@ -1,15 +0,0 @@ -name: "Pull Request Labeler" -on: -- pull_request_target - -jobs: - triage: - name: Label Triage - permissions: - contents: read - pull-requests: write - runs-on: ubuntu-latest - steps: - - uses: actions/labeler@v5 - with: - repo-token: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml deleted file mode 100644 index 15004c5aca5037..00000000000000 --- a/.github/workflows/lint.yml +++ /dev/null @@ -1,347 +0,0 @@ -# Copyright (c) 2020-2021 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. - -name: Lint Code Base - -on: - push: - branches-ignore: - - 'dependabot/**' - pull_request: - merge_group: - workflow_dispatch: - -concurrency: - group: - ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == - 'pull_request' && github.event.number) || (github.event_name == - 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true - -jobs: - code-lints: - runs-on: ubuntu-latest - if: github.actor != 'restyled-io[bot]' - - container: - image: ghcr.io/project-chip/chip-build:74 - - steps: - - name: Checkout - uses: actions/checkout@v4 - - # Bootstrap and checkout for internal scripts (like idl_lint) - # to run - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: linux - - - name: Check for orphaned gn files - if: always() - # We should enforce that ALL new files are referenced in our build scripts. - # Several things do not have a clear fix path: - # - various platform implementations (including darwin-specific files as they - # are not using GN) - # - app/clusters (they are fetched dynamically - this should probably be fixed) - # - # All the rest of the exceptions should be driven down to 0: chip should fully - # be defined in build rules. - # - # This check enforces that for any newly added file, it must be part of some - # BUILD.gn file - run: | - ./scripts/run_in_build_env.sh "./scripts/tools/not_known_to_gn.py \ - src \ - --skip-dir app/clusters \ - --skip-dir darwin \ - --skip-dir include \ - --skip-dir platform/Ameba \ - --skip-dir platform/android \ - --skip-dir platform/ASR \ - --skip-dir platform/Beken \ - --skip-dir platform/bouffalolab \ - --skip-dir platform/cc13xx_26xx \ - --skip-dir platform/cc32xx \ - --skip-dir platform/Darwin \ - --skip-dir platform/ESP32 \ - --skip-dir platform/fake \ - --skip-dir platform/FreeRTOS \ - --skip-dir platform/Infineon \ - --skip-dir platform/Linux \ - --skip-dir platform/mbed \ - --skip-dir platform/mt793x \ - --skip-dir platform/nxp \ - --skip-dir platform/OpenThread \ - --skip-dir platform/qpg \ - --skip-dir platform/silabs \ - --skip-dir platform/telink \ - --skip-dir platform/webos \ - --skip-dir platform/Zephyr \ - --skip-dir test_driver \ - --skip-dir platform/NuttX \ - --known-failure app/app-platform/ContentApp.cpp \ - --known-failure app/app-platform/ContentApp.h \ - --known-failure app/app-platform/ContentAppPlatform.cpp \ - --known-failure app/app-platform/ContentAppPlatform.h \ - --known-failure controller/ExamplePersistentStorage.cpp \ - --known-failure controller/ExamplePersistentStorage.h \ - --known-failure app/AttributeAccessToken.h \ - --known-failure app/CommandResponseSender.h \ - --known-failure app/CommandSenderLegacyCallback.h \ - --known-failure app/ReadHandler.h \ - --known-failure app/reporting/reporting.cpp \ - --known-failure app/reporting/tests/MockReportScheduler.cpp \ - --known-failure app/reporting/tests/MockReportScheduler.h \ - --known-failure app/util/attribute-storage.cpp \ - --known-failure app/util/attribute-storage-detail.h \ - --known-failure app/util/attribute-storage.h \ - --known-failure app/util/attribute-table.cpp \ - --known-failure app/util/attribute-table-detail.h \ - --known-failure app/util/attribute-table.h \ - --known-failure app/util/binding-table.cpp \ - --known-failure app/util/binding-table.h \ - --known-failure app/util/config.h \ - --known-failure app/util/DataModelHandler.cpp \ - --known-failure app/util/DataModelHandler.h \ - --known-failure app/util/ember-compatibility-functions.cpp \ - --known-failure app/util/ember-compatibility-functions.h \ - --known-failure app/util/ember-global-attribute-access-interface.cpp \ - --known-failure app/util/ember-global-attribute-access-interface.h \ - --known-failure app/util/ember-io-storage.cpp \ - --known-failure app/util/ember-io-storage.h \ - --known-failure app/util/endpoint-config-api.h \ - --known-failure app/util/generic-callbacks.h \ - --known-failure app/util/generic-callback-stubs.cpp \ - --known-failure app/util/im-client-callbacks.h \ - --known-failure app/util/IMClusterCommandHandler.h \ - --known-failure app/util/util.cpp \ - --known-failure app/util/util.h \ - --known-failure app/WriteHandler.h \ - --known-failure platform/DeviceSafeQueue.cpp \ - --known-failure platform/DeviceSafeQueue.h \ - --known-failure platform/GLibTypeDeleter.h \ - --known-failure platform/SingletonConfigurationManager.cpp \ - " - - - name: Check for matter lint errors - if: always() - run: | - for idl_file in $(find . -name '*.matter'); do - # TODO: all these conformance failures should be fixed - # Issues exist for most of them: - # https://github.com/project-chip/connectedhomeip/issues/19176 - # https://github.com/project-chip/connectedhomeip/issues/19175 - # https://github.com/project-chip/connectedhomeip/issues/19173 - if [ "$idl_file" = './examples/log-source-app/log-source-common/log-source-app.matter' ]; then continue; fi - if [ "$idl_file" = './examples/placeholder/linux/apps/app1/config.matter' ]; then continue; fi - if [ "$idl_file" = './examples/placeholder/linux/apps/app2/config.matter' ]; then continue; fi - if [ "$idl_file" = './examples/thermostat/thermostat-common/thermostat.matter' ]; then continue; fi - if [ "$idl_file" = './examples/window-app/common/window-app.matter' ]; then continue; fi - # Example is intentionally not spe compliant for use in cert testing - if [ "$idl_file" = './examples/lighting-app-data-mode-no-unique-id/lighting-common/lighting-app.matter' ]; then continue; fi - - # Test files are intentionally small and not spec-compilant, just parse-compliant - if [ "$idl_file" = "./scripts/py_matter_idl/matter_idl/tests/inputs/cluster_struct_attribute.matter" ]; then continue; fi - if [ "$idl_file" = "./scripts/py_matter_idl/matter_idl/tests/inputs/global_struct_attribute.matter" ]; then continue; fi - if [ "$idl_file" = "./scripts/py_matter_idl/matter_idl/tests/inputs/optional_argument.matter" ]; then continue; fi - if [ "$idl_file" = "./scripts/py_matter_idl/matter_idl/tests/inputs/several_clusters.matter" ]; then continue; fi - if [ "$idl_file" = "./scripts/py_matter_idl/matter_idl/tests/inputs/simple_attribute.matter" ]; then continue; fi - if [ "$idl_file" = "./scripts/py_matter_idl/matter_idl/tests/inputs/large_lighting_app.matter" ]; then continue; fi - if [ "$idl_file" = "./scripts/py_matter_idl/matter_idl/tests/inputs/large_all_clusters_app.matter" ]; then continue; fi - - ./scripts/run_in_build_env.sh "./scripts/idl_lint.py --log-level warn $idl_file" >/dev/null || exit 1 - done - - - name: Check broken links - # On-push disabled until the job can run fully green - # At that point the step should be enabled. - if: github.event_name == 'workflow_dispatch' - uses: gaurav-nelson/github-action-markdown-link-check@v1 - - # git grep exits with 0 if it finds a match, but we want - # to fail (exit nonzero) on match. And we want to exclude this file, - # to avoid our grep regexp matching itself. - - name: Check for incorrect error use in VerifyOrExit - if: always() - run: | - git grep -I -n "VerifyOrExit(.*, [A-Za-z]*_ERROR" -- './*' ':(exclude).github/workflows/lint.yml' && exit 1 || exit 0 - - # git grep exits with 0 if it finds a match, but we want - # to fail (exit nonzero) on match. And we want to exclude this file, - # to avoid our grep regexp matching itself. - - name: - Check for use of PRI*8, which are not supported on some libcs. - if: always() - run: | - git grep -I -n "PRI.8" -- './*' ':(exclude).github/workflows/lint.yml' ':(exclude)third_party/lwip/repo/lwip/src/include/lwip/arch.h' && exit 1 || exit 0 - - # git grep exits with 0 if it finds a match, but we want - # to fail (exit nonzero) on match. And we want to exclude this file, - # to avoid our grep regexp matching itself. - - name: - Check for use of PRI*16, which are not supported on some - libcs. - if: always() - run: | - git grep -I -n "PRI.16" -- './*' ':(exclude).github/workflows/lint.yml' ':(exclude)third_party/lwip/repo/lwip/src/include/lwip/arch.h' && exit 1 || exit 0 - - # git grep exits with 0 if it finds a match, but we want - # to fail (exit nonzero) on match. And we want to exclude this file, - # to avoid our grep regexp matching itself. - - name: - Check for use of PRI*64, which are not supported on some - libcs. - if: always() - run: | - # TODO: MessageDefHelper should ideally not be excluded here. - # TODO: chip_im_initiatore should ideally not be excluded here. - # TODO: TLVDebug should ideally not be excluded here. - # TODO: protocol_decoder.cpp should ideally not be excluded here. - # TODO: PersistentStorageMacros.h should ideally not be excluded here. - git grep -I -n "PRI.64" -- './*' ':(exclude).github/workflows/lint.yml' ':(exclude)examples/chip-tool' ':(exclude)examples/tv-casting-app' ':(exclude)src/app/MessageDef/MessageDefHelper.cpp' ':(exclude)src/app/tests/integration/chip_im_initiator.cpp' ':(exclude)src/lib/core/TLVDebug.cpp' ':(exclude)src/lib/dnssd/tests/TestTxtFields.cpp' ':(exclude)src/lib/format/protocol_decoder.cpp' ':(exclude)src/lib/support/PersistentStorageMacros.h' ':(exclude)src/messaging/tests/echo/echo_requester.cpp' ':(exclude)src/platform/Linux' ':(exclude)src/platform/Ameba' ':(exclude)src/platform/ESP32' ':(exclude)src/platform/Darwin' ':(exclude)src/darwin' ':(exclude)src/platform/webos' ':(exclude)zzz_generated/chip-tool' ':(exclude)src/tools/chip-cert/Cmd_PrintCert.cpp' ':(exclude)src/platform/NuttX' && exit 1 || exit 0 - - # git grep exits with 0 if it finds a match, but we want - # to fail (exit nonzero) on match. And we want to exclude this file, - # to avoid our grep regexp matching itself. - - name: Check for use of %zu, which are not supported on some libcs. - if: always() - run: | - git grep -I -n "%zu" -- './*' ':(exclude).github/workflows/lint.yml' && exit 1 || exit 0 - - # Comments like '{{! ... }}' should be used in zap files - - name: Do not allow TODO in generated files - if: always() - run: | - git grep -n 'TODO:' -- ./zzz_generated './*/zap-generated/*' && exit 1 || exit 0 - - - name: Check for disallowed include files - if: always() - run: scripts/tools/check_includes.sh - - - name: Check for zcl.json and extension sync status - if: always() - run: scripts/tools/check_zcl_file_sync.py . - - - name: Ensure all PICS are set for tests (to true or false) - if: always() - run: | - scripts/tools/check_test_pics.py src/app/tests/suites/certification/ci-pics-values src/app/tests/suites/certification/PICS.yaml - - # git grep exits with 0 if it finds a match, but we want - # to fail (exit nonzero) on match. And we want to exclude this file, - # to avoid our grep regexp matching itself. - - name: - Check for use of 0x%u and the like, which lead to misleading - output. - if: always() - run: | - git grep -I -n '0x%[0-9l.*-]*[^xX"0-9l.*-]' -- './*' ':(exclude).github/workflows/lint.yml' && exit 1 || exit 0 - - # git grep exits with 0 if it finds a match, but we want - # to fail (exit nonzero) on match. And we want to exclude this file, - # to avoid our grep regexp matching itself. - - name: - Check for use of '"0x" PRIu*' and the like, which lead to - misleading output. - if: always() - run: | - git grep -I -n '0x%[0-9-]*" *PRI[^xX]' -- './*' ':(exclude).github/workflows/lint.yml' && exit 1 || exit 0 - - # git grep exits with 0 if it finds a match, but we want - # to fail (exit nonzero) on match. - - name: - Check for use of NSLog instead of Matter logging in Matter - framework - if: always() - run: | - git grep -n 'NSLog(' -- src/darwin/Framework/CHIP && exit 1 || exit 0 - - # git grep exits with 0 if it finds a match, but we want - # to fail (exit nonzero) on match. And we want to exclude this file, - # to avoid our grep regexp matching itself, as well as excluding the files - # that implement the type-safe accessors - - name: - Check for use of 'emberAfReadAttribute' instead of the - type-safe getters - if: always() - run: | - git grep -I -n 'emberAfReadAttribute' -- './*' ':(exclude).github/workflows/lint.yml' ':(exclude)src/app/util/attribute-table.h' ':(exclude)zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.cpp' ':(exclude)src/app/zap-templates/templates/app/attributes/Accessors-src.zapt' ':(exclude)src/app/util/attribute-table.cpp' && exit 1 || exit 0 - - # git grep exits with 0 if it finds a match, but we want - # to fail (exit nonzero) on match. And we want to exclude this file, - # to avoid our grep regexp matching itself, as well as excluding the files - # that implement the type-safe accessors, attribute writing from the wire, and some - # Pigweed RPC code that seems hard to update. - - name: - Check for use of 'emberAfWriteAttribute' instead of the - type-safe setters - if: always() - run: | - git grep -I -n 'emberAfWriteAttribute' -- './*' \ - ':(exclude).github/workflows/lint.yml' \ - ':(exclude)examples/common/pigweed/rpc_services/Attributes.h' \ - ':(exclude)src/app/codegen-data-model-provider/CodegenDataModelProvider_Write.cpp' \ - ':(exclude)src/app/codegen-data-model-provider/tests/EmberReadWriteOverride.cpp' \ - ':(exclude)src/app/util/attribute-table.cpp' \ - ':(exclude)src/app/util/attribute-table.h' \ - ':(exclude)src/app/util/ember-compatibility-functions.cpp' \ - ':(exclude)src/app/util/mock/CodegenEmberMocks.cpp' \ - ':(exclude)src/app/zap-templates/templates/app/attributes/Accessors-src.zapt' \ - ':(exclude)zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.cpp' \ - && exit 1 || exit 0 - - # Run ruff python linter - - name: Check for errors using ruff Python linter - if: always() - run: | - ruff check - - # git grep exits with 0 if it finds a match, but we want - # to fail (exit nonzero) on match. And we want to exclude this file, - # to avoid our grep regexp matching itself. - - name: - Check for use of "SuccessOrExit(CHIP_ERROR_*)", which should - probably be "SuccessOrExit(err = CHIP_ERROR_*)" - if: always() - run: | - git grep -I -n 'SuccessOrExit(CHIP_ERROR' -- './*' ':(exclude).github/workflows/lint.yml' && exit 1 || exit 0 - - # git grep exits with 0 if it finds a match, but we want - # to fail (exit nonzero) on match. And we want to exclude this file, - # to avoid our grep regexp matching itself. - - name: - Check for use of - "SuccessOrExit(something-without-assignment(", which should - probably be "SuccessOrExit(err = something(" - if: always() - run: | - git grep -I -n 'SuccessOrExit([^=)]*(' -- './*' ':(exclude).github/workflows/lint.yml' && exit 1 || exit 0 - - # git grep exits with 0 if it finds a match, but we want - # to fail (exit nonzero) on match. - - name: - Check for use of "using namespace" outside of a class/function - in headers. - if: always() - run: | - # Various platforms have `using namespace chip::Ble` in their BLEManager* headers; just exclude those for now. - # - # Exclude platform openiotsdk bits that do this in their persistent storage header. - # - # Also exclude examples (for now) and third_party, which have various instances of this. - # - # Ignore uses of `System::Clock::Literals`, because that's the only way to have things using _ms32 or whatnot - # in a header file. - git grep -I -n -e '^using namespace' --and --not -e 'System::Clock::Literals' -- './**/*.h' ':(exclude)src/platform/*/BLEManager*.h' ':(exclude)src/platform/openiotsdk/KVPsaPsStore.h' ':(exclude)./examples' ':(exclude)./third_party' && exit 1 || exit 0 diff --git a/.github/workflows/minimal-build.yaml b/.github/workflows/minimal-build.yaml deleted file mode 100644 index ade1bd56ea36ff..00000000000000 --- a/.github/workflows/minimal-build.yaml +++ /dev/null @@ -1,71 +0,0 @@ -# Copyright (c) 2023 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. - -name: Minimal Build (Linux / configure) - -on: - push: - branches-ignore: - - "dependabot/**" - pull_request: - merge_group: - -concurrency: - group: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true - -jobs: - minimal-all-clusters: - name: Linux / configure build of all-clusters-app - - if: github.actor != 'restyled-io[bot]' - runs-on: ubuntu-latest - - container: - image: ghcr.io/project-chip/chip-build-minimal:74 - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Checkout submodules # but don't bootstrap! - uses: ./.github/actions/checkout-submodules - with: - platform: linux - - - name: Configure and build All Clusters App - run: | - CC=gcc CXX=g++ scripts/configure --project=examples/all-clusters-app/linux --enable-recommended=no && ./ninja-build - - minimal-network-manager: - name: Linux / configure build of network-manager-app - - if: github.actor != 'restyled-io[bot]' - runs-on: ubuntu-latest - - container: - image: ghcr.io/project-chip/chip-build-minimal:74 - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Checkout submodules # but don't bootstrap! - uses: ./.github/actions/checkout-submodules - with: - platform: linux - - - name: Configure and build Network Manager App - run: | - CC=gcc CXX=g++ scripts/configure --project=examples/network-manager-app/linux --enable-recommended=no && ./ninja-build diff --git a/.github/workflows/protocol_compatibility.yaml b/.github/workflows/protocol_compatibility.yaml deleted file mode 100644 index 6c8960072ec3be..00000000000000 --- a/.github/workflows/protocol_compatibility.yaml +++ /dev/null @@ -1,49 +0,0 @@ -# Copyright (c) 2020-2021 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. - -name: Backwards compatibility check -on: - pull_request: - paths: - - "src/controller/data_model/controller-clusters.matter" - -jobs: - check_clusters_matter: - name: Check controller-clusters.matter backwards compatibility - runs-on: ubuntu-latest - if: github.event.pull_request && !(contains(github.event.pull_request.labels.*.name, 'skip-protocol-compatibility')) - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Setup python - uses: actions/setup-python@v5 - with: - python-version: 3.11 - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install click coloredlogs lark - - name: Create old/new copies - run: | - mkdir -p out - cp src/controller/data_model/controller-clusters.matter out/new_version.matter - wget '${{github.event.pull_request.diff_url}}' --output-document out/patch.diff - patch -p1 --reverse /dev/null || (sudo apt update && sudo apt install curl -y) - curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg \ - && sudo chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg \ - && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null \ - && sudo apt update \ - && sudo apt install gh -y - - - name: Tag Release & Generate Notes - env: - GH_TOKEN: ${{ github.token }} - run: | - export BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD) - echo "Tagging against branch: $BRANCH_NAME" - ./scripts/tagging/tag_new_release.sh --generate-notes --target "$BRANCH_NAME" -d # Note this is a draft for now. - - diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml deleted file mode 100644 index 2c68b91222bf80..00000000000000 --- a/.github/workflows/tests.yaml +++ /dev/null @@ -1,627 +0,0 @@ -# Copyright (c) 2020-2021 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. - -name: Tests - -on: - push: - branches-ignore: - - 'dependabot/**' - pull_request: - merge_group: - workflow_dispatch: - -concurrency: - group: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == - 'pull_request' && github.event.number) || (github.event_name == - 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true - -env: - CHIP_NO_LOG_TIMESTAMPS: true - -jobs: - test_suites_linux: - name: Test Suites - Linux - - strategy: - matrix: - build_variant: [no-ble-tsan-clang] - chip_tool: [""] - env: - BUILD_VARIANT: ${{matrix.build_variant}} - CHIP_TOOL_VARIANT: ${{matrix.chip_tool}} - TSAN_OPTIONS: "halt_on_error=1 suppressions=scripts/tests/chiptest/tsan-linux-suppressions.txt" - LSAN_OPTIONS: detect_leaks=1 - - if: github.actor != 'restyled-io[bot]' - runs-on: ubuntu-latest - - container: - image: ghcr.io/project-chip/chip-build:74 - options: --privileged --sysctl "net.ipv6.conf.all.disable_ipv6=0 - net.ipv4.conf.all.forwarding=1 net.ipv6.conf.all.forwarding=1" - - steps: - - name: Checkout - uses: actions/checkout@v4 - # To use act like: - # act -j test_suites_linux - # - # Note you likely still need to have non submodules setup for the - # local machine, like: - # git submodule deinit --all - - uses: actions/checkout@v4 - if: ${{ env.ACT }} - name: Checkout (ACT for local build) - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: linux - bootstrap-log-name: bootstrap-logs-linux-${{ matrix.build_variant }}${{ matrix.chip_tool }} - - name: Try to ensure the directories for core dumping exist and we - can write them. - run: | - mkdir /tmp/cores || true - sysctl -w kernel.core_pattern=/tmp/cores/core.%u.%p.%t || true - mkdir objdir-clone || true - - - name: Validate that xml are parsable - # The sub-items being run here are the same as the input XMLs listed - # at src/app/zap-templates/zcl/zcl.json - # - # This ensures that the syntax of the XML can always be parsed/validated, however it - # does not enforce that the content is understood (that part is covered by parser - # unit tests) - # - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/py_matter_idl/matter_idl/zapxml_parser.py \ - --no-print \ - --log-level info \ - src/app/zap-templates/zcl/data-model/chip/global-attributes.xml \ - src/app/zap-templates/zcl/data-model/chip/global-bitmaps.xml \ - src/app/zap-templates/zcl/data-model/chip/global-enums.xml \ - src/app/zap-templates/zcl/data-model/chip/global-structs.xml \ - src/app/zap-templates/zcl/data-model/chip/semantic-tag-namespace-enums.xml \ - src/app/zap-templates/zcl/data-model/chip/access-control-definitions.xml \ - src/app/zap-templates/zcl/data-model/chip/access-control-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/account-login-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/administrator-commissioning-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/air-quality-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/application-basic-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/application-launcher-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/audio-output-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/ballast-configuration-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/basic-information-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/binding-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/boolean-state-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/actions-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/bridged-device-basic-information.xml \ - src/app/zap-templates/zcl/data-model/chip/chip-ota.xml \ - src/app/zap-templates/zcl/data-model/chip/chip-types.xml \ - src/app/zap-templates/zcl/data-model/chip/channel-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/clusters-extensions.xml \ - src/app/zap-templates/zcl/data-model/chip/color-control-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/commissioner-control-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/concentration-measurement-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/content-launch-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/content-app-observer-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/content-control-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/descriptor-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/device-energy-management-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/device-energy-management-mode-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/diagnostic-logs-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/dishwasher-alarm-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/dishwasher-mode-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/measurement-and-sensing.xml \ - src/app/zap-templates/zcl/data-model/chip/microwave-oven-mode-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/microwave-oven-control-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/door-lock-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/ecosystem-information-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/energy-evse-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/energy-evse-mode-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/ethernet-network-diagnostics-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/fan-control-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/fault-injection-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/fixed-label-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/flow-measurement-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/general-commissioning-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/general-diagnostics-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/global-attributes.xml \ - src/app/zap-templates/zcl/data-model/chip/groups-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/group-key-mgmt-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/identify-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/illuminance-measurement-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/keypad-input-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/laundry-washer-mode-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/laundry-dryer-controls-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/level-control-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/localization-configuration-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/low-power-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/media-input-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/media-playback-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/messages-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/mode-base-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/mode-select-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/network-commissioning-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/occupancy-sensing-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/onoff-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/operational-credentials-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/operational-state-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/operational-state-oven-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/operational-state-rvc-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/oven-mode-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/power-topology-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/pressure-measurement-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/power-source-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/power-source-configuration-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/proxy-configuration-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/proxy-discovery-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/proxy-valid-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/pump-configuration-and-control-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/pwm-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/refrigerator-and-temperature-controlled-cabinet-mode-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/refrigerator-alarm.xml \ - src/app/zap-templates/zcl/data-model/chip/relative-humidity-measurement-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/rvc-clean-mode-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/rvc-run-mode-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/scene.xml \ - src/app/zap-templates/zcl/data-model/chip/smoke-co-alarm-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/software-diagnostics-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/switch-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/target-navigator-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/temperature-measurement-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/test-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/thermostat-user-interface-configuration-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/thermostat-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/thread-border-router-management-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/thread-network-diagnostics-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/thread-network-directory-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/time-format-localization-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/time-synchronization-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/timer-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/user-label-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/unit-localization-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/wake-on-lan-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/washer-controls-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/water-heater-management-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/wifi-network-diagnostics-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/wifi-network-management-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/window-covering.xml \ - src/app/zap-templates/zcl/data-model/chip/temperature-control-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/matter-devices.xml \ - src/app/zap-templates/zcl/data-model/draft/barrier-control-cluster.xml \ - src/app/zap-templates/zcl/data-model/draft/electrical-measurement-cluster.xml \ - src/app/zap-templates/zcl/data-model/draft/input-output-value-clusters.xml \ - src/app/zap-templates/zcl/data-model/draft/onoff-switch-configuration-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/resource-monitoring-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/sample-mei-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/electrical-energy-measurement-cluster.xml \ - src/app/zap-templates/zcl/data-model/chip/electrical-power-measurement-cluster.xml \ - " - - name: Build Apps - run: | - scripts/run_in_build_env.sh './scripts/build_python.sh --install_virtual_env out/venv' - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target linux-x64-chip-tool${CHIP_TOOL_VARIANT}-${BUILD_VARIANT} \ - --target linux-x64-all-clusters-${BUILD_VARIANT} \ - --target linux-x64-lock-${BUILD_VARIANT} \ - --target linux-x64-ota-provider-${BUILD_VARIANT} \ - --target linux-x64-ota-requestor-${BUILD_VARIANT} \ - --target linux-x64-tv-app-${BUILD_VARIANT} \ - --target linux-x64-bridge-${BUILD_VARIANT} \ - --target linux-x64-lit-icd-${BUILD_VARIANT} \ - --target linux-x64-microwave-oven-${BUILD_VARIANT} \ - --target linux-x64-rvc-${BUILD_VARIANT} \ - --target linux-x64-network-manager-${BUILD_VARIANT} \ - build \ - --copy-artifacts-to objdir-clone \ - " - - - name: Run Tests using the python parser sending commands to chip-tool - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/tests/run_test_suite.py \ - --runner chip_tool_python \ - --chip-tool ./out/linux-x64-chip-tool${CHIP_TOOL_VARIANT}-${BUILD_VARIANT}/chip-tool \ - run \ - --iterations 1 \ - --test-timeout-seconds 120 \ - --all-clusters-app ./out/linux-x64-all-clusters-${BUILD_VARIANT}/chip-all-clusters-app \ - --lock-app ./out/linux-x64-lock-${BUILD_VARIANT}/chip-lock-app \ - --ota-provider-app ./out/linux-x64-ota-provider-${BUILD_VARIANT}/chip-ota-provider-app \ - --ota-requestor-app ./out/linux-x64-ota-requestor-${BUILD_VARIANT}/chip-ota-requestor-app \ - --tv-app ./out/linux-x64-tv-app-${BUILD_VARIANT}/chip-tv-app \ - --bridge-app ./out/linux-x64-bridge-${BUILD_VARIANT}/chip-bridge-app \ - --lit-icd-app ./out/linux-x64-lit-icd-${BUILD_VARIANT}/lit-icd-app \ - --microwave-oven-app ./out/linux-x64-microwave-oven-${BUILD_VARIANT}/chip-microwave-oven-app \ - --rvc-app ./out/linux-x64-rvc-${BUILD_VARIANT}/chip-rvc-app \ - --network-manager-app ./out/linux-x64-network-manager-${BUILD_VARIANT}/matter-network-manager-app \ - " - - - name: Run purposeful failure tests using the python parser sending commands to chip-tool - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/tests/run_test_suite.py \ - --runner chip_tool_python \ - --include-tags PURPOSEFUL_FAILURE \ - --chip-tool ./out/linux-x64-chip-tool${CHIP_TOOL_VARIANT}-${BUILD_VARIANT}/chip-tool \ - run \ - --iterations 1 \ - --expected-failures 3 \ - --keep-going \ - --test-timeout-seconds 120 \ - --all-clusters-app ./out/linux-x64-all-clusters-${BUILD_VARIANT}/chip-all-clusters-app \ - " - - - name: Run Tests using chip-repl (skip slow) - if: github.event_name == 'pull_request' - run: | - ./scripts/run_in_python_env.sh out/venv \ - "./scripts/tests/run_test_suite.py \ - --runner chip_repl_python \ - --exclude-tags MANUAL \ - --exclude-tags FLAKY \ - --exclude-tags IN_DEVELOPMENT \ - --exclude-tags EXTRA_SLOW \ - --exclude-tags SLOW \ - --exclude-tags PURPOSEFUL_FAILURE \ - run \ - --iterations 1 \ - --test-timeout-seconds 120 \ - --all-clusters-app ./out/linux-x64-all-clusters-${BUILD_VARIANT}/chip-all-clusters-app \ - --lock-app ./out/linux-x64-lock-${BUILD_VARIANT}/chip-lock-app \ - --ota-provider-app ./out/linux-x64-ota-provider-${BUILD_VARIANT}/chip-ota-provider-app \ - --ota-requestor-app ./out/linux-x64-ota-requestor-${BUILD_VARIANT}/chip-ota-requestor-app \ - --tv-app ./out/linux-x64-tv-app-${BUILD_VARIANT}/chip-tv-app \ - --bridge-app ./out/linux-x64-bridge-${BUILD_VARIANT}/chip-bridge-app \ - --lit-icd-app ./out/linux-x64-lit-icd-${BUILD_VARIANT}/lit-icd-app \ - --microwave-oven-app ./out/linux-x64-microwave-oven-${BUILD_VARIANT}/chip-microwave-oven-app \ - --rvc-app ./out/linux-x64-rvc-${BUILD_VARIANT}/chip-rvc-app \ - --network-manager-app ./out/linux-x64-network-manager-${BUILD_VARIANT}/matter-network-manager-app \ - " - - name: Run Tests using chip-repl (including slow) - if: github.event_name == 'push' - run: | - ./scripts/run_in_python_env.sh out/venv \ - "./scripts/tests/run_test_suite.py \ - --runner chip_repl_python \ - run \ - --iterations 1 \ - --test-timeout-seconds 120 \ - --all-clusters-app ./out/linux-x64-all-clusters-${BUILD_VARIANT}/chip-all-clusters-app \ - --lock-app ./out/linux-x64-lock-${BUILD_VARIANT}/chip-lock-app \ - --ota-provider-app ./out/linux-x64-ota-provider-${BUILD_VARIANT}/chip-ota-provider-app \ - --ota-requestor-app ./out/linux-x64-ota-requestor-${BUILD_VARIANT}/chip-ota-requestor-app \ - --tv-app ./out/linux-x64-tv-app-${BUILD_VARIANT}/chip-tv-app \ - --bridge-app ./out/linux-x64-bridge-${BUILD_VARIANT}/chip-bridge-app \ - --lit-icd-app ./out/linux-x64-lit-icd-${BUILD_VARIANT}/lit-icd-app \ - --microwave-oven-app ./out/linux-x64-microwave-oven-${BUILD_VARIANT}/chip-microwave-oven-app \ - --rvc-app ./out/linux-x64-rvc-${BUILD_VARIANT}/chip-rvc-app \ - --network-manager-app ./out/linux-x64-network-manager-${BUILD_VARIANT}/matter-network-manager-app \ - " - - name: Uploading core files - uses: actions/upload-artifact@v4 - if: ${{ failure() && !env.ACT }} - with: - name: crash-core-linux-${{ matrix.build_variant }}${{ matrix.chip_tool }} - path: /tmp/cores/ - # Cores are big; don't hold on to them too long. - retention-days: 5 - - name: Uploading objdir for debugging - uses: actions/upload-artifact@v4 - if: ${{ failure() && !env.ACT }} - with: - name: crash-objdir-linux-${{ matrix.build_variant }}${{ matrix.chip_tool }} - path: objdir-clone/ - # objdirs are big; don't hold on to them too long. - retention-days: 5 - - test_suites_darwin: - name: Test Suites - Darwin - - strategy: - matrix: - build_variant: [no-ble-asan-clang, no-ble-tsan-clang] - chip_tool: [""] - env: - BUILD_VARIANT: ${{matrix.build_variant}} - CHIP_TOOL_VARIANT: ${{matrix.chip_tool}} - TSAN_OPTIONS: "halt_on_error=1" - LSAN_OPTIONS: detect_leaks=1 suppressions=scripts/tests/chiptest/lsan-mac-suppressions.txt - - if: github.actor != 'restyled-io[bot]' - runs-on: macos-13 - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Setup Environment - # coreutils for stdbuf - run: brew install coreutils - - name: - Try to ensure the directories for core dumping and diagnostic - log collection exist and we can write them. - run: | - sudo chown ${USER} /cores || true - mkdir -p ~/Library/Logs/DiagnosticReports || true - mkdir objdir-clone || true - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: darwin - bootstrap-log-name: bootstrap-logs-darwin-${{ matrix.build_variant }}${{ matrix.chip_tool }} - - - - name: Build Apps - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target darwin-x64-chip-tool${CHIP_TOOL_VARIANT}-${BUILD_VARIANT} \ - --target darwin-x64-all-clusters-${BUILD_VARIANT} \ - --target darwin-x64-lock-${BUILD_VARIANT} \ - --target darwin-x64-ota-provider-${BUILD_VARIANT} \ - --target darwin-x64-ota-requestor-${BUILD_VARIANT} \ - --target darwin-x64-tv-app-${BUILD_VARIANT} \ - --target darwin-x64-bridge-${BUILD_VARIANT} \ - --target darwin-x64-lit-icd-${BUILD_VARIANT} \ - --target darwin-x64-microwave-oven-${BUILD_VARIANT} \ - --target darwin-x64-rvc-${BUILD_VARIANT} \ - --target darwin-x64-network-manager-${BUILD_VARIANT} \ - build \ - --copy-artifacts-to objdir-clone \ - " - - - name: Run Tests using the python parser sending commands to chip-tool - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/tests/run_test_suite.py \ - --runner chip_tool_python \ - --chip-tool ./out/darwin-x64-chip-tool${CHIP_TOOL_VARIANT}-${BUILD_VARIANT}/chip-tool \ - --target-skip-glob '{Test_TC_DGTHREAD_2_1,Test_TC_DGTHREAD_2_2,Test_TC_DGTHREAD_2_3,Test_TC_DGTHREAD_2_4}' \ - run \ - --iterations 1 \ - --test-timeout-seconds 120 \ - --all-clusters-app ./out/darwin-x64-all-clusters-${BUILD_VARIANT}/chip-all-clusters-app \ - --lock-app ./out/darwin-x64-lock-${BUILD_VARIANT}/chip-lock-app \ - --ota-provider-app ./out/darwin-x64-ota-provider-${BUILD_VARIANT}/chip-ota-provider-app \ - --ota-requestor-app ./out/darwin-x64-ota-requestor-${BUILD_VARIANT}/chip-ota-requestor-app \ - --tv-app ./out/darwin-x64-tv-app-${BUILD_VARIANT}/chip-tv-app \ - --bridge-app ./out/darwin-x64-bridge-${BUILD_VARIANT}/chip-bridge-app \ - --lit-icd-app ./out/darwin-x64-lit-icd-${BUILD_VARIANT}/lit-icd-app \ - --microwave-oven-app ./out/darwin-x64-microwave-oven-${BUILD_VARIANT}/chip-microwave-oven-app \ - --rvc-app ./out/darwin-x64-rvc-${BUILD_VARIANT}/chip-rvc-app \ - --network-manager-app ./out/darwin-x64-network-manager-${BUILD_VARIANT}/matter-network-manager-app \ - " - - - name: Run purposeful failure tests using the python parser sending commands to chip-tool - run: | - ./scripts/run_in_build_env.sh \ - "./scripts/tests/run_test_suite.py \ - --runner chip_tool_python \ - --include-tags PURPOSEFUL_FAILURE \ - --chip-tool ./out/darwin-x64-chip-tool${CHIP_TOOL_VARIANT}-${BUILD_VARIANT}/chip-tool \ - run \ - --iterations 1 \ - --expected-failures 3 \ - --keep-going \ - --test-timeout-seconds 120 \ - --all-clusters-app ./out/darwin-x64-all-clusters-${BUILD_VARIANT}/chip-all-clusters-app \ - " - - - name: Uploading core files - uses: actions/upload-artifact@v4 - if: ${{ failure() && !env.ACT }} - with: - name: crash-core-darwin-${{ matrix.build_variant }}${{ matrix.chip_tool }} - path: /cores/ - # Cores are big; don't hold on to them too long. - retention-days: 5 - - name: Uploading diagnostic logs - uses: actions/upload-artifact@v4 - if: ${{ failure() && !env.ACT }} - with: - name: crash-log-darwin-${{ matrix.build_variant }}${{ matrix.chip_tool }} - path: ~/Library/Logs/DiagnosticReports/ - - name: Uploading objdir for debugging - uses: actions/upload-artifact@v4 - if: ${{ failure() && !env.ACT }} - with: - name: crash-objdir-darwin-${{ matrix.build_variant }}${{ matrix.chip_tool }} - path: objdir-clone/ - # objdirs are big; don't hold on to them too long. - retention-days: 5 - - repl_tests_linux: - name: REPL Tests - Linux - - env: - TSAN_OPTIONS: "halt_on_error=1 suppressions=scripts/tests/chiptest/tsan-linux-suppressions.txt" - - if: github.actor != 'restyled-io[bot]' - runs-on: ubuntu-latest - - container: - image: ghcr.io/project-chip/chip-build:74 - options: --privileged --sysctl "net.ipv6.conf.all.disable_ipv6=0 - net.ipv4.conf.all.forwarding=0 net.ipv6.conf.all.forwarding=0" - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: linux - bootstrap-log-name: bootstrap-logs-linux-${{ matrix.build_variant }}${{ matrix.chip_tool }} - - name: Try to ensure the directories for core dumping exist and we - can write them. - run: | - mkdir /tmp/cores || true - sysctl -w kernel.core_pattern=/tmp/cores/core.%u.%p.%t || true - mkdir objdir-clone || true - - - name: Build Python REPL and example apps - # NOTE: the data-mode-check + check-failure-die is not 100% perfect as different - # encoding sizes for data that keeps changing may alter over time (e.g. anything relating to time - # or resources such as packet counts or other similar counters) - # - # This may result in invalid errors, however for most purposes of our testing, we are unlikely to - # hit such cases so we remain very strict on testing here. - run: | - scripts/run_in_build_env.sh './scripts/build_python.sh --install_virtual_env out/venv' - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test-data-model-check-check-failure-die \ - --target linux-x64-lock-ipv6only-no-ble-no-wifi-tsan-clang-test \ - --target linux-x64-lit-icd-ipv6only-no-ble-no-wifi-tsan-clang-test \ - --target linux-x64-energy-management-ipv6only-no-ble-no-wifi-tsan-clang-test \ - --target linux-x64-microwave-oven-ipv6only-no-ble-no-wifi-tsan-clang-test \ - --target linux-x64-rvc-ipv6only-no-ble-no-wifi-tsan-clang-test \ - --target linux-x64-network-manager-ipv6only-no-ble-no-wifi-tsan-clang-test \ - --target linux-x64-fabric-admin-rpc-ipv6only-clang \ - --target linux-x64-fabric-bridge-rpc-ipv6only-no-ble-no-wifi-clang \ - --target linux-x64-light-data-model-no-unique-id-ipv6only-no-ble-no-wifi-clang \ - --target linux-x64-python-bindings \ - build \ - --copy-artifacts-to objdir-clone \ - " - - name: Generate an argument environment file - run: | - echo -n "" >/tmp/test_env.yaml - echo "ALL_CLUSTERS_APP: out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test-data-model-check-check-failure-die/chip-all-clusters-app" >> /tmp/test_env.yaml - echo "CHIP_LOCK_APP: out/linux-x64-lock-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-lock-app" >> /tmp/test_env.yaml - echo "ENERGY_MANAGEMENT_APP: out/linux-x64-energy-management-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-energy-management-app" >> /tmp/test_env.yaml - echo "LIT_ICD_APP: out/linux-x64-lit-icd-ipv6only-no-ble-no-wifi-tsan-clang-test/lit-icd-app" >> /tmp/test_env.yaml - echo "CHIP_MICROWAVE_OVEN_APP: out/linux-x64-microwave-oven-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-microwave-oven-app" >> /tmp/test_env.yaml - echo "CHIP_RVC_APP: out/linux-x64-rvc-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-rvc-app" >> /tmp/test_env.yaml - echo "NETWORK_MANAGEMENT_APP: out/linux-x64-network-manager-ipv6only-no-ble-no-wifi-tsan-clang-test/matter-network-manager-app" >> /tmp/test_env.yaml - echo "FABRIC_ADMIN_APP: out/linux-x64-fabric-admin-rpc-ipv6only-clang/fabric-admin" >> /tmp/test_env.yaml - echo "FABRIC_BRIDGE_APP: out/linux-x64-fabric-bridge-rpc-ipv6only-no-ble-no-wifi-clang/fabric-bridge-app" >> /tmp/test_env.yaml - echo "LIGHTING_APP_NO_UNIQUE_ID: out/linux-x64-light-data-model-no-unique-id-ipv6only-no-ble-no-wifi-clang/chip-lighting-app" >> /tmp/test_env.yaml - echo "TRACE_APP: out/trace_data/app-{SCRIPT_BASE_NAME}" >> /tmp/test_env.yaml - echo "TRACE_TEST_JSON: out/trace_data/test-{SCRIPT_BASE_NAME}" >> /tmp/test_env.yaml - echo "TRACE_TEST_PERFETTO: out/trace_data/test-{SCRIPT_BASE_NAME}" >> /tmp/test_env.yaml - - - name: Run Tests - run: | - mkdir -p out/trace_data - scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --load-from-env /tmp/test_env.yaml --script src/controller/python/test/test_scripts/mobile-device-test.py' - scripts/run_in_python_env.sh out/venv 'python3 ./src/python_testing/execute_python_tests.py --env-file /tmp/test_env.yaml --search-directory src/python_testing' - scripts/run_in_python_env.sh out/venv './scripts/tests/TestTimeSyncTrustedTimeSourceRunner.py --all-clusters out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test-data-model-check-check-failure-die/chip-all-clusters-app' - scripts/run_in_python_env.sh out/venv 'python3 ./src/python_testing/TestIdChecks.py' - scripts/run_in_python_env.sh out/venv 'python3 ./src/python_testing/TestSpecParsingDeviceType.py' - scripts/run_in_python_env.sh out/venv 'python3 ./src/python_testing/TestConformanceSupport.py' - scripts/run_in_python_env.sh out/venv 'python3 ./src/python_testing/TestConformanceTest.py' - scripts/run_in_python_env.sh out/venv 'python3 ./src/python_testing/TestChoiceConformanceSupport.py' - scripts/run_in_python_env.sh out/venv 'python3 ./src/python_testing/TestMatterTestingSupport.py' - scripts/run_in_python_env.sh out/venv 'python3 ./src/python_testing/TestSpecParsingSupport.py' - scripts/run_in_python_env.sh out/venv 'python3 ./src/python_testing/test_testing/test_TC_ICDM_2_1.py' - scripts/run_in_python_env.sh out/venv 'python3 ./src/python_testing/test_testing/test_IDM_10_4.py' - scripts/run_in_python_env.sh out/venv 'python3 ./src/python_testing/test_testing/test_TC_SC_7_1.py' - scripts/run_in_python_env.sh out/venv 'python3 ./src/python_testing/test_testing/TestDecorators.py' - - - - name: Uploading core files - uses: actions/upload-artifact@v4 - if: ${{ failure() && !env.ACT }} - with: - name: crash-core-linux-python-repl - path: /tmp/cores/ - # Cores are big; don't hold on to them too long. - retention-days: 5 - - name: Uploading objdir for debugging - uses: actions/upload-artifact@v4 - if: ${{ failure() && !env.ACT }} - with: - name: crash-objdir-linux-python-repl - path: objdir-clone/ - # objdirs are big; don't hold on to them too long. - retention-days: 5 - - repl_tests_darwin: - name: REPL Tests - Darwin - - strategy: - matrix: - build_variant: [no-ble-no-wifi-tsan-clang] - env: - BUILD_VARIANT: ${{matrix.build_variant}} - TSAN_OPTIONS: "halt_on_error=1" - - if: github.actor != 'restyled-io[bot]' && false - runs-on: macos-13 - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Setup Environment - # coreutils for stdbuf - run: brew install coreutils - - name: - Try to ensure the directories for core dumping and diagnostic - log collection exist and we can write them. - run: | - sudo chown ${USER} /cores || true - mkdir -p ~/Library/Logs/DiagnosticReports || true - mkdir objdir-clone || true - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: darwin - bootstrap-log-name: bootstrap-logs-darwin-${{ matrix.build_variant }}${{ matrix.chip_tool }} - - - name: Build Python REPL and example apps - run: | - scripts/run_in_build_env.sh './scripts/build_python.sh --install_virtual_env out/venv' - ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py \ - --target darwin-x64-all-clusters-${BUILD_VARIANT}-test \ - build \ - --copy-artifacts-to objdir-clone \ - " - - name: Run Tests - run: | - scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/darwin-x64-all-clusters-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app --factoryreset --quiet --app-args "--discriminator 3840 --interface-id -1" --script-args "-t 3600 --disable-test ClusterObjectTests.TestTimedRequestTimeout"' - - name: Uploading core files - uses: actions/upload-artifact@v4 - if: ${{ failure() && !env.ACT }} - with: - name: crash-core-darwin-python-repl - path: /cores/ - # Cores are big; don't hold on to them too long. - retention-days: 5 - - name: Uploading traces on failure - uses: actions/upload-artifact@v4 - if: ${{ failure() && !env.ACT }} - with: - name: trace-data-python-repl - path: out/trace_data/ - retention-days: 5 - - name: Uploading diagnostic logs - uses: actions/upload-artifact@v4 - if: ${{ failure() && !env.ACT }} - with: - name: crash-log-darwin-python-repl - path: ~/Library/Logs/DiagnosticReports/ - - name: Uploading objdir for debugging - uses: actions/upload-artifact@v4 - if: ${{ failure() && !env.ACT }} - with: - name: crash-objdir-darwin-python-repl - path: objdir-clone/ - # objdirs are big; don't hold on to them too long. - retention-days: 5 diff --git a/.github/workflows/third-party-check.yaml b/.github/workflows/third-party-check.yaml deleted file mode 100644 index beda0af41b0622..00000000000000 --- a/.github/workflows/third-party-check.yaml +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright (c) 2024 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. - -name: Check for Unintentional Submodule Updates - -on: - pull_request: - branches-ignore: - - "dependabot/**" - paths: - - "third_party/**" - - ".gitmodules" - -jobs: - check-submodule-update-label: - name: Check For Submodule Update Label - runs-on: ubuntu-latest - steps: - - if: ${{ !contains(github.event.pull_request.labels.*.name, 'changing-submodules-on-purpose') }} - name: Fail - run: | - echo This pull request attempts to update submodules without the changing-submodules-on-purpose label. Please apply that label if the changes are intentional, or remove those changes. - exit 1 - - if: ${{ contains(github.event.pull_request.labels.*.name, 'changing-submodules-on-purpose') }} - name: Success - run: | - echo PR looks good. - exit 0 diff --git a/.github/workflows/todos.yaml b/.github/workflows/todos.yaml deleted file mode 100644 index cc2148da4e6d18..00000000000000 --- a/.github/workflows/todos.yaml +++ /dev/null @@ -1,38 +0,0 @@ -name: Create issues from To-Dos - -on: - workflow_dispatch: - inputs: - importAll: - default: "false" - required: false - type: boolean - description: Enable, if you want to import all TODOs. Runs on checked out branch! Only use if you're sure what you are doing. -# push: Will move this to a cadence -# branches: -# - master - -permissions: - issues: write - repository-projects: read - contents: read - -jobs: - todos: - name: Scan for To-Dos - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Run Issue Bot - uses: derjuulsn/todo-issue@main - with: - # autoAssign: false - reopenClosed: false - # label: "todo" - # disabled until this works: https://github.com/DerJuulsn/todo-issue/issues/9 - keywords: "todo,fixme,bug,TODO,FIXME,BUG" - excludePattern: "^(node_modules/|third_party/|zzz_generated/|docs/|.vscode/)" - env: - GITHUB_TOKEN: ${{ secrets.MATTER_PAT }} diff --git a/.github/workflows/unit_integration_test.yaml b/.github/workflows/unit_integration_test.yaml deleted file mode 100644 index 040e50f1535079..00000000000000 --- a/.github/workflows/unit_integration_test.yaml +++ /dev/null @@ -1,88 +0,0 @@ -# Copyright (c) 2020 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. - -name: Unit / Integration Tests - -on: - push: - branches-ignore: - - 'dependabot/**' - pull_request: - merge_group: - -concurrency: - group: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true - -jobs: - unit_tests: - name: Unit / Integration Tests - if: github.actor != 'restyled-io[bot]' - - strategy: - matrix: - type: [main, clang, mbedtls, rotating_device_id, icd] - env: - BUILD_TYPE: ${{ matrix.type }} - - runs-on: ubuntu-latest - - container: - image: ghcr.io/project-chip/chip-build:74 - volumes: - - "/:/runner-root-volume" - - "/tmp/log_output:/tmp/test_logs" - options: --privileged --sysctl "net.ipv6.conf.all.disable_ipv6=0 net.ipv4.conf.all.forwarding=1 net.ipv6.conf.all.forwarding=1" - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: linux - bootstrap-log-name: bootstrap-logs-unittest-${{ matrix.type }} - - name: Artifact suffix - id: outsuffix - uses: haya14busa/action-cond@v1 - if: ${{ !env.ACT }} - with: - cond: ${{ github.event.pull_request.number == '' }} - if_true: "${{ github.sha }}" - if_false: "pull-${{ github.event.pull_request.number }}" - - name: Setup Build - # TODO: If rotating_device_id is ever removed/combined, we have to cover boringssl otherwise - run: | - case $BUILD_TYPE in - "main") GN_ARGS='';; - "clang") GN_ARGS='is_clang=true';; - "mbedtls") GN_ARGS='chip_crypto="mbedtls"';; - "rotating_device_id") GN_ARGS='chip_crypto="boringssl" chip_enable_rotating_device_id=true';; - "icd") GN_ARGS='chip_enable_icd_server=true chip_enable_icd_lit=true';; - *) ;; - esac - - scripts/build/gn_gen.sh --args="$GN_ARGS chip_data_model_check_die_on_failure=true" - - name: Run Build - run: scripts/run_in_build_env.sh "ninja -C out/$BUILD_TYPE" - - name: Run Tests - run: scripts/tests/gn_tests.sh - # TODO Log Upload https://github.com/project-chip/connectedhomeip/issues/2227 - # TODO https://github.com/project-chip/connectedhomeip/issues/1512 - # - name: Run Code Coverage - # if: ${{ contains('main', env.BUILD_TYPE) }} - # run: scripts/tools/codecoverage.sh - # - name: Upload Code Coverage - # if: ${{ contains('main', env.BUILD_TYPE) }} - # run: bash <(curl -s https://codecov.io/bash) diff --git a/.github/workflows/zap_regeneration.yaml b/.github/workflows/zap_regeneration.yaml deleted file mode 100644 index dca68cc94e88ad..00000000000000 --- a/.github/workflows/zap_regeneration.yaml +++ /dev/null @@ -1,54 +0,0 @@ -# Copyright (c) 2020 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. - -name: ZAP - Regenerate - -on: - workflow_dispatch: - -concurrency: - group: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true - -env: - CHIP_NO_LOG_TIMESTAMPS: true - -jobs: - zap_regeneration: - name: ZAP Regeneration - - runs-on: ubuntu-20.04 - container: - image: ghcr.io/project-chip/chip-build:74 - defaults: - run: - shell: sh - if: github.actor != 'restyled-io[bot]' - - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - submodules: true - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: linux - - - name: Generate all - run: ./scripts/run_in_build_env.sh scripts/tools/zap_regen_all.py - - uses: EndBug/add-and-commit@v9 - with: - default_author: github_actions - message: Regenerating ZAP diff --git a/.github/workflows/zap_templates.yaml b/.github/workflows/zap_templates.yaml deleted file mode 100644 index 5ed20b29ada3d6..00000000000000 --- a/.github/workflows/zap_templates.yaml +++ /dev/null @@ -1,75 +0,0 @@ -# Copyright (c) 2020 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. - -name: ZAP - -on: - push: - branches-ignore: - - 'dependabot/**' - pull_request: - merge_group: - -concurrency: - group: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }} - cancel-in-progress: true - -env: - CHIP_NO_LOG_TIMESTAMPS: true - -jobs: - zap_templates: - name: ZAP templates generation - - runs-on: ubuntu-20.04 - container: - image: ghcr.io/project-chip/chip-build:74 - defaults: - run: - shell: sh - if: github.actor != 'restyled-io[bot]' - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Checkout submodules & Bootstrap - uses: ./.github/actions/checkout-submodules-and-bootstrap - with: - platform: linux - # Java formatting requires a newer java to run ktfmt - # TODO: this should be eventually inside Docker files - - name: Update java - run: | - apt-get update - DEBIAN_FRONTEND=noninteractive apt-get install -fy --fix-missing openjdk-17-jre - # Clean out java generated files: since java codegen will generate one file per - # structure/cluster, if clusters and structures are ever changed (for in progress work) - # this may leave obsolete files. Ensure we always check for clean regen. - - name: Ensure clean java - run: rm -rf src/controller/java/generated/ - - name: Generate all - run: ./scripts/run_in_build_env.sh scripts/tools/zap_regen_all.py - - name: Generate script-maintained items (ERROR_CODES.md) - run: ./scripts/run_in_build_env.sh "scripts/error_table.py > docs/ERROR_CODES.md" - - name: Ensure git works in current working directory - run: git config --global --add safe.directory `pwd` - - name: Check for uncommited changes - run: | - git add . - # Show the full diff - git diff-index -p HEAD -- - # Also show just the files that are different, to make it easy - # to tell at a glance what might be going on. And throw in - # --exit-code to make this job fail if there is a difference. - git diff-index --exit-code HEAD --

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�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%0D+{K0-4L0|7CfAh|FvbkCB?Z$** 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 literal 0 HcmV?d00001 diff --git a/examples/platform/nxp/mcxw71_k32w1/doc/images/mcxw71_debug.jpg b/examples/platform/nxp/mcxw71_k32w1/doc/images/mcxw71_debug.jpg new file mode 100755 index 0000000000000000000000000000000000000000..21bd041ebd3f14f9d77f530ef375fa078c66676f GIT binary patch literal 68145 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�Rb-Qa}v@u(kQ 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