Skip to content

Commit e19ac85

Browse files
pankoreandy31415
andauthored
[ameba] Ameba SNTP and observer support (project-chip#36382)
* [ameba] Support Time Syncronization Using SNTP * [ameba] Synchronize RTC with SNTP * [ameba] Add CONFIG_ENABLE_AMEBA_SNTP to config/ameba/chip.cmake and run restyle-diff.sh * [ameba] Add Ameba Observer for Ameba Examples * [Ameba] Fix build with all-clusters-minimal-app and SystemTimeSupport.cpp * [Ameba] Update Docker Version to 91 * [Ameba] moved AmebaObserver.h to examples/platform/ameba/observer/ and updated Ameba cmake * [Ameba] simplified #if defined(CONFIG_ENABLE_AMEBA_SNTP) && (CONFIG_ENABLE_AMEBA_SNTP == 1) to #if CONFIG_ENABLE_AMEBA_SNTP --------- Co-authored-by: Andrei Litvin <andy314@gmail.com>
1 parent 83b75e1 commit e19ac85

File tree

16 files changed

+69
-19
lines changed

16 files changed

+69
-19
lines changed

config/ameba/chip.cmake

+1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ list(
3232
-DMBEDTLS_CONFIG_FILE=<mbedtls_config.h>
3333
-D_POSIX_REALTIME_SIGNALS
3434
-DCHIP_SHELL_MAX_TOKENS=11
35+
-DCONFIG_ENABLE_AMEBA_SNTP=1
3536
)
3637

3738
list(

examples/air-purifier-app/ameba/chip_main.cmake

+6
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,11 @@ endif (matter_enable_ota_requestor)
145145
list(
146146
APPEND ${list_chip_main_sources}
147147

148+
${chip_dir}/examples/air-purifier-app/air-purifier-common/src/air-purifier-manager.cpp
149+
${chip_dir}/examples/air-purifier-app/air-purifier-common/src/air-quality-sensor-manager.cpp
150+
${chip_dir}/examples/air-purifier-app/air-purifier-common/src/filter-delegates.cpp
151+
${chip_dir}/examples/air-purifier-app/air-purifier-common/src/thermostat-manager.cpp
152+
148153
${chip_dir}/examples/air-purifier-app/ameba/main/chipinterface.cpp
149154
${chip_dir}/examples/air-purifier-app/ameba/main/DeviceCallbacks.cpp
150155
${chip_dir}/examples/air-purifier-app/ameba/main/CHIPDeviceManager.cpp
@@ -192,6 +197,7 @@ target_include_directories(
192197
${chip_dir}/examples/air-purifier-app/air-purifier-common/include
193198
${chip_dir}/examples/air-purifier-app/ameba/main/include
194199
${chip_dir}/examples/platform/ameba
200+
${chip_dir}/examples/platform/ameba/observer
195201
${chip_dir}/examples/providers
196202
${chip_dir_output}/gen/include
197203
${chip_dir}/src/include/

examples/air-purifier-app/ameba/main/chipinterface.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
#include <platform_stdlib.h>
1919

20+
#include "AmebaObserver.h"
2021
#include "CHIPDeviceManager.h"
2122
#include "DeviceCallbacks.h"
2223
#include "Server.h"
@@ -139,6 +140,8 @@ static void InitServer(intptr_t context)
139140
VerifyOrDie((sAmebaPersistentStorageOpKeystore.Init(initParams.persistentStorageDelegate)) == CHIP_NO_ERROR);
140141
initParams.operationalKeystore = &sAmebaPersistentStorageOpKeystore;
141142
#endif
143+
static AmebaObserver sAmebaObserver;
144+
initParams.appDelegate = &sAmebaObserver;
142145
chip::Server::GetInstance().Init(initParams);
143146
gExampleDeviceInfoProvider.SetStorageDelegate(&Server::GetInstance().GetPersistentStorage());
144147
chip::DeviceLayer::SetDeviceInfoProvider(&gExampleDeviceInfoProvider);
@@ -151,6 +154,7 @@ static void InitServer(intptr_t context)
151154
PrintOnboardingCodes(chip::RendezvousInformationFlags(chip::RendezvousInformationFlag::kBLE));
152155
}
153156

157+
chip::Server::GetInstance().GetFabricTable().AddFabricDelegate(&sAmebaObserver);
154158
InitAirPurifierManager();
155159
}
156160

examples/all-clusters-app/ameba/chip_main.cmake

+1
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,7 @@ target_include_directories(
248248
${chip_dir}/examples/energy-management-app/energy-management-common/energy-reporting/include
249249
${chip_dir}/examples/all-clusters-app/ameba/main/include
250250
${chip_dir}/examples/platform/ameba
251+
${chip_dir}/examples/platform/ameba/observer
251252
${chip_dir}/examples/platform/ameba/route_hook
252253
${chip_dir}/examples/providers
253254
${chip_dir_output}/gen/include

examples/all-clusters-minimal-app/ameba/chip_main.cmake

+4-3
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,9 @@ endif (matter_enable_ota_requestor)
128128
list(
129129
APPEND ${list_chip_main_sources}
130130

131-
${chip_dir}/examples/all-clusters-minimal-app/all-clusters-common/src/bridged-actions-stub.cpp
132-
${chip_dir}/examples/all-clusters-minimal-app/all-clusters-common/src/smco-stub.cpp
133-
${chip_dir}/examples/all-clusters-minimal-app/all-clusters-common/src/static-supported-modes-manager.cpp
131+
${chip_dir}/examples/all-clusters-app/all-clusters-common/src/bridged-actions-stub.cpp
132+
${chip_dir}/examples/all-clusters-app/all-clusters-common/src/smco-stub.cpp
133+
${chip_dir}/examples/all-clusters-app/all-clusters-common/src/static-supported-modes-manager.cpp
134134

135135
${chip_dir}/examples/all-clusters-minimal-app/ameba/main/chipinterface.cpp
136136
${chip_dir}/examples/all-clusters-minimal-app/ameba/main/DeviceCallbacks.cpp
@@ -176,6 +176,7 @@ target_include_directories(
176176
${chip_dir}/examples/all-clusters-app/all-clusters-common
177177
${chip_dir}/examples/all-clusters-app/all-clusters-common/include
178178
${chip_dir}/examples/all-clusters-minimal-app/ameba/main/include
179+
${chip_dir}/examples/platform/ameba/observer
179180
${chip_dir_output}/gen/include
180181
${chip_dir}/src/include/
181182
${chip_dir}/src/lib/

examples/all-clusters-minimal-app/ameba/main/chipinterface.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
#include <platform_stdlib.h>
1919

20+
#include "AmebaObserver.h"
2021
#include "CHIPDeviceManager.h"
2122
#include "DeviceCallbacks.h"
2223
#include "Globals.h"
@@ -157,6 +158,8 @@ static void InitServer(intptr_t context)
157158
// Init ZCL Data Model and CHIP App Server
158159
static chip::CommonCaseDeviceServerInitParams initParams;
159160
initParams.InitializeStaticResourcesBeforeServerInit();
161+
static AmebaObserver sAmebaObserver;
162+
initParams.appDelegate = &sAmebaObserver;
160163
chip::Server::GetInstance().Init(initParams);
161164

162165
// Initialize device attestation config
@@ -173,6 +176,7 @@ static void InitServer(intptr_t context)
173176
PrintOnboardingCodes(chip::RendezvousInformationFlags(chip::RendezvousInformationFlag::kBLE));
174177
}
175178
Clusters::ModeSelect::setSupportedModesManager(&sStaticSupportedModesManager);
179+
chip::Server::GetInstance().GetFabricTable().AddFabricDelegate(&sAmebaObserver);
176180
}
177181

178182
extern "C" void ChipTest(void)

examples/chef/ameba/chip_main.cmake

+1
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ target_include_directories(
6666
${chip_dir}/examples/all-clusters-app/all-clusters-common/include
6767
${chip_dir}/examples/all-clusters-app/ameba/main/include
6868
${chip_dir}/examples/platform/ameba
69+
${chip_dir}/examples/platform/ameba/observer
6970
${chip_dir}/examples/providers
7071
${chip_dir_output}/gen/include
7172
${chip_dir}/src/include/

examples/chef/ameba/main/chipinterface.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
#include <platform_stdlib.h>
1919

20+
#include "AmebaObserver.h"
2021
#include "CHIPDeviceManager.h"
2122
#include "DeviceCallbacks.h"
2223
#include "Globals.h"
@@ -104,6 +105,8 @@ static void InitServer(intptr_t context)
104105
// Init ZCL Data Model and CHIP App Server
105106
static chip::CommonCaseDeviceServerInitParams initParams;
106107
initParams.InitializeStaticResourcesBeforeServerInit();
108+
static AmebaObserver sAmebaObserver;
109+
initParams.appDelegate = &sAmebaObserver;
107110
chip::Server::GetInstance().Init(initParams);
108111
gExampleDeviceInfoProvider.SetStorageDelegate(&Server::GetInstance().GetPersistentStorage());
109112
chip::DeviceLayer::SetDeviceInfoProvider(&gExampleDeviceInfoProvider);
@@ -115,6 +118,7 @@ static void InitServer(intptr_t context)
115118
// QR code will be used with CHIP Tool
116119
PrintOnboardingCodes(chip::RendezvousInformationFlags(chip::RendezvousInformationFlag::kBLE));
117120
}
121+
chip::Server::GetInstance().GetFabricTable().AddFabricDelegate(&sAmebaObserver);
118122
}
119123

120124
extern "C" void ChipTest(void)

examples/light-switch-app/ameba/chip_main.cmake

+1
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,7 @@ target_include_directories(
201201
${chip_dir}/zzz_generated/app-common
202202
${chip_dir}/examples/light-switch-app/ameba/main/include
203203
${chip_dir}/examples/platform/ameba
204+
${chip_dir}/examples/platform/ameba/observer
204205
${chip_dir}/examples/providers
205206
${chip_dir_output}/gen/include
206207
${chip_dir}/src/include/

examples/light-switch-app/ameba/main/chipinterface.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
#include <platform_stdlib.h>
1919

20+
#include "AmebaObserver.h"
2021
#include "BindingHandler.h"
2122
#include "CHIPDeviceManager.h"
2223
#include "DeviceCallbacks.h"
@@ -109,6 +110,8 @@ static void InitServer(intptr_t context)
109110
VerifyOrDie((sAmebaPersistentStorageOpKeystore.Init(initParams.persistentStorageDelegate)) == CHIP_NO_ERROR);
110111
initParams.operationalKeystore = &sAmebaPersistentStorageOpKeystore;
111112
#endif
113+
static AmebaObserver sAmebaObserver;
114+
initParams.appDelegate = &sAmebaObserver;
112115
chip::Server::GetInstance().Init(initParams);
113116
gExampleDeviceInfoProvider.SetStorageDelegate(&Server::GetInstance().GetPersistentStorage());
114117
chip::DeviceLayer::SetDeviceInfoProvider(&gExampleDeviceInfoProvider);
@@ -124,6 +127,7 @@ static void InitServer(intptr_t context)
124127
#if CONFIG_ENABLE_CHIP_SHELL
125128
InitBindingHandler();
126129
#endif
130+
chip::Server::GetInstance().GetFabricTable().AddFabricDelegate(&sAmebaObserver);
127131
}
128132

129133
extern "C" void ChipTest(void)

examples/lighting-app/ameba/chip_main.cmake

+1
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ target_include_directories(
196196
${chip_dir}/examples/lighting-app/lighting-common/include
197197
${chip_dir}/examples/lighting-app/ameba/main/include
198198
${chip_dir}/examples/platform/ameba
199+
${chip_dir}/examples/platform/ameba/observer
199200
${chip_dir}/examples/providers
200201
${chip_dir_output}/gen/include
201202
${chip_dir}/src/include/

examples/lighting-app/ameba/main/chipinterface.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
#include <platform_stdlib.h>
1919

20+
#include "AmebaObserver.h"
2021
#include "CHIPDeviceManager.h"
2122
#include "DeviceCallbacks.h"
2223
#include "Globals.h"
@@ -129,6 +130,8 @@ static void InitServer(intptr_t context)
129130
VerifyOrDie((sAmebaPersistentStorageOpKeystore.Init(initParams.persistentStorageDelegate)) == CHIP_NO_ERROR);
130131
initParams.operationalKeystore = &sAmebaPersistentStorageOpKeystore;
131132
#endif
133+
static AmebaObserver sAmebaObserver;
134+
initParams.appDelegate = &sAmebaObserver;
132135
chip::Server::GetInstance().Init(initParams);
133136
gExampleDeviceInfoProvider.SetStorageDelegate(&Server::GetInstance().GetPersistentStorage());
134137
chip::DeviceLayer::SetDeviceInfoProvider(&gExampleDeviceInfoProvider);
@@ -140,6 +143,7 @@ static void InitServer(intptr_t context)
140143
// QR code will be used with CHIP Tool
141144
PrintOnboardingCodes(chip::RendezvousInformationFlags(chip::RendezvousInformationFlag::kBLE));
142145
}
146+
chip::Server::GetInstance().GetFabricTable().AddFabricDelegate(&sAmebaObserver);
143147
}
144148

145149
extern "C" void ChipTest(void)

examples/ota-requestor-app/ameba/chip_main.cmake

+1
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ target_include_directories(
6262
${chip_dir}/src/app/clusters/ota-requestor
6363
${chip_dir}/examples/ota-requestor-app/ameba/main/include
6464
${chip_dir}/examples/platform/ameba
65+
${chip_dir}/examples/platform/ameba/observer
6566
${chip_dir}/examples/providers
6667
${sdk_root}/component/soc/realtek/amebad/fwlib/include
6768
)

examples/ota-requestor-app/ameba/main/chipinterface.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
#include <platform_stdlib.h>
1919

20+
#include "AmebaObserver.h"
2021
#include "CHIPDeviceManager.h"
2122
#include "DeviceCallbacks.h"
2223
#include "chip_porting.h"
@@ -76,11 +77,14 @@ static void InitServer(intptr_t context)
7677
// Init ZCL Data Model and CHIP App Server
7778
static chip::CommonCaseDeviceServerInitParams initParams;
7879
(void) initParams.InitializeStaticResourcesBeforeServerInit();
80+
static AmebaObserver sAmebaObserver;
81+
initParams.appDelegate = &sAmebaObserver;
7982
chip::Server::GetInstance().Init(initParams);
8083
gExampleDeviceInfoProvider.SetStorageDelegate(&Server::GetInstance().GetPersistentStorage());
8184
chip::DeviceLayer::SetDeviceInfoProvider(&gExampleDeviceInfoProvider);
8285

8386
NetWorkCommissioningInstInit();
87+
chip::Server::GetInstance().GetFabricTable().AddFabricDelegate(&sAmebaObserver);
8488
}
8589

