按键任务

创建一个任务

void creat_key_task( void )
{
    osThreadDef( key, key_task , osPriorityHigh, 0, configMINIMAL_STACK_SIZE*3);
    keyTask = osThreadCreate(osThread(key), NULL);
    configASSERT(keyTask);
}

任务干活

static void key_task( void const *pvParameters)
{
    keyTaskType key;

    configASSERT( ( ( unsigned long ) pvParameters ) == 0 );

    keyTimerHandle = timer.creat(15000 , FALSE , key_timer_isr);
    touch_key_clear();
    memset(&key,0x00,sizeof(keyTaskType));

    while(1)
    { 
        if(xQueueReceive( xKeyQueue, &key, 1000 ) == pdTRUE)
        {
            key_handle(&key);
            memset(&key,0x00,sizeof(keyTaskType));
        }

        task_keep_alive(TASK_KEY_BIT);
    }
}

核心代码是处理按键

static void key_handle(keyTaskType *key)
{
    switch(key->cmd)
    {
    case SYS_KEY:
    {
        system_key_handle(key);
    }break;
    case TOUCH_KEY:
    {
        touch_key_handle(key);
    }break;
    case FUN_KEY:
    {
        fun_key_handle(key);
    }break;
    default:log_err("按键命令错误,CMD=%d\n" ,key->cmd);
    }
}

//具体
static void system_key_handle(keyTaskType *key)
{
    switch(key->keyValue)
    {
    case KEY_1_SEC:
    {
         tag_config_enable(TRUE);
         beep.write(BEEP_NORMAL);
         log(DEBUG,"使能安装工刷卡\n");
    }break;
    case KEY_8_SEC:
    {
        tag_config_enable(FALSE);
        beep.write_base(&beepRestore);
        set_clear_flash(FLASH_ALL_DATA);
    }break;
    default:log_err("按键键值错误,VALUE=%d\n" ,key->keyValue);
    }


}

不同的按键执行不同 的函数。
好了,这个任务就是前台程序,它是处理者。
后台程序是其他模块,比如其他任务或者其他函数,给它的消息队列发送消息。

上面全部在Key_Task.c
下面就是在后台的了。
这个模块叫做Config_Key.c它很简单就是GPIO外面一个按键,按下去会有中断触发,同时用一个定时器扫描区别看按键按下去1S还是8S,发送出2个消息。(以前我就是在it.c发送的)看看别人的。

这是初始化 最下面一句话是很宏观的,把这个函数加入到数组中一起初始化。自己初始化了按键中断,同时开启了定时器扫描。

static void config_key_exit_interrupt( void )
{
    if( pin_ops.pin_read(CONFIG_KEY_PIN) == PIN_LOW)
    {
        timer.start(configKeyHandle);
        log(INFO,"中断检测到系统按键输入 ,INPUT =%d\n" ,pin_ops.pin_read(CONFIG_KEY_PIN));
    }
}

static void config_key_init( void )
{
    pin_ops.pin_mode(CONFIG_KEY_PIN , PIN_MODE_INPUT_PULLUP);
    pin_ops.pin_exit(CONFIG_KEY_PIN , config_key_exit_interrupt);

    configKeyHandle = timer.creat( 100 , FALSE , config_key_timer_isr);   
}


MODULES_INIT_EXPORT(config_key_init , "config key");

这就是发送消息给前台task

static uint32_t pushTime=0;

static void config_key_timer_isr(void)
{
    if(pin_ops.pin_read(CONFIG_KEY_PIN)  == PIN_LOW)
    {
        pushTime++;
    }
    else
    {
        pushTime = 0;
        timer.stop(configKeyHandle);
    }
    if( pushTime == 2)
    {
        keyTaskType key;

        key.cmd = SYS_KEY;
        key.keyValue = KEY_1_SEC;
        xQueueSendFromISR( xKeyQueue, ( void* )&key, NULL );
    }
    else if( pushTime == 40)
    {
        keyTaskType key;

        key.cmd = SYS_KEY;
        key.keyValue = KEY_8_SEC;
        xQueueSendFromISR( xKeyQueue, ( void* )&key, NULL );
    }
}

其实写的并不好 你能看的按8S的时候会发送2个消息的 先发1S在发8S的。 在处理函数里面8S的先把1S干的活推翻看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值