#include "hal.h"
#define KEY_NOT_PRESSED 0x0
#define LONG_PRESS_COUNT 200
#define REPEAT_DELAY 75
#define MAX_LONG_PRESS 1000
typedef struct
{
unsigned int repeatDelay;
unsigned char quickCount;
unsigned int longCount;
unsigned long current;
unsigned long previous;
unsigned long quickPrevious;
unsigned char pressed;
unsigned char longPressed;
unsigned char down;
unsigned char up;
} KeyState;
KeyState ks = {0};
void KeyInit(void)
{
}
void KeyClear(void)
{
ks.repeatDelay = 0;
ks.quickCount = 0;
ks.longCount = 0;
ks.current = KEY_NOT_PRESSED;
ks.previous = KEY_NOT_PRESSED;
ks.quickPrevious = KEY_NOT_PRESSED;
ks.pressed = 0;
ks.longPressed = 0;
ks.down = 0;
ks.up = 0;
}
void KeyScan(void)
{
ks.current = hal_GetKey();
if (ks.current != KEY_NOT_PRESSED)
{
if (ks.previous == ks.current)
{
ks.pressed = 1;
if (ks.longCount < MAX_LONG_PRESS)
{
ks.longCount++;
}
if (ks.longCount >= LONG_PRESS_COUNT)
{
ks.longPressed = 1;
}
}
else
{
if (ks.quickPrevious == ks.current)
{
ks.quickCount++;
}
else
{
ks.quickCount = 1;
}
ks.repeatDelay = REPEAT_DELAY;
ks.quickPrevious = ks.current;
ks.down = 1;
ks.longCount = 0;
}
ks.previous = ks.current;
}
else
{
ks.pressed = 0;
ks.longPressed = 0;
if (ks.previous != KEY_NOT_PRESSED)
{
ks.up = 1;
}
else
{
ks.up = 0;
}
ks.previous = KEY_NOT_PRESSED;
if (ks.repeatDelay > 0)
{
ks.repeatDelay--;
}
if (ks.repeatDelay == 0)
{
ks.quickPrevious = KEY_NOT_PRESSED;
ks.quickCount = 0;
}
}
}
#include <stdint.h>
#define TIMEOUT_TH 32
#define BIT_CNT_TH 25
#define BIT_RD_TH 8
volatile uint32_t gRfKeyVal = 0;
uint32_t gReadData;
uint8_t loTimeout = 0;
uint8_t hiTimeout = 0;
uint8_t lastData = 0;
uint8_t bitCnt = 0;
void rfKeyInit(void)
{
#if (RfKeyType == RfKeyType_IoWidthCode)
RFKEY_POWER_IO_Output();
RFKEY_DATA_IO_Input();
RFKEY_POWER_IO_Ctrl(RFKEY_POWER_ON);
#endif
}
unsigned char rfKeyRead(uint32_t *keyval)
{
if ((*keyval) == gRfKeyVal)
{
return 0;
}
else
{
(*keyval) = gRfKeyVal;
return 1;
}
}
void GetRfKeyValue(void)
{
static uint8_t hiTimeCnt = 0;
if (RFKEY_DATA_IO_Channel == 0)
{
if (loTimeout < TIMEOUT_TH)
{
loTimeout++;
if (loTimeout >= TIMEOUT_TH)
{
if (bitCnt == BIT_CNT_TH)
{
gRfKeyVal = gReadData;
}
else
{
gRfKeyVal = 0;
}
gReadData = 0;
bitCnt = 0;
}
}
else
{
return;
}
hiTimeout = 0;
if (lastData == 1)
{
lastData = 0;
if (hiTimeCnt >= BIT_RD_TH)
{
gReadData |= 1;
}
gReadData <<= (bitCnt < 32);
bitCnt += (bitCnt < 32);
}
}
else
{
if (hiTimeout < TIMEOUT_TH)
{
hiTimeout++;
if (hiTimeout >= TIMEOUT_TH)
{
gReadData = 0;
gRfKeyVal = 0;
bitCnt = 0;
}
}
else
{
return;
}
loTimeout = 0;
if (lastData == 0)
{
lastData = 1;
hiTimeCnt = 0;
}
else
{
hiTimeCnt++;
}
}
}