You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
48 lines
890 B
48 lines
890 B
6 years ago
|
/*
|
||
|
key.c
|
||
|
*/
|
||
|
|
||
|
#include <stdint.h>
|
||
|
#include "stm32l031xx.h" /* IRQ disable/enable */
|
||
|
#include "key.h"
|
||
|
|
||
|
#define KEY_QUEUE_MASK 0x0f
|
||
|
#define KEY_QUEUE_MAX (KEY_QUEUE_MASK+1)
|
||
|
uint8_t volatile key_queue[KEY_QUEUE_MAX];
|
||
|
uint8_t volatile key_queue_start = 0;
|
||
|
uint8_t volatile key_queue_end = 0;
|
||
|
|
||
|
|
||
|
int key_add(uint8_t key)
|
||
|
{
|
||
|
uint8_t new_end;
|
||
|
new_end = key_queue_end;
|
||
|
new_end++;
|
||
|
new_end &= KEY_QUEUE_MASK;
|
||
|
if ( new_end == key_queue_start )
|
||
|
return 0; /* buffer is full */
|
||
|
key_queue[key_queue_end] = key;
|
||
|
key_queue_end = new_end;
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
uint8_t key_get(void)
|
||
|
{
|
||
|
uint8_t key;
|
||
|
uint8_t new_start;
|
||
|
|
||
|
if ( key_queue_start == key_queue_end )
|
||
|
{
|
||
|
return KEY_NONE;
|
||
|
}
|
||
|
//__disable_irq();
|
||
|
key = key_queue[key_queue_start];
|
||
|
new_start = key_queue_start;
|
||
|
new_start++;
|
||
|
new_start &= KEY_QUEUE_MASK;
|
||
|
key_queue_start = new_start;
|
||
|
//__enable_irq();
|
||
|
return key;
|
||
|
}
|
||
|
|