nl::Weave::System::Layer

#include <src/system/SystemLayer.h>

This provides access to timers according to the configured event handling model.

摘要

WEAVE_SYSTEM_CONFIG_USE_SOCKETS 來說,系統會透過調整平台的傳統輪詢/選取實作處理事件完備性通知。

如果是 WEAVE_SYSTEM_CONFIG_USE_LWIP,系統會透過事件 / 訊息,以及事件/訊息系統的平台與系統專用掛鉤處理事件完備性通知。

建構函式和解構函式

Layer(void)

公開類型

EventHandler)(Object &aTarget, EventType aEventType, uintptr_t aArgument) typedef
Error(*
TimerCompleteFunct)(Layer *aLayer, void *aAppState, Error aError) typedef
void(*

公開函式

AddEventHandlerDelegate(LwIPEventHandlerDelegate & aDelegate)
Error
這會將事件處理常式委派新增至系統層,擴展其處理 LwIP 事件的能力。
CancelTimer(TimerCompleteFunct aOnComplete, void *aAppState)
void
這個方法會取消早開始到 StartTimer() 的一次性計時器。
DispatchEvent(Event aEvent)
Error
這會分派指定事件,以供此執行個體處理。
DispatchEvents(void)
Error
這是在平台專屬掛鉤周圍的語法包裝函式,會影響事件迴圈、等待執行個體在服務佇列中、從該佇列中提取事件,然後將其派出進行處理。
GetPlatformData(void) const
void *
此方法會傳回指派給執行個體的任何用戶端專屬平台資料 (如果先前已設定過)。
HandleEvent(Object & aTarget, EventType aEventType, uintptr_t aArgument)
Error
這會實作 Weave 系統圖層事件的實際調度和處理。
HandlePlatformTimer(void)
Error
處理平台計時器到期事件。
HandleSelectResult(int aSetSize, fd_set *aReadSet, fd_set *aWriteSet, fd_set *aExceptionSet)
void
透過特定呼叫處理 I/O。
Init(void *aContext)
Error
NewTimer(Timer *& aTimerPtr)
Error
PostEvent(Object & aTarget, EventType aEventType, uintptr_t aArgument)
Error
這會將具有指定類型的事件 / 訊息張貼至這個執行個體的平台專屬事件佇列,並加上提供的引數。
PrepareSelect(int & aSetSize, fd_set *aReadSet, fd_set *aWriteSet, fd_set *aExceptionSet, struct timeval & aSleepTime)
void
準備可供 select() 使用的檔案描述元集。
ScheduleWork(TimerCompleteFunct aComplete, void *aAppState)
Error
排定簽名與 TimerCompleteFunct 相同的函式,以便在 Weave 執行緒上盡快執行。
SetPlatformData(void *aPlatformData)
void
這會將指定的用戶端平台資料設為執行個體,以供用戶端平台稍後擷取。
Shutdown(void)
Error
StartTimer(uint32_t aMilliseconds, TimerCompleteFunct aComplete, void *aAppState)
Error
這個方法會啟動一次性計時器。
State(void) const
LayerState
這會傳回圖層物件的目前狀態。
WakeSelect(void)
void
使用 select() 將單一位元組寫入 Wake 管道,藉此喚醒使用 select() 監控檔案描述元的 I/O 執行緒。

公開的靜態函式

GetClock_Monotonic(void)
uint64_t
傳回單調系統時間 (以微秒為單位)。
GetClock_MonotonicHiRes(void)
uint64_t
傳回 (可能) 的高解析度單調系統時間,以微秒為單位。
GetClock_MonotonicMS(void)
uint64_t
傳回單調系統時間 (以毫秒為單位)。
GetClock_RealTime(uint64_t & curTime)
Error
以微秒 Unix 時間格式傳回目前的實際 (民用) 時間。
GetClock_RealTimeMS(uint64_t & curTimeMS)
Error
以毫秒的 Unix 時間格式傳回目前的實際 (民用) 時間。
SetClock_RealTime(uint64_t newCurTime)
Error
設定平台的目前實際 (民用) 時間概念。

公開類型

EventHandler

Error(* EventHandler)(Object &aTarget, EventType aEventType, uintptr_t aArgument)

TimerCompleteFunct

void(* TimerCompleteFunct)(Layer *aLayer, void *aAppState, Error aError)

公開函式

AddEventHandlerDelegate

Error AddEventHandlerDelegate(
  LwIPEventHandlerDelegate & aDelegate
)

這會將事件處理常式委派新增至系統層,以擴展其處理 LwIP 事件的能力。

詳細資料
參數
[in] aDelegate
未初始化的 LwIP 事件處理常式委派結構
傳回值
WEAVE_SYSTEM_NO_ERROR
成功時。
WEAVE_SYSTEM_ERROR_BAD_ARGS
如果 aDelegate 中的函式指標為 NULL

CancelTimer

void CancelTimer(
  TimerCompleteFunct aOnComplete,
  void *aAppState
)

這個方法會取消早開始到 StartTimer() 的一次性計時器。

詳細資料
參數
[in] aOnComplete
用於呼叫 StartTimer() 的回呼函式的指標。
[in] aAppState
指向呼叫 StartTimer() 時使用的應用程式狀態物件指標。

DispatchEvent

Error DispatchEvent(
  Event aEvent
)

這會分派指定事件,以供此執行個體處理。

事件的類型和引數解構作業是由平台專屬的掛鉤處理,該掛鉤應會呼叫 Layer::HandleEvent,以便實際調度。

詳細資料
參數
[in] aEvent
要分派處理的平台專屬事件物件。
傳回
WEAVE_SYSTEM_NO_ERROR 成功;否則會顯示特定錯誤,指出初始化失敗的原因。

DispatchEvents

Error DispatchEvents(
  void
)

這是在平台專屬掛鉤周圍的語法包裝函式,會影響事件迴圈、等待執行個體在服務佇列中、從該佇列中提取事件,然後將其派出進行處理。

詳細資料
傳回
WEAVE_SYSTEM_NO_ERROR 成功;否則會顯示特定錯誤,指出初始化失敗的原因。

GetPlatformData

void * GetPlatformData(
  void
) const 

此方法會傳回指派給執行個體的任何用戶端專屬平台資料 (如果先前已設定過)。

詳細資料
傳回
用戶端專屬平台資料 (如果先前已設定);否則為 NULL。

HandleEvent

Error HandleEvent(
  Object & aTarget,
  EventType aEventType,
  uintptr_t aArgument
)

這會實作 Weave 系統圖層事件的實際調度和處理。

詳細資料
參數
[in,out] aTarget
事件目標所鎖定的圖層物件參照。
[in] aEventType
要處理的事件 / 訊息類型。
[in] aArgument
與事件 / 訊息相關聯的引數。
傳回值
WEAVE_SYSTEM_NO_ERROR
成功時。
WEAVE_SYSTEM_ERROR_UNEXPECTED_STATE
如果 InetLayer 物件的狀態不正確。
WEAVE_SYSTEM_ERROR_UNEXPECTED_EVENT
如果事件類型無法辨識。

HandlePlatformTimer

Error HandlePlatformTimer(
  void
)

處理平台計時器到期事件。

呼叫 nl::Weave::System::Timer::HandleExpiredTimers 來處理任何已過期的計時器。系統會假設只有在擁有 Weave 系統圖層物件的執行緒上,才會呼叫這個 API。

詳細資料
傳回
成功時傳回 WEAVE_SYSTEM_NO_ERROR,否則傳回錯誤代碼。

HandleSelectResult

void HandleSelectResult(
  int aSetSize,
  fd_set *aReadSet,
  fd_set *aWriteSet,
  fd_set *aExceptionSet
)

透過特定呼叫處理 I/O。

這個方法會在每個有效端點中註冊待處理的 I/O 事件,然後針對這些端點叫用對應的 I/O 處理函式。

詳細資料
參數
[in] aSetSize
選取呼叫的傳回值。
[in] aReadSet
指向讀取檔案描述元集的指標。
[in] aWriteSet
指向寫入檔案描述元集的指標。
[in] aExceptionSet
指向有錯誤的檔案描述元組合的指標。

Init

Error Init(
  void *aContext
)

圖層

 Layer(
  void
)

NewTimer

Error NewTimer(
  Timer *& aTimerPtr
)

PostEvent

Error PostEvent(
  Object & aTarget,
  EventType aEventType,
  uintptr_t aArgument
)

這會將具有指定類型的事件 / 訊息張貼至這個執行個體的平台專屬事件佇列,並加上提供的引數。

詳細資料
參數
[in,out] aTarget
指向提出 post 要求的 Weave System Layer 物件。
[in] aEventType
要發布的活動類型。
[in,out] aArgument
與要發布事件相關聯的引數。
傳回值
WEAVE_SYSTEM_NO_ERROR
成功時。
WEAVE_SYSTEM_ERROR_UNEXPECTED_STATE
如果 Layer 物件的狀態不正確。
WEAVE_SYSTEM_ERROR_NO_MEMORY
如果事件佇列已滿。
other
系統產生的平台相關錯誤,指出失敗原因。

PrepareSelect

void PrepareSelect(
  int & aSetSize,
  fd_set *aReadSet,
  fd_set *aWriteSet,
  fd_set *aExceptionSet,
  struct timeval & aSleepTime
)

準備可供 select() 使用的檔案描述元集。

詳細資料
參數
[out] aSetSize
檔案描述元集的檔案描述元範圍。
[in] aReadSet
指向可讀取檔案描述元集的指標。
[in] aWriteSet
指向可寫入檔案描述元集的指標。
[in] aExceptionSet
指向有錯誤的檔案描述元組合的指標。
[in] aSleepTime
最長睡眠時間的參考依據。

ScheduleWork

Error ScheduleWork(
  TimerCompleteFunct aComplete,
  void *aAppState
)

排定簽名與 TimerCompleteFunct 相同的函式,以便在 Weave 執行緒上盡快執行。

詳細資料
參數
[in] aComplete
指向在此計時器觸發時要呼叫的回呼函式的指標。
[in] aAppState
指向回呼函式做為引數的應用程式狀態物件的指標。
傳回值
WEAVE_SYSTEM_ERROR_UNEXPECTED_STATE
如果 SystemLayer 尚未初始化。
WEAVE_SYSTEM_ERROR_NO_MEMORY
如果 SystemLayer 無法分配新的計時器。
WEAVE_SYSTEM_NO_ERROR
成功時。

SetPlatformData

void SetPlatformData(
  void *aPlatformData
)

這會將指定的用戶端平台資料設為執行個體,以供用戶端平台稍後擷取。

詳細資料
參數
[in] aPlatformData
要設定的用戶端專屬平台資料。

關閉

Error Shutdown(
  void
)

StartTimer

Error StartTimer(
  uint32_t aMilliseconds,
  TimerCompleteFunct aComplete,
  void *aAppState
)

這個方法會啟動一次性計時器。

詳細資料
參數
[in] aMilliseconds
到期時間,以毫秒為單位。
[in] aComplete
計時器到期時呼叫的函式指標。
[in] aAppState
計時器到期時,所用應用程式狀態物件的指標。
傳回
WEAVE_SYSTEM_NO_ERROR 成功時。
傳回
WEAVE_SYSTEM_ERROR_NO_MEMORY 如果無法分配計時器。
傳回
其他值,表示無法啟動計時器。

LayerState State(
  void
) const 

這會傳回圖層物件的目前狀態。

WakeSelect

void WakeSelect(
  void
)

使用 select() 將單一位元組寫入 Wake 管道,藉此喚醒使用 select() 監控檔案描述元的 I/O 執行緒。

注意:如果是從 HandleSelectResult() 中呼叫 WakeSelect(),則可以略過寫入 W/O 執行緒,因為 I/O 執行緒已喚醒。 此外,我們不介意這個寫入作業是否失敗,因為只有在合理可能失敗的情況下,管道空間已滿;在這種情況下,所選呼叫執行緒仍會喚醒。

公開的靜態函式

GetClock_Monotonic

uint64_t GetClock_Monotonic(
  void
)

傳回單調系統時間 (以微秒為單位)。

這個函式會傳回經過時間 (以微秒為單位),因為平台定義的任意時間。系統重新啟動後,傳回的值保證不會經過自動換行。此外,在任何系統睡眠模式期間,凡是不會在醒來後重新啟動的系統睡眠模式,基礎時間來源保證仍會保持不變。

雖然部分平台可能會選擇傳回用來測量系統啟動後時間的值,但應用程式「不」必須傳回這個值。此外,GetClock_Monotonic() 的週期「不必」與任何其他 GetClock... 函式一樣。因此,只有相同函式傳回的值才能計算相對時間。

在任何採用執行緒的平台上,此函式一定能確保執行緒安全。

詳細資料
傳回
從平台定義任意訓練週期以來經過的時間 (以微秒為單位)。

GetClock_MonotonicHiRes

uint64_t GetClock_MonotonicHiRes(
  void
)

傳回 (可能) 的高解析度單調系統時間,以微秒為單位。

這個函式會傳回經過時間 (以微秒為單位),因為平台定義的任意時間。系統重新啟動後,傳回的值保證不會經過自動換行。不過,系統「不需要」在系統處於熟睡狀態時持續遵守基礎計時器。

部分平台可能會使用高解析度計時器 (比 GetClock_Monotonic()) 更精準的 GetClock_MonotonicHiRes(),而且不會循序漸進地調整時鐘 (滑動)。如果系統沒有這類計時器,可能只會傳回與 GetClock_Monotonic() 的值相同。

GetClock_MonotonicHiRes() 所傳回的時間週期不必與所有其他 GetClock... 函式 (包括 GetClock_Monotonic()) 相同。

在任何採用執行緒的平台上,此函式一定能確保執行緒安全。

詳細資料
傳回
從平台定義任意訓練週期以來經過的時間 (以微秒為單位)。

GetClock_MonotonicMS

uint64_t GetClock_MonotonicMS(
  void
)

傳回單調系統時間 (以毫秒為單位)。

這個函式會傳回從平台定義任意訓練週期以來的經過時間 (以毫秒為單位)。系統重新啟動後,傳回的值保證不會經過自動換行。此外,在任何系統睡眠模式期間,凡是不會在醒來後重新啟動的系統睡眠模式,基礎時間來源保證仍會保持不變。

雖然部分平台可能會選擇傳回用來測量系統啟動後時間的值,但應用程式「不」必須傳回這個值。此外,GetClock_Monotonic() 的週期「不必」與任何其他 GetClock... 函式一樣。因此,只有相同函式傳回的值才能計算相對時間。

在任何採用執行緒的平台上,此函式一定能確保執行緒安全。

詳細資料
傳回
從任意平台定義週期以來經過的時間 (以毫秒為單位)。

GetClock_RealTime

Error GetClock_RealTime(
  uint64_t & curTime
)

以微秒 Unix 時間格式傳回目前的實際 (民用) 時間。

這個方法會傳回當地平台的目前即時概念,以縮放至微秒的 Unix 時間值表示。基礎時鐘保證會以至少秒的速率 (值是 1,000,000) 來測量,但是在某些平台上,它的移動速度可能比較快。

如果基礎平台能夠即時追蹤,但系統目前沒有同步,GetClock_RealTime() 會傳回 WEAVE_SYSTEM_ERROR_REAL_TIME_NOT_SYNCED 錯誤。

在無法即時追蹤的平台上,GetClock_RealTime() 方法可能缺少,對於參照該方法的應用程式,也會產生連結錯誤。或者,這類平台可能會提供 GetClock_RealTime() 的實作方式,其一律會傳回 WEAVE_SYSTEM_ERROR_NOT_SUPPORTED 錯誤。

在任何採用執行緒的平台上,此函式一定能確保執行緒安全。

詳細資料
參數
[out] curTime
目前時間,以 Unix 時間比例調整為微秒。
傳回值
WEAVE_SYSTEM_NO_ERROR
方法是否成功。
#WEAVE_SYSTEM_ERROR_REAL_TIME_NOT_SYNCED
如果平台能夠即時追蹤,但目前並未同步,
#WEAVE_SYSTEM_ERROR_NOT_SUPPORTED
如果平台無法即時追蹤。

GetClock_RealTimeMS

Error GetClock_RealTimeMS(
  uint64_t & curTimeMS
)

以毫秒的 Unix 時間格式傳回目前的實際 (民用) 時間。

這個方法會傳回本機平台的目前即時概念 (以縮放至毫秒的 Unix 時間值表示)。基礎時鐘保證會以至少秒的速率 (值是 1,000,000) 來測量,但是在某些平台上,可能會跳動速度更快。

如果基礎平台能夠即時追蹤,但系統目前沒有同步,GetClock_RealTimeMS() 會傳回 WEAVE_SYSTEM_ERROR_REAL_TIME_NOT_SYNCED 錯誤。

在無法即時追蹤的平台上,GetClock_RealTimeMS() 方法可能會缺少,對於參照該方法的應用程式,也會產生連結錯誤。或者,這類平台可能會提供 GetClock_RealTimeMS() ,其實作一律會傳回 WEAVE_SYSTEM_ERROR_NOT_SUPPORTED 錯誤。

在任何採用執行緒的平台上,此函式一定能確保執行緒安全。

詳細資料
參數
[out] curTime
目前時間,以 Unix 時間比例調整為毫秒。
傳回值
WEAVE_SYSTEM_NO_ERROR
方法是否成功。
#WEAVE_SYSTEM_ERROR_REAL_TIME_NOT_SYNCED
如果平台能夠即時追蹤,但目前並未同步,
#WEAVE_SYSTEM_ERROR_NOT_SUPPORTED
如果平台無法即時追蹤。

SetClock_RealTime

Error SetClock_RealTime(
  uint64_t newCurTime
)

設定平台的目前實際 (民用) 時間概念。

應用程式可以呼叫此函式,設定本機平台的目前即時概念。新的目前時間會以 Unix 時間值表示,調幅為微秒。

設定後,基礎平台時鐘即可保證即時追蹤精細程度至少為一秒的即時資訊。

某些平台可能會限制可即時設定的應用程式或程序。如果呼叫端不允許即時變更,SetClock_RealTime() 函式將傳回錯誤 WEAVE_SYSTEM_ERROR_ACCESS_DENIED。

在無法即時追蹤的平台上,或不提供即時設定功能的平台上,可能缺少 SetClock_RealTime() 函式,因此在參照該函式的應用程式也會發生連結錯誤。或者,這類平台可能會提供 SetClock_RealTime() 的實作方式,其一律會傳回 WEAVE_SYSTEM_ERROR_NOT_SUPPORTED 錯誤。

在任何採用執行緒的平台上,此函式一定能確保執行緒安全。

詳細資料
參數
[in] newCurTime
新的目前時間,以 Unix 時間比例調整為微秒。
傳回值
WEAVE_SYSTEM_NO_ERROR
方法是否成功。
#WEAVE_SYSTEM_ERROR_NOT_SUPPORTED
如果平台無法即時追蹤。
#WEAVE_SYSTEM_ERROR_ACCESS_DENIED
如果發出呼叫的應用程式沒有設定目前時間的權限。