8690
extern "C" void ChipTest(void)

src/platform/Ameba/SystemTimeSupport.cpp

+29-16
Original file line numberDiff line numberDiff line change
@@ -58,26 +58,32 @@ Milliseconds64 ClockImpl::GetMonotonicMilliseconds64(void)
5858

5959
CHIP_ERROR ClockImpl::GetClock_RealTime(Clock::Microseconds64 & curTime)
6060
{
61-
// TODO(19081): This platform does not properly error out if wall clock has
62-
// not been set. For now, short circuit this.
63-
return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
64-
#if 0
65-
time_t seconds;
66-
struct rtkTimeVal tv;
61+
#if CONFIG_ENABLE_AMEBA_SNTP
62+
time_t seconds = 0, uSeconds = 0;
6763

68-
seconds = matter_rtc_read();
69-
70-
tv.tv_sec = (uint32_t) seconds;
71-
tv.tv_usec = 0;
64+
if (matter_sntp_rtc_is_sync()) // if RTC is already sync with SNTP, read directly from RTC
65+
{
66+
seconds = matter_rtc_read(); // ameba rtc precission is in seconds only
67+
}
68+
else // read from SNTP and sync RTC with SNTP
69+
{
70+
matter_sntp_get_current_time(&seconds, &uSeconds);
71+
}
7272

73-
if (tv.tv_sec < CHIP_SYSTEM_CONFIG_VALID_REAL_TIME_THRESHOLD)
73+
if (seconds < CHIP_SYSTEM_CONFIG_VALID_REAL_TIME_THRESHOLD)
7474
{
7575
return CHIP_ERROR_REAL_TIME_NOT_SYNCED;
7676
}
77-
static_assert(CHIP_SYSTEM_CONFIG_VALID_REAL_TIME_THRESHOLD >= 0, "We might be letting through negative tv_sec values!");
78-
curTime = Microseconds64((static_cast<uint64_t>(tv.tv_sec) * UINT64_C(1000000)) + static_cast<uint64_t>(tv.tv_usec));
77+
if (uSeconds < 0)
78+
{
79+
return CHIP_ERROR_REAL_TIME_NOT_SYNCED;
80+
}
81+
static_assert(CHIP_SYSTEM_CONFIG_VALID_REAL_TIME_THRESHOLD >= 0, "We might be letting through negative uSeconds values!");
82+
curTime = Microseconds64((static_cast<uint64_t>(seconds) * UINT64_C(1000000)) + static_cast<uint64_t>(uSeconds));
7983

8084
return CHIP_NO_ERROR;
85+
#else
86+
return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
8187
#endif
8288
}
8389

