你好,
我正在使用Dialog物联网开发工具包。我正在尝试检测狗狗是否移动超过了一定的时间间隔,并在广告数据中放置一个标志。最好的方法是什么?是否有一个中断,我可以为每次dongle移动写一个处理程序?如果是,我该如何设置?或者有一个函数,我可以调用它来告诉我,如果狗狗已经移动或没有(我可以重置后,每次我读它)
我尝试过致电BMO160_Get_Any_Motion_Stat()和BMI160_Get_Step_Counter()函数来尝试检测运动,但似乎没有工作。是否有另一种功能可以使用或在广告模式下使用这些功能所需的其他设置?
我正在完成wrbl_sfl项目。
谢谢,
杰里米
设备:
嗨jeremynwong,
在广告完成后,物联网项目获得任何类型的移动中断,在广告完整回调中user_bmi160_config_anymotion_intr()函数将加速计设置为该模式,当加速度计感应到任何运动触发一个到583的中断wkup_intr_non_connected_cb()被触发以便设备再次开始发布,所以你可以在那个中断处理器上放置一个标志,或者因为设备每次移动它都会启动广告,你甚至可以在user_adv_start()函数中设置设备移动的标志,并相应地修改你的广告字符串。如果你想计数,而你的广告,你可以使用这个配置,以便在任何时间可用,并在任何移动触发中断。
也请注意,同声传译项目中编写额外的代码的空间非常有限,如果不是不存在的,问题是凯尔的局限性,因为它不会编译额外的代码在32 k所以我建议与格兰原始项目,除非你想传感器融合functionallity。
谢谢mt_dialog.
嗨MT_dialog !您提到IOT项目在广告完成后,IOT项目会导致任何类型的移动,因此如果存在动作检测到中断处理程序,以便设备再次启动广告。如果我们想要一直在启用中断,那么不仅在14583睡觉后启用中断?我们目前禁用了我们的14583年的睡眠模式。
此外,您提到我们可以在user_adv_start函数中编写一个标志。我们将如何使用可用的任何函数来帮助我们实现目标。我们尝试使用read_step_counter语句在user_app_add_undirect_complete函数中编写标志,但它根本无法工作。
谢谢,
迈克尔
嗨michaelmeng998,
如果你想让中断一直处于启用状态那么你就必须配置传感器从设备运行的时候开始提供一个中断在获得中断之后你可以把它看作一个运动,此外,您将考虑什么作为一个移动,这取决于您如何在IMU上配置中断,BMI中断在永久、临时或非锁存模式下操作(请查看BMI160数据表了解更多信息)。
关于如何做到这一点,请建议传感器的数据表,模块本身提供了一系列配置和中断,在某些条件下触发,所以您应该检查什么适合您,并启用BMI模块中的相应功能。关于写作user_adv_start_function国旗,我已经提到过,如果你想做广告,设备被移动了,自设备使中断时落在永恒的睡眠和醒来时广告你可以设置一个计数器或国旗表明设备移动和广告。
谢谢mt_dialog.
嗨MT_dialog:
我仍然有点困惑。我检查了Datasheet.h源文件,它有一些特定的IRQN,就像从低功耗中断的唤醒一样,每个接收的数据包结束的收据中断,以及广告中断结束,但没有中断对应于我们首次启动时对应设备。
此外,在BMI160 Datasheet Online中,它说有一个AnyMotion中断寄存器(int_motion,0x5f-0x62)。我试图了解如何启用此中断。此外,我们还需要编写一个单独的中断处理程序,还是我们可以调用一个像wkup_intr_non_connected_cb这样的预先写的中断处理程序之一?
嗨michaelmeng998,
当代码开始在设备上运行时没有中断,如果你想知道你可以在哪里设置中断来触发,你可以把它放在。app_on_init回调中,或者你甚至可以把它放在广告开始时。
物联网源代码允许在设备停止广告时中断,在user_app_on_adv_undirect_complete中,如果您检查user_init_bmi_nc()函数,您将能够找到如何使用任何运动中断设置BMI的示例,更具体地说,user_bmi160_config_anymotion_intr()是设置要触发的中断的函数。您可以检查该函数并将您想要的配置应用到项目中。关于中断的处理,在物联网上,这个中断连接到唤醒计时器(当设备处于睡眠状态时可用的中断),为了给那个中断分配一个ISR,有wkupct_register_callback() api来完成,例如在任何动机中断后的物联网和IMU已经配置函数config_da1458x_pin_intr_non_connected()被调用时,该函数注册wkup_intr_non_connected_cb唤醒定时器并设置销,预计通过wkupct_enable_irq中断()函数。
谢谢mt_dialog.
嘿MT_dialog。谢谢你的回应。我还有一些问题。您提到user_init_bmi_nc()函数是将BMI与任何运动中断设置的函数?当我检查user_wrbl.c文件时,在广告完成后,user_init_bmi_nc()函数调用user_app_on_add_undirect_complete函数中。因此,如果我们想在广告启动时设置中断,我们会只是将user_init_bmi_nc()函数移动到user_adv_start()函数?
另外,由于我想访问加密乐动作状态(无论是移动还是不移动),然后配置我们的广告数据包以携带它是否移动,(我们已经有能力修改广告的数据包大小,我们只需要访问运动状态信息正确)运动状态在BMI160检测到运动之后存储运动状态在哪里存储?是否有特定的队列保存我们可以访问的这些信息?
嗨michaelmeng998,
不仅user_init_bmi_nc(),这只设置配置传感器一端,你也将会配置中断583年user_app_on_adv_undirect_complete,这边也有一些额外的配置,配置的代码乌兹别克斯坦伊斯兰运动设备,请阅读并试图理解代码。如果只是放置user_init_bmi_nc(),它就不会工作。
关于你的第二个问题,你将能够在IMU的数据表中找到答案和更多的信息,然而,当中断被触发时,你可以在wkup_intr_non_connected_cb()中看到设备读取一些寄存器(INT_STATUS_寄存器- 0x1C, 0x1D,0x1E),以确定被触发的中断是什么。
谢谢mt_dialog.
嗨MT_Dialog,
我们设置了当狗狗移动时触发的中断。这部分工作。我们希望运行另一个类似但不同的函数,而不是执行user_adv_start的默认操作。
原因是我们设置了user_adv_start函数来开始广告,其中0x00的标志,从程序初始化调用,因为“未移动”应该是我们的初始状态。
但是,中断表示发生的动作,我们希望开始广告,但有一个0x01的标志。我们创建了一个名为RESTART_ADV的单独函数,并从我们的中断处理程序中称为如下所示。但是,即使这个函数被称为(我们在调试器中验证了这个功能),加密狗即使我们将0x01传递为我们的启动广告函数的参数,即使我们传递0x00,加密狗也会重新启动。
相关代码包含在下面。
谢谢,
杰里米
//在user_platform.c.中
Void wkup_intr_non_connected_cb(Void) //当软件狗移动时成功调用该函数
{
RESTART_ADV();
}
//在user_wrbl.c.中
Void user_adv_start(Void){//这是程序初始化时调用的,用0x00发布
user_easy_gap_undircated_advertise_start(fast_adv_interval,0x00);
}
void restart_adv(void){//这是我们想要从中断处理程序调用的,应该用0x01宣传
user_easy_gap_undirected_advertise_start(fast_adv_interval,0x01);
}
//开始广告的函数,我们为想要广告的用户数据添加了一个额外的参数
static void user_easy_gap_undircated_advertise_start(uint16_t adv_intv,uint8_t user_data)
{
struct gapm_start_advertise_cmd * cmd;
app_adv_data_update_timer_used = app_easy_timer(1000, adv_data_update_timer_cb);
cmd = app_easy_gap_undirected_advertise_get_active();
cmd-> intv_max = adv_intv;
cmd-> intv_min = adv_intv;
user_add_adv_info (cmd - > info.host。scan_rsp_data 10);
user_add_accel_info (cmd - > info.host。scan_rsp_data user_data);//修改我们用于广告数据的字节
app_easy_gap_undirected_advertise_start ();
//我们现在是可连接的
ke_state_set(task_app,app_connectable);
}
Uint8_t user_add_accel_info(Uint8_t *padv, Uint8_t user_data){
padv [7] = user_data;
返回0;
}
嗨MT_Dialog,
我们弄清楚了我们的问题是什么。谢谢!
杰里米
嗨jeremynwong,
感谢您的提示,如果您觉得上面的答案有用,请接受它们,或者甚至可以自由地分享您的解决方案,以便其他人在类似的问题中获得帮助。
谢谢mt_dialog.