wkupct回调函数

⚠️
大家好. .谢谢你来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台,它将提供更好的功能,包含在主对话网站中。所有岗位和账户都已迁移。我们现在只接受新论坛的流量-请在上面发布任何新帖子//www.xmece.com/support.我们将在未来几天修复bug /优化搜索和标记。
14个帖子/ 0个新
最后发表
dlo
离线
最后看到:1个月1个星期前
加入:2017-05-26 16:21
wkupct回调函数

当我从GPIO中断中唤醒时,我想改变广告的UUID的最后一个字节,以指示是哪个GPIO唤醒了它。使用beacon_v_5.40.2_0项目,我声明回调如下:

空白tilt_wakeup_cb(空白)

if(getBits16(sys_stat_reg,per_is_down))

//从外部唤醒GPIO返回GPIO功能
如果(DEVELOPMENT_DEBUG)
GPIO_reservations ();
periph_init ();

tilt_wkup_flag = 1;
user_advertise_operation();


这是允许的吗?
我计划使用一个标志来确定设备是被GPIO中断唤醒还是从它的计时器唤醒,基于此信息,我计划编辑user_update_ibeacon_adv_string如下:

void user_update_ibeacon_adv_string(struct user_i_beacon_config_tag * data,struct user_beacon_config_tag config)

