1.介绍
因为手表可以日常佩戴,所以需要有一个机制进行模式的切换,【RSL10-SENSE-GEVK】开发套件有两个按钮,所以可以利用这两个按钮进行设计,下井模式和正常佩戴模式使用的场景显而易见,下井模式则是下井时使用,正常模式则是平时佩戴时使用。
2.设计介绍
首先介绍一下这次的设计,有两个按钮,为了防止误触,所以都采用长按的机制,下面是两个模式的切换设计:
图1
其中下井模式还有三种状态,分别是:正常状态、报警状态和呼救状态,状态之间互相切换的框图如下图2:
图2
三种状态是可以相互切换的,而且这三种状态也是满足正常使用的,当遇到危险时,长按某个按键,则会将自己的状态转换为呼救状态,这样矿井外人员看到设备上有人呼救,则立马对齐进行定位(通过中继器大致定位),并进行救援。
3.程序设计
其实没有太多的难点,首先定义按键,检测3秒和5秒的长按,具体实现如下:
void PB_TransitionEvent(void *arg)
{
static uint32_t btn0_rpessed_time, btn1_rpessed_time;
ButtonName btn = (ButtonName)arg;
bool button_pressed = BTN_Read(btn);
switch (btn)
{
case BTN0:
if(button_pressed == BTN_PRESSED) //按键按下
{
btn0_rpessed_time = HAL_Time();
}
else
{
if(HAL_Time() - btn0_rpessed_time > 3000) //大于3秒钟
{
if(status_get_downhole_flag()) //不是正常模式
{
status_led_set(LED_SWITCH_NORMAL); //切换为正常模式
}
}
}
break;
case BTN1:
if(button_pressed == BTN_PRESSED) //按键按下
{
btn1_rpessed_time = HAL_Time();
}
else
{
if(HAL_Time() - btn1_rpessed_time > 3000) //大于3秒钟
{
if(status_get_downhole_flag() == 0) //不是下井模式
{
status_led_set(LED_WITCH_DOWNHOLE); //切换为下井模式
}
}
if(status_get_downhole_flag())
{
if(HAL_Time() - btn1_rpessed_time > 5000) //大于5秒钟
{
if(status_get_downhole_status() < 2)
status_led_set(LED_DOWNHOLE_HELP); //切换呼救模式
else
status_led_set(LED_DOWNHOLE_NORMAL); //切换为普通模式
}
}
}
break;
default:
return;
}
}
然后修改广播协议,在气压值后面添加上状态标志,矿井外设备从中获取到设备是否处于下井模式,如果处于下井模式,则显示到屏幕上,如果不处于则过滤。
这里有一个设计冲突,如果矿井外设备检测到有设备进入下井模式,那么屏幕上会显示出该设备,当如果这台设备关闭下井模式,屏幕是否应该继续显示该设备的状态?最终我设计成这样的,当检测到有设备进入下井模式,如果该设备退出下井模式,会继续显示在屏幕上,同时屏幕上显示该设备的处于正常模式,为什么要这样设计,主要是怕下井人员误触,如果矿井外设备查看到此标志,则需通过对讲机或其他通信设备告知佩戴该设备的人员,开启下井模式,因为正常模式进入低功耗,更新数据会比较慢,会造成延时!
4.总结
最终下井模式就设计完毕了,矿井外设备的扫描机制需要做一些修改,同时还需要添加窗口置顶的功能,用于提示该设备处于呼救状态,而且需要设计窗口优先级,这个需要专门写一篇帖子进行分析设计。
|