[Ameba] Error mapping & update ci to 0.7.14 (#26573)
* implement error mapping from ameba to matter
* [Ameba] update ci to 0.7.14
diff --git a/.github/workflows/examples-ameba.yaml b/.github/workflows/examples-ameba.yaml
index e188826..0e3d2e8 100644
--- a/.github/workflows/examples-ameba.yaml
+++ b/.github/workflows/examples-ameba.yaml
@@ -38,7 +38,7 @@
if: github.actor != 'restyled-io[bot]'
container:
- image: connectedhomeip/chip-build-ameba:0.7.3
+ image: connectedhomeip/chip-build-ameba:0.7.14
options: --user root
steps:
diff --git a/src/platform/Ameba/AmebaConfig.cpp b/src/platform/Ameba/AmebaConfig.cpp
index 08d552f..e91905e 100644
--- a/src/platform/Ameba/AmebaConfig.cpp
+++ b/src/platform/Ameba/AmebaConfig.cpp
@@ -21,6 +21,8 @@
#include <core/CHIPEncoding.h>
#include <platform/Ameba/AmebaConfig.h>
+#include <platform/Ameba/AmebaUtils.h>
+#include <platform/Ameba/KeyValueStoreManagerImpl.h>
#include <support/CHIPMem.h>
#include <support/CHIPMemString.h>
#include <support/CodeUtils.h>
@@ -35,6 +37,8 @@
kPrefsTypeBinary = 5
};
+using namespace chip::DeviceLayer::PersistedStorage;
+
namespace chip {
namespace DeviceLayer {
namespace Internal {
@@ -84,114 +88,112 @@
CHIP_ERROR AmebaConfig::ReadConfigValue(Key key, bool & val)
{
+ CHIP_ERROR err;
+ int32_t error;
uint8_t intVal;
- int32_t success = 0;
- success = getPref_bool_new(key.Namespace, key.Name, &intVal);
- if (success != 0)
+ error = getPref_bool_new(key.Namespace, key.Name, &intVal);
+ err = AmebaUtils::MapError(error, AmebaErrorType::kDctError);
+ if (err != CHIP_NO_ERROR)
{
ChipLogProgress(DeviceLayer, "getPref_bool_new: %s/%s failed\n", StringOrNullMarker(key.Namespace),
StringOrNullMarker(key.Name));
}
val = (intVal != 0);
-
- if (success == 0)
- return CHIP_NO_ERROR;
- else
- return CHIP_DEVICE_ERROR_CONFIG_NOT_FOUND;
+ return err;
}
CHIP_ERROR AmebaConfig::ReadConfigValue(Key key, uint32_t & val)
{
- int32_t success = 0;
+ CHIP_ERROR err;
+ int32_t error;
- success = getPref_u32_new(key.Namespace, key.Name, &val);
- if (success != 0)
+ error = getPref_u32_new(key.Namespace, key.Name, &val);
+ err = AmebaUtils::MapError(error, AmebaErrorType::kDctError);
+ if (err != CHIP_NO_ERROR)
{
ChipLogProgress(DeviceLayer, "getPref_u32_new: %s/%s failed\n", StringOrNullMarker(key.Namespace),
StringOrNullMarker(key.Name));
}
- if (success == 0)
- return CHIP_NO_ERROR;
- else
- return CHIP_DEVICE_ERROR_CONFIG_NOT_FOUND;
+ return err;
}
CHIP_ERROR AmebaConfig::ReadConfigValue(Key key, uint64_t & val)
{
- int32_t success = 0;
+ CHIP_ERROR err;
+ int32_t error;
- success = getPref_u64_new(key.Namespace, key.Name, &val);
- if (success != 0)
+ error = getPref_u64_new(key.Namespace, key.Name, &val);
+ err = AmebaUtils::MapError(error, AmebaErrorType::kDctError);
+ if (err != CHIP_NO_ERROR)
{
- ChipLogProgress(DeviceLayer, "getPref_u32_new: %s/%s failed\n", StringOrNullMarker(key.Namespace),
+ ChipLogProgress(DeviceLayer, "getPref_u64: %s/%s failed\n", StringOrNullMarker(key.Namespace),
StringOrNullMarker(key.Name));
}
- if (success == 0)
- return CHIP_NO_ERROR;
- else
- return CHIP_DEVICE_ERROR_CONFIG_NOT_FOUND;
+ return err;
}
CHIP_ERROR AmebaConfig::ReadConfigValueStr(Key key, char * buf, size_t bufSize, size_t & outLen)
{
- int32_t success = 0;
+ CHIP_ERROR err;
+ int32_t error;
- success = getPref_str_new(key.Namespace, key.Name, buf, bufSize, &outLen);
- if (success != 0)
+ error = getPref_str_new(key.Namespace, key.Name, buf, bufSize, &outLen);
+ err = AmebaUtils::MapError(error, AmebaErrorType::kDctError);
+ outLen -= 1; // Don't count trailing null
+ if (err != CHIP_NO_ERROR)
{
ChipLogProgress(DeviceLayer, "getPref_str_new: %s/%s failed\n", StringOrNullMarker(key.Namespace),
StringOrNullMarker(key.Name));
+ outLen = 0;
}
- if (success == 0)
- {
- outLen -= 1; // Don't count trailing null
- return CHIP_NO_ERROR;
- }
- else
- {
- outLen = 0;
- return CHIP_DEVICE_ERROR_CONFIG_NOT_FOUND;
- }
+ return err;
}
CHIP_ERROR AmebaConfig::ReadConfigValueBin(Key key, uint8_t * buf, size_t bufSize, size_t & outLen)
{
- int32_t success = 0;
+ CHIP_ERROR err;
+ int32_t error;
- success = getPref_bin_new(key.Namespace, key.Name, buf, bufSize, &outLen);
- if (success != 0)
+ error = getPref_bin_new(key.Namespace, key.Name, buf, bufSize, &outLen);
+ err = AmebaUtils::MapError(error, AmebaErrorType::kDctError);
+ if (err != CHIP_NO_ERROR)
{
ChipLogProgress(DeviceLayer, "getPref_bin_new: %s/%s failed\n", StringOrNullMarker(key.Namespace),
StringOrNullMarker(key.Name));
+ outLen = 0;
}
- if (success == 0)
- {
- return CHIP_NO_ERROR;
- }
- else
- {
- outLen = 0;
- return CHIP_DEVICE_ERROR_CONFIG_NOT_FOUND;
- }
+ return err;
}
CHIP_ERROR AmebaConfig::WriteConfigValue(Key key, bool val)
{
- int32_t success;
+ CHIP_ERROR err;
+ int32_t error;
uint8_t value;
if (val == 1)
value = 1;
else
value = 0;
- success = setPref_new(key.Namespace, key.Name, &value, 1);
- if (!success)
+
+ if (checkExist(key.Name, key.Name))
+ {
+ err = ClearConfigValue(key);
+ if (err != CHIP_NO_ERROR)
+ {
+ ChipLogError(DeviceLayer, "Warning, KVS leakage, failed to remove old KVS value");
+ }
+ }
+
+ error = setPref_new(key.Namespace, key.Name, &value, 1);
+ err = AmebaUtils::MapError(error, AmebaErrorType::kDctError);
+ if (err != CHIP_NO_ERROR)
{
ChipLogError(DeviceLayer, "setPref: %s/%s = %s failed\n", StringOrNullMarker(key.Namespace), StringOrNullMarker(key.Name),
value ? "true" : "false");
@@ -202,15 +204,26 @@
val ? "true" : "false");
}
- return CHIP_NO_ERROR;
+ return err;
}
CHIP_ERROR AmebaConfig::WriteConfigValue(Key key, uint32_t val)
{
- int32_t success;
+ CHIP_ERROR err;
+ int32_t error;
- success = setPref_new(key.Namespace, key.Name, (uint8_t *) &val, sizeof(uint32_t));
- if (!success)
+ if (checkExist(key.Name, key.Name))
+ {
+ err = ClearConfigValue(key);
+ if (err != CHIP_NO_ERROR)
+ {
+ ChipLogError(DeviceLayer, "Warning, KVS leakage, failed to remove old KVS value");
+ }
+ }
+
+ error = setPref_new(key.Namespace, key.Name, (uint8_t *) &val, sizeof(uint32_t));
+ err = AmebaUtils::MapError(error, AmebaErrorType::kDctError);
+ if (err != CHIP_NO_ERROR)
{
ChipLogError(DeviceLayer, "setPref: %s/%s = %d(0x%x) failed\n", StringOrNullMarker(key.Namespace),
StringOrNullMarker(key.Name), val, val);
@@ -221,15 +234,26 @@
StringOrNullMarker(key.Name), val, val);
}
- return CHIP_NO_ERROR;
+ return err;
}
CHIP_ERROR AmebaConfig::WriteConfigValue(Key key, uint64_t val)
{
- int32_t success;
+ CHIP_ERROR err;
+ int32_t error;
- success = setPref_new(key.Namespace, key.Name, (uint8_t *) &val, sizeof(uint64_t));
- if (!success)
+ if (checkExist(key.Name, key.Name))
+ {
+ err = ClearConfigValue(key);
+ if (err != CHIP_NO_ERROR)
+ {
+ ChipLogError(DeviceLayer, "Warning, KVS leakage, failed to remove old KVS value");
+ }
+ }
+
+ error = setPref_new(key.Namespace, key.Name, (uint8_t *) &val, sizeof(uint64_t));
+ err = AmebaUtils::MapError(error, AmebaErrorType::kDctError);
+ if (err != CHIP_NO_ERROR)
{
ChipLogError(DeviceLayer, "setPref: %s/%s = %d(0x%x) failed\n", StringOrNullMarker(key.Namespace),
StringOrNullMarker(key.Name), val, val);
@@ -240,15 +264,26 @@
StringOrNullMarker(key.Name), val, val);
}
- return CHIP_NO_ERROR;
+ return err;
}
CHIP_ERROR AmebaConfig::WriteConfigValueStr(Key key, const char * str)
{
- int32_t success;
+ CHIP_ERROR err;
+ int32_t error;
- success = setPref_new(key.Namespace, key.Name, (uint8_t *) str, strlen(str) + 1);
- if (!success)
+ if (checkExist(key.Name, key.Name))
+ {
+ err = ClearConfigValue(key);
+ if (err != CHIP_NO_ERROR)
+ {
+ ChipLogError(DeviceLayer, "Warning, KVS leakage, failed to remove old KVS value");
+ }
+ }
+
+ error = setPref_new(key.Namespace, key.Name, (uint8_t *) str, strlen(str) + 1);
+ err = AmebaUtils::MapError(error, AmebaErrorType::kDctError);
+ if (err != CHIP_NO_ERROR)
{
ChipLogError(DeviceLayer, "setPref: %s/%s = %s failed\n", StringOrNullMarker(key.Namespace), StringOrNullMarker(key.Name),
StringOrNullMarker(str));
@@ -258,7 +293,8 @@
ChipLogProgress(DeviceLayer, "NVS set: %s/%s = \"%s\"", StringOrNullMarker(key.Namespace), StringOrNullMarker(key.Name),
StringOrNullMarker(str));
}
- return CHIP_NO_ERROR;
+
+ return err;
}
CHIP_ERROR AmebaConfig::WriteConfigValueStr(Key key, const char * str, size_t strLen)
@@ -279,10 +315,21 @@
CHIP_ERROR AmebaConfig::WriteConfigValueBin(Key key, const uint8_t * data, size_t dataLen)
{
- int32_t success;
+ CHIP_ERROR err;
+ int32_t error;
- success = setPref_new(key.Namespace, key.Name, (uint8_t *) data, dataLen);
- if (!success)
+ if (checkExist(key.Name, key.Name))
+ {
+ err = ClearConfigValue(key);
+ if (err != CHIP_NO_ERROR)
+ {
+ ChipLogError(DeviceLayer, "Warning, KVS leakage, failed to remove old KVS value");
+ }
+ }
+
+ error = setPref_new(key.Namespace, key.Name, (uint8_t *) data, dataLen);
+ err = AmebaUtils::MapError(error, AmebaErrorType::kDctError);
+ if (err != CHIP_NO_ERROR)
{
ChipLogError(DeviceLayer, "setPref: %s/%s failed\n", StringOrNullMarker(key.Namespace), StringOrNullMarker(key.Name));
}
@@ -292,15 +339,17 @@
StringOrNullMarker(key.Name), dataLen);
}
- return CHIP_NO_ERROR;
+ return err;
}
CHIP_ERROR AmebaConfig::ClearConfigValue(Key key)
{
- int32_t success;
+ CHIP_ERROR err;
+ int32_t error;
- success = deleteKey(key.Namespace, key.Name);
- if (!success)
+ error = deleteKey(key.Namespace, key.Name);
+ err = AmebaUtils::MapError(error, AmebaErrorType::kDctError);
+ if (err != CHIP_NO_ERROR)
{
ChipLogProgress(DeviceLayer, "%s : %s/%s failed\n", __FUNCTION__, StringOrNullMarker(key.Namespace),
StringOrNullMarker(key.Name));
@@ -310,7 +359,7 @@
ChipLogProgress(DeviceLayer, "NVS erase: %s/%s", StringOrNullMarker(key.Namespace), StringOrNullMarker(key.Name));
}
- return CHIP_NO_ERROR;
+ return err;
}
bool AmebaConfig::ConfigValueExists(Key key)
@@ -320,40 +369,50 @@
CHIP_ERROR AmebaConfig::InitNamespace()
{
- int32_t success = -1;
+ CHIP_ERROR err;
+ int32_t error;
- success = registerPref();
- if (success != 0)
+ error = registerPref();
+ err = AmebaUtils::MapError(error, AmebaErrorType::kDctError);
+ if (err != CHIP_NO_ERROR)
{
ChipLogError(DeviceLayer, "DCT modules registration failed");
+ goto exit;
}
- success = registerPref2();
- if (success != 0)
+ error = registerPref2();
+ err = AmebaUtils::MapError(error, AmebaErrorType::kDctError);
+ if (err != CHIP_NO_ERROR)
{
ChipLogError(DeviceLayer, "DCT2 modules registration failed");
}
- return CHIP_NO_ERROR;
+exit:
+ return err;
}
CHIP_ERROR AmebaConfig::ClearNamespace()
{
- int32_t success = -1;
+ CHIP_ERROR err;
+ int32_t error;
- success = clearPref();
- if (success != 0)
+ error = clearPref();
+ err = AmebaUtils::MapError(error, AmebaErrorType::kDctError);
+ if (err != CHIP_NO_ERROR)
{
ChipLogError(DeviceLayer, "DCT modules unregistration failed\n");
+ goto exit;
}
- success = clearPref2();
- if (success != 0)
+ error = clearPref2();
+ err = AmebaUtils::MapError(error, AmebaErrorType::kDctError);
+ if (err != CHIP_NO_ERROR)
{
ChipLogError(DeviceLayer, "DCT2 modules unregistration failed\n");
}
- return CHIP_NO_ERROR;
+exit:
+ return err;
}
void AmebaConfig::RunConfigUnitTest() {}
diff --git a/src/platform/Ameba/AmebaUtils.cpp b/src/platform/Ameba/AmebaUtils.cpp
index 578ffab..12118df 100644
--- a/src/platform/Ameba/AmebaUtils.cpp
+++ b/src/platform/Ameba/AmebaUtils.cpp
@@ -40,10 +40,10 @@
CHIP_ERROR AmebaUtils::StartWiFi(void)
{
- CHIP_ERROR err = CHIP_NO_ERROR;
// Ensure that the WiFi layer is started.
- matter_wifi_on(RTW_MODE_STA);
- return err;
+ int32_t error = matter_wifi_on(RTW_MODE_STA);
+ CHIP_ERROR err = MapError(error, AmebaErrorType::kWiFiError);
+ return CHIP_NO_ERROR; // will fail if wifi is already initialized, let it pass
}
CHIP_ERROR AmebaUtils::IsStationEnabled(bool & staEnabled)
@@ -60,22 +60,23 @@
CHIP_ERROR AmebaUtils::IsStationConnected(bool & connected)
{
- CHIP_ERROR err = CHIP_NO_ERROR;
- connected = (matter_wifi_is_connected_to_ap() == RTW_SUCCESS) ? 1 : 0;
+ int32_t error = matter_wifi_is_connected_to_ap();
+ CHIP_ERROR err = MapError(error, AmebaErrorType::kWiFiError);
+ connected = (err == CHIP_NO_ERROR) ? true : false;
return err;
}
CHIP_ERROR AmebaUtils::EnableStationMode(void)
{
- CHIP_ERROR err = CHIP_NO_ERROR;
// Ensure that station mode is enabled in the WiFi layer.
- matter_wifi_set_mode(RTW_MODE_STA);
+ int32_t error = matter_wifi_set_mode(RTW_MODE_STA);
+ CHIP_ERROR err = MapError(error, AmebaErrorType::kWiFiError);
return err;
}
CHIP_ERROR AmebaUtils::SetWiFiConfig(rtw_wifi_config_t * config)
{
- CHIP_ERROR err = CHIP_NO_ERROR;
+ CHIP_ERROR err;
// don't store if ssid is null
if (config->ssid[0] == 0)
{
@@ -95,7 +96,7 @@
CHIP_ERROR AmebaUtils::GetWiFiConfig(rtw_wifi_config_t * config)
{
- CHIP_ERROR err = CHIP_NO_ERROR;
+ CHIP_ERROR err;
size_t ssidLen = 0;
size_t credentialsLen = 0;
@@ -117,8 +118,8 @@
CHIP_ERROR AmebaUtils::ClearWiFiConfig()
{
/* Clear Wi-Fi Configurations in Storage */
- CHIP_ERROR err = CHIP_NO_ERROR;
- err = PersistedStorage::KeyValueStoreMgr().Delete(kWiFiSSIDKeyName);
+ CHIP_ERROR err;
+ err = PersistedStorage::KeyValueStoreMgr().Delete(kWiFiSSIDKeyName);
SuccessOrExit(err);
err = PersistedStorage::KeyValueStoreMgr().Delete(kWiFiCredentialsKeyName);
@@ -130,43 +131,46 @@
CHIP_ERROR AmebaUtils::WiFiDisconnect(void)
{
- CHIP_ERROR err = CHIP_NO_ERROR;
- ChipLogProgress(DeviceLayer, "matter_wifi_disconnect");
- err = (matter_wifi_disconnect() == RTW_SUCCESS) ? CHIP_NO_ERROR : CHIP_ERROR_INTERNAL;
+ ChipLogProgress(DeviceLayer, "Disconnecting WiFi");
+ int32_t error = matter_wifi_disconnect();
+ CHIP_ERROR err = MapError(error, AmebaErrorType::kWiFiError);
+ if (err == CHIP_NO_ERROR)
+ {
+ ChipLogProgress(DeviceLayer, "matter_lwip_releaseip");
+ matter_lwip_releaseip();
+ }
return err;
}
CHIP_ERROR AmebaUtils::WiFiConnectProvisionedNetwork(void)
{
- CHIP_ERROR err = CHIP_NO_ERROR;
rtw_wifi_config_t * config = (rtw_wifi_config_t *) pvPortMalloc(sizeof(rtw_wifi_config_t));
memset(config, 0, sizeof(rtw_wifi_config_t));
GetWiFiConfig(config);
ChipLogProgress(DeviceLayer, "Connecting to AP : [%s]", (char *) config->ssid);
- int ameba_err = matter_wifi_connect((char *) config->ssid, RTW_SECURITY_WPA_WPA2_MIXED, (char *) config->password,
+ int32_t error = matter_wifi_connect((char *) config->ssid, RTW_SECURITY_WPA_WPA2_MIXED, (char *) config->password,
strlen((const char *) config->ssid), strlen((const char *) config->password), 0, nullptr);
+ CHIP_ERROR err = MapError(error, AmebaErrorType::kWiFiError);
vPortFree(config);
- err = (ameba_err == RTW_SUCCESS) ? CHIP_NO_ERROR : CHIP_ERROR_INTERNAL;
return err;
}
CHIP_ERROR AmebaUtils::WiFiConnect(const char * ssid, const char * password)
{
- CHIP_ERROR err = CHIP_NO_ERROR;
ChipLogProgress(DeviceLayer, "Connecting to AP : [%s]", (char *) ssid);
- int ameba_err = matter_wifi_connect((char *) ssid, RTW_SECURITY_WPA_WPA2_MIXED, (char *) password, strlen(ssid),
+ int32_t error = matter_wifi_connect((char *) ssid, RTW_SECURITY_WPA_WPA2_MIXED, (char *) password, strlen(ssid),
strlen(password), 0, nullptr);
- err = (ameba_err == RTW_SUCCESS) ? CHIP_NO_ERROR : CHIP_ERROR_INTERNAL;
+ CHIP_ERROR err = MapError(error, AmebaErrorType::kWiFiError);
return err;
}
CHIP_ERROR AmebaUtils::SetCurrentProvisionedNetwork()
{
- CHIP_ERROR err = CHIP_NO_ERROR;
rtw_wifi_setting_t pSetting;
- int ret = matter_get_sta_wifi_info(&pSetting);
- if (ret < 0)
+ int32_t error = matter_get_sta_wifi_info(&pSetting);
+ CHIP_ERROR err = MapError(error, AmebaErrorType::kWiFiError);
+ if (err != CHIP_NO_ERROR)
{
ChipLogProgress(DeviceLayer, "STA No Wi-Fi Info");
goto exit;
@@ -197,3 +201,52 @@
exit:
return err;
}
+
+CHIP_ERROR AmebaUtils::MapError(int32_t error, AmebaErrorType type)
+{
+ if (type == AmebaErrorType::kDctError)
+ {
+ return MapDctError(error);
+ }
+ if (type == AmebaErrorType::kFlashError)
+ {
+ return MapFlashError(error);
+ }
+ if (type == AmebaErrorType::kWiFiError)
+ {
+ return MapWiFiError(error);
+ }
+ return CHIP_ERROR_INTERNAL;
+}
+
+CHIP_ERROR AmebaUtils::MapDctError(int32_t error)
+{
+ if (error == DCT_SUCCESS)
+ return CHIP_NO_ERROR;
+ if (error == DCT_ERR_NO_MEMORY)
+ return CHIP_ERROR_NO_MEMORY;
+ if (error == DCT_ERR_NOT_FIND)
+ return CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND;
+ if (error == DCT_ERR_SIZE_OVER)
+ return CHIP_ERROR_INVALID_ARGUMENT;
+ if (error == DCT_ERR_MODULE_BUSY)
+ return CHIP_ERROR_BUSY;
+
+ return CHIP_ERROR_INTERNAL;
+}
+
+CHIP_ERROR AmebaUtils::MapFlashError(int32_t error)
+{
+ if (error == 1)
+ return CHIP_NO_ERROR;
+
+ return CHIP_ERROR_INTERNAL;
+}
+
+CHIP_ERROR AmebaUtils::MapWiFiError(int32_t error)
+{
+ if (error == RTW_SUCCESS)
+ return CHIP_NO_ERROR;
+
+ return CHIP_ERROR_INTERNAL;
+}
diff --git a/src/platform/Ameba/AmebaUtils.h b/src/platform/Ameba/AmebaUtils.h
index 5fcc5c9..c1fa81b 100644
--- a/src/platform/Ameba/AmebaUtils.h
+++ b/src/platform/Ameba/AmebaUtils.h
@@ -24,6 +24,13 @@
namespace DeviceLayer {
namespace Internal {
+enum class AmebaErrorType
+{
+ kDctError,
+ kFlashError,
+ kWiFiError,
+};
+
class AmebaUtils
{
public:
@@ -39,6 +46,14 @@
static CHIP_ERROR WiFiConnectProvisionedNetwork(void);
static CHIP_ERROR WiFiConnect(const char * ssid, const char * password);
static CHIP_ERROR SetCurrentProvisionedNetwork(void);
+ static CHIP_ERROR WiFiConnect(void);
+
+ static CHIP_ERROR MapError(int32_t error, AmebaErrorType type);
+
+private:
+ static CHIP_ERROR MapDctError(int32_t error);
+ static CHIP_ERROR MapFlashError(int32_t error);
+ static CHIP_ERROR MapWiFiError(int32_t error);
};
} // namespace Internal
diff --git a/src/platform/Ameba/ConfigurationManagerImpl.cpp b/src/platform/Ameba/ConfigurationManagerImpl.cpp
index 16d7a8f..b3c6cbf 100644
--- a/src/platform/Ameba/ConfigurationManagerImpl.cpp
+++ b/src/platform/Ameba/ConfigurationManagerImpl.cpp
@@ -25,6 +25,7 @@
#include <platform/internal/CHIPDeviceLayerInternal.h>
#include <platform/Ameba/AmebaConfig.h>
+#include <platform/Ameba/AmebaUtils.h>
#include <platform/ConfigurationManager.h>
#include <platform/DiagnosticDataProvider.h>
#include <platform/internal/GenericConfigurationManagerImpl.ipp>
@@ -152,13 +153,22 @@
CHIP_ERROR ConfigurationManagerImpl::GetPrimaryWiFiMACAddress(uint8_t * buf)
{
+ CHIP_ERROR err;
+ int32_t error;
+
char temp[32];
uint32_t mac[ETH_ALEN];
- int i = 0;
-
- wifi_get_mac_address(temp);
-
char * token = strtok(temp, ":");
+ int i = 0;
+
+ error = matter_wifi_get_mac_address(temp);
+ err = AmebaUtils::MapError(error, AmebaErrorType::kWiFiError);
+ if (err != CHIP_NO_ERROR)
+ {
+ ChipLogError(DeviceLayer, "Failed to get mac address");
+ goto exit;
+ }
+
while (token != NULL)
{
mac[i] = (uint32_t) strtol(token, NULL, 16);
@@ -169,7 +179,8 @@
for (i = 0; i < ETH_ALEN; i++)
buf[i] = mac[i] & 0xFF;
- return CHIP_NO_ERROR;
+exit:
+ return err;
}
bool ConfigurationManagerImpl::CanFactoryReset()
@@ -188,10 +199,6 @@
AmebaConfig::Key configKey{ AmebaConfig::kConfigNamespace_ChipCounters, key };
CHIP_ERROR err = ReadConfigValue(configKey, value);
- if (err == CHIP_DEVICE_ERROR_CONFIG_NOT_FOUND)
- {
- err = CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND;
- }
return err;
}
diff --git a/src/platform/Ameba/ConnectivityManagerImpl.cpp b/src/platform/Ameba/ConnectivityManagerImpl.cpp
index ba289b1..d42886b 100644
--- a/src/platform/Ameba/ConnectivityManagerImpl.cpp
+++ b/src/platform/Ameba/ConnectivityManagerImpl.cpp
@@ -524,7 +524,7 @@
{
WiFiStationState prevState = mWiFiStationState;
ChangeWiFiStationState(kWiFiStationState_NotConnected);
- if (prevState != kWiFiStationState_Connecting_Failed)
+ if (prevState == kWiFiStationState_Connecting_Failed)
{
ChipLogProgress(DeviceLayer, "WiFi station failed to connect");
// TODO: check retry count if exceeded, then clearwificonfig
@@ -858,13 +858,13 @@
void ConnectivityManagerImpl::DHCPProcessThread(void * param)
{
- matter_lwip_dhcp(0, DHCP_START);
+ matter_lwip_dhcp();
PlatformMgr().LockChipStack();
sInstance.OnStationIPv4AddressAvailable();
PlatformMgr().UnlockChipStack();
#if LWIP_VERSION_MAJOR > 2 || LWIP_VERSION_MINOR > 0
#if LWIP_IPV6
- matter_lwip_dhcp(0, DHCP6_START);
+ matter_lwip_dhcp6();
PlatformMgr().LockChipStack();
sInstance.OnIPv6AddressAvailable();
PlatformMgr().UnlockChipStack();
diff --git a/src/platform/Ameba/DiagnosticDataProviderImpl.cpp b/src/platform/Ameba/DiagnosticDataProviderImpl.cpp
index b9f2f01..ab1f243 100644
--- a/src/platform/Ameba/DiagnosticDataProviderImpl.cpp
+++ b/src/platform/Ameba/DiagnosticDataProviderImpl.cpp
@@ -25,10 +25,13 @@
#include <crypto/CHIPCryptoPAL.h>
#include <lib/support/CHIPMemString.h>
+#include <platform/Ameba/AmebaUtils.h>
#include <platform/Ameba/DiagnosticDataProviderImpl.h>
#include <lwip_netconf.h>
+using namespace chip::DeviceLayer::Internal;
+
namespace chip {
namespace DeviceLayer {
@@ -248,19 +251,25 @@
#if CHIP_DEVICE_CONFIG_ENABLE_WIFI
CHIP_ERROR DiagnosticDataProviderImpl::GetWiFiBssId(MutableByteSpan & BssId)
{
+ CHIP_ERROR err;
+ int32_t error;
+
constexpr size_t bssIdSize = 6;
VerifyOrReturnError(BssId.size() >= bssIdSize, CHIP_ERROR_BUFFER_TOO_SMALL);
- if (wifi_get_ap_bssid(BssId.data()) != 0)
+ error = matter_wifi_get_ap_bssid(BssId.data());
+ err = AmebaUtils::MapError(error, AmebaErrorType::kWiFiError);
+
+ if (err != CHIP_NO_ERROR)
{
- return CHIP_ERROR_READ_FAILED;
+ return err;
}
BssId.reduce_size(bssIdSize);
ChipLogProgress(DeviceLayer, "%02x,%02x,%02x,%02x,%02x,%02x\n", BssId.data()[0], BssId.data()[1], BssId.data()[2],
BssId.data()[3], BssId.data()[4], BssId.data()[5]);
- return CHIP_NO_ERROR;
+ return err;
}
CHIP_ERROR DiagnosticDataProviderImpl::GetWiFiVersion(app::Clusters::WiFiNetworkDiagnostics::WiFiVersionEnum & wifiVersion)
@@ -273,20 +282,25 @@
CHIP_ERROR DiagnosticDataProviderImpl::GetWiFiSecurityType(app::Clusters::WiFiNetworkDiagnostics::SecurityTypeEnum & securityType)
{
+ CHIP_ERROR err;
+ int32_t error;
+
using app::Clusters::WiFiNetworkDiagnostics::SecurityTypeEnum;
unsigned int _auth_type;
- unsigned short _security = 0;
+ unsigned short security = 0;
rtw_wifi_setting_t setting;
-#ifdef CONFIG_PLATFORM_8721D
- if (wext_get_enc_ext("wlan0", &_security, &setting.key_idx, setting.password) < 0)
+ error = matter_wifi_get_security_type("wlan0", &security, &setting.key_idx, setting.password);
+ err = AmebaUtils::MapError(error, AmebaErrorType::kWiFiError);
+ if (err != CHIP_NO_ERROR)
{
securityType = SecurityTypeEnum::kUnspecified;
}
+#ifdef CONFIG_PLATFORM_8721D
else
{
- switch (_security)
+ switch (security)
{
case IW_ENCODE_ALG_NONE:
securityType = SecurityTypeEnum::kNone;
@@ -306,14 +320,9 @@
}
}
#else
- wext_get_enc_ext("wlan0", &_security, &setting.key_idx, setting.password);
- if (wext_get_auth_type("wlan0", &_auth_type) < 0)
- {
- securityType = SecurityTypeEnum::kUnspecified;
- }
else
{
- switch (_security)
+ switch (security)
{
case IW_ENCODE_ALG_NONE:
securityType = SecurityTypeEnum::kNone;
@@ -342,30 +351,40 @@
}
#endif
- return CHIP_NO_ERROR;
+ return err;
}
CHIP_ERROR DiagnosticDataProviderImpl::GetWiFiChannelNumber(uint16_t & channelNumber)
{
+ CHIP_ERROR err;
+ int32_t error;
unsigned char channel;
- if (wext_get_channel("wlan0", &channel) < 0)
+ error = matter_wifi_get_wifi_channel_number("wlan0", &channel);
+ err = AmebaUtils::MapError(error, AmebaErrorType::kWiFiError);
+ if (err != CHIP_NO_ERROR)
channelNumber = 0;
else
channelNumber = (uint16_t) channel;
- return CHIP_NO_ERROR;
+ return err;
}
CHIP_ERROR DiagnosticDataProviderImpl::GetWiFiRssi(int8_t & rssi)
{
- int _rssi = 0;
- if (wifi_get_rssi(&_rssi) < 0)
- rssi = 0;
- else
- rssi = _rssi;
+ CHIP_ERROR err;
+ int32_t error;
- return CHIP_NO_ERROR;
+ error = matter_wifi_get_rssi((int *) &rssi);
+ err = AmebaUtils::MapError(error, AmebaErrorType::kWiFiError);
+
+ if (err != CHIP_NO_ERROR)
+ {
+ // set rssi to 0 upon error
+ rssi = 0;
+ }
+
+ return err;
}
CHIP_ERROR DiagnosticDataProviderImpl::GetWiFiBeaconLostCount(uint32_t & beaconLostCount)
diff --git a/src/platform/Ameba/FactoryDataDecoder.cpp b/src/platform/Ameba/FactoryDataDecoder.cpp
index 3c6874b..4e3536e 100644
--- a/src/platform/Ameba/FactoryDataDecoder.cpp
+++ b/src/platform/Ameba/FactoryDataDecoder.cpp
@@ -17,29 +17,28 @@
#include "FactoryDataDecoder.h"
#include "chip_porting.h"
+#include <platform/Ameba/AmebaUtils.h>
#include <platform/internal/CHIPDeviceLayerInternal.h>
+using namespace chip::DeviceLayer::Internal;
+
namespace chip {
namespace DeviceLayer {
CHIP_ERROR FactoryDataDecoder::ReadFactoryData(uint8_t * buffer, uint16_t * pfactorydata_len)
{
- uint32_t ret = 0;
- ret = ReadFactory(buffer, pfactorydata_len);
- if (ret != 1)
- return CHIP_ERROR_INTERNAL;
+ int32_t error = ReadFactory(buffer, pfactorydata_len);
+ CHIP_ERROR err = AmebaUtils::MapError(error, AmebaErrorType::kFlashError);
- return CHIP_NO_ERROR;
+ return err;
}
CHIP_ERROR FactoryDataDecoder::DecodeFactoryData(uint8_t * buffer, FactoryData * fdata, uint16_t factorydata_len)
{
- uint32_t ret = 0;
- ret = DecodeFactory(buffer, fdata, factorydata_len);
- if (ret != 0)
- return CHIP_ERROR_INTERNAL;
+ int32_t error = DecodeFactory(buffer, fdata, factorydata_len);
+ CHIP_ERROR err = AmebaUtils::MapError(error, AmebaErrorType::kFlashError);
- return CHIP_NO_ERROR;
+ return err;
}
} // namespace DeviceLayer
diff --git a/src/platform/Ameba/KeyValueStoreManagerImpl.cpp b/src/platform/Ameba/KeyValueStoreManagerImpl.cpp
index 1fede31..282d58c 100644
--- a/src/platform/Ameba/KeyValueStoreManagerImpl.cpp
+++ b/src/platform/Ameba/KeyValueStoreManagerImpl.cpp
@@ -23,9 +23,12 @@
/* this file behaves like a config.h, comes first */
#include "FreeRTOS.h"
#include "chip_porting.h"
+#include <platform/Ameba/AmebaUtils.h>
#include <platform/KeyValueStoreManager.h>
#include <support/CodeUtils.h>
+using namespace chip::DeviceLayer::Internal;
+
namespace chip {
namespace DeviceLayer {
namespace PersistedStorage {
@@ -35,99 +38,79 @@
CHIP_ERROR KeyValueStoreManagerImpl::_Get(const char * key, void * value, size_t value_size, size_t * read_bytes_size,
size_t offset_bytes)
{
- CHIP_ERROR err = CHIP_NO_ERROR;
- int32_t ret = -1;
+ CHIP_ERROR err;
+ int32_t error;
if (!value)
{
- return (err = CHIP_ERROR_INVALID_ARGUMENT);
+ err = CHIP_ERROR_INVALID_ARGUMENT;
+ goto exit;
}
if (offset_bytes > 0)
{
// Offset and partial reads are not supported in nvs, for now just return NOT_IMPLEMENTED. Support can be added in the
// future if this is needed.
- return (err = CHIP_ERROR_NOT_IMPLEMENTED);
+ err = CHIP_ERROR_NOT_IMPLEMENTED;
+ goto exit;
}
if (read_bytes_size)
{
- ret = getPref_bin_new(key, key, (uint8_t *) value, value_size, read_bytes_size);
+ error = getPref_bin_new(key, key, (uint8_t *) value, value_size, read_bytes_size);
+ err = AmebaUtils::MapError(error, AmebaErrorType::kDctError);
}
else
{
size_t * dummy_read_bytes_size = (size_t *) pvPortMalloc(sizeof(size_t));
if (!dummy_read_bytes_size)
{
- return CHIP_ERROR_INTERNAL;
+ err = CHIP_ERROR_INTERNAL;
+ goto exit;
}
- ret = getPref_bin_new(key, key, (uint8_t *) value, value_size, dummy_read_bytes_size);
+ error = getPref_bin_new(key, key, (uint8_t *) value, value_size, dummy_read_bytes_size);
+ err = AmebaUtils::MapError(error, AmebaErrorType::kDctError);
vPortFree(dummy_read_bytes_size);
}
- switch (ret)
- {
- case 0:
- return CHIP_NO_ERROR;
- case -6:
- return CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND;
- case -7:
- return CHIP_ERROR_INVALID_ARGUMENT;
- case -8:
- return CHIP_ERROR_BUFFER_TOO_SMALL;
- default:
- break;
- }
- return CHIP_ERROR_INTERNAL;
+exit:
+ return err;
}
CHIP_ERROR KeyValueStoreManagerImpl::_Put(const char * key, const void * value, size_t value_size)
{
- CHIP_ERROR err = CHIP_NO_ERROR;
- int32_t ret = -1;
+ CHIP_ERROR err;
+ int32_t error;
if (!value)
{
- return (err = CHIP_ERROR_INVALID_ARGUMENT);
+ err = CHIP_ERROR_INVALID_ARGUMENT;
+ goto exit;
}
if (checkExist(key, key))
{
- ret = deleteKey(key, key);
- if (ret != 0)
+ error = deleteKey(key, key);
+ err = AmebaUtils::MapError(error, AmebaErrorType::kDctError);
+ if (err != CHIP_NO_ERROR)
{
ChipLogError(DeviceLayer, "Warning, KVS leakage, failed to remove old kvs value");
}
}
- ret = setPref_new(key, key, (uint8_t *) value, value_size);
+ error = setPref_new(key, key, (uint8_t *) value, value_size);
+ err = AmebaUtils::MapError(error, AmebaErrorType::kDctError);
- if (TRUE == ret)
- err = CHIP_NO_ERROR;
- else
- err = CHIP_ERROR_INTERNAL;
-
+exit:
return err;
}
CHIP_ERROR KeyValueStoreManagerImpl::_Delete(const char * key)
{
- int32_t ret = deleteKey(key, key);
- switch (ret)
- {
- case 0:
- return CHIP_NO_ERROR;
- case -6:
- return CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND;
- case -7:
- return CHIP_ERROR_INVALID_ARGUMENT;
- case -8:
- return CHIP_ERROR_BUFFER_TOO_SMALL;
- default:
- break;
- }
+ int32_t error = deleteKey(key, key);
+ CHIP_ERROR err = AmebaUtils::MapError(error, AmebaErrorType::kDctError);
- return CHIP_ERROR_INTERNAL;
+ return err;
}
} // namespace PersistedStorage
diff --git a/src/platform/Ameba/NetworkCommissioningWiFiDriver.cpp b/src/platform/Ameba/NetworkCommissioningWiFiDriver.cpp
index 38be3f2..914e4f3 100644
--- a/src/platform/Ameba/NetworkCommissioningWiFiDriver.cpp
+++ b/src/platform/Ameba/NetworkCommissioningWiFiDriver.cpp
@@ -127,10 +127,13 @@
CHIP_ERROR AmebaWiFiDriver::ConnectWiFiNetwork(const char * ssid, uint8_t ssidLen, const char * key, uint8_t keyLen)
{
CHIP_ERROR err = CHIP_NO_ERROR;
+ bool connected;
+
// If device is already connected to WiFi, then disconnect the WiFi,
- // clear the WiFi configurations and add the newly provided WiFi configurations.
- if (chip::DeviceLayer::Internal::AmebaUtils::IsStationProvisioned())
+ chip::DeviceLayer::Internal::AmebaUtils::IsStationConnected(connected);
+ if (connected)
{
+ ConnectivityMgrImpl().ChangeWiFiStationState(ConnectivityManager::kWiFiStationState_Disconnecting);
ChipLogProgress(DeviceLayer, "Disconnecting WiFi station interface");
err = chip::DeviceLayer::Internal::AmebaUtils::WiFiDisconnect();
if (err != CHIP_NO_ERROR)
@@ -138,6 +141,11 @@
ChipLogError(DeviceLayer, "WiFiDisconnect() failed");
return err;
}
+ }
+
+ // clear the WiFi configurations and add the newly provided WiFi configurations.
+ if (chip::DeviceLayer::Internal::AmebaUtils::IsStationProvisioned())
+ {
err = chip::DeviceLayer::Internal::AmebaUtils::ClearWiFiConfig();
if (err != CHIP_NO_ERROR)
{
@@ -146,9 +154,12 @@
}
}
- ConnectivityMgrImpl().ChangeWiFiStationState(ConnectivityManager::kWiFiStationState_Connecting);
+ DeviceLayer::ConnectivityManager::WiFiStationState state = DeviceLayer::ConnectivityManager::kWiFiStationState_Connecting;
+ DeviceLayer::SystemLayer().ScheduleLambda([state, ssid, key]() {
+ ConnectivityMgrImpl().ChangeWiFiStationState(state);
+ chip::DeviceLayer::Internal::AmebaUtils::WiFiConnect(ssid, key);
+ });
- err = chip::DeviceLayer::Internal::AmebaUtils::WiFiConnect(ssid, key);
return err;
}
@@ -304,7 +315,7 @@
CHIP_ERROR AmebaWiFiDriver::SetLastDisconnectReason(const ChipDeviceEvent * event)
{
VerifyOrReturnError(event->Type == DeviceEventType::kRtkWiFiStationDisconnectedEvent, CHIP_ERROR_INVALID_ARGUMENT);
- mLastDisconnectedReason = wifi_get_last_error(); // TODO: change this to wrapper
+ mLastDisconnectedReason = matter_wifi_get_last_error();
return CHIP_NO_ERROR;
}
diff --git a/src/platform/Ameba/PlatformManagerImpl.cpp b/src/platform/Ameba/PlatformManagerImpl.cpp
index 0b89c4a..33ad2a6 100644
--- a/src/platform/Ameba/PlatformManagerImpl.cpp
+++ b/src/platform/Ameba/PlatformManagerImpl.cpp
@@ -39,7 +39,7 @@
PlatformManagerImpl PlatformManagerImpl::sInstance;
extern "C" {
-extern int rtw_get_random_bytes(void * dst, size_t size);
+extern int rtw_get_random_bytes(void * dst, uint32_t size);
}
static int app_entropy_source(void * data, unsigned char * output, size_t len, size_t * olen)
{
diff --git a/src/platform/Ameba/SystemTimeSupport.cpp b/src/platform/Ameba/SystemTimeSupport.cpp
index 57e5d86..5b7d03b 100644
--- a/src/platform/Ameba/SystemTimeSupport.cpp
+++ b/src/platform/Ameba/SystemTimeSupport.cpp
@@ -28,14 +28,10 @@
#include <platform/Ameba/SystemTimeSupport.h>
#include <support/logging/CHIPLogging.h>
-#include "rtc_api.h"
#include "task.h"
+#include <chip_porting.h>
#include <time.h>
-extern void rtc_init(void);
-extern time_t rtc_read(void);
-extern void rtc_write(time_t t);
-
struct rtkTimeVal
{
uint32_t tv_sec; /* seconds */
@@ -69,7 +65,7 @@
time_t seconds;
struct rtkTimeVal tv;
- seconds = rtc_read();
+ seconds = matter_rtc_read();
tv.tv_sec = (uint32_t) seconds;
tv.tv_usec = 0;
@@ -98,8 +94,8 @@
struct rtkTimeVal tv;
tv.tv_sec = static_cast<uint32_t>(aNewCurTime.count() / UINT64_C(1000000));
tv.tv_usec = static_cast<uint32_t>(aNewCurTime.count() % UINT64_C(1000000));
- rtc_init();
- rtc_write(tv.tv_sec);
+ matter_rtc_init();
+ matter_rtc_write(tv.tv_sec);
return CHIP_NO_ERROR;
}