feat(events): 添加传输策略事件支持
添加了新的 transport_policy_event 事件类型,用于管理 HID 传输策略和蓝牙配置文件策略。该事件包含源模式、HID 传输策 略和蓝牙配置文件策略三个枚举值,并提供了相应的提交函数 和日志记录功能。 BREAKING CHANGE: 将原有的 mode_switch_event 替换为更具体的 transport_policy_event,相关模块需要更新以使用新的事件类 型。
This commit is contained in:
@@ -10,12 +10,19 @@
|
||||
|
||||
#include "module_lifecycle.h"
|
||||
#include "mode_switch_event.h"
|
||||
#include "transport_policy_event.h"
|
||||
|
||||
LOG_MODULE_REGISTER(MODULE, LOG_LEVEL_INF);
|
||||
|
||||
struct transport_policy_state {
|
||||
enum hid_transport_policy hid_transport;
|
||||
enum ble_profile_policy ble_profile;
|
||||
};
|
||||
|
||||
struct mode_policy_module_ctx {
|
||||
struct module_lifecycle_ctx lc;
|
||||
enum mode_switch_mode active_mode;
|
||||
struct transport_policy_state policy;
|
||||
};
|
||||
|
||||
static int do_init(void);
|
||||
@@ -40,8 +47,51 @@ static struct mode_policy_module_ctx ctx = {
|
||||
.ops = &lifecycle_ops,
|
||||
},
|
||||
.active_mode = MODE_SWITCH_USB,
|
||||
.policy = {
|
||||
.hid_transport = HID_TRANSPORT_POLICY_USB,
|
||||
.ble_profile = BLE_PROFILE_POLICY_NONE,
|
||||
},
|
||||
};
|
||||
|
||||
static void build_policy_from_mode(enum mode_switch_mode mode,
|
||||
struct transport_policy_state *policy)
|
||||
{
|
||||
switch (mode) {
|
||||
case MODE_SWITCH_USB:
|
||||
policy->hid_transport = HID_TRANSPORT_POLICY_USB;
|
||||
policy->ble_profile = BLE_PROFILE_POLICY_NONE;
|
||||
break;
|
||||
|
||||
case MODE_SWITCH_BLE:
|
||||
policy->hid_transport = HID_TRANSPORT_POLICY_BLE;
|
||||
policy->ble_profile = BLE_PROFILE_POLICY_GENERAL;
|
||||
break;
|
||||
|
||||
case MODE_SWITCH_24G:
|
||||
policy->hid_transport = HID_TRANSPORT_POLICY_BLE;
|
||||
policy->ble_profile = BLE_PROFILE_POLICY_DONGLE;
|
||||
break;
|
||||
|
||||
default:
|
||||
policy->hid_transport = HID_TRANSPORT_POLICY_NONE;
|
||||
policy->ble_profile = BLE_PROFILE_POLICY_NONE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static bool policy_equal(const struct transport_policy_state *a,
|
||||
const struct transport_policy_state *b)
|
||||
{
|
||||
return (a->hid_transport == b->hid_transport) &&
|
||||
(a->ble_profile == b->ble_profile);
|
||||
}
|
||||
|
||||
static void broadcast_policy(void)
|
||||
{
|
||||
submit_transport_policy_event(ctx.active_mode, ctx.policy.hid_transport,
|
||||
ctx.policy.ble_profile);
|
||||
}
|
||||
|
||||
static void mode_policy_set_ble(bool enable)
|
||||
{
|
||||
if (enable) {
|
||||
@@ -76,7 +126,7 @@ static void mode_policy_set_usb(bool enable)
|
||||
}
|
||||
}
|
||||
|
||||
static void apply_active_mode(void)
|
||||
static void apply_stack_policy(void)
|
||||
{
|
||||
switch (ctx.active_mode) {
|
||||
case MODE_SWITCH_BLE:
|
||||
@@ -90,7 +140,7 @@ static void apply_active_mode(void)
|
||||
break;
|
||||
|
||||
case MODE_SWITCH_24G:
|
||||
mode_policy_set_ble(false);
|
||||
mode_policy_set_ble(true);
|
||||
mode_policy_set_usb(false);
|
||||
break;
|
||||
|
||||
@@ -111,7 +161,7 @@ static void apply_ble_mode_policy(void)
|
||||
break;
|
||||
|
||||
case MODE_SWITCH_24G:
|
||||
mode_policy_set_ble(false);
|
||||
mode_policy_set_ble(true);
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -139,15 +189,36 @@ static void apply_usb_mode_policy(void)
|
||||
}
|
||||
}
|
||||
|
||||
static void update_mode_policy(enum mode_switch_mode mode)
|
||||
{
|
||||
struct transport_policy_state next_policy;
|
||||
bool mode_changed = (ctx.active_mode != mode);
|
||||
bool policy_changed;
|
||||
|
||||
build_policy_from_mode(mode, &next_policy);
|
||||
policy_changed = !policy_equal(&ctx.policy, &next_policy);
|
||||
|
||||
ctx.active_mode = mode;
|
||||
ctx.policy = next_policy;
|
||||
|
||||
if (policy_changed || mode_changed) {
|
||||
broadcast_policy();
|
||||
}
|
||||
|
||||
apply_stack_policy();
|
||||
}
|
||||
|
||||
static int do_init(void)
|
||||
{
|
||||
ctx.active_mode = MODE_SWITCH_USB;
|
||||
build_policy_from_mode(ctx.active_mode, &ctx.policy);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int do_start(void)
|
||||
{
|
||||
apply_active_mode();
|
||||
broadcast_policy();
|
||||
apply_stack_policy();
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -162,8 +233,7 @@ static bool app_event_handler(const struct app_event_header *aeh)
|
||||
const struct mode_switch_event *event = cast_mode_switch_event(aeh);
|
||||
|
||||
if (module_lifecycle_is_running(&ctx.lc)) {
|
||||
ctx.active_mode = event->mode;
|
||||
apply_active_mode();
|
||||
update_mode_policy(event->mode);
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
Reference in New Issue
Block a user