【环境专家之智能手表】Part10:状态灯及模式切换
[复制链接]
1.介绍
NFC功能先掠过,先写一个简单的功能,状态灯和模式切换,为什么需要状态灯,是因为【RSL10-SENSE-GEVK】板不方便外接显示模块,刚好板载一个RGB灯,刚好就拿这个RGB灯作为指示状态,而且还比较低功耗。
2.设计
由于用的是RGB灯,不能直接展示出用户想要的信息,那么就可以通过一些闪烁的方式来表示一些状态,根据自己需要的状态,定义了如下图1的对应表格:
图1
状态不多,灯也够用,后期要添加也足够。闪烁方式对应的状态表已经好了,那么就来实现吧,首先定义了一个枚举用于表示状态。
typedef enum
{
LED_NO_STATUS = 0,
LED_SWITCH_NORMAL,
LED_BLE_CONNECT,
LED_BLE_DISCONNECT,
LED_SET_SUCCESS,
LED_WITCH_DOWNHOLE,
LED_DOWNHOLE_NORMAL,
LED_DOWNHOLE_ALARM,
LED_DOWNHOLE_HELP,
}status_led_t;
一共是九种状态,有一个是无状态,有了状态之后,需要有一个状态设置接口,如下定义:
void status_led_set(status_led_t now_status)
{
runing_status = now_status;
runing_cnt = 0;
LED_Off(LED_RED);
LED_Off(LED_GREEN);
LED_Off(LED_BLUE);
}
其中runing就是用来计数的,然后实现一个定时调用的函数就可以了,由于逻辑比较简单,下面贴出部分代码:
void status_led_runing(void)
{
if(runing_status == LED_NO_STATUS)
return;
switch(runing_status)
{
case LED_SWITCH_NORMAL:
{
if(runing_cnt % 2 == 0)
LED_On(LED_BLUE);
else
LED_Off(LED_BLUE);
if(runing_cnt >= 3)
status_led_set(LED_NO_STATUS);
break;
}
case LED_BLE_CONNECT:
{
if(runing_cnt < 5)
LED_On(LED_BLUE);
if(runing_cnt >= 5)
status_led_set(LED_NO_STATUS);
break;
}
case LED_BLE_DISCONNECT:
{
if(runing_cnt < 5)
LED_On(LED_RED);
if(runing_cnt >= 5)
status_led_set(LED_NO_STATUS);
break;
}
//.......
}
runing_cnt++;
}
我是200毫秒调用一次【status_led_runing】函数,在蓝牙连接和断开回调中调用设置状态灯的函数即可,蓝牙连接函数为【GAPC_ConnectionReqInd】,蓝牙断开函数为【GAPC_DisconnectInd】,在该函数中调用即可。
对于状态切换,我这里采用两个按键,按键0长按3秒切换到正常模式,按键1长按3秒切换到下井模式,最终展示出来的效果如下图所示。
图2 蓝牙连接和断开测试
图3 模式切换
可以对照图1的表格观看GIF图片。
3.总结
状态灯这个设计其实不难,但是也是需要的,因为没有屏幕只能通过这个进行人机交互,对于模式切换,考虑到手表不是下井时才佩戴,日常也可以进行佩戴,所以加入了这么一个机制。
|