【环境专家之智能手表】Part18:下井模式
<p><strong><span style="font-size:20px;">1.介绍</span></strong></p><p><span style="font-size:16px;">因为手表可以日常佩戴,所以需要有一个机制进行模式的切换,【RSL10-SENSE-GEVK】开发套件有两个按钮,所以可以利用这两个按钮进行设计,下井模式和正常佩戴模式使用的场景显而易见,下井模式则是下井时使用,正常模式则是平时佩戴时使用。</span></p>
<p><span style="font-size:20px;"><strong>2.设计介绍</strong></span></p>
<p><span style="font-size:16px;">首先介绍一下这次的设计,有两个按钮,为了防止误触,所以都采用长按的机制,下面是两个模式的切换设计:</span></p>
<p class="imagemiddle" style="text-align: center;"></p>
<p style="text-align: center;"><span style="font-size:16px;">图1</span></p>
<p><span style="font-size:16px;">其中下井模式还有三种状态,分别是:正常状态、报警状态和呼救状态,状态之间互相切换的框图如下图2:</span></p>
<p class="imagemiddle" style="text-align: center;"></p>
<p style="text-align: center;"><span style="font-size:16px;">图2</span></p>
<p><span style="font-size:16px;">三种状态是可以相互切换的,而且这三种状态也是满足正常使用的,当遇到危险时,长按某个按键,则会将自己的状态转换为呼救状态,这样矿井外人员看到设备上有人呼救,则立马对齐进行定位(通过中继器大致定位),并进行救援。</span></p>
<p><strong><span style="font-size:20px;">3.程序设计</span></strong></p>
<p><span style="font-size:16px;">其实没有太多的难点,首先定义按键,检测3秒和5秒的长按,具体实现如下:</span></p>
<pre>
<code>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;
}
}
</code></pre>
<p><span style="font-size:16px;">然后修改广播协议,在气压值后面添加上状态标志,矿井外设备从中获取到设备是否处于下井模式,如果处于下井模式,则显示到屏幕上,如果不处于则过滤。</span></p>
<p><span style="font-size:16px;">这里有一个设计冲突,如果矿井外设备检测到有设备进入下井模式,那么屏幕上会显示出该设备,<strong>当如果这台设备关闭下井模式,屏幕是否应该继续显示该设备的状态?</strong>最终我设计成这样的,当检测到有设备进入下井模式,如果该设备退出下井模式,会继续显示在屏幕上,同时屏幕上显示该设备的处于正常模式,为什么要这样设计,主要是怕下井人员误触,如果矿井外设备查看到此标志,则需通过对讲机或其他通信设备告知佩戴该设备的人员,开启下井模式,因为正常模式进入低功耗,更新数据会比较慢,会造成延时!</span></p>
<p><span style="font-size:20px;"><strong>4.总结</strong></span></p>
<p><span style="font-size:16px;">最终下井模式就设计完毕了,矿井外设备的扫描机制需要做一些修改,同时还需要添加窗口置顶的功能,用于提示该设备处于呼救状态,而且需要设计窗口优先级,这个需要专门写一篇帖子进行分析设计。</span></p>
<p>井人员误触是必须注意点</p>
<p>楼主设计的很细</p>
<p> </p>
<p>要是一直被误触发长按呢?</p>
freebsder 发表于 2021-7-6 22:20
要是一直被误触发长按呢?
<p>那就只能按另一个按键退出了。</p>
w494143467 发表于 2021-7-7 11:53
那就只能按另一个按键退出了。
<p>哈哈,好吧,故意破坏确实没啥好的办法。</p>
freebsder 发表于 2021-7-7 17:40
哈哈,好吧,故意破坏确实没啥好的办法。
<p>是啊,其实也有别的办法,不过目前不好实现。</p>
w494143467 发表于 2021-7-7 20:00
是啊,其实也有别的办法,不过目前不好实现。
<p>啥办法?科普一下</p>
freebsder 发表于 2021-7-9 21:39
啥办法?科普一下
<p>就是进入下井模式,由矿井外人员设置,通过扫描NFC标签获取设备MAC地址,然后通过矿井外设备对下井设备进行设置。</p>
页:
[1]