你好,
我正在使用对话框的IoS开发套件。我正在尝试检测加密狗是否已在某个时间间隔内移动并将标志放入广告数据。这样做的最佳方式是什么?是否有中断我可以为加密狗移动时可以写一个处理程序?如果是这样,我怎样才能将其设置为?或者有一个功能,我可以打电话给我会告诉我如果加密狗是否已经移动(每次读取它之后我可以重置)
我尝试调用bmo160_get_any_motion_stat()和bmi160_get_step_counter()函数来检测运动,但这似乎不起作用。在广告模式下,我是否可以使用其他功能,或者是否需要其他设置来使用这些功能?
我正在运作WRBL_SFL项目。
谢谢,
杰里米
设备:
嗨jeremynwong,
IOT项目在广告完成后,在广告完成后,IOT项目会发生任何类型的运动,在广告完整的回调中user_bmi160_config_anymotion_Intr()函数在该模式下设置加速度计,因此当加速度计感测任何类型的运动触发到583中断时触发WKUP_INTR_NON_CONNECTED_CB()触发,以便设备再次启动广告,因此您可以在该中断处理程序处放置一个标志,或者由于设备每次移动时,它开始它开始广告您甚至可以设置设备的标志在user_adv_start()函数中移动并相应地修改广告字符串。如果您想在广告时计算您可以使用此配置,以便随时可用,并在任何移动时触发中断。
另请注意,如果不存在,SFL项目中的写入额外代码的空间非常有限,问题是keil的限制,因为它不会通过32k编译额外的代码,所以我建议除非原始项目您希望传感器融合功能。
由于MT_dialog
嗨MT_dialog !你提到过,在广告完成后,物联网项目将获得任何类型的移动中断,所以如果检测到移动,中断处理程序将被触发,以便设备再次开始广告。如果我们想让中断一直处于启用状态,而不仅仅是在14583睡着之后呢?我们目前禁用了14583的睡眠模式。
另外,您提到我们可以在user_adv_start函数中编写一个标志。我们将如何使用任何运动或步进计数器功能,以帮助我们实现我们的目标。我们尝试过使用read_step_counter语句在user_app_adv_undirect_complete函数中编写一个标志,但它根本不起作用。
谢谢,
迈克尔
嗨michaelmeng998,
如果您想一直启用中断,那么您必须配置传感器,从设备运行的时间和在获得中断后,您可以将其视为一个运动,也是您要将的考虑作为依赖于在IMU上配置中断的运动,BMI中断在永久性,暂时或不锁存模式下运行(请检查BMI160数据表以获取更多信息)。
关于如何执行此操作,请告知传感器的数据表,该模块IT Self提供了一系列配置和中断,这些配置和中断在某些情况下触发,因此您应该检查什么适合您并启用BMI模块中的相应功能。关于user_adv_start_function中的写作标志,我提到的是,如果您想宣传设备正在移动,因为设备在永久睡眠状态下落下时,设备可以启用中断,并且可以设置a计数器或标志作为设备移动和宣传的指示。
由于MT_dialog
嗨mt_dialog:
我还是有点困惑。我检查了dataset .h源文件,它有一些特定的IRQn,比如从低功率中断唤醒,在每个接收包的末端接收中断,以及广告中断的结束,但没有对应于我们第一次启动设备时的中断。
此外,在bmi160联机数据表中,它说有一个任意运动中断寄存器(INT_MOTION, 0x5F-0x62)。我正在尝试找出如何启用这个中断。另外,我们是否需要编写一个单独的中断处理程序,或者我们可以调用一个预先编写的中断处理程序,如wkup_intr_non_connected_cb?
嗨michaelmeng998,
当代码开始在设备上运行时,没有中断,如果您想知道您可以在哪里设置中断以便触发,则可以将其放在.app_on_init回调中,或者您甚至可以将其放置在广告启动时。
IOT源代码使设备在设备停止广告时,请在user_app_on_adv_undirect_complete中,如果检查user_init_bmi_nc()函数,您将能够找到一个示例如何使用任何运动中断设置BMI,更具体地说是user_bmi160_config_anymotion_intr()是设置要触发中断的函数。您可以检查该功能并应用您想要的配置。关于中断的处理,在IOT上,此中断连接到唤醒定时器(设备在睡眠状态时可用的中断),以便为该中断分配ISR,有WKUPCT_REGISTER_CALLBACK()API例如,在ACotion中断和IMU配置的IOT中,调用函数Config_DA1458X_PIN_INTR_NON_CONNETed(),该函数将WKUP_INTR_NON_CONNECTED_CB注册到唤醒定时器,并设置通过WKUPCT_ENABLE_IRQ()函数的中断的引脚。
由于MT_dialog
嘿MT_dialog。谢谢你的回复。我还有几个问题。您提到user_init_bmi_nc()函数是用任何运动中断设置BMI的函数?当我检查user_wrbl.c文件时,在发布结束后user_app_on_adv_undirect_complete函数中调用user_init_bmi_nc()函数。因此,如果我们想在广告开始时设置中断,我们是否只需将user_init_bmi_nc()函数移动到user_adv_start()函数?
此外,由于我想访问狗狗的运动状态(无论它是否移动),然后配置我们的广告包携带无论它是否移动,(我们已经有能力修改广告包的大小,我们只需要正确地访问运动状态信息)在bmi160检测到运动后,运动状态被存储在哪里?是否有一个特定的队列来保存我们可以访问的信息?
嗨michaelmeng998,
不仅是user_init_bmi_nc(),那就是只在传感器结束时设置配置,您还可以在583的侧面配置中断,也在user_app_on_adv_undirect_complete中,有一些额外的配置代码为配置IMU设备,请阅读并尝试了解代码。如果您只是将User_Init_Bmi_nc()放置它,它只是工作。
关于您的第二个问题,您将能够在IMU的数据表中找到答案和更多信息,尽管如此,当设备读取设备读取某些寄存器的WKUP_INTR_NON_CONNECTED_CB()时,您可以在WKUP_INTR_NON_CONNECTE_CB()中找到答案和更多信息(INT_STATUS_寄存器 - 0x1c,0x1d,0x1e)为了确定已触发的中断是什么。
由于MT_dialog
嗨mt_dialog,
我们设置了随机移动时触发的中断。这部分有效。我们希望运行另一个类似但不同的函数,而不是执行user_adv_start的默认操作。
原因是我们设置了user_adv_start函数以0x00标志开始广告,这个标志在程序初始化时被调用,因为“not moved”应该是我们的初始状态。
然而,中断表示运动已经发生,我们想要开始广告,但带有0x01标志。我们创建了一个名为restart_adv的单独函数,并在中断处理程序中调用它,如下所示。然而,即使这个函数正在被调用(我们在调试器中验证了这一点),狗狗也会以0x00重新启动广告,即使我们将0x01作为参数传递给我们的start广告函数。
相关代码如下所示。
谢谢,
杰里米
/ /在user_platform.c
void wkup_intr_non_connected_cb(void)//当加密狗移动时成功调用
{
restart_adv ();
}
/ /在user_wrbl.c
void user_adv_start(void){//这是程序初始化所谓的,用0x00发布
user_easy_gap_undirected_advertise_start (FAST_ADV_INTERVAL 0 x00);
}
Void restart_adv(Void){//这是我们想要从中断处理程序调用的,应该用0x01发布
user_easy_gap_undirected_advertise_start (FAST_ADV_INTERVAL 0 x01);
}
//启动广告的功能,我们为我们要宣传的用户数据添加了额外参数
Static void user_easy_gap_undirected_advertise_start(uint16_t adv_intv, uint8_t user_data)
{
struct gapm_start_advertise_cmd * cmd;
timer_hnd app_add_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_undircated_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