需求:
需要对上下方向键添加按键弹起的消息。
在遥控器上下方向按键弹起时,发送一个按键弹起的消息。实际开发的应用是要求换台时,一直按着遥控器键,只换信息条跳动,不切台,放开按键即按键弹起后,切换到当前停止的台上;
思路:在遥控器的中断响应里面进行全局变量的赋值为1,然后在自己写的keyup_respond函数里面进行轮询检测这个全局变量的值是否发生变化,最后创建线程调用自己写的的接口函数keyup_rspond。
void RemoteISR (STPIO_Handle_t Handle, STPIO_BitMask_t ActiveBits)
{
对于上向方向的重复按键和单次按键分别m_i置1,并且设置标志变量,如果重复按下时单次不置1.
}
/*****************************************************************************
Function Name : 按键弹起消息
*****************************************************************************/
static int state_change_sign = 0;
static int state_count = 0;
void keyup_rspond(void* pvParam)
{
while(1)
{
if(m_i == 1)//
{
state_change_sign = 1;
m_i = 0;
state_count = 0;
}
else if((m_i==0) && (state_change_sign == 1))
{
state_count++;
if(state_count == 8)
{
state_change_sign = 0;
state_count = 0;
m_i = 0;
printf("******send RKEY_UP_STATUS message\n\n");
STTBX_Print(("******send RKEY_UP_STATUS message\n\n"));
Panel_DeliverAppMsg(RKEY_UP_STATUS);
}
}
task_delay (6250*20); // 20ms
}
}
/*****************************************************************************
Function Name : 在遥控器初始化里面创建线程调用按键弹起消息函数
*****************************************************************************/
BOOL_YS DRV_PanleInit ( void )
{
task_t *KeyTask;
KeyTask = task_create ( keyup_rspond,
0L,
4096, /* stack */
9,/*9,*/ /* priority */
"bordTask",
0 );
}
出现的问题:
1、创建任务的时候不能保证上层的任务和我们创建的任务都成功,可能是内存引起的问题,通过在sections.c里面将开头的注释去掉,达到了创建线程的效果。
2、在按键弹起的时候只有上向方向键响应,
开始的时候通过在中断锁之前加上按键判断标志失败,总是在按完上下键的紧接着的那个键还是有按键抬起响应,造成这个原因可能是上次响应的键值传到了这个的键值里面使得改变了我们定义的全局变量,
于是通过在重复按键和单次按键的选择里面进行全局变量的赋值,同时还要防止重复键在开始按下和抬起响应两次,我们设置了标志位,如果响应重复按键就不响应一般按键。最终问题得到了解决。