在FiRa标准中,很重要的一个概念就是FiRa会话以及会话的管理,本文主要介绍了在Linux UWB Stack实现中,FiRa会话状态机管理的实现。
在FiRa中,会话分为INIT、DEINIT、ACTIVE、IDLE四种状态,其定义如下。
enum fira_session_state_id {
FIRA_SESSION_STATE_ID_INIT,
FIRA_SESSION_STATE_ID_DEINIT,
FIRA_SESSION_STATE_ID_ACTIVE,
FIRA_SESSION_STATE_ID_IDLE,
};
其中:
● INIT,初始化状态,会话还未准备好;
● DEINIT,会话注销,不存在;
● ACTIVE,会话活跃状态;
● IDLE,会话已经准备好开始,但并未激活。
在实现中,通过定义了一个struct fira_session_fsm_state结构体来进行每种状态的管理,该结构体包含一系列回调函数,用于处理从当前状态转换的事件,结构体定义如下:

包含了fira会话状态id,以及一系列的回调函数:
struct fira_local与struct fira_session相关指针信息;基于该状态结构体,以及fira会话中的四种状态,根据实际应用中的需求,定义了以下三个实例:
DEINIT状态,会话已经不存在,所以在具体状态的实现中,直接没有进行定义。
从实现来看,INIT状态,主要处理进入、参数更新、受控端列表更新以及参数检查四种回调函数。
if (fira_session_is_ready(local, session)) {
fira_session_fsm_change_state(local, session,
&fira_session_fsm_idle);
}
对于IDLE状态而言,实现了参数更新处理、受控端列表更新、开始以及参数检查处理。
mcps802154_reschedule(local->llhw);。
相对其他状态而言,ACTIVE状态为FiRa会话管理的核心,相应实现的对应状态下的回调函数而言相对较为全面,从enter/leave,参数更新与检查,启动/停止,获取访问等等都进行了完整的实现。

其中,关于FiRa会话的状态与FiRa会话的管理高度相关,创建一个新的FiRa会话时,会话默认状态为INIT,待FiRa会话准备好之后,可以切换到IDLE状态。
同样,当FiRa会话释放时,会话状态切换到DEINIT,所以在会话的管理上,未单独定义DEINIT的状态转移。
相关接口在fira_session_fsm.c/h中定义与实现,相关接口如下:
其中,