WKUPCT回调函数

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

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

空白tilt_wakeup_cb(空白)

如果(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_adv_tring的信息,如下所示:

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

.......
//由DL添加
if(tilt_wkup_flag){
如果(!GPIO_GetPinStatus (GPIO_PORT_2 GPIO_PIN_0)) {
数据- > uuid [15] = 1;
}如果(!gpio_getpinstatus(gpio_port_2,gpio_pin_1)){
数据- > uuid [15] = 2;
} else if (!GPIO_GetPinStatus (GPIO_PORT_2 GPIO_PIN_2)) {
数据- > uuid [15] = 3;
} else if (!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十六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
离线
最后看到:三个月四个星期前
工作人员
加入:2015-06-08 34
你好戴奥,

你好戴奥,

您只需要调试它,如果发生唤醒中断,您可以在user_update_ibeacon_adv_string()中放置一个断点,并检查代码是否通过该函数,以及是否满足更改广告字符串的条件。

由于MT_dialog

DLO.
离线
最后看到:1个月1个星期前
加入:2017-05-26十六21
好的,所以应该没有

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

我只是想确保我没有违反一些规则,我们不能在GPIO中断后立即发布。

谢谢,

MT_dialog
离线
最后看到:三个月四个星期前
工作人员
加入:2015-06-08 34
好吧,它没有建议

嗯,它没有建议直接从唤醒开始广告操作虽然这应该工作,可以在BLE_APP_SLEEMODE中找到一个动作的正确方法,检查app_button_press_cb(),但即使没有跟随你的设备应该能够开始广告。例如,如果可以直接从app_button_press_cb()和删除app_easy_wakeup()设备将宣传的App_easy_wakeUp()将用户调用user_app_adv_start()(我假设是与已实现的user_advertise_operation相同。但是使用app_easy_wakeup()API的建议方式。

由于MT_dialog

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

当没有发生GPIO中断并且设备在定时间隔上唤醒时,在手机上的灯架扫描应用上看到所有广告活动。

当GPIO中断确实发生,通过代码,它似乎代码做了它应该做的,但我从来没有看到正确的值在扫描应用程序…

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

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

这是代码。

MT_dialog
离线
最后看到:三个月四个星期前
工作人员
加入:2015-06-08 34
嗨dlo,

嗨dlo,

如果代码确实假设要做什么,并且您可以获得中断和您想要的数据,您可以看到设备仍然是广告,但与旧值有关您将如何在广告中放置数据细绳。通过新值更新广告字符串之后,我假设您停止使用新值的广告更新广告字符串,然后使用user_advertise_operation重新启动广告。你调用app_easy_gap_non_connectable_advertise_get_active()函数才能填写一个新消息,然后在广告字符串中添加自定义数据,您可以做些什么来调试这是为了逐步在代码中查看携带广告命令的CMD指针包括您想要放置的广告数据的代码中的某个点(检查CMD-> host.adv_data阵列并检查您的数据是否在此阵列中附加)。

由于MT_dialog

DLO.
离线
最后看到:1个月1个星期前
加入:2017-05-26十六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->info->host->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);
数据 - >亚博全网 company_id [0] =(UINT8_T)(CONFIG.COMPANY_ID&0xFF);
数据->co亚博全网mpany_id[1] = (uint8_t) (config.company_id>>8);
数据- > data_type = iBEACON_DATA_TYPE;
数据- > beacon_length = ADV_DATA_LENGTH;

memcpy(数据- > uuid,配置。uuid, 16);
//由DL添加
if(tilt_wkup_flag){
如果(!GPIO_GetPinStatus (GPIO_PORT_2 GPIO_PIN_0)) {
数据- > uuid [15] = 1;
}如果(!gpio_getpinstatus(gpio_port_2,gpio_pin_1)){
数据- > uuid [15] = 2;
} else if (!GPIO_GetPinStatus (GPIO_PORT_2 GPIO_PIN_2)) {
数据- > uuid [15] = 3;
} else if (!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;

//
数据- > tx_power = config.power;


写wkupct回调:

空白tilt_wakeup_cb(空白)

如果(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十六21
找到了更多的信息。

找到了更多的信息。
我删除了对user_advertise_operation()的调用;在tilt_wakeup_cb()中,现在看到扫描仪应用程序中的预期更改。问题是它稍后最终记录了大约5-10个广告间隔。(我在5秒钟内设置广告间隔,我在GPIO被拉低后在大约55秒内收到更改的数据包)。

这似乎表明,在实际的事件数据放入队列之前,有一个广告数据缓冲区需要被清空?这看起来对吗?

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

app_easy_gap_advertise_stop();
user_advertise_operation ();

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

空白user_advertise_operation(空白)

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 (TASK_APP) == ke_state_get(TASK_APP)

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

别的

如果(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 ();



否则if(current_advertising_mode ==未向连接_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_undirected_advertise_start ();


DLO.
离线
最后看到:1个月1个星期前
加入:2017-05-26十六21
我所尝试的背景

关于我正在努力做的事情的背景,如果可能的话请让我知道。

当GPIO2_0变为低电平时,我想用uuid结尾发出一个广告,以0.手机应用程序将记录它收到广告的时间。当另一个GPIO变低时,让我们说GPIO2_1,我想用uuid结尾发出一个广告。手机将记录它收到的时间并计算两个广告之间的时间差。时间差对我正在尝试与数据进行操作至关重要。这是实现这一目标的可靠方法吗?或者是否有一些类型的限制,不允许我完成这一目标?

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

MT_dialog
离线
最后看到:三个月四个星期前
工作人员
加入:2015-06-08 34
嗨dlo,

嗨dlo,

关于更新580上的广告字符串,为了正确停止,更新广告字符串并重新开始广告,你必须发出一个stop,然后等待堆栈回复广告确实停止了(SDK会通知你广告已经停止了,同时app_on_adv_undirect complete for the undirected advertising,对于不可连接的广告也有相应的回调-请检查基本的例子,以便有一个比信标更简单的参考)。因此,当堆栈通知你广告已经完成,并发生回调时,从那个回调中,你可以调用你将更新的新广告字符串的开始。您不能调用停止广告,然后立即调用函数来启动。我想这就是你的主要问题。

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

由于MT_dialog

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

(谢谢你们一直以来的支持。)我尝试在基本项目中实现这个例子,但它似乎仍然不起作用。我不知道还能尝试什么,但既然你提到不能保证数据到达扫描仪,我们就得想点别的办法。

MT_dialog
离线
最后看到:三个月四个星期前
工作人员
加入:2015-06-08 34
嗨dlo,

嗨dlo,

是的,没有保证广告字符串将要达到中央,由于一个拥挤的平均值,范围或噪音,协议没有机制,以便核心adcied广告串的外围设备收到,这仅在连接期间发生。

由于MT_dialog