.......
//由DL添加
如果(tilt_wkup_flag) {
如果(!GPIO_GetPinStatus (GPIO_PORT_2 GPIO_PIN_0)) {
数据 - > UUID [15] = 1;
} else if (!GPIO_GetPinStatus (GPIO_PORT_2 GPIO_PIN_1)) {
数据- > uuid [15] = 2;
}如果(!gpio_getpinstatus(gpio_port_2,gpio_pin_2)){
数据- > uuid [15] = 3;
}如果(!gpio_getpinstatus(gpio_port_2,gpio_pin_3)){
数据- > uuid [15] = 4;
} else if (!GPIO_GetPinStatus (GPIO_PORT_2 GPIO_PIN_4)) {
数据- > uuid [15] = 5;
} else if (!GPIO_GetPinStatus (GPIO_PORT_2 GPIO_PIN_5)) {
数据- > uuid [15] = 6;

tilt_wk_flag = 0;
其他}{
数据- > uuid [15] = 0;

//
.....


测试这段代码时,当GPIO被拉低以强制唤醒时,似乎没有做任何事情。

在user_on_init ()
我在函数中添加了以下内容:

wkupct_register_callback(tilt_wakeup_cb);
x3f0000 x3f0000 wkupct_enable_irq (0, 0, 0);//启用P2_0到P2_5的中断

关键词:
设备:
dlo
离线
最后看到:1个月1个星期前
加入:2017-05-26 16:21
我修改了回调

我修改回调如下,但仍然不工作。用Jlink跟踪,我可以看到它进入回调函数,但它没有发布新的UUID:

void tilt_wakeup_cb(void) {if (GetBits16(SYS_STAT_REG, PER_IS_DOWN)){//从外部唤醒GPIO功能返回GPIO if (DEVELOPMENT_DEBUG) GPIO_reservations();periph_init ();} if (arch_ble_ext_wakeup_get()) {arch_set_sleep_mode(ARCH_SLEEP_OFF);//关闭睡眠模式//强制BLE唤醒arch_ble_ext_wakeup_off();//关闭外部唤醒(如果在进入永久睡眠之前设置了arch_ble_ext_wakeup_on()函数);user_advertise_operation ();x003f0000 x003f0000 wkupct_enable_irq (0, 0, 0);//允许P2_0到P2_5中断}

MT_dialog
离线
最后看到:3个月4周前
工作人员
加入:2015-06-08 11:34
嗨dio,

嗨dio,

如果发生唤醒中断,则需要调试此操作,可以在User_update_ibeacon_add()中放置一个断点,并检查代码是否通过该函数,并且如果满足条件以更改广告字符串。

由于MT_dialog

dlo
离线
最后看到:1个月1个星期前
加入:2017-05-26 16:21
好的,所以不应该有任何

好的,那么调用user_advertise_operation()应该没有任何问题;在回调中,对吧?收音机和其他东西都应该开着它应该在按我的方式设置的时候做广告吗?

只是确保我没有违反一些规则,从GPIO中断唤醒后我们无法宣传。

谢谢,

MT_dialog
离线
最后看到:3个月4周前
工作人员
加入:2015-06-08 11:34
嗯,不建议这样做

它不建议直接从醒来开始广告操作虽然这应该工作,可以找到适当的方式开始一个动作在app_button_press_cb ble_app_sleemode检查(),但即使不遵循你的设备应该能够开始广告。例如,如果您直接从app_button_press_cb()调用user_app_adv_start()(我认为这与您已经实现的user_advertise_operation相同)并删除app_easy_wakeup(),设备将发布。但建议使用app_easy_wakeup() API的方式。

由于MT_dialog

dlo
离线
最后看到:1个月1个星期前
加入:2017-05-26 16:21
似乎经常

当没有GPIO中断发生,设备在定时间隔苏醒时,所有的广告事件都可以在我手机上的信标扫描应用程序上看到。

当GPIO中断确实发生时,踩到代码时,似乎代码会做它应该是什么,但我从未在扫描仪应用中看到正确的值......

不知何故,我不认为数据是在这种情况下发布的。app_easy_gap_non_connectable_advertise_start()用于这两个场景。对于GPIO中断情况,我将cmd->intv_min和cmd->intv_max改为0。或者让这两个空着,不管怎样都不行。

dlo
离线
最后看到:1个月1个星期前
加入:2017-05-26 16:21
这是代码。

这是代码。

MT_dialog
离线
最后看到:3个月4周前
工作人员
加入:2015-06-08 11:34
嗨dlo,

嗨dlo,

如果代码是什么想做得到中断和数据,你想看到的设备仍然是广告但旧值然后应该错如何放置广告中的数据字符串。在广告字符串被新值更新之后,我假设您停止广告,用新值更新广告字符串,然后使用user_advertise_operation重新启动广告。调用app_easy_gap_non_connectable_advertise_get_active()函数以便SDK填充新消息,然后将自定义数据添加到广告字符串中,要调试它,您可以在代码中一步一步地进行,并检查携带advertise命令的CMD指针是否在代码的某个点包含您想放置的广告数据(检查CMD ->主机。Adv_data数组,并检查你的数据是否被添加到这个数组中)。

由于MT_dialog

dlo
离线
最后看到:1个月1个星期前
加入:2017-05-26 16:21
所以我测试了你的样子

所以我测试了你建议的东西,发现了一些奇怪的行为。

当使用定时器唤醒间隔并禁用wkupct时,会在user_update_ibeacon_adv_string中轮询GPIO,并相应地更新UUID的最后一个字节。我可以看到这些变化在扫描仪应用程序,一切工作,因为它应该。

然后我启用wkupct:
wkupct_register_callback(tilt_wakeup_cb);
x3f0000 x3f0000 wkupct_enable_irq (0, 0, 0);//启用P2_0到P2_5的中断

在此之后,我不再看到扫描仪应用程序中UUID的最后一个字节的变化。由于使用相同的代码更新广告字符串和广告,我将假定这两个函数工作正常。现在来弄清楚为什么启用wkupct和调用user_advertise_operation不再正常工作。

我尝试追踪CMD->信息 - >主机 - > ADV_DATA,但没有一个值似乎匹配UUID或任何识别的任何识别。

代码只使用对话框代码user_advertise_operation();没有修改。
我修改了对话框提供的代码user_update_ibeacon_adv_string

void user_update_ibeacon_adv_string(struct user_i_beacon_config_tag * data,struct user_beacon_config_tag config)

memcpy(数据- > adv_header ADV_HEADER_iBEACON 2);
>compa亚博全网ny_id[0] = (uint8_t) (config.company_id&0xff);
数据->co亚博全网mpany_id[1] = (uint8_t) (config.company_id>>8);
data-> data_type = ibeacon_data_type;
数据- > beacon_length = ADV_DATA_LENGTH;

memcpy(数据- > uuid,配置。uuid, 16);
//由DL添加
如果(tilt_wkup_flag) {
如果(!GPIO_GetPinStatus (GPIO_PORT_2 GPIO_PIN_0)) {
数据 - > UUID [15] = 1;
} else if (!GPIO_GetPinStatus (GPIO_PORT_2 GPIO_PIN_1)) {
数据- > uuid [15] = 2;
}如果(!gpio_getpinstatus(gpio_port_2,gpio_pin_2)){
数据- > uuid [15] = 3;
}如果(!gpio_getpinstatus(gpio_port_2,gpio_pin_3)){
数据- > uuid [15] = 4;
} else if (!GPIO_GetPinStatus (GPIO_PORT_2 GPIO_PIN_4)) {
数据- > uuid [15] = 5;
} else if (!GPIO_GetPinStatus (GPIO_PORT_2 GPIO_PIN_5)) {
数据- > uuid [15] = 6;

tilt_wkup_flag = 0;
其他}{
数据- > uuid [15] = 0;

//
data-> tx_power = config.power;


写wkupct回调:

空白tilt_wakeup_cb(空白)

if(getBits16(sys_stat_reg,per_is_down))

//从外部唤醒GPIO返回GPIO功能
如果(DEVELOPMENT_DEBUG)
GPIO_reservations ();
periph_init ();

如果(arch_ble_ext_wakeup_get ())

arch_set_sleep_mode (app_default_sleep_mode);//设置默认睡眠模式
arch_ble_force_wakeup ();//强制BLE醒来
ARCH_BLE_EXT_WAKEUP_OFF();//禁用外部唤醒

tilt_wkup_flag = 1;
user_advertise_operation();
x003f0000 x003f0000 wkupct_enable_irq (0, 0, 0);//启用P2_0到P2_5的中断

感谢您一直以来的支持!

dlo
离线
最后看到:1个月1个星期前
加入:2017-05-26 16:21
发现有点信息。

发现有点信息。
我删除了对user_advertise_operation()的调用;在tilt_wakeup_cb()中,现在在扫描仪应用程序中看到了预期的变化。问题是,它最终会在大约5-10个广告间隔之后被记录。(我将发布间隔设置为5秒,并且在gpio被拉低后大约55秒收到更改的数据包)。

这似乎表明,在将实际事件放在队列中之前需要刷新的广告数据的缓冲区?这似乎是对吗?

你提到我应该停止广告,更新广告字符串,然后重新启动广告。如果我这样做,我的理解正确吗?

app_easy_gap_advertise_stop ();
user_advertise_operation();

user_advertise_operation()的代码;是默认的Dialog:

void user_advertise_operation(void)

struct gapm_start_advertise_cmd * cmd;
current_advertising_string = next_advertising_string;
current_advertising_mode = next_advertising_mode;
if (current_advertising_mode == NON_CONNECTABLE_MODE)

//获取指向BLE数据包的指针
cmd = app_easy_gap_non_connectable_advertise_get_active();

user_adv_restarted = true;
cmd-> info.host.adv_data_len = user_load_beacon_config(cmd);

//开始发布不可连接的外设。
if(app_connected == ke_state_get(task_app))

//不要在连接状态广告不可连接的广告

其他的

if(user_flash_beacon_config_loaded)

cmd - > intv_min = MS_TO_BLESLOTS (user_beacon_config.adv_int);
cmd - > intv_max = MS_TO_BLESLOTS (user_beacon_config.adv_int);

app_easy_gap_non_connectable_advertise_start ();



else if (current_advertising_mode == UNDIRECTED_MODE)

//获取指向BLE数据包的指针
cmd = app_easy_gap_undirected_advertise_get_active ();

user_adv_restarted = true;
cmd-> info.host.adv_data_len = user_load_beacon_config(cmd);

if (current_advertising_string == SUOTA_ADVERTISING_STRING)

update_advertising_data (USER_ADVERTISE_SUOTA USER_ADVERTISE_SUOTA_LEN);
user_update_adv_string (cmd, (void *) dynamic_adv_string SUOTA_ADVERTISING_STRING, USER_ADVERTISE_SUOTA_LEN);

//启动广告以获得未确定的外设。
app_easy_gap_undircated_advertise_start();


dlo
离线
最后看到:1个月1个星期前
加入:2017-05-26 16:21
我正在尝试的背景

关于我想做的事情的背景,请告诉我是否有可能。

当GPIO2_0变低时,我希望发送一个UUID以0结尾的通告。手机应用程序将记录它收到广告的时间。当另一个GPIO变低时,比如GPIO2_1,我想发送一个UUID以1结尾的广告。手机会记录它收到这个信息的时间,并计算两个广告之间的时间差。时差对我处理数据很重要。这是实现这一目标的可靠方法吗?或者是否存在某种限制让我无法实现这个目标?

再次感谢您一直以来的支持。

MT_dialog
离线
最后看到:3个月4周前
工作人员
加入:2015-06-08 11:34
嗨dlo,

嗨dlo,

关于在580上更新广告字符串,为了正确地停止,更新广告字符串并再次启动广告,您将不得不发出停止,然后等待堆栈回复广告确实停止了(SDK Will通知您广告已停止使用APP_ONC_ADV_UNDIRECT为无向广告,对于不可连接的广告,还有CORRSPONDING回调 - 请检查鞍骨灯,以便具有比标识更简单的引用)。因此,当堆栈通知您广告已完成并发生回调时,从该回调开始,您可以调用您将更新的新广告字符串的启动。您无法调用停止广告,然后将函数拨打函数开始。我想这是你的主要问题。

关于你想要实现什么和两个广告数据之间的差异,请注意广告不是一个可靠的方式发送数据,这意味着你将发送的数据将在特定的时间到达扫描仪,由于此时其他广告设备和协议之间会发生碰撞,所以在广告过程中不能保证无论外围设备发送什么,扫描器都会最确定地接收到。所以请注意这一点。

由于MT_dialog

dlo
离线
最后看到:1个月1个星期前
加入:2017-05-26 16:21
谢谢你的继续

谢谢你继续支持。我尝试在鞍骨项目中实现示例,但它仍然没有工作。我不知道还有什么要尝试,但是因为你提到没有保证到达扫描仪的数据,我们需要解决其他问题。

MT_dialog
离线
最后看到:3个月4周前
工作人员
加入:2015-06-08 11:34
嗨dlo,

嗨dlo,

是的,并不能保证广告字符串将到达中央,由于拥挤的平均值,范围或噪音,协议没有一个机制,以便中央确认发送的广告字符串已经收到的外设,这只发生在连接期间。

由于MT_dialog