@@ -105,9 +111,16 @@ CHIP_ERROR InitClock_RealTime()
105111
Clock::Microseconds64((static_cast<uint64_t>(CHIP_SYSTEM_CONFIG_VALID_REAL_TIME_THRESHOLD) * UINT64_C(1000000)));
106112
// Use CHIP_SYSTEM_CONFIG_VALID_REAL_TIME_THRESHOLD as the initial value of RealTime.
107113
// Then the RealTime obtained from GetClock_RealTime will be always valid.
108-
//
109-
// TODO(19081): This is broken because it causes the platform to report
110-
// that it does have wall clock time when it actually doesn't.
114+
#if CONFIG_ENABLE_AMEBA_SNTP
115+
time_t seconds = 0, uSeconds = 0;
116+
117+
matter_sntp_init();
118+
matter_sntp_get_current_time(&seconds, &uSeconds); // try to read from SNTP and sync RTC with SNTP
119+
if ((seconds > CHIP_SYSTEM_CONFIG_VALID_REAL_TIME_THRESHOLD) && (uSeconds > 0))
120+
{
121+
curTime = Microseconds64((static_cast<uint64_t>(seconds) * UINT64_C(1000000)) + static_cast<uint64_t>(uSeconds));
122+
}
123+
#endif
111124
return System::SystemClock().SetClock_RealTime(curTime);
112125
}
113126

0 commit comments

Comments
 